~/f/erlang/RPMS.2 ~/f/erlang ~/f/erlang RPMS.2/erlang-28.4.1-1.1.x86_64.rpm RPMS/erlang-28.4.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-28.4.1-1.1.x86_64.rpm to erlang-28.4.1-1.1.x86_64.rpm comparing the rpm tags of erlang --- old-rpm-tags +++ new-rpm-tags @@ -3019 +3019 @@ -/usr/lib64/erlang/lib/public_key-1.20.2/ebin/PKIX1Implicit-2009.beam bb182ff1e6277992c773ac1d970a62adc0d9e65710609cb50f954ce4572d13e6 0 +/usr/lib64/erlang/lib/public_key-1.20.2/ebin/PKIX1Implicit-2009.beam 96a39646c1123a6818737fd05ca5ead6f47bd79a537581c0e2e43990e346859e 0 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist comparing file checksum creating rename script RPM file checksum differs. Extracting packages /usr/lib64/erlang/lib/public_key-1.20.2/ebin/PKIX1Implicit-2009.beam differs at offset '2726' (Erlang BEAM file) --- old /usr/lib64/erlang/lib/public_key-1.20.2/ebin/PKIX1Implicit-2009.beam (hex) +++ new /usr/lib64/erlang/lib/public_key-1.20.2/ebin/PKIX1Implicit-2009.beam (hex) @@ -1,6 +1,6 @@ 00000a80 25 67 65 74 65 6e 63 5f 69 6e 74 65 72 6e 61 6c |%getenc_internal| 00000a90 5f 6f 62 6a 65 63 74 5f 73 65 74 5f 61 72 67 75 |_object_set_argu| -00000aa0 6d 65 6e 74 5f 32 08 32 65 6e 63 5f 53 75 62 6a |ment_2.2enc_Subj| +00000aa0 6d 65 6e 74 5f 31 08 32 65 6e 63 5f 53 75 62 6a |ment_1.2enc_Subj| 00000ab0 65 63 74 44 69 72 65 63 74 6f 72 79 41 74 74 72 |ectDirectoryAttr| 00000ac0 69 62 75 74 65 73 5f 41 74 74 72 69 62 75 74 65 |ibutes_Attribute| 00000ad0 53 65 74 5f 76 61 6c 75 65 73 08 3d 65 6e 63 5f |Set_values.=enc_| @@ -14,7 +14,7 @@ 00000b50 74 74 72 69 62 75 74 65 73 5f 41 74 74 72 69 62 |ttributes_Attrib| 00000b60 75 74 65 53 65 74 08 25 67 65 74 64 65 63 5f 69 |uteSet.%getdec_i| 00000b70 6e 74 65 72 6e 61 6c 5f 6f 62 6a 65 63 74 5f 73 |nternal_object_s| -00000b80 65 74 5f 61 72 67 75 6d 65 6e 74 5f 32 c0 41 74 |et_argument_2.At| +00000b80 65 74 5f 61 72 67 75 6d 65 6e 74 5f 31 c0 41 74 |et_argument_1.At| 00000b90 74 72 69 62 75 74 65 53 65 74 08 32 64 65 63 5f |tributeSet.2dec_| 00000ba0 53 75 62 6a 65 63 74 44 69 72 65 63 74 6f 72 79 |SubjectDirectory| 00000bb0 41 74 74 72 69 62 75 74 65 73 5f 41 74 74 72 69 |Attributes_Attri| RPMS.2/erlang-doc-28.4.1-1.1.x86_64.rpm RPMS/erlang-doc-28.4.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-doc-28.4.1-1.1.x86_64.rpm to erlang-doc-28.4.1-1.1.x86_64.rpm comparing the rpm tags of erlang-doc --- old-rpm-tags +++ new-rpm-tags @@ -626 +626 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-272F0D3A.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-D25CF93C.js 2 (none) 100644 root root 0 4294967295 @@ -2362 +2362 @@ -/usr/share/doc/packages/erlang-doc/doc/404.html c36255d30f25c2b3092edd53b040deb5dff5ede6dd3e265228ec267939ad7466 2 +/usr/share/doc/packages/erlang-doc/doc/404.html 5b5193e47fd13b3fc84a35f2602e58e54be645fcd0f4d6769f79a12592c78e51 2 @@ -2370 +2370 @@ -/usr/share/doc/packages/erlang-doc/doc/deprecations.html f025d32070ec531485dc8bae06dcdb670066cdaac031825f9fad6a2632c0cbc5 2 +/usr/share/doc/packages/erlang-doc/doc/deprecations.html 2c4c6806e405eb0b504d1136154c16c97994e3b48d522b6eb7944071c18766b8 2 @@ -2399 +2399 @@ -/usr/share/doc/packages/erlang-doc/doc/man_index.html 431a1cfd52b50b9749ae7cd11f64fa13c2c96dc3e16295a3625730723bc02e94 2 +/usr/share/doc/packages/erlang-doc/doc/man_index.html 22519ed3501887b22a0b4eee7feb906f04ad2c43b1e19506842b81b708affc6f 2 @@ -2408 +2408 @@ -/usr/share/doc/packages/erlang-doc/doc/readme.html f9e550bf3cc099775c867cfe9dd5625d0a53c480864d2786fda17cd7d9c53a55 2 +/usr/share/doc/packages/erlang-doc/doc/readme.html a1ab138a7c067de156eeaf830e843137f1fa6ec73ca6e0895af7e6f2ad3b8710 2 @@ -2411 +2411 @@ -/usr/share/doc/packages/erlang-doc/doc/removed.html 83f335aa0876105957b31dfb033aa55460a532589490a767f5c849c0172d2cbb 2 +/usr/share/doc/packages/erlang-doc/doc/removed.html c299d94144d66d57a9a083d7f60f341917a7562195d6c2223a45259133feef3d 2 @@ -2415,2 +2415,2 @@ -/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 30effa46e1fdd08c2e88edb10b6f4130cbbd04914e7d2db6d3b304697831d5be 2 -/usr/share/doc/packages/erlang-doc/doc/search.html 6ec86cdf45c9128fe92a760f6ab47d4c8acdba713a0280444bfbdbcebf1543d9 2 +/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html d92c783f8176cd90b71e216c1d23116f70e87df60c5997299eade73704e3542b 2 +/usr/share/doc/packages/erlang-doc/doc/search.html bd804ed0d77332a3a7cb47b791a337b4b2d51be3b84248977dc78a91667d3633 2 @@ -2423,4 +2423,4 @@ -/usr/share/doc/packages/erlang-doc/doc/system/404.html a85db3988f2cfa7c3a8fe5603bd9dd90d5aef3ddeec465ee2c5560d545d1b443 2 -/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub 4f91905400dd0dc01f44216f38112f787349f248aef1b6de16836ab8482ce812 2 -/usr/share/doc/packages/erlang-doc/doc/system/applications.html 670047e4e9d5cec4ee4605b58fdcee0c1e872b31f7bc135185d9c35734d30e48 2 -/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 7abd363af24e1f615efc92895c7a4ab2cf78f5b3b3c921df3bbf9b090ef85491 2 +/usr/share/doc/packages/erlang-doc/doc/system/404.html 99591fa00227184c19cff8d35167c37d110172b81d78555451def19fa8bee1e6 2 +/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub 983b42f1f0944da70f2f83e4b4efc44a056421914329e246e670115081252421 2 +/usr/share/doc/packages/erlang-doc/doc/system/applications.html 7f654c1e98b53945231e37469b3864e9a5c41700863cd69b9fa6c5f71ac9805e 2 +/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 98270d8321718bbc45eaf96e9c8c780b7b375e7e89c781c42964c27ad322d690 2 @@ -2437,14 +2437,14 @@ -/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html 4d538c608f9a266ece24e783bd26eb48c1cc2f07731ad10e4ebdd6fa0a5783a3 2 -/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html eb011664a8699d42a75cbacdd2864cf4b6113e58287da84c1ee74263312e92b4 2 -/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 70557b41d2f9d3454943b798ddee6766b4ea596c4482345083ee3f72d3cae067 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_port.html 955493fdebbcae6f87aa7a070d2d70aa3e9604b4a3cc8eb4e7b51aa1bdfa08f5 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 5dd19bce56ade8ce0c71ad26f351be03f47dcbc64a59eeaa9fe3a5e52dd3dbf1 2 -/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 16a68f09703d5b4684e0b5181dc1287ec65a8a79a7129d751b5a6228e65b8927 2 -/usr/share/doc/packages/erlang-doc/doc/system/cnode.html db65d337f31ee7dcda73f40fe80ae6900b61b6a21b731fffd7b887ccac7a9fef 2 -/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html d2c29efec2ccb977e84e3a46b9c55a47e8771d253587a896dde3f7dad8d6028f 2 -/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html b8126b30d12849be3b71deb1958d0638b961812240a411c345ed573b4c6d4cb8 2 -/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html a16662dcc2f5abdefdcd4c99225eb2b2376fd18cf4919541b9c9464fbf773964 2 -/usr/share/doc/packages/erlang-doc/doc/system/create_target.html 8804c042126810f81870f7f7401e66a870c8b3c94ef10b77fefbeaa76c9868a5 2 -/usr/share/doc/packages/erlang-doc/doc/system/data_types.html 41539dc854d893d1b5df3552d14211f29bc9ab39b5d62d71d958831e7d315c01 2 -/usr/share/doc/packages/erlang-doc/doc/system/debugging.html f43a7e6dc67f0e5cf242e730f1e284ca0f3ca0101a13b62b8a7f8b804606f9d8 2 -/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html 80e0f2f7b86175428fcff572062ebd067ea0286a6700bc47e51a7f4559771353 2 +/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html 640ee98ea0622e3aea59a71570aaab6a143edfbe15eab50ef31a3ce3a13f2d93 2 +/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html 173e5925c1cda5b85e5d2c39fa50fd894389acb102cce3fe23a4ba89a35c2aa8 2 +/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 0c5c029d3069a92f23e4d0989c7764c2b6fd3f9146c4be5177ae9987e822c021 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_port.html 6d50a56ac19e3a15b2934c07d2d81a95ea98493d213807d4bd0f02d5af64b40e 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html ee3861a45ba812a18f88aa2bef34ceb87e7a7eff11b4e5f1fd8677ce02fcc433 2 +/usr/share/doc/packages/erlang-doc/doc/system/character_set.html e36059060f9cd77f75a7472761f0ae17604f5e6e17706d61edc60a0926238f18 2 +/usr/share/doc/packages/erlang-doc/doc/system/cnode.html d2ac5efcf54db1d4a97273fc924450762d1993d50c09ae376fdfe4cd55ba13e2 2 +/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 1f3cea2b7d21da477166acd6f83a03a7c15899d7ffaf80ac638d41800d8f4db8 2 +/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html 138b08dac438fafbc0a0ffed1a60fe723fb889a9406b843504e41bfb4a236a9d 2 +/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html a8ac7c470e4cf8397532bf584ce5619c8b33ea83bad2c974e15e5b0f7dcf2524 2 +/usr/share/doc/packages/erlang-doc/doc/system/create_target.html 2492b554a9d8b45720db347ba4b89fe22318dbbc0c089c908f4e56047151721f 2 +/usr/share/doc/packages/erlang-doc/doc/system/data_types.html 1d547b94a21d36630194985790462e8d20f2a1832e9de4fdc8cec5dd35297549 2 +/usr/share/doc/packages/erlang-doc/doc/system/debugging.html 27b685d86971540d4317c048d49bdd683b853fed5cac3a632da2a9cb9404df4f 2 +/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html a1dbbb94db57a14bcb7539bc06585c0108b423145bee596bf4dd365b710e95ca 2 @@ -2461,20 +2461,20 @@ -/usr/share/doc/packages/erlang-doc/doc/system/distributed.html 9097f928142753b36dff5f9c24ac2e4ed0b63eb5f16551dfe9800105336948d1 2 -/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html e754011063d908c3619669d694b6eaf0c85adf7296d0fbad8ede08c7f9f22f65 2 -/usr/share/doc/packages/erlang-doc/doc/system/documentation.html ddd52fb63824882dbba2d04c58d2aaaae7b315918257034df5f4c767e56d5502 2 -/usr/share/doc/packages/erlang-doc/doc/system/drivers.html abccc7f1d5879c7ef5603cae5dc16e7fe99a9a2f5acd802e90bfd5f801b60a6c 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html 7ea3de9ec57ad239e2ebf8bdbbd929c46af7efd33549391618e68b5728b149bb 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html f8200cba3443071c578bfe9c2e2e36a1ed7181034c3376c91ad228e0bc138220 2 -/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html 712b81dff3a819d1277cb3ff40de9eaad8f0e4736115f9e86cc72f57cc9ffb3a 2 -/usr/share/doc/packages/erlang-doc/doc/system/embedded.html 488988cf07f0c771a18f71b3de7df2189b0dd271ef8dc7f83a49f00dbfe4f3b0 2 -/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html 047012d92f2ffe16d5a8006c5173c6376198f11ecb5d9afd021294917cf1b027 2 -/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html 10979238023c24f1b63222962d7e6c8ccfa92d46bac730f72df0651056555411 2 -/usr/share/doc/packages/erlang-doc/doc/system/errors.html d3f3f1aaf754c49b1ad37e7430e9f710a2ac4d3724c16fb8b078ed1d3b11ce9d 2 -/usr/share/doc/packages/erlang-doc/doc/system/events.html 4d3a4f41d809ad177d3238b8e074106315a9ae599d57241d352b348ea8e9b061 2 -/usr/share/doc/packages/erlang-doc/doc/system/example.html 9fccc9c08c989324b662ee8b0f4d7b0a23a8a7d4da1760d775e068c2d609786a 2 -/usr/share/doc/packages/erlang-doc/doc/system/expressions.html 922617f091e03f4d67087e5876759761b3978774b3540411c227c2461ead77b9 2 -/usr/share/doc/packages/erlang-doc/doc/system/features.html 2bfa558fcd3aa3cdafa74447b0b9d42e173e0e6c6ac44ab61abbf35ba24ba584 2 -/usr/share/doc/packages/erlang-doc/doc/system/funs.html 79d5cc22d51871c98921d74adef8cc595c0bc3a778ac1fbc1d62434572fe3170 2 -/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 4d59dcadbc4e79e17253f3e1568387341b98b4e8d5b279defc2608cad20fd5a6 2 -/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html f3df8359cdbb775ec089a67624147b2752ad0530c83331668146f50cb51c5f39 2 -/usr/share/doc/packages/erlang-doc/doc/system/howto_debug.html 362e9745676c3cf446c46cc5a74f231a7c3c3e669d2b18deacbb48c08c077077 2 -/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 2537c93158d1e2b1d76676e288b01e63605a9cee04f3d9abf3b77d3476d813ef 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed.html a6bd7a769f6298b0325a1d30b0daf9eb92d8e47264c4270da00239744e8923a0 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html dfba227554efc5826a1df5975173a144bcb8f5db7a6fdb5aa10fa6adb4e5b0ef 2 +/usr/share/doc/packages/erlang-doc/doc/system/documentation.html 5de11175edeb84ccc4f6701f9e4f5b4123a8a5e2af992f3f7a946d5b507fedb5 2 +/usr/share/doc/packages/erlang-doc/doc/system/drivers.html 805c01f7666e1a3f341bf0e10a34b0bc9a66f2e42c8b976595c6490e6b4d7853 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html 3017ee23962d50ffc4b4cbe1dd44126ced45dc9448ba80d32ee8f92cf9043812 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html 5853401a9142ff0628b8e65fdb8cd8f1657a336c29e05c7930cc996221e898dc 2 +/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html ae4bce585bc7778f1da80044e13155b6c7d160498540cddfdcd5380db0f6ebb2 2 +/usr/share/doc/packages/erlang-doc/doc/system/embedded.html 473c4ee596e068f162dbff3b68e839afc82b1bbe1ef0945abb19b227ac5601d1 2 +/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html eab3646750aaa39113f4db071bfcae8a5177a97e993ba5a8d2fbed1ea3b73bfb 2 +/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html c6141570423173ba426752aca262ad9f75eeb9ed8ef41846fe3e5401d8ab960f 2 +/usr/share/doc/packages/erlang-doc/doc/system/errors.html e833cfc452a9a297b2d8d5c7930fef4d6390f820e995724e1ea4aede43eca33e 2 +/usr/share/doc/packages/erlang-doc/doc/system/events.html ff7b7b19f048881e33008a319b701854dce87bb835cc320deb21a4fa6e7e561c 2 +/usr/share/doc/packages/erlang-doc/doc/system/example.html f831c946c36232e0d9aa0c2b1c97faa3100782313cf754dbdd893036d53d5a31 2 +/usr/share/doc/packages/erlang-doc/doc/system/expressions.html ccd11e18afa1df9e620a1e313127956fa9618fd073410089292a68c925e7ac13 2 +/usr/share/doc/packages/erlang-doc/doc/system/features.html a0238a16a1f6d00f09ee209f84e822daca8e66fe15b3802770419ef3b0af472b 2 +/usr/share/doc/packages/erlang-doc/doc/system/funs.html 294d30996f9c2bc8a9d30d74b4f931f958d433cca8efba228999bcd811b00fba 2 +/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 88a6402d4b3d3677e2ada9deea423de97131b1d8604ed4376e341a4044b7e734 2 +/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 60ce72e02486e7f78dd4621df0beff3b88fceb96b813e00b754e16e8bc54c8e8 2 +/usr/share/doc/packages/erlang-doc/doc/system/howto_debug.html 042954284bc0a6832d0d775c8b46070f96fe50851123d1c7cfc3e745451b377d 2 +/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html bc91c3dfa37c37fc6cd363b25ea1d61137328fddbe6d122cc80905426379e320 2 @@ -2482,44 +2482,44 @@ -/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html b8e68ef3945954c55c1ded914bde0b0f5b731b6d1f91390d68083ea3904aa32b 2 -/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 39ec62270708ef5109c1ff6972a0ccab5fd6b9f46c38d3e6b8e38541849c7ec2 2 -/usr/share/doc/packages/erlang-doc/doc/system/install.html bf619d180d6d1e7cce7126b9cd37c811854d788eb7927983d5cb0afaf9f34efb 2 -/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html cb30f36e6f9393c29dcd563e68214753ff40012e310e17a7744601e16b7a3b28 2 -/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html dc3e5285f884fb298eb0852616ec8fcd1652fc090e822ba7d2283d38efda46ed 2 -/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 849a46c0b3f9999427cc0768a29dfd014bfe18b4b7b0bf29c9ad46efa7c75d88 2 -/usr/share/doc/packages/erlang-doc/doc/system/macros.html 0dc35d0ab12e5ea94f2b0593abb53e39992697de3ff7850e2ee44b696ff2acf9 2 -/usr/share/doc/packages/erlang-doc/doc/system/maps.html 058dd436061176b2db000944f0738433dcc2085d604378c95cb2a9a6300189c9 2 -/usr/share/doc/packages/erlang-doc/doc/system/memory.html 3c36fa3002eec5dbb6a7a7d9128cf08245f8ab30805042ed7415095d61c62685 2 -/usr/share/doc/packages/erlang-doc/doc/system/misc.html 4ad9520b4b53025993f8e7ee3b90ebd78284a15a90c287e76b4945320040c474 2 -/usr/share/doc/packages/erlang-doc/doc/system/modules.html 5342149407a38ef78e74708151a3516cf611c13bc58ff7ae3f7bddca6fd2a930 2 -/usr/share/doc/packages/erlang-doc/doc/system/nif.html 0bbd46c6ce0ccc6c5927b10bbabb88fee3551ae42eef9a08f6340408a721c3f8 2 -/usr/share/doc/packages/erlang-doc/doc/system/nominals.html 5071317358fd6682d7790139fc49468dff77210c32ff3a30dfde14fed3e17081 2 -/usr/share/doc/packages/erlang-doc/doc/system/opaques.html b3e8c3ec9bc701ce1b2fd45ea6d2ef6082ebc3d47903748235cc2fcb46139fcf 2 -/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html 6d2f9ed7a179d05af0b776c332bb6b817a260445bd33afdb6247746ab0e7656c 2 -/usr/share/doc/packages/erlang-doc/doc/system/overview.html 1e94ff88fdf7cfb7faee3d8c29fa806edfaa4c5bc58ad2f1113c28f170c1ee4f 2 -/usr/share/doc/packages/erlang-doc/doc/system/patterns.html 51b260a2fb9e59535057969d836dc1ce496ac877410fffb3e6b09692400365e7 2 -/usr/share/doc/packages/erlang-doc/doc/system/ports.html 5579967237a0f11a1d5fb4169d7588ac85a4a63a45166ddaddf1bca30fbbd1de 2 -/usr/share/doc/packages/erlang-doc/doc/system/profiling.html df97534f59d09235fba32a73e1c8cdae52a7fc45e880c98827ff56b4513fad9d 2 -/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 2383659ba20155c9b29c152ceb19c711c84f57b790acf5606c0b9405e6b78fed 2 -/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html 961e64aad409eba801cf8ef939aafeef9111b91e3a385432d8df4758184f9b3a 2 -/usr/share/doc/packages/erlang-doc/doc/system/readme.html 2c902ff144a52c4d5ee72f335ab26e726ec2fd861322a6a07bb3431d665fe1f7 2 -/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html dc0bd30157d7a290c68a9e71729004667c0d1031423e1472e808a5154790c000 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html 1f3df4ebeb2badaeeeb6a88f4176f299c0e9ae26bd737284e2d1e526b5dceff2 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 8dd19d95a82fb80bc5a75a9ff48a0fcd26a8f84dfcc1ddeffdefb979831f54ca 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html 9051c14a2a505bb9bd4292c3bde0b5e3d7a8076b77f639221ba9a6b140af5b52 2 -/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 4c98a0ba1bace33c616622ca6811a168b11cd3d08fb5f0f14175a35847dc2518 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html a824aa29130561f55547993ca0d404b89bc33c59b79f9a66b314b97f2d2a2d29 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html 647fd66f3a194de3d7648a8291c9763bf65a47d6da89c726d5a2f89090d0e6ec 2 -/usr/share/doc/packages/erlang-doc/doc/system/robustness.html 23d112acbb9525cdc06f5e4634deb45c989fd90717d5ceff6793ba979d1ffdcc 2 -/usr/share/doc/packages/erlang-doc/doc/system/sbom.html 9cd6150a113e490e4361cba75a722a519623bb3f34517a42fbbb71c3be7a70d8 2 -/usr/share/doc/packages/erlang-doc/doc/system/search.html 6ad4d9f014404241351d8bda5a98b6430411ec0c05914c70a92731b9e0e07887 2 -/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 4316695e0538d820e82f4342254b98dce1935e270a2c821047ce4525350344ca 2 -/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 58004cde67de1245915a9c27bc62a1e5c7b2b6b30b36e0dd9bb83ca05b8aaede 2 -/usr/share/doc/packages/erlang-doc/doc/system/statem.html bb96956c345dc3554312c88236564af94d524a46427f55365b1e0bd1f79acb51 2 -/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 6322bccb3d1ee5a1a1b0bebbfefd0f49782ff0af5099e2eee29b828cae41df0a 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 637df8fce5492075081ae578a87d5759b73ee5b2dade16f6026915c5ac70e8b1 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html c4f02acaf2aace1c36327d5d53523e1eb2198c54cc0ccb07d8573f58bbf6f002 2 -/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 538dd08bed309ec0f3b4248c548f3aac91e672660fc2faa210e5d6be643ac7e3 2 -/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html e49016927c9e5d920068da3189a60ff432de2871b63e94c68583691cc8f8f280 2 -/usr/share/doc/packages/erlang-doc/doc/system/typespec.html 29942fb2ef9194d8d1c87b223b5fd58e3f635c43330388184893d13fe224934a 2 -/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html df2e05d75f57ad28d315b4a91da48fdbbca1cfa1c0473e3969adec6fa0952a05 2 -/usr/share/doc/packages/erlang-doc/doc/system/versions.html a6c9849d93ee04ccb7481d5766c0afe7d38c066e513c87f3f4cf8ab8c7ae98d0 2 -/usr/share/doc/packages/erlang-doc/doc/system/vulnerabilities.html 34550d31771d3dc497770acc48d05143f2432f4165fc5d7ce1eee6db539769de 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 9c29a43e53e118fa8bdabb769599c55599c82c0e7318e60bc2d2d143c4d027c2 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html f321be62799599442bd8dab99f3d6d639ffe7259ef629bd3a3701ca3b3cf312c 2 +/usr/share/doc/packages/erlang-doc/doc/system/install.html a939a911ab14cf7c40a8bde6664fae73f404c48b5a868e39307b986423714705 2 +/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 37b82c657941c8ac9ee8669a4073c8346b95a6dcc84f4ff8793502c9071f2325 2 +/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 18f700032aafa1ecaafdd6f4ecf74c311b378adbcc261e8cf6f1e4b6334336d1 2 +/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 369629090fd03dcca2eb47ca0a85e24989c677bc29ccd81865e1c52f90104c7b 2 +/usr/share/doc/packages/erlang-doc/doc/system/macros.html d31926a5b60e0548ee3608e4e03aa8e50941d2100847b0db4e436d400b18242d 2 +/usr/share/doc/packages/erlang-doc/doc/system/maps.html 0081a60c2bf1b2cfdfc2edd449d33b8d2401c55d89785a58337ddade5b633a3b 2 +/usr/share/doc/packages/erlang-doc/doc/system/memory.html e0839b0ea85c438f2ea55c2d91485c02aaf6fe66f30657cc59c3f3822166f077 2 +/usr/share/doc/packages/erlang-doc/doc/system/misc.html 462ecfd93d2c3b91f8edb06871de0f59f7f44f07a661faa6a61ab563eca788f5 2 +/usr/share/doc/packages/erlang-doc/doc/system/modules.html f555fd130b9b14bdf51348390219e31bda62956659f59365ac08c2e9b15ad966 2 +/usr/share/doc/packages/erlang-doc/doc/system/nif.html 48e9928536c17edcec1213eb76ba56429b82c575b53ee375559b8e4cb4edf49d 2 +/usr/share/doc/packages/erlang-doc/doc/system/nominals.html 5b3316be5e1b57e9717d90d14358d43a8109a0362f9166434e4fa954cc267b3e 2 +/usr/share/doc/packages/erlang-doc/doc/system/opaques.html 414133cde06b6fe4512fe2723dd494a9bd8f89892013c4abd53b5aafdcfe72a5 2 +/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html 2da34ab5caae86d2c7d23ae1f102bca170c92865971f179e771b486e62158288 2 +/usr/share/doc/packages/erlang-doc/doc/system/overview.html bf1abd617f057abb08fb345357b131b45541a0c11869f8c6259c2e89f1b08681 2 +/usr/share/doc/packages/erlang-doc/doc/system/patterns.html a7d295f8b52659ec3af108695754ec5a25209bc51bf54af0bd1e32a3400ac6b0 2 +/usr/share/doc/packages/erlang-doc/doc/system/ports.html 636915dbdb21fa31eeaedaf5ef9db565bff072e30d5f7aa372172b1026e73212 2 +/usr/share/doc/packages/erlang-doc/doc/system/profiling.html 2daf2987e46d697e65c88a76c76360cb6b631aedd9aad329bfee6247da64af90 2 +/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 809f4b01f8c881e986b134a65794235bcaef3f31f62eba5c6b4cd3c3d92f3d63 2 +/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html e781cbbcfe585340aa6727c6c4fe1b18c7d219e256755a94d4df14a657fd732c 2 +/usr/share/doc/packages/erlang-doc/doc/system/readme.html ee318fe2b1b7120e39564ca74cdf55cd147342593140c1ab244112111b0e9a8d 2 +/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html ea0bf072333cb196e996d2c66b246a92c3dbde40ce4e3b508bf2182b77345c82 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html 8e333e047602ab91e1b92a4bc3e92a713ad054ba0dd0f6cac13d7ae71b6e8f9d 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html cdb39be4c2959b366db4d0c1109b9c05419d2553f07e403b7d7259df460f57a1 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html b85318d001ab614b8b0a3bd908b2e535639d66b80a078b4f4ddad4702547be92 2 +/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 0e6d6d8a08c83e723995a75e4e87df8d65a3f17efc6aa487ded85825e88e5a60 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 0aeb7eb3716452ffdc1f7c2378539c1bd3662f2a2e38fd0da241e085459067ea 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html 9fb161e88bebf2cec273d05e92af22536518ea30115aca2cd355faffca831960 2 +/usr/share/doc/packages/erlang-doc/doc/system/robustness.html 785b75d40c369b37e29572e4c7551bfea8c0c785bb1f1522694ef940f3d55f77 2 +/usr/share/doc/packages/erlang-doc/doc/system/sbom.html 2be223f766c49a83cdaac5767d09296ad58165431e631bd4b9eedccc9c81c1a1 2 +/usr/share/doc/packages/erlang-doc/doc/system/search.html 407b23c5dd5cdb0d0833603b4e13c96cd94e26475a182c071bdcb1d296fa6e3e 2 +/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 767136ed4a9f4f848eda1d3f81a5eed93e18b2e1727b9ea23a50cc6f080231ee 2 +/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 511272e60df1517a24fafac5cb04fcdfabd599d2dab3380b8394b133887ab145 2 +/usr/share/doc/packages/erlang-doc/doc/system/statem.html 33b65ca7877c3349c442046f691f91b5aaadd02913e8555f14da3ad16f34fd74 2 +/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 6b0fd131a9fc21f92914257b40d48e823b398a545494686a9687c40213ff2e16 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 4f805bf5cb7c82893514ac5b6407a17ad055bbee383bd5fd453bc26bb2b1420b 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html f3d0c3aa6d8772874e96312fcc06f4c9467c1f5e876902979604a874ddc36539 2 +/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 9956416458c89b5205bbf5f718ab8fa4e1590f323070e762b222f2f7ffca0dcb 2 +/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html 319f9c477a32f03b84f833d81f0694ac0d8d9700489f7d87bae2a82db149191b 2 +/usr/share/doc/packages/erlang-doc/doc/system/typespec.html b7aa6525e8d0f465a0c6b4887b07d2ff796dfb8f2a01786d3e1a9b8fdc0054d8 2 +/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 4fd19aecaed5d3d7d9d528717c1e68a4ab119b278cd031f3301770a99df50bd4 2 +/usr/share/doc/packages/erlang-doc/doc/system/versions.html 4c3363b1d91ab9009945a45ecd5b629705e3d48ebd4702d5f41a326ce63f940a 2 +/usr/share/doc/packages/erlang-doc/doc/system/vulnerabilities.html f502f4c083c77b02e91b85a1248d894ae4eadd39fdabdfa3c924ef9745ad9cc5 2 @@ -2530 +2530 @@ -/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html 1f56e37b04947488c15dba3e1ed9c0bd6e08782bd79d03782a4f2df614666f69 2 +/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html 3b63c1c4d6745531667da97e2e306d331b8626168164384d43bff44edd05fe92 2 @@ -2537,5 +2537,5 @@ -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/404.html bb16ed88710d2b8505d9d73ba7f01cdb8c7af3ffd9a148978965e5ea9303ba10 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/absform.html 1d41297272d75505741f4f60e9ceb87fb943063c2ab363c033e0ad993fe620cb 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/alt_disco.html 949d30b94b675df1570416ad358e285222710a746833f4c076b978fb00058872 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/alt_dist.html dca75ed75af05f3b120e5e6d3aa4159fe029d7116cbeb6c6c2b4c0edd5b0ada9 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/api-reference.html 869bceb5546278513392551877a9030efd97b2238888e2a2ec0f39e694da8fa8 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/404.html c33f2d8d0be96586aedf0ebc1b6db8d05d49d2b3ec25bf76870fd8dd60177278 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/absform.html e89376826dbc8bb2d325a3700a5bc50b9bc1184d37a4b29a426af915106a9115 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/alt_disco.html d954a123021da68b17eacb00cf35c095092af54e0ff1b1fc6e8b2817b9625a41 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/alt_dist.html 518b7e16e129286f6e4b656ce1b28835aea73ac4a42e07dca45c4ede86e37c9b 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/api-reference.html 16077d4a6d6efdc18aca79f86045a8663217a465a1c7f4e7b23e06ab923b5d69 2 @@ -2557,12 +2557,12 @@ -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/atomics.html a51d1fedf6f2b693fc2df3e2369bbf5f5f73e2ed5e6774ce028d0777e387fa57 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/automaticyieldingofccode.html dd4d56534f5c6245c14ab8b0fd9903c8b1c64ded9b7eccce933f157af85bc770 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/beam_makeops.html 161167baff199f95aa20b62b2c26ae8f9d9d26b99f78c10426e3df2c774c765d 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/beamasm.html cc718ae1c627f80a0df773c05a7d4cd42a8840a3ee2b8c913ca803de38449747 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/carriermigration.html 3535c44b2542e0e7d0b64acec5204daf7635142bd60f55ae10c6a2466d04d889 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/checkio.html 85e197b5656d08623075c3278b280431d9e727211bc390d8e96b1c1ce2a4cd7a 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/codeloading.html 824f6e81d05d06b306ef827897146254a43c70627b2f8c989276d24ea858c963 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/communication.html 9e960c2a8df35dc6328d6114c41cb680ce0aedfa4b1c5581aecae2fe29772548 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/counters.html 3bab9d9e14b19c06987dac2484490369e957a2cef2f6c26428382ba44336d4c9 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/countinginstructions.html 4a47b7110094f96fdca1e50f21e72e15780b6259dc77d76aea890da5eb61e6f3 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/crash_dump.html 10ce037c01275739e65d8cf84ee4e42ced1b455b700bc80bc2354a5d4f02eb12 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/delayeddealloc.html 03e44d18a1729bd396e297f2d8ef372833a787504fff7fa8ad91d2446ec51cb6 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/atomics.html 763b394d74489316c41b9eaa244f54d6b763671c566a712d07d347022113d177 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/automaticyieldingofccode.html 17b6a406ca47e318be2422c772e1d19d3a535c2641894710f10b80620f84a2af 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/beam_makeops.html 4f425e41410548dfb4d959f016df52bb83bb9295adf37199a54b7a1fc5f77874 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/beamasm.html 825ce18ec31da8f9d553fc9f20f087c5ff9dd7d611a0589bb3d06c500857c7b9 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/carriermigration.html 9e88aae0cf560e0ed0fb77e9feb510bd86dea64d055c06c17143354643475bd1 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/checkio.html 31f5a0f0e447ec223065b3a454b5af6e44441ba73d2e33c7e4f302c1e120c074 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/codeloading.html 3b6a90c567ceb3c06b65878c22681ee8230269c4c22caac7afd4be685d57c4cb 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/communication.html c178e3534d247ebf7ff2be44c1c0e9d7a0abd3f5aaa45515efed2db182750dce 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/counters.html b00f1969d477a418644598da3133a6d066ab6731508f61ea5694fc94a4a87a30 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/countinginstructions.html a2b2525ac537bbcc1c9eafee9434d2806ccff8c281860b839ed9346544b9d425 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/crash_dump.html b50d3fd63d9e73e872da80e2693669a88437b6bd737d8575f85d70a1701a982e 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/delayeddealloc.html 190b6852d737876570d8868e1499bc79383a1280a0851a0501316ab2ef83bda7 2 @@ -2579,16 +2579,16 @@ -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/driver.html 1aa548d0d3268346c52a09c377b27e802e501244514cf1eda1ee547a83ee362f 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/driver_entry.html fa3fc2d10ca910fa0e6b066cb4f3567303ddbb80ec2ecd9a5d6d10ad5c8f5f9d 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/epmd_cmd.html 011a69c6c778addf53af24b3282f3b3a055feb30bde1c31a334232e15ebac868 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_cmd.html d08066010884c406d0a59c046aba6ca48a569236f305f40d4779f19a5715329f 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_dist_protocol.html bf0bb5d3a293428b2a77c5c94bba4e49bebeb5c7685db1e074d73a20005125ee 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_driver.html b6be9ca164375675c99549bcc7232a2236a6df1b51dec770e0c5474286d52472 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_ext_dist.html b3239dd76263fd08aaef19d82030a5215616737024886e804056ae807bb31206 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_nif.html 2a0b1953a583043098629c4a8418814d001f369af95db925cb632b91b3c98e97 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_prim_loader.html e29526f7d554b09d68aa0bb48f40e726342fcad5c5bd53eef0a1e0a4a16e5051 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_tracer.html 720ac03bf8774072f4d4e9a7aeab6bd3cfd2c3621a1d572d1f251dab9bb36a42 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlang.html f62e8f849324bafa702b07eb39b9c940c9bee04264802aaa684c46c5f08e5f16 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlc_cmd.html 2d625e45d934c2392be4d604d1e917265aa09b4562784f0fcb263e2245eb5d00 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlsrv_cmd.html 812a955956a38293c96367d053042d3b054aebdfbb20d133d38c32a6d4a9b201 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erts_alloc.html 02116501fb1a8ea3d5a319bb5ca297fda77ab636bd652f52e4233f84a96074f1 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/escript_cmd.html 3be0541e6a27b7f59a97b04476ca7196cb001e6c74174766c466e9c65d162dd9 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/garbagecollection.html 857c05b6c3168250af3a5ffc25a866d232dbe98fbd9e2bad61c5fa8e5bf8b1a8 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/driver.html f37d23b22ccad1121abf325b176bf09a722275fcf80d4ca64d00a83d6cdfe671 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/driver_entry.html 2fb4e98a985997a111b8d5a758b63ee2216269e751fe5e0925779a1f4ab71742 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/epmd_cmd.html 45bf8d9ebcc51419852d0a7a24943fe485c6c34cac31283567f02bdbef29dc2d 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_cmd.html 787c1a88e6b6646645aee66e97117bf2528abd3f8b688315e90572544dff6ff8 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_dist_protocol.html a4a484f1ec31d7b034114a9bb6e8867ebc5a10f3bbe0b85b94db96a354db4304 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_driver.html 6f60107bc8d60da91ba5259b05a413c1492e517c512f87962c0fd9878befec77 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_ext_dist.html 020705e88896532db84cfc9546749deab3ca8aa2c009ba55fa2e3588fdee57bf 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_nif.html 8711bc5fcd80f489533e7a18f0c54e414aa5a227174ed29243dcbd571cdf9938 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_prim_loader.html cb04082d5f260702fb541be50cb9e96dc02070217113e8cdb618e268a599e972 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erl_tracer.html 7e1187ed70351c8606d30731bef5ee3433148702c314fd224e0d12842dee66f6 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlang.html f0a3e04317197bbfe7bbfecdac22249f82ee73b2680af03ea45bd71bd9f0239f 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlc_cmd.html 579eda989cfc7b09d0660cea0334c83978661ebcd0b1d86dd4bd4fa573977b90 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlsrv_cmd.html 78e8bf5af228d6a691fdef9ede6b1388cc778bfdbc36e2a3c659ade92b63d219 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erts_alloc.html 3afad8b8f12bcfe0479294e6bc0d4f28760a6d904d8349786e37a6e3193caa84 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/escript_cmd.html fa04a0fdc9ee5aa50c08c498a06fb7fd3922f310bb9bd95173fc8d14d8101077 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/garbagecollection.html 67573daeabced550726ba76f63258b33f18eff4d90d6580ee06de4001f6efa32 2 @@ -2596,20 +2596,20 @@ -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/inet_cfg.html 5b836dd30939f0004cd76d4a2642898f28722232d8fba0e01bc08ee8d5439784 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/init.html 53fa76e50fa7122b89965ed2c45c1c4d2b3f5fb2c6bd67e466a3ebfdc2f22577 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/introduction.html 5ab5df059de4a239269c3a56ae7733ba16b357b38076d654c89ccbd81e6aa838 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/match_spec.html 75c7d6c0b70af5a61a571881fa4814d40be99d9b40d203bfb90bc368bf3b2526 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/notes.html 9da65709c7548a74919077943efe289dbbea7b4f97c9ee8c00dfcc4dfb070678 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/persistent_term.html 88bea58ecf696a2a66bacb3a98c9192716619202f381c9e6e8124c06b2a7192a 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/portsignals.html 094e4c785d4a25bdffc04d62d24e0b5cef04b3e04cac74ddbf8abd4dde86d2d9 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/processmanagementoptimizations.html bcd42afbb2c3e6ece43ca7075d9aa3edbd014e00b81a941ce85d2b30cb6760bf 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/ptables.html 96f83903621ab1d07c0ed3dc543381d078cad7b6ac3c03732fe091aa83b23496 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/run_erl_cmd.html 0b1930556654600249606ff8a3640502ee705b76a3a0cb6d97a782b99e3ee220 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/search.html f08d0e8e98ff25380cd3b8aaa93534159351c149a796369b41605cf6f538908a 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_cmd.html 8a44ee4e73aa69aaad0e16616b367f3bf8e2440d61227ad5c8a18ed51a9e08e9 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_erl_cmd.html 979f3e7aace0b513bb0b396f9afcb48f3fb51153b782600b9c0a0363d4f4726b 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/supercarrier.html 1492d6e9f0ca604da43bcd28959dc9274d55c43ae22d6120528945b2f1c1de2e 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/threadprogress.html eb8c8fcfeb993082e6022821a1b2f8af7f1cb5a049f08f59430b345725171087 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/time_correction.html b7f821fdca1646f6ce25936140ede6c109318aa10f464b607c1d2abee8beb2aa 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tracing.html 23f0f90aee45eab5441de10f62078079278e12e2c65ead713dd0426994864ccf 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tty.html b86dcd84a30571180ce09d273937376c8ad78fb5ef70b6cec9f6f35a8de1b0b7 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/werl_cmd.html 9340060c49d7ddce1864a401d6fcfc46694fe0f5412c17a4aa9ce61bf8df0a4e 2 -/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/zlib.html 9999bbb44aed7c8f6659cc1283bdca6d17f7560d8f9a7854f10bd17cb84dae70 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/inet_cfg.html 7a6f10b9eb30186b641e3c9e2e9035132fb5b0ab1bdbb9bf469287505fb92462 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/init.html dcfec88e44fb3554d4dc799758d23a3f283efb74140c7e46d63d9bda9e04762a 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/introduction.html ebf40df742a6ab2c25d218cd5e3c01b978f2d122fb84a79119a1378b87c812ba 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/match_spec.html c6d68a25656fd124899568b58dc809d7601bd48dfb1f66d28e169c2a5c8a2fb8 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/notes.html 68b9d32b988cf046951e285add59aaeda83e662c7cdabca10bd063247f0eaf70 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/persistent_term.html 712cc8466476cd371df177f0f103fdb41a4baad7affa533eb35cd7af49dc1517 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/portsignals.html 39b9fadc5a0200216c67c34327712de7abbc64e73d42393f15c441a9360d9553 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/processmanagementoptimizations.html ccdf6167d2582d2a80e32a11e793f7b5caeea10c8e0108926f3652637267f0fd 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/ptables.html 7c73351e4e4a63ebb1d34ee20a4544800284c1039bc3332d2c0d2e013c625bd0 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/run_erl_cmd.html d36da36ef97650aeb18085fb043794f3c006cb5da9a10c89f1907c12c503fab3 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/search.html 05454244c9950bad68bbd3f00650754272c07ceeb468e848d08e679cc4dc7878 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_cmd.html db8c5b4b030a51ab035948c0bb6d2120b5fbb83115a92db20ab43c14be74e6ae 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_erl_cmd.html f2f0e77fc791e6d4d10ab485ac982fd0f9ae3d80b520a3084b3e6844fce1d46a 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/supercarrier.html 9ea29a7bc6bd8ff7784c6d35eb2831bd72c344df2fba77f8ffa027f647ee80b1 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/threadprogress.html 656bbe928d887b6c9e6a6d6a9c27be8fcaf47b7f900ae55569078a69f67dd54c 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/time_correction.html d729d681df14b569d27b25a3aaff5bbfc6df6409392c11efb1d51e846faec68e 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tracing.html 0f6dd335b73b7539d2083c35f7c4bcdedeeeaee52c836cf791ad52130db4c424 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tty.html ccc56bded18a9c53ec84f03b31848b4798776895cf5edb132be7562f64913934 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/werl_cmd.html bc38bdb49d183c3641e3b576179f7a09736762f88e600cbaec734cde8f1ae13a 2 +/usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/zlib.html bb54ad05ed22b77adda704239f14b1c264e0605f786735225a09d5dc845a7ee8 2 @@ -2622,8 +2622,8 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/404.html 881fef33410de5388a9d272c6344c418d8df945daca6ed9ca5d35315aebadc7b 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/api-reference.html 8d6bb6661aa951d221bbd58b718712591c8d40440051f129383ccd1670f66806 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub ebd9fe2b535c84a56d6711d4cafaee4b3cf3dca5454f9111d10c663042ece8ee 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_getting_started.html 0b3a4f0ab80dd012ec1692aec044043fb3e44f6033b2444e45f83047f6c36748 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_introduction.html 3fb2ad0a4f7a64e1f756b8e3624b2af6c722e478e3b8fb2ce49760f43ff3ff27 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_overview.html 844f2ef875f4c2a4602a1f77575f503d915995cd18be225676f3907616f7be0b 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_spec.html 6759734d10db3661b4366d78700bb22d55d33ff6d7d437c7e3c615704314a87f 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1ct.html 3f975512cbfd41e3f0158af8df4e551fbb5d42dafeeef16f75bbb2f5bbb4a44f 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/404.html 0b4d5769e8b00a7a2011edadf6277eafade7a1c00743e2bdbbf523e6cb93cc69 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/api-reference.html d9a33aad3a0945a7b14c4a6adcc10ece95c84878de37bb84e7efd0f0fd350aff 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub 46d41e40793acb649ec1f31afaba5d106e49d66de5a6a44c7af68fa9b3613afb 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_getting_started.html 7e7c53d98034c579f9adbc34000246b5e61e8675b7121cbdf6a2638235a4d0c6 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_introduction.html 736ef3461353d84c19a8c658d5179a55d11e66ef6393774c29bf68f061da739d 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_overview.html 2d888aa43a4c61bd9fa44a13f425433cbed6cd20d88145f7416278e12f6c5e1a 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_spec.html e61cdfe984dd93c0c1cec0ad25c1a722424f5cdaa1122329a70831fa26dcb6e8 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1ct.html 1c33fdd408d67fbeae02edea44dd5dc368f93961baa8e7f7a601940b7164fe7f 2 @@ -2646,2 +2646,2 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/notes.html 2fc9cbca552aa960e65832a53ee13df6d0827e491aeeda43a43c1c04e0a345a1 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/search.html 9f186acc15e7aadd935dd899460c98dec587b8623cd014bb517d5b8b6497ec73 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/notes.html d10f797f53254bcae8732385c0c6382f28142673efc45e044af792b39ab6c48b 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/search.html 0af14066000e6e168789a465c75c222a4119be749873784d27d11a4a76524ca4 2 @@ -2651,2 +2651,2 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/404.html f8d9c7848f418fc91f45997630cc04fcd408836c16445766e3654fffa5f25b3d 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/api-reference.html aea5c331f41f67a40f1451a16cfb94305d28f4579ddc663cc854791be8cfc1b4 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/404.html 4aaa3b85b51d445af912bef8e6a0075f8535a48863ab59c5078ecea15e0eae9d 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/api-reference.html ac562e32f590e54c40852f7d772e1d93625a4651d5ee1ad02bd1d6f74388018f 2 @@ -2658,24 +2658,24 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/basics_chapter.html ef1c1984f1f66681de7c5198faee9938004f529430eb7e340aa2542f77a7393d 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub 3c01e56f7855ccdf0ae05f1ffce2ae1c73253e124172cac6da4adbc9041b3b8c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test_app.html f41f78ed82422e8a2761d1c96c7ca3850c0625f8747b3038dbaf9feff0f48f73 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/config_file_chapter.html edff496f329ca3d21188e4276f79d08851773732a6d7d41ec8813e009b9b8d5f 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/cover_chapter.html de0566afc8b795a3c4b2c49f1ee0fe9ddb629cb540c447ef7dd8f4ca031d16a1 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct.html 64c756d5b2ca48577f20d41d684d4762b67ac13f668f5e1cfd790bd7dfa57730 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_cover.html e48403d31b44f59f21a7017da480d19b8ef1ea128d4cc008cbd2df6d849636a9 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ftp.html 4dd3070f9ee64d3d62487fae64693040d6c862b1c92db7f9daa91a967e6a6f04 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks.html 2213d321852a794540b6a1e514c56884b2594241b3a3d6a3e61bc62fda90cabe 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks_chapter.html 636aa16eb5052496570d7b1e56c30c9f0197c731d9e662cfd19350082e42282a 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master.html 9b0cf84a8dfeda3b82e8647da60199cc637b6c4a704763feb676177fa9b0355e 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master_chapter.html 8eab525c09ac89423a4ca1654858e764f9b2bbf9f09df4f280baa7ba7d849e7e 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_netconfc.html 4c765ea91e0e4fdad9a0e165a214d0d27ea8a8da97b78439839f95b430403fdf 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test.html 4285803768dc34065a3cc2fdfea7f4ff583e0e3b5dd280ced1774013839f61fc 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test_chapter.html 8cc649c589bf3974ecde0073ed075b1213347c0717484b9cfee6d9acfe9a2ff1 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_rpc.html aeaf3ee1c7674fee0035314bce2a7dc503b5ba4762624d6c4d3f5bb9342e5abf 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_run_cmd.html 1525b8b394eae7c3d393d4a988f37d56552bff29562345eeede58954657a1ce5 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_slave.html 55c8dcf48f83d2d9b3419e650039454a23e204333ad90db525005bb3ebad5926 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_snmp.html f555a0303ee4db103ff66e1898bf3ac3264dd878435c1e6e31682667a811c5f2 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ssh.html c5e67b0574dc1413e834d33e1a0551904d08ada15cb96c761b004dee2c8a2679 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_suite.html 2254ce3528bb167ac44d491dca2e17a5fc7528e5fda792e685e13ebfbd620525 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_telnet.html ffb31f36de0a3e4aadee89e9bdf4a84a7aaa696ba161799183f0df35f68267b8 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_testspec.html fb6da6af6ddb27282280a1ec11d7192acc03af3d5142633ec944874d5b99053d 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/dependencies_chapter.html f1a906a41c0d9f9bf6f722f4a546c9019be9635b09562522302552a9f076b7c9 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/basics_chapter.html 76bdfd65f1bd3ac33ab4559fe20bfac81df81211bcbfdd2530d83b99317fe4b4 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub 476ff941b200aa039edbe95a97f9600451f76a9813f4b176646b918b36700106 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test_app.html ecc650222e9ba86883f969dcbe63e223cf262ca76b26f4e7ed4d0e34f7a34647 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/config_file_chapter.html e210028769ef7f4c3a5d498414e4a6d0f87c86cca56c51a32872ed8287e96e9f 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/cover_chapter.html 97ceffa506fc77e778c53fa9fd93d34cf7dc959326375ff804f8665d2dbc835b 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct.html 258a85442ab1ca7bf1e9250107f8415128fb5bb3f73d3b5a11c4e18224e0e46a 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_cover.html 63e8e41ec144fc744bd37da3d8f723690e083cd9f221ec2f3028dc323e21e708 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ftp.html a4ecd414fc138ae03eecf6fb34a730b82ffd5b785d0c3a3fdf4efd1eab614b89 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks.html ef9dd9a87779c62efeaafbc287fa0658697927ec9d21e537cf89f83282ef3605 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks_chapter.html 76198555a1b8dfcdd050d55c290647dcf6cb8bd2d9fd4fa3f83fffb4fc3ad561 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master.html c76fe3895970d9cabd89d8cc32312f4e02455195eb91a377c6b87445a98c6438 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master_chapter.html b55141db36f6f90b047476e89950298ff10228e0b37c8f1b2462a6d4b76a98c4 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_netconfc.html 1fdb000196b62a7471b242780834d47f29c0249e1b38ae23f684850083b4d00a 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test.html 5ef99c04c93d4b7642acca9b82fd681ccd91a99aa5ca04b7a2feead16aec5da7 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test_chapter.html b066386987a7a3851e9efa8951586dc70876fff483dd6f415086f477c658a16a 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_rpc.html f7801a95a8eee6cefe2224b67b9f78167d96447960be6e8f5f3878f93f62a582 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_run_cmd.html e9706414c53d8686ee9220f7e2f82d904288f98f43b60a54da0993a661bb90ec 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_slave.html cba772dd5129ed0042979c626a72e72fbe8ce20b1d65b46113222a0e3a7be336 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_snmp.html 9a3b809144f33bb329a80738ae11db1ab9e170c67532f8bb0cb3fad9700e91aa 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ssh.html 318658bccc4fcc527097b76c09b3a0444f8b556db1088f018a2f3b9e9f12982d 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_suite.html 1177002874a2c083d5f9f1cfd002e2af761a44f1315f5f315abfc452d33fc6ab 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_telnet.html 94201075fc69db25634fca8f3563aecda5e4af47560aed058e3d2b6fcc810530 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_testspec.html bd34984f10b282a63eb2c77558e81f8d10f2e110c5d319f6e0d965a11c104c1c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/dependencies_chapter.html 0be5096457143da97f66610de1efb2bf39ec51e189d545c7992ebc4912f7de74 2 @@ -2692,3 +2692,3 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/event_handler_chapter.html 4afab7da2c71daf7c71f8f9f0d2d9a44910cbed7061be8d9abdfc46c09bdd56c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/example_chapter.html 9411462885b6cd43f02a37453d7276ee0c6597d875d28444ebf05991e1812de9 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/getting_started_chapter.html 358143547f1bf44fe60aac02591ebfa59d1348aa60fc1d735da12bc31355e096 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/event_handler_chapter.html 43c916ee39c55cead7d6b519c70483fa3fe192409c5e57ad38998a718565bad3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/example_chapter.html aef28502693507fb00bbd853a1d2aeda723bfe69c88ee29df654da3e54172cf8 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/getting_started_chapter.html 26add0d8678e5f305adbd35a0f40d185a33508cd52ae2c3e639e06cee2c6409d 2 @@ -2696,9 +2696,9 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/install_chapter.html 877b36e93bb18b605ddfc1a4010dc39b44619fc64eef7313ecb8f0fd0fa53326 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/introduction.html 0481b341578e5708a71176b88bf52f69de5e8831b795ef488bcd569da73f5241 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/notes.html 5f63027584e3c1e7f1489efbe9307edaee7b6620c76c9bf99a03b0dcda71d947 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/run_test_chapter.html 3138c0fdcd1e1f078f59e5bdcc82fa8ccd29f8af1fd40839e273409d628235ce 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/search.html 555269662856166af6190a02072ad4a02798eae05b3a3043a98ce6052935086a 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/test_structure_chapter.html 0bcb4008ffbd7b94be5055fc6a280e52f81dea7054b7874630775d570a818379 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/unix_telnet.html 83f620675406be0a8103f1da89aa9eaa3218f8c3c78c0e1424d7aa15def11714 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/why_test_chapter.html 9dc8a5e7bb3931b4f5b31679fff8608d2d16a3d02682bef15353872178620490 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/write_test_chapter.html fbffba10c351c9e1f1050e80728bf0d9a26f9f45caeeb0c40884105a95b77d2c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/install_chapter.html 92d35888b405769eb69f90bfd312a86ff107caf6529d8ef3247539d52e4f9c13 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/introduction.html f946ad55642b36e479ec23e670c859ccb9222951060a9e81ad4f41274aa50db4 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/notes.html 05f9053e6def4146b68c01bf2f7436b784555f970422576ef1c5efb68b03a5f2 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/run_test_chapter.html 85835fa6586e4e44a6cf71a6a0583cc255aef9f9e5b22193b0bf4ff36cd5a28a 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/search.html afb2871018d8d8d9510a5fdc188c9e2b9d74b91381a4fee396f64520618d8d2c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/test_structure_chapter.html ece3dc0acdec1257e1f02668531d69cf1f2f1a513930939cdc184624be699aba 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/unix_telnet.html c09b554b6d9f6db7b2f2e9758402af559a9429b7b90ffa37e5775ef418fd6ecc 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/why_test_chapter.html 0fb83dfe13a39e9dd279ed838a79831b9cddf84f2e6a08e1e6b0c55c77a0be68 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/write_test_chapter.html e3eb309ce983653f850bf2371072fe30e6eba24c497237d25ef0221ac47d398a 2 @@ -2708,2 +2708,2 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/404.html 47f309246442ba2c7192fb0e91c348c8cce0f4f0192bae2b37da4424b4098a23 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/api-reference.html c35e96e73f17aba5cc88abff256b6da69699b8622179dd730617c062ffd1c9e9 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/404.html a07ab079440f2961c7d9391c99a566de75a012f40c62ecf56f11a3083c7ed28d 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/api-reference.html 693fd4e9da68fcbcde58381f8da917201ef46c4f35b4eaba4cae201d8f041d7c 2 @@ -2712,6 +2712,6 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/beam_ssa.html 991f922844eb45c372044f7f32362d55166d784c2341f97f1f1cb9641e2c870b 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl.html 94fa20b7792f0d95c82f5b8927205a143902d2033fd7be92af64e8897d2e4eaa 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_clauses.html 9e0991c0bd3b12933e1f4c2dad678ba1827ea52849e6c070d82b9b954eccb3f8 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_trees.html 60157047acabc6ec41dad65e3895a323b26411a2bb51d8c4c58aed83bb0d5a47 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compile.html b971a5694a301b49495a42850eff895b3e3656e31c24f70c42b6b2520cbe17e4 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub 9fe208bfd2ba100ca1ac152f733f985c3ced9e0bc63d0413da7253a897d876b8 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/beam_ssa.html b9ee265807365fccb51d9508b9d9ef3228f92c6bae4495333aa019715c6e3c77 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl.html 5c699341d14dcb61f1a19339387774d24fc31d1c8a22b0409e9ac83681cfd906 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_clauses.html e99ea08bf9dcaf063a0b45439b68cca884bd208acef3f775f9e445b03ff13e3f 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_trees.html ce08fda56f2d6ce51a56e5f2ee0d5d19b72df78e2e1217e7a41f4a832435fea0 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compile.html 79a63d63778c14b234c1feb20e99e3fafbe3d16b7c50ee8d1e775b7d6a4bd571 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub e33d56c8682a9aa5930ce66d1ab77712fcf5e2a9f92966d2f04ffb32e18f43aa 2 @@ -2729,3 +2729,3 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/notes.html 6db1b19b88c421edbaf5c883333eee6a8844f6a18d99137db96346a887c53684 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/search.html a9fd97b84440032f79cb7c99aa4898ed1208426365dcadf9dd910fe514248cb9 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/ssa_checks.html a690f15d455f41636f74ecc887320357517bccc32b192fa7ced19656ff7256bf 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/notes.html 9644ad22412c672e4da031d413a63e0d6a6753d89c710d95ee5fb735b1b53abb 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/search.html 61fd942a0983c7b5e441250a9fce2ee0e1195d938784c0f4756cf157fb925ede 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/ssa_checks.html 0bebfc2c0270d124a9a270a91642e2ac7694c31737161c5ed4aa4f5c10114a72 2 @@ -2735,3 +2735,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/404.html 741f1a970517543bce75f0ab91af7bc49bca12f27d3f6d5de34b4e73fe378ebf 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/algorithm_details.html 5923168d72e40a4fac803871235c651ec150ebd52ce993492807e12bd2175f69 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/api-reference.html 658717d96bb55039bd23677c0a59ebb992ee82b395d7abaa60450c6fb449f203 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/404.html a98fe21eb7572f17bcaf9ae08e0e27675c3412d4def892d82a6775925d659975 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/algorithm_details.html abac78404d969631d31f8848e55c05505ee908532e3ee57fa61d08d310b0cccf 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/api-reference.html 548f28ca248190986d7a3dd3aff5a8a2ce1d2ad0d24b6c11acd07e87cf4c2918 2 @@ -2740,3 +2740,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub 23efe10e9d247e1f59a4be5687ac134efd3cf779197c90c02ed124adc13de3e0 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.html 0f45d279dbef6794e721cc83f6be3d61bdef907aabc75b28c2743bffdea972b3 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto_app.html 23880b73ce66dfd0ccd332bea0e8dd85819b6d6797336e0b966a273bd95a1ee6 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub f896354248d8d800ed6b8c7b61632141f2f3243274ef357f7cb6af094e0e98bb 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.html 1a5ea0c9ec100f6eb8d30f2de6a8581cffb50d7355786202dcc02795462f60a9 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto_app.html cd2973bc2029d957c2e376a3bb43030ed7b1fb3ea4bb1785ecfd2a39fa3be5a5 2 @@ -2753,3 +2753,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_keys.html 4d2d46ea506eba69cc5e82db8e84e6c61f9e5e6184120f574f741435edf0bb22 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_load.html ca4ec7407f745b2de82a681a7814ec6c852caa093d6e8331c65a3eb61186f0f0 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/fips.html edd76b3b25a9b210023a77ea2750df81da5ba60644f07645fd19645c21f23ee2 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_keys.html 0e8dd073bd617b8cb3930ee4ef33c62378c7ac689f545107ae5d2884c1fbdbb5 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_load.html 7abac87bcb6b3aac520916fb2dc72d6e92a448b8038e181982850072216ede09 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/fips.html 4e10545a12db49d88ca460c9059600538c8a4c7dfacdb2049becc633b289302c 2 @@ -2757,3 +2757,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/new_api.html 474d86ef7447b70b8e54c349bcf499c9c3ec7a41b71c88801ab58c9de9090735 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/notes.html 83c109d243d2ec95ab6ee93c43b3074a6f6ec2596568735e9a70b2c9ad7a03c1 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/search.html e04abbff251f854b0e956160072e9c06a1d2da65651dd8550e8d90ec5707b258 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/new_api.html 05aa96587aa1b52e9b88b19db849bc82782f6138521cf23b5278b5663ddfb7ef 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/notes.html fa539ab49b29f01310e1733696cad4b5222eec80b2a16033cf7bf31d91e9b4c0 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/search.html eb2a7782a984a1dec41baa0e06aae2d216d7147bd6378e11da4c4ecfe8ea0aab 2 @@ -2763,2 +2763,2 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 4bd8cf1152141ab55358d654c4b29a4f1a7cd6e1f41094b12c6fe7cc30ee534b 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html ab7259894f23e57fe2ff4dc124891988d8eebfd9acf6f70e470c9aaac7045cbf 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 5c1930a2d804b5cd4a4ceed8a6b87fec3802f0e55295800f331d1f4cbef67370 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 10c33b454d0d3077c5bba35d72ab119ad55e7ee897b87375ea2c2f8d31262220 2 @@ -2774,3 +2774,3 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub 755eb9656014358fe32d45bbc1eeed44a8c364154a8aeb6378802b16ddbe1df1 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html 90a28615a3167cffbb3f81cfc1f9e131a0c0c31a4dae95ff32c63d5979b24c74 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 5f39f698922a40e5fba2beee184c3bfed3d7f2f6b90bdd7e82037e9c2173c046 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub a1c4f3ca16d8248f5aa127c87e6ff0029bbe599700ef4fc54b873c714654279f 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html 52db8009fee99a3f75f0427f4126fa9cdf776aa28af62b85aa96b133ea1f96b6 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 75722b978f618ef660557f5ba93d46acad81da3d07430796a75e30a9c4f7f841 2 @@ -2787 +2787 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html 96e6dea0dc763a0a41a745f2b88d7b027f42ea456c0ee47ec8d7f968faee42b5 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html 050fabce5b07e90b151a6091edf78fb6e19b15851bc53befa311a19c52ef37a2 2 @@ -2789,4 +2789,4 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html da40f0b927c5271ab29594b9c931aabd3b1de132a88cf6e2489302c051eee31b 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html a5bfa2a5fc4505c2f8f479b82d14ea3e3ccb5cecb2570847273dc793bfc0e3a6 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html fad98631968d53e84cc1fb362edcda1722756191eae4cc48d6e9cf85cc22338b 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html 14e1471cb52523f675c55cff07d3fc93c3ea7441d2e4b3dc8cd114a1c7b22fc6 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 9b675e899f8459ef40392e7f8fa9356b87204944f2e2f424fd9f3692f5f3a9fb 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html 076aa27afda00493e196a526e2fbefcbdde170f03b279bc90f77ed3cc1c3ee9d 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html 6e0b25f7d87dca61adc8c90e484b49374e3223455dac6aa411559a7104faed2b 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html a6ad7225588a05af2a651af7b70b8e6979c3dbd99e6883fd23349c153fece44e 2 @@ -2796,2 +2796,2 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html ab9ff89b6d9673222cd0ec1808cb1cb0467c33e743c0bae3c105314a0a5786c1 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 2359eeb6382517c5620abbfd5d21cc4a26c5d584ef6cb892126f54acad757329 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html fd550f34ee9e40681341b98e1615b7bb69dd8b640e53bc7b7f43fed3f60df512 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html ca5c5d66dab1ad3bf1d17879c8f7a292c25b0a9e48e17f6ec51fd9814c98c752 2 @@ -2800,3 +2800,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub e9065eff9bc63628e70e63e597d7418aa1e8cbb8b88c606ee480cfaab877b229 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 32d605ca901c21abe2fdea2d6eb74fc98f3fc60b91b1ba5d774242ed4fbc2be1 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 9523e6c6f1b3e950cc6a63c5b8de04a2acd03b6f2c9a4e53f99444dff8b53366 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub b9ef3bdbfacfd4b77dab51d38e5c555bb060186c930dacb6fe493da5f82d7339 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 574979cf762c1f89f561cf5f223e509d24b53eb18ea672b372b35703ea0c9c22 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 72311882ed5bfb7b836dfedbebf41dba71bcc121979c8435637d139c199a1420 2 @@ -2814,3 +2814,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 40d1ca846085b3bfcaf1c6f0ec91519b9c304b6534463a75548009266aa041ec 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html a37e38db01586c43651f0e07793cfccf428ac41aeb42793b5a20f98a3f272ada 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 263f08cf7f5d92b303c576a390358dc0a0ec82384eb9cf8da518974a009bc4b3 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html b412328edf397ae40becd9e03eca01abe9b6b64457d8465a2768bb1076a7ec3c 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html 85c913eaed62f835902b6dc287bac6c1a6d2936869adfdfc7c3dbfea79560d00 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 85d079a89de7a1db7ec326173f9114f6d043c713da23b0c20262a5cd472f972c 2 @@ -2838,2 +2838,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/404.html 162717d52fda79c3dc2c6fa3abd5ebe0dc30ed652015e70bc857bd99ead35d81 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/api-reference.html 5be343b96b2310d40b56ff3168214c99cf0546915e6a8c2734a1612adb6f6ae4 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/404.html 6e8d660d99150448604caa171e1c230641ad7b882c9fbf4218e80ebaa3cca142 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/api-reference.html 0efe9252b6165916d5f2debdf9d62b9d84668cb2aa809401dea1afb4dfeef9c8 2 @@ -2842,15 +2842,15 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub 7cd6156a9c1f3321f12d41779333b0a7a8158158b70f1568642004da6f43daff 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.html 0bbaa2c3c6e050e8193cae9865f6935bbad417c4b19f3aeb0c7663a8de278c52 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_app.html b915d4ada751c1bac06bcbb18aa6c164592011fdf5523926a6859ec0589adafa 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_codec.html 318ce5fa4a820bb072671609e41b788bc5c436a6fd3688b17204819a0c494143 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_dict.html cd743156b0c83313cd7d00d9c083b06302837e5356b71f5ea726e38ea04bf6e5 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_examples.html 0131af3a2b0572bca967c0f23bd50573a96eb5be38444517768f4383944e1e3d 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_intro.html 3c7abd9159919a3ecc96dd8229ccf8bdc9329a9c14857a7fb384c776b2f61cb5 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_make.html 3c772b9f84aed0517154e2384fd4b4d57262f9441e68fb1ee66960bbd2f41001 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_sctp.html 27bdad7d5fdb8938be36e47240b68b539978e97079d1cbd0d000b371a715be14 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_service.html 9528c70f876b6634a800021de3f01b94f5b01af90932310468f3b1e6d85774b4 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_soc.html 0bdea9831a1cb513300b56820f80b932391fa1dabac3e1ad1ba91eb2a184cfab 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_tcp.html 3d24c65c54d8434708ae75f56fb588c922993b272a1372433cc084b449fdd856 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_transport.html bf640b3374b57ad63d8d9d576e17876f482a3e2929a3e8196162271a9bd2d309 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_using.html c2e4b47187d67741fdb4a8a274a441ba95168010a799c8a14b3605fdff9d3fec 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameterc_cmd.html a54c9f41592172fbe603e8624427c28a7ebe8eb9e0d9d8bd5465c156f1492c25 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub c8b83d7c2b8be5ebc530cfbf679ce589afa3fd5ad9e90b2283d65d52a12307de 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.html 5ec853f7be1e7ebb9d93d90d85ec25893d93a77cafe9486a5f57754c3501c3a1 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_app.html c13757dbb7e821495d401910df86ea43f16464f4fc6f568e90ee619e0f2abc9e 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_codec.html 2223016ce70c3ec699a189806ceddc158d6e4892206e1c8c82686e6ae6a32830 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_dict.html b7eed02193ae755a29a8dd9b58fdb840da7e46d709637cdf34d9d5ac367d2a32 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_examples.html b61acfc379f2f424980aad2097e15990e800cf6b49ae4cdfce88834cfab81ec8 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_intro.html 2ddad7963719ed3d937a9b95656972f3b0f5c6b4e97083e411d2938f3a73a56c 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_make.html 90ac4ba68eb4f48c082d80d5d4d95f3597c7cefafb9d5ef9b8adf0a604dfac61 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_sctp.html 6628f05fdf34d437f00e8beeaeb70d3f2cbd5b165c6ed4c8c08b2eb9b82f70d9 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_service.html 02c5139d8ecaaa5c8305336ec3aa98136840edf9a3fe8cdc9fbce27c1954e7dd 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_soc.html 87c4069c395e9dea98e9c7b21dbdd0dfb41338b771faa036e3bb6395efb5a946 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_tcp.html a0eb989cbdb5ef4cd943dc2a381b96d65bfed7ce3a8fb6a465be94eb5df25408 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_transport.html 6a03715b6e607b0cd8f711494595e117c72e3522fe0d1ce0e3d9306252dd48ef 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_using.html d7b3f499ce5811eea413cbe52da3052f0650c1b9f968c20ab11aedb27226009d 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameterc_cmd.html fe68c4b1ae86b7da16a995d7728a108b8ef73fcda33cba76bbfa4c6ddb0ce306 2 @@ -2868,2 +2868,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/notes.html f3ce662e910b6d7cdee2cf38ef1bcd2bca9cbaaa6b07fa4cad9d3e215b190fe1 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/search.html 468b850876f3d12156881cd199d2b15be099fcfa4c6ecb36f484538dd8654892 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/notes.html 2b17ad59ccda399d841735b30c002acb1dbebca58bf333e1e886b3933e3a86e9 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/search.html 3f173997574e9f8efa9d71ae89e2aa19da9277838e378f5443cf8ee6c99716ad 2 @@ -2877,2 +2877,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html 62a39b13d2c8e3ba7d870d44832a997f86918969ed43d81468788cd4e45edcc9 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html bc5657f0048606ee29a66002de60932dad42f7a8b8be6c8b8890d96ff2191a49 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html ca7c04c58505fa69d8ce17d992fb6ca03bc222c62122f7a5f1d1338faac9b700 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html 7661c804f56c8ed6bc601f624ddfec4ed376f1a52ca3536450f73d468075af27 2 @@ -2883 +2883 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 5e78ef84810641b1bb18a33cc19fcb6e58168a9ece45412957dbf3012d7a405b 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 5932ce4896bdf08671a68218093bfc2a49ae4a416ac934263ab2e5db3c07f4b8 2 @@ -2892 +2892 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-272F0D3A.js 3a4045da150f72c1f456e14ce8d9f0074f3a8039fde1c526634637d5b38bb0c8 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-D25CF93C.js 46b41f3001c977236d6fecc7c29aa4596d9cfbd39f44881f2c924242601dedd7 2 @@ -2894,12 +2894,12 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 3909eb862ff666799227589cf49e92950b67562f65f6f767296df8c35c88f5e2 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html bcd0616173baf5086eaef0f70cea1aa21749546896f370a190f44fa88da8bfb6 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 9af324566901cfd7c4653809bccd079b15006123d3d6c88b601271e0a42f5c61 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html e23d7ca04a5a2c096bfe7d77fbaefb45f8594586d318e6ef8debba0519391fb9 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html 3787540bf783ffca191442922692eb17e0e503123a50c486957165686b37d30b 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 18aaed2489cba53413b48b18a8f9d610219f904f71e5c4803585f00cb6921bb6 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 5f2ba2f40f593db28ef85f26d1a10fd56bf8483086bed60bb442755965327f96 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html 4b6904400cc917ed870fda7a3b69c22e8b2b4b31603503a5e6184dcc72c35878 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 1b0b994e91f2bece975c92fae25a23f4234a8f5c7fa7a6dafd69b543cd94da2e 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 2a413f2994d21ea31734612f06e489e0b546a90749fc6854917a977aaafd6f66 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 64010947789a7997a7817109feeb4d7887aadc94ff8aeca1edbaafe39776eb21 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 8019c7da041074fab651209e4feb957a3c1554d4772408177cfe1e611092eef8 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 0fc6e560b7e2680a0a2f49f6f7d0d384e13e53fc44dee4d08315e88163d2ac31 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 42adea479a562de6ecf10f0dd63b5a7d593c7ac66e14cf0377afd5d171de0f31 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html b3fd818693ae15464ccf36743bd43e08592508ccb9165d4b34cfd7b0d2b4e479 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html d5a5e35d329ffc060132dcd94abc69ce85aefe64b92fc3c76ede63d66114f865 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html f9307516aabec752d651fab18ea482a66af9713adf5ba5ad16bc29392a75c720 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 9417f5a3444f4e4f1a7fb9c071abde07a6268d67c49d04ae43f8a9d06cfa649b 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 1108d0069867a1e3ef21d949e508134e7ca198f01e7e78d644f79ca2d3d259f8 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html 1b854c0fadb31c807d1f1f6b057534ce0668e25de8b87e00e158dff0c2a8b766 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html c37e40bb4a2ab47792b5130cee0fc7e5c788022b962e0346cb1a4e755921470d 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 7df262502be70e366b1bf9437618b925284cac06e0ffa8d2f8701d9ec6f7735d 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 9c652ea0c6f018f5af3b1cf7bdc805805bf739bd676cdbadaf47476cf5bf42c7 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 1a30d27930d1b539d2faed94cdf36855f1461d67f64abae996cc21d6d50c4743 2 @@ -2907,2 +2907,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html a2f2804e32200f5967610770b238cbcd2694ee44d4c353b5c94336fce2f07cde 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 9783113130c2461bec1a37dbbd4cd023cd0bfc90919645521fa2e4ad6c68b078 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 4b515a9be2bf0c7a8aaf4292b34e3989cb0dc22c723b409b303a6bc3a3e16cad 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 1c8c5fd0fbd7c5b63ee7f90e193df0a561a2f42f52927cc9b51aa2d1cf80216d 2 @@ -2912,2 +2912,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 0ea8f5a884816379b30d5a1fd55b1451c66b27f704edf98bdf8055d1f2f54c1e 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 4843ea3834e452b49292a62447af9562ca8e1a159c54e630df50704d3d51caee 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 72cba3e46a20283042847514641728d813a4b527bf9328101bc9bb50ca60d1fa 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 617ada7aaac6ec252cece5781bade8d1087ae732e1bd993c03bfc1463f67b329 2 @@ -2926,2 +2926,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub 5a57973e13d6c7ea9a98b7b6d69ef87d86fc21cffc999fcab0eeb1f4492b5986 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html ed0b3ec57b6b59d0f99681646567dd305f79476709cc7f55b76416698c22ef77 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub af4aabf1cb10962b5798444aeac7d691ed33dfc105ddc2dc8c2e049cadfde9b5 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html 1f006216cbc8c3f08b041565f594ecb6fe3d2d1eff4e233396dacade8c49e04c 2 @@ -2929,2 +2929,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 5ee573541c4b71516a6c766e857609f9e94e5b8f24706a57717d224fcbe61838 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 749c74b7e01f47537952781cdc0ff1e337e8c4b7b8601d08afb89706c8ecd98e 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 104ee765ca1424b9a61b092f11199e02c59d6bd5c78038a4c06f661d196745c9 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 0d545e3c45ec7cfef107d06145f616f0600f1078ab6caf2db69d3951a5364da5 2 @@ -2934 +2934 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/404.html 75fcec6f19f0de2112194d785a6ec98e066cc1dfe3d71d0772977b078201d977 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/404.html 0c7f02cc9f388d2064c4911f906d487a0cf4277971c7955e3d0f43d31c8f3060 2 @@ -2947,6 +2947,6 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei.html a52680c476c72f95b8e2eec51b880a18a76eee044b15da93cba6335e17e08943 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei_connect.html 283f90948f16b6121cb975eccb64a8100c6168b650ee4d05b751e87a4915020a 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei_global.html 20c5c9fc4e3e94ed55bc59481fb742a2136ff9ae965466807a54c6d16f8d2d9d 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei_users_guide.html 78d3e9c47351c2822b86b64bfeb8b38deeb5841300d31d593d277b13e8033589 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_call_cmd.html 38149e9eaf2a1daf3599dc58c18cb4023d066221811d560979e6008d247bf4f1 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub afba4e99f771a9475858869aa069083bad7bcda6571ec8540ce4df128b57bb5c 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei.html d4a475b1f6fa484e2643728cb37cd3baf76725c97daa260abd9e5f325079a130 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei_connect.html cdc124f02a5c898a01e85c6bd79ecb7469df4b1ec608932fa839e7ad0d1c052c 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei_global.html aea908ed4d0c50a9433e328ec8399b115b3a067fd02ce28d18f8a57caf9243bf 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei_users_guide.html ab3a1f9699ef0e529772662d8cdbd5974179f3d50055d0ed5e40c1ba90d43314 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_call_cmd.html 8cf09981fa1fbdfab84a8b41f863c375f789e8d2642766a102c2b588db6a640e 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub 3042c5a473308c7e843a5c4c295af95a1e1aa7400d2fdfc0914962dc848e1623 2 @@ -2954,2 +2954,2 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/notes.html 838b3ba90e2b9ed66ef2f558d2df10fbbe9be6965dbc18e14468f44e263b41d4 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/search.html 5501f1bc38240a2e2fbd28fcc76bbc75edc71e22774794fa398e2ad539a1c4af 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/notes.html bfcf56b709b40f6d98a9519c1bd1ea0069a4d6ee87a8a0634736b438ea3e47a2 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/search.html 547c6f65c0407aa1e25a1fcb0aeec5a201de8dfd6ac5fe91cc0ce0c54af8ba17 2 @@ -2963,2 +2963,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/404.html fd3d63e1c86c68cf15682b4915d5522bca8f4d0ae624f47225f944033ed314d9 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/api-reference.html f4e8a9a62d6dafa37cb3ae9f322ea625c9ba58f558574a7bb76b6093a848f0f6 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/404.html b677db8d4db92e5c4e6c56e33fa51975422dc431f66b563bbd5e0d853c10c2a7 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/api-reference.html 04da60ea86543a5cc58e876e7662318c8097f7b2bca209c556c10f01317be569 2 @@ -2988,9 +2988,9 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et.epub a9c48f76e42da41ac8cca88e94e140e81f976500481e34d14b006ff3745e3e9e 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et.html d121c85348457db4ef628338bf4687f4f34ed4d488361a5fb500f95d243b0722 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_collector.html 0016680d36e7a814061857cbe8bf80ba4449208ec397195fa771786908d3123e 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_desc.html 92da55dd805f9350f979e17eab96277c85af7d8f44f65bd18a97990dab266cfd 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_examples.html 5c86e9836527178e2501e630fb04492c3a5e476701660c9066db18387f1c3da9 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_intro.html ff71dfdeac0424a336b77babe05061af2b8baadcdd68acfb9ff3932de04d73fc 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_selector.html d9809dd906cb0a97e5b92a68897cd1fba911091d9599c020d4672d98ce41f2df 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_tutorial.html 96c713351b06352fe2ce0da3e37b4752f44106ea8855e4877ccc0d7e60e3f3d7 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_viewer.html e4481ceb09d5086898fecf96093e07004b2c457696232d4e32206e73fc13c23e 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et.epub 24c535c3175cb1d1614211618e7109c8256b8ef6ea2cf16171a2bffb15ae9092 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et.html 69cb1fb8d3cb11c0c2c50bf569484b77a3c396375224ee38295440c2e30d0934 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_collector.html 06daff84c45378601b204d43039cab752c73ff7c0198d6070f1c4a81b6f0741e 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_desc.html a96029de38ad96b8085716a201ea4defb5c64a94bca6c8c121ac2799c8ef0c15 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_examples.html 5a00f8864ce9c0aaee59bb4d87e893bf4201d7882ff35665985b09555aecd538 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_intro.html 9ed09b66cc586265eabeea8238cf45d15049f7ea14e9d5af0542781146bda37b 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_selector.html 0c32cbfc97b0a26a47834d5d17e99e1b60e265f7db0e7a7f9a725b574f8df2ab 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_tutorial.html 63519be96fe8ebdcd6b56d878e4bcd0dd244bd41b4aa134b8b99b5fa27a4b1a8 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/et_viewer.html d3a238c44c4a2eadd4db5a56dd79edfff9b7182257a718193684fdde637977db 2 @@ -2998,2 +2998,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/notes.html 76f733f7bff3bc4738379f911a079fa5b73745a0b50e7d1726f0c02fc358a863 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/search.html 9fb08b9e40ce7c3c85a79af1783dd4c43e963dded643f1a65bd90d05f8625288 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/notes.html ab0a7314416115feca5e20a1c3f3acb0fa54eb786c65f89c78204b1dd95f954b 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.3/doc/html/search.html 8877d77465387827608a7dfb2f3a5d21cb3b514aad76817064679be27a30d839 2 @@ -3006,2 +3006,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/404.html 80f3fa7d5fb7d0e06790a77108321315f7acad56acb05740597acdf379ffffc1 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/api-reference.html 0637092f6de7e6d1b243d9445fb0f235fa34d868829522fbee1774bf4494826a 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/404.html c6ac0dad4ac1530a8ff93880e801076be2543da37fc296d685de9689605f1416 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/api-reference.html ab96b99821284fd57a9c5f446ea676813f90219d355b3a994955af999bad012c 2 @@ -3010 +3010 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/chapter.html be9facacad4e7f98147587c36d4bf1845f9c3bf085374320d1f577be50a7db1d 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/chapter.html 21acbcad31de90ae4d75cb4be039534873d4e112b6ba151380c73c3a2930a793 2 @@ -3021,3 +3021,3 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/eunit.epub 5c0b293cba716a93d7aab70766760fea5161f43a292186b1773cd459972da698 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/eunit.html bbe94e3ec0ea5251a48777959f65c82e183ba27b744b07ce0b476e466eae43c2 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/eunit_surefire.html ec64ddeaed1f08a3e8adcb3ef1b14602ea75f89f66eee872178f596ff21da91d 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/eunit.epub f958b946ffcb440aed4a204dae804c9157e3847df55adb425b6edf8f47a763a5 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/eunit.html eaec3cd95ca9772618361c2d6cbfd4d09b10139080802cdb25a579124ecf2523 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/eunit_surefire.html 10555da88a04a821709b4dccb6cc321e322ae849923bc37d994dd5c77f758cf1 2 @@ -3025,2 +3025,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/notes.html f1fcd317b36178d981825e273b6584d1ab4882d017be92aee75e6aab78509d81 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/search.html c3bb62c1d11cb78923bac30ad08b6a0de9e042fb532eb38b141e05ddf28b87ab 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/notes.html 53d4de1ea9da45d80d8bc017ee448c2da1060674b86c82e1a1fef8d28417f5a2 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10.2/doc/html/search.html d3d0888808c15c565e95b66e48c7fd4c195837c2165d82defe9fd801e633d7b3 2 @@ -3030,2 +3030,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/404.html fe442f916a761375ecdb11ef7a551191e82d9d58444d5ea9131be797a0faddd7 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/api-reference.html 294c6b5ea46b09cef3fc051093c8fd50bb58e6bc165021e2e36484baa73973d7 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/404.html e81d83d83bed7b9591e8fdaa3aaa20d75d98949f20ca5e0d4dc2e72279f25a1f 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/api-reference.html a653c14d9617703d2ea10f03e7e9ed2d7c3398f7e2078af3de5d5cf6397d07e3 2 @@ -3044,3 +3044,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub fe4ae7117c94653091a12b2b574fb00fac3afd1d4a216c784b0db6085a559733 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html 29f4f96064673c9473e30a8092c5e50ac53354f9540c0088cfd2987de41ba277 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html a80366343519540bc053fc301a8b6a089f5fff6e107eab018fddc85a7ad24b46 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub f2583115709ba8efc5658b26697bde3a82a95c606dab59b6106ec3d11786c24a 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html 9a5a7bde5c7d3cdb21ef8c45b8e20589ee7869e8df2139a1bcad2dfb1b46c682 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html 903f7f9eabcfc045235a25c878e778d1e5e36c645773eb86ae8f48d309b99aba 2 @@ -3048,3 +3048,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/introduction.html 2e3b2180735040aecc8b6f658d8c37f0f69276d5c733bc9f66b859ea9f140a6a 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/notes.html 6b7f96ed152ee08d47bf9916d5b6571325675f54021e8d341714a83c5f7c332d 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/search.html 4693fffa4c0d2beb7242bf012d49e91af74e538390ed756690e5fb92b73bafb2 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/introduction.html 6ad2f08e410b6d4f3365470389b2ed96e038eb3dc412032db25022b6188a4347 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/notes.html 4b4fb11abc9330b93ea754148e3de5f35a407907f78f9970a2ee570d49e5e51b 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/search.html 79e26f87ab50ce3f93ae48585fdced6f9cd90b9240de00df58814c398cef7080 2 @@ -3184,2 +3184,2 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/404.html 0008e35469b9a106096d6bce9a14f567751e4c6fbb95ba2660ecf6a1ad64a45f 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/api-reference.html dd4c4cbd790eec7ceb50f1be3e267f49cb1c8d650e53e0f2bf2762b3b282bf0f 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/404.html 273b85dd7e823601e5820e525197159c7d11a7e3dce461243dd441d21e6f8fc6 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/api-reference.html 509a2fb2e4022fe937ad1bd155f263dfbfe5cfd8a586cdebfbc1a1e8a7443f7f 2 @@ -3198,8 +3198,8 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/http_client.html 282fc462d0c41323b2706be5b8a3f1a94cec8740047194ba388e6374076e46fb 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/http_server.html 419d38e5f9dc99cb297337393c1f23a925c0170ee8caabdaa803c61145a05704 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/http_uri.html 8d6ca1c8880caddf5691322d9977139e1c6942a0ad6eaa398e738a518d3a096e 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpc.html 768e4ccc4bb712de6af09a1f7a33b1ed479cdc72ccbddfce01c6420e439be092 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd.html 0f9063b97d46f99a8503410cc50eea7a9ee81fe64510c81b81b3b4c7180acfac 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_custom_api.html e2599c7c0d0aab84b7835f7b7e03b884c82baf736d813be3458b31660e406dd5 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_socket.html 1d2c01a567a6355c0ffdb227a4bbf6add7de8179c8654d0a619a144973707d2a 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_util.html d744ac6014ed42d318e9fd5f8c752e67391689ca0cc899aa26efddc73639016c 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/http_client.html 38a213fb10912a4109dee71b85417826fcf713bbb432fefdcf6b77e97fc0ac85 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/http_server.html d8ca390f9acc25ed7742226c33d5890aa262425b305229599b2f580874367e8a 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/http_uri.html 0627e0e1f92fff21ad5c977a45c8ca197cdf8261f634223d0dc2cf62b476c230 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpc.html 2188cd02413a1b90c042975f8300851aa999abad4e765f6d2ff7518eaa86fbae 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd.html 7bb3177a3b42a7a52ea9d6d1828464f2050bfc84f3a3fa7c4371dd66941fd159 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_custom_api.html f988e44e07885d117126476d5af06a2823b9f8400f7f49212e792b1e2fdcf874 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_socket.html b267868c579eabcd440eb139855c6ea4da5a812ff099d5b58a7c9079c6c80827 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_util.html ea1ca2980f5d464d81a86a9de6782c68b172a7cb244677dd01217ac8aff1ef19 2 @@ -3207,10 +3207,10 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub 212a37adec59cbfbb7bfa55af4b246e9197a562019fb32580baf58fea71776f0 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.html 9e8c29044568be389688ea6bc538a14cc7b9a0178e84af0ac4e468bd221d3b91 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets_services.html 5597e27e266196105f4570e245c9df2dd4037e9c4bcdd588a70c5930809a843a 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/introduction.html b2554a6b77ce36cc7fe9a8f0453f233178f0d31ee7fbb78ef9ff1e34ce2e6f7c 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/mod_alias.html d3d0f66d28427999314f7e439de6bd905300aafc7edfb9cb2908ef542d3d611e 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/mod_auth.html db4f1fff9a639c8c571fb2a891520c89466bce5bd698c75db7c36e4bf4514d1f 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/mod_esi.html 06216130ac4d7bfb06598c2e927d8c017b0aaa78feb1cb0dd6f0c8e1509930f9 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/mod_security.html 6ad5acfe42f06ac59fed69952c3631ad04281a793f3c486ed1d8bad7b2089f7a 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/notes.html 83806db831806484c2096aa1c6852e0425b2b29488579bf5aca770c4ef177611 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/search.html 9e886d4b709507c909222bdee6729d60b6eeb6a2d2036159d8ee7b2a156ba927 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub 7f1e9f6731e39ffa7013f4ce10e9698191b8efd88629a42113ca8cff02f8a37e 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.html d647203ad9dd563482b899b35ee1938861fba073c4d726b99faf1958de5e6492 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets_services.html fc7a361d242a02511b8f7ce4016f7edcdc1fc9c5f11b54f0f8928b81244a1cff 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/introduction.html f4e7914a8e235698d603991832b68f34ef022a228e20f263700835e13fe306a2 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/mod_alias.html 47f35d072148851484972707c1c954674a835cff7b5a2fe2624c9ccfd977bfbf 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/mod_auth.html bebae92a7368084269cef9ef3333f4890b3e75615a57646abe202b0d4fe2f080 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/mod_esi.html 3f8d1ebbea346d68fea2d746dd8e708a096f6bed47930aec71fd9567470a9c4b 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/mod_security.html be537a3a299256ce7987d98873207ea053e9e50dcb978f929163c3607c75f9a1 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/notes.html 98c87a896d82acf293930c489d9e06274ba3cc8d03b57233d1313e224cf857c0 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/search.html a6b4fa95d1a646b845411032dbea62c938f784bbe0ab63b33a1bea59d685cf34 2 @@ -3220 +3220 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/404.html 064ed627db3ef9ed3aaf76b420d236a851f34e28e935082d1432241533a8cfbd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/404.html 4b04be73191b4ce3aeb40548ff5cb1cdafb47f16dce2521fa69f1cc7209f6d4a 2 @@ -3223,2 +3223,2 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allclasses-index.html e3e1d4a6f41f6154ad19f3db5ff75cc636d0128edd978a0b8160ad4f00dfb366 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allpackages-index.html 223bed5af7965c1208e94b7910a537fbaecf5de87caf29004b0dd0addfe741dc 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allclasses-index.html 28e8b859aebe0b32833856a8a5fdf5a24c11f671e2c83fa3b47b9bda55ca2e8a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allpackages-index.html 1cc02dcb808437a520ab273a2777851577d65c37fe07e70f1f2765a2a1662532 2 @@ -3229,61 +3229,61 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html dec03432fea41245780dd16098cfb0f103691cf2df9d8ce496d51baa9297aa7a 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html 331b29d12bfbb72b59d13a37706e4b8d451c57e553267acfebf5c192a77e7fa7 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html 70d4652e87727a0ad7d220c0efc8dc09734118734646df3b9e961f401909061e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html a0b0e3dd955a91fe49d5950d09e5da2919839afc153fddf7af647bc589b693e5 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html 012eda87c42ab274953127337b1f6058093499d1f1f180cc22609a1fe2dbfb8b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html 8784bd83611eddf441edb1fcbae05a482714ff741e0e026797d277b6604db9dc 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html 0289fb07850258fce62e3161503be11de0523cf4c59ebe0810df7c67d56f9300 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html 41ab636dbe554b944c462a8ec05f7cc7b73862bb566528372a33f25a01295d89 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html 04c2c52753ae362047f324a3943f4c998bc407d990fe2965a6659bb90eece1ec 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html 141336bfdd1d0139f4fa3d9e411d2f74454b05722fe58317052296f167b76346 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html de0643cefc9939ef34c3a453e529b5d70b663fff7eedcce4cdd798148a2b0f1c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html 85eefad0aed408294e602445442f6c707e4e33e489f4a0409029f49c15efbc73 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html 03a23e34e5c646f6862410259640c8dace1ea8dd163fbff58a2de4cf8a9251bd 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html 8e9e8a87b98ba38196cde37d987d2e35cd6abe58dac15492f2e2dd2345cbd3e4 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html 33ed9c157aa0298e1ae63a84471f8af2133bc1dc583ff2b1d13dde9a0e0bb3d1 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html 01c24a7eaa568b1b3f8c70f5eaa1eea38deba838abe2fff034864a9a930812d1 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html 2c2de9c9b0e62d33da3500b4674d4f0f2cba8ebfa49275dbbc4e6be0e9e0f230 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html 761877954bb57e198fb59c45f614c6ee3be01fb45c8d1da9c5bdf8f781038d49 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html 84b22ec7b97c95e5e2090219478e549af0bcdb1ba4c1aee8257dc975fe50bc6a 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html 75b1074020ea5c62dc07a114fc29f8214b959c4b7de19eb49470e9e9d1d47b61 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html 9c078b98a3e571cc4827961d0d21f6f410f284be9309e2f97ac15f5244ae4310 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html 2e117c1d01fb98692ab5c95415b0ee809b88e0daa957cfb680d8eaf20b4a58c3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html 90d98a18755bf2aaf1bc80ee2853ce8d3278d56ac48d596c57a758c416e0c183 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html 9a3ddbc22c242c49ebda752216114db845c9ab1100649a2906f87742d6c20cfc 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html 578b955218b973a28c2ebfb55d7aa8a7d5cdbfbae88cf2d23c1e862f51f27d6c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html 1eb214e353b5671347629182cfaf08383f3192516da9946632cf475e0f56eb50 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html f9b505e942054919cbcd6b8a773bd975fdb64a60c20881e4aa630ba2aa00829b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html 30121212fa8f99aba5864c5f0b8aea262ee8b7d61055da10d89abc1cfb1997c0 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html 1ab28ccee21bfe2918b010688fe5022df0ad91b3b8b67679ade9e09eac5bef7e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html a47cbb1d00d22e6c5f6ca8c0ba0dfbaa4dd47b81b35a56cf83ee90ba1611765c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html 989522767a5fb59ac497927ef710de1b16af1ab1855da25a3ed00046998c9f8e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html 873f47476476518f911cebfa88d54657f214671d3e136ae3c2a5bab87d1ba689 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html 70a873a3c37fd9b9b9315f9f7653f9b6b58d543a744ea33b665e1fc1b9c61aef 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html aaef0bad8f5512893142114f82ac3773c03471c95da8cbe02a0aa5db4a618c58 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html d7982c987bda0a86b6dfb504e150814c9fe4632c76e4c2b4e1f77450a8d43a6e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html ee8efb760928e8a4fe9b512b6ef165c1f5baf26c85662dc4751b152b1cc40540 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html 10bec5b775a3a705c9294ceb5b5b96eaa0ed24f21d17c8d0e3c39bced1829824 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html 685300bfad806e2b2b84b3d05008e3446e0958a39058d38d4fbeecb880e1a87e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html 0e060f0fd389a2046081ca4cde615b2a1ae2afb8841c52caa81a4a34b4121143 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html ae5af9d209d2536fb907380fa350783baa58d2db4760d5580575175fdc179afa 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html 0ff008a507aea414899cf6acbe2c0b2a2ec39b9e755227c72ed8f1b2167aa86b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html 50992e895d92130431ca1ec2c25bba65037a8ff3f530b708578ed71ad752ab4e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html 3d138202c7fb5736fb1c9bbcd083d77527667d7b01b2b6374d2a3d292c7a06f6 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html a9642b4a89cfdfbbf73f140d8efb4056af7043b559e1a85dd73fac8e2c9db0c8 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html 2334a5a9f3b39e7d3f8e85ab4b2d72fb18a42b0548ea650692ffc95fd8d6ec1a 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html 84fdc716b6554e7a73694f4f7aed43ca06b1d6215d6f3f1edfb653f7367f2d90 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html 928e38d2d7a37314b677fde3dcd97234205a347a97cc07fe3d7e280ba3964882 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html 08156ffeb11589c7353e29787d4ccb15dcc3924f829d3125898dd15633278861 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html 8eb45367d9a4085e9ec2e42ed6110dc3e7de267c79f76e8176933fb2093322ce 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html 310bc9b3b2d20db38fdab81d44a09c4701ab81ffc6ab75015fd4b6bbc12c3fc6 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html 0ab849c1ddb4a6280db083f40c1e6aab38e3574e514c05771ab3e409133f6aa3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html a0c20a1742810f7d480eb6ecb70045b1419f9ddef43995a078a82c64ebd7957f 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html 8be566dcc84452414aed10614fd67c5eda6e1e81ca8f3fda26837844aecf25b3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html 6307b9e1c5042496c638ce25e93c427d33cd2aac5ee4b384ab542e3a853ce0b0 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html d1eb0426cb1547d563ab37949b68938610d9f7009f19904b240ffb32abaf9180 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html 6d72163ea42f2ea1fdf13d5c848562dcf9d01b2d2d7e29c1122dbd2663393524 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html d3532ac375f30e693e09ca531f66bb82f90203dffadd8ffcb6f76d3f8d8361e6 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html b66d2cfe2a22c5d09b3ddbfee916ef8d42541db7918bdfa3b9cda93ae5b3c5af 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html f29a291e3e066c0444ef327444a89194e21c53169e0d7b2dfc249fe0db4c7701 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/constant-values.html 07c3fba9ded958dafd9bb1a8782a62c95a03a3f38dcc3cc030b96981e3abd757 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/deprecated-list.html d6f6270c85207f077292fc0d58aa2f9749c73aa6f65479557afd7b1abe8e00fd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html 2e2bbadb4e62a86492abda633f9be0cc130c5df8f880d306045730259cf3c1bd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html 159a4e86cd3667e1f24bc14f506357350f3818e8e610492c03d231f5e3366a4e 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html c8f894c7f9d491d17bfc49759b2d4d3db3127cfb84972b11805d9fba4c1fe766 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html bb709f2bafb95f2628a8293cff10773b5f932c3332f120e99a4dd862ed474dbe 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html 56db2ff19e350c4b7072f53cab34889cf5a1bca24270aadf11b23f323f3f0c5a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html 243aac76766792cb4fb31f56d2187c5564192c39a9be8c0793e0d757605ef0e8 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html 88575b4d49c8c6a829139aa8cf82107b90f8da72ce6ad899c0c07de78ec76f91 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html b9385c8f46c65db7d8c9e247a1b880494bc78d1f96952bc3f2a6cd846ba5c2b8 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html c86cf3dd9c6d6c5d9e37183ec0be6e40ae6a323aecedba4aec38ac2ee75c41ec 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html 9f024f5195e179b423f9d6acc2c24fdf8751317373123a72eae4bc84f92568d0 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html 44112e663f48845b47337b056e7777afb1f9ae5d925d2eb53ea2803c33eeb6d9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html a8f5f2ced87871978d6da96b1c12f60dbe50290f875e5adc83ae360df9e4eee1 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html c65a9c694c6f66b7c2102e890307882e8a9e093f615135641c7588bd41d99cb4 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html 6d2d3fd1f62c54586f6d3e5920864a3567b703658413dfc656bce0eb43a781ed 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html 18c89c6dd560221bb0fc27729dd2177eb279db902b5fdd40da1ce603a1ab6282 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html bc4a149efea45dd085e9dfcfaa87040f1ac8d2169858b2723cfa5b3ddeb123b3 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html e28d215d52d5906456f78b551bd9c06d64497c60426023bf4696a494d74ba924 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html 430af622096f73ea6a83b8ab31a64dcfe3ea6aa66c8c2a2ade8eccfefe506787 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html 1a0e17056df5f49169b856614300e8ffcda9742b49289409f62c269c12c6db54 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html 3ff70c17933287b3b501e7f0c8162810eb5999af380d85dca02682566732b7a3 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html 26ae87e535809d3c2746dac7cc6c6edd166a908a1aeee4568a2263d372c4b8c9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html ba34d36dad8f61f8d1c60b3061922e304863942c9e7f80cc4a15fc1e47b753a9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html 34ee36e66d368bcb9dbba63626942a2eb88c7b6a04c98d102ff57ad2579583ac 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html 3988edf9e0afb0d8bb4886d4563a7827e156fdae794a10d7f782f2531ed3ae2a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html 1ff08999159084d74236d4e37bf60478b7b9ca3e7effe4724afc9b8b11e5101b 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html 7740cfb88c48da1846e4d5880926461fd291d4b57fed4a40419d39612e23866f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html 8b8b1343c622d8a8892c6ff0411b3bb78ad9b6d7ac831427aa3143b7af19d319 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html 24cea6148b7ce8d6afa354f96cb0c1aab1dc789caf69b80f244798f30a0590da 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html 9b37e8b85cd7b2cbd018569c6c1d6b48762b1b868dfe3f66957ef648b7198238 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html e3c024c8870f57150e815f8bce918f013e0d1979e3e4cd4a360270005a2b59b5 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html 77531bc4e92f6909a43a36f0461761abd66b8736e462974941631ac6f5042688 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html 44ebd926e6419fc7292f6a2fabbf8f7d8d2b208547ab52e0844b30daeab45ecc 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html f67913e34aec35832e9c315efd707e427684865d52fa4e06b6394d76b65c819e 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html 1051261220258b336da671b5c46e4b98f2311f3c5b26ad71971ba8ded3ee4734 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html 2c80287c25898844014307406f35b394532bf2092d538691d9f730223453de56 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html 36a64f356f2038c577a640b1d384fe47367eb1e1fdab3867151d2086813f3cfd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html 432d8a5cf3e449cee222f3cdcf6f3d0ec39ebfad0e03d5f9907e93fc9498060f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html ad68abc01aeff1f65b03111feadb213d65c967b7ac6c139fcb78c636a35990be 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html 625e5e757c4cb49edaf4a1198d84eec67278f631624922ab9c89f66954be522d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html c82f83a69c73fc501072498aa3bd2c3ce299ba6a670d8ed5a39d5ebe3ace2954 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html 20c150c501152f9e79aca141004b10850d2b8dab10220c6f7469461558d466e9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html 5cc1becf00a4e371de25319ea9d60d79c3d34ee3012cece518c10457804270cb 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html 25c8f52235956aed3c72d281bca28003bbeaa71cd04e79ef506c875b52eb8208 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html e798147d885880228a5ef619234f0a7e1721037f72204343757dffa7102c2f74 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html a099fc955d570eb1683b34f42f72474c00efc040634c17978fc2fd1d6aa367ec 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html 8e1e61cdacad52ddc761fd7e41a0c44f833275a7d8a0681e3d601235c2b4530d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html f92d9feb608daa3b6257f890383ca4afef7b0394b797145bd5fb4fe9ad40513d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html ce1ab750ef2636f9ae0d52cdd51cbbfadd9138bb59ef94769477dc3466675879 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html 33bf08bfab66b89a40a7b7a86f4db471ba5d4ec44b73532eb1591149a96bbcba 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html f6661fad722cca716f4fd83890e0b38dd1d22091ab33fe98e1d7fa5725288180 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html e3c03c6d93456f3ad229c83688a1364a542027e5e109211bbbeaafc288ffa3cc 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html a3e2eaf76b2e4921c75049ebfa8913471ae76e188f801b9efb31d3c0846dc6a2 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html 8a8593bf8cebe703074707be065b0e3cdd03467e4146caf9ba9beb05656a82fb 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html e580a47a6af47f8571b7d29622b5042638246c92ec357c72e9fc7a76ecb5d126 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html 054a648b75b1ef340c46bbc20cd7760f25e653d6f574e566af0c7d4ab93c150f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html f8c708844612006f0e1be5da8ccc4f7bef17ad8bbb6f4e8d14da6a0cc118f43d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html 6087a92845de732d0889759dbd8ec804e6179c1c508fbf68554c4522f79a2ee9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html 746a4f5845ad6cf1bfda1758ceb8377b6f969818b2ef2c17854e5476f9d76950 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html 08ec9ce200f68d3319ace7311ac495c5e784592798d2f14c05bd1792821c6b81 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/constant-values.html 61dce41d689acab4bbeac4d86c5a5f730b6bc23a3585010e3a507381682f7cfc 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/deprecated-list.html 8bf50d4386102683a0606061980127d1172d986efd0a01303bc7997b883d0a7a 2 @@ -3291,3 +3291,3 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/help-doc.html 56e52dd1eb520846249ed45bdf824b137426e75a32cf5ec1fee0fdb260185434 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index-all.html e43cc8af6f4cc75949826bea08881f43dc22d45dcf1b30303b12cd609224a715 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index.html 834c31eb1dd8a357bcaf22b25108f44fb09f78ba3f1d7b1ec4850569348aec79 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/help-doc.html 64187d5eb4a884c7b13571ca86b53fb803fc5b4547e485c6a250f6613c18c6cc 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index-all.html acf5ddf0ef187089f05f30dfb4c2868ef728c9618fa0eec6d7f615d0e6a6c8a4 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index.html 63e3510587c31ba0eca6ba92d5eff41af62ef86e778cca9071c27f23f7250886 2 @@ -3303 +3303 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/overview-tree.html f7dae22444a62832b1d91ba48a8d92bb1162607f5ed8210517bf58d34023b7dd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/overview-tree.html c7bc3a63a1abd8048b2366257944539f7ab6d3ff2e1f33f805c7ec3e0827ddbe 2 @@ -3346,2 +3346,2 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/search.html 5a6904d36952bb1a483c32c99064d60570282efe28cfa6f47afb24b48b4b7f89 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/serialized-form.html 66115b8aa4010b36030b481acc9d20f9969a000839f341a67056f25d602935e9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/search.html 46ca687a87d8aca36e3c648ba6c5515ae165de42b227262bcdd4f062ea9ac7fd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/serialized-form.html 35f2a14712734dd843dc015220d10cba451514b0a4d2e0c84f548edf42978726 2 @@ -3362,3 +3362,3 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/jinterface_users_guide.html ffad1f52c867df8259f790cc88c006194e5147f2b78ff66514b10f698ec9a70a 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/notes.html 4b9a807d0f453df2c3a66b2ca0783b57d888e7ec95c78e09840e9abee854a620 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/search.html a750d5c08c71978c88a8ad9acbb4600ecfcc3682d85f2e19e696bf3239f602d4 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/jinterface_users_guide.html c6f0613d157e82be22f8d7d50233d59fa0c5c3d8effc1c3dccc3c82cdf533426 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/notes.html 4ad13923fad5e451685b75795f3448c993d5e82708acdeb9f821e66440b90ae4 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/search.html 0c58cf8ecd378cfb216ece24df4ad9d50efeb5b1f53b85b3c2e0c191ace351bd 2 @@ -3391,4 +3391,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/404.html 1d5875decc971a6c8cb392b6cd745d60bdaff6b8120b35d9017bb2f69a5d71f6 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/api-reference.html 3a8bbba5173a01932e8c123323b407f95c676889bb81e6ddf2ce43289d9082e3 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/app.html 0a8b3e5541b6553e5bbc91cff17d2d518457624d8e1b9f54c3e4ce95ad2a1209 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/application.html e8df2da7a0b52841dfd8b85c2f930e02b285c503a42084c4e0418b84a2dae715 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/404.html ad384e4c816298096b4d506033f7d83d1706fc9d24b5f040bd3db03f37b7f47a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/api-reference.html 28d3eb388c293913ab12c97bf35e9e030466759839dc8edd925ad8e39e3113ce 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/app.html a4d03700fa9b869fca7a2ad524d61ef4b684b5a24154c8941849d59d18376eaa 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/application.html 7c22cac711d94bed9faa3f2d4e893a91fd5f1c505c0146f672e11bb1b51ff46b 2 @@ -3397,4 +3397,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/auth.html cb0731f7c3cff06fc91fbc565016a26ce84c2605f41e2f6901d301071c43a0e9 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/code.html bb1f9e30933dfde4abf483146540e998528993bab8077fafd6a8d6f72368da1b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/config.html 8b714212821b3cd1478b0224752b92343c7128d63d31f8e542f043ec1a940728 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/disk_log.html 434489d96e2bda4bc78e8138047a9efed9bb7af8bce620192c5f6e0385a1515a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/auth.html dad31b71973bbd503a897d5e228cc7d3246da974bf285afd65624f3f86998e49 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/code.html 9ea1b40832651eada4d4c898eea6d9d76fbd5999975d993bd60333a75a57044e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/config.html 8f8111f32e520da961856ed3bd80533a1b2bf8bc85003e5578820c82f3db72a9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/disk_log.html ce266c7bdd0d0b66da32ed5b1f3f3863abf1eabe92ca0dc542a58477b452b82c 2 @@ -3411,15 +3411,15 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/eep48_chapter.html d32442d4bc0de29a4563433005b3c7fae778223a4e9df626759ef57134e2c999 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erl_boot_server.html 048b4da14708208d9581a5f141036d5ad0317ea397a22e8695c533027d56264e 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erl_ddll.html 16a46a94de53014d32a32b59d0b5cb725b714c8c8f253be33ff53a63cd933e27 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erl_debugger.html b095dfb924c1535897169d967f16cefe3d0fc4182033249655878cfabf59a8eb 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erl_epmd.html da87ab10d187174e6e0e5681b2fb44c846560e2da040fb87270ab1f203bec890 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erpc.html 3f77222268e0eab24a539b58add2216dcc944e1d7a129d0a19a4d007576f09fe 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/error_handler.html 56a8096f87f54c6436a76d76f38792516df6d8a808b6d156280119ba3007bb7d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/error_logger.html 6abcb881480e9c0dc7d919de263a953d1fe15a253b6be19f041cb2f518ee8e5c 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/file.html a8a9f63a79fcd43dda686daad827ab5906c4322982eccbcdb0caebe237553831 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_sctp.html dd0ce368e30c25e08753ff9600c15c682b0e58f8e89ce237195d18afeea8d720 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_tcp.html 5aa611cbed839030d9da1cce177c3ce78f030f110ffd465075c74ebbb7fdfa55 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_udp.html ebec20bd2f12a648743e25916a38e6361cbf2b38e786ea7ba236b3f223b17839 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global.html 87e23e17d921eec4ff5f9e948901118053e02d98a7a9fdb8939c4501bc7fb7ec 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global_group.html de0a0b5cd46bf84d056861aa15681deb194a320a05cafd9296d6b1f1f6ee6e7c 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/heart.html 265926b8f3fdd0b2f9c9da3af5175c77ce97b5db351b33ee7933c94aa2138bd9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/eep48_chapter.html 970a4185bce4533eba4a8ee98e876548aa2aceed8fb28511c612be6bcaf52b43 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erl_boot_server.html f3d8fc3d8d946401fd4eae2215b6afdbb03d783c9d780394a0f6c37eaa6f10ea 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erl_ddll.html ec8f25622d9c99ebd41f37ed2cf5452d6888fa6863d50d8165e1fcd56ae2ca00 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erl_debugger.html fe22041500f737564e90c6ba05960917e4ce0a1ffc5fcb87cd9d18166eccaa5f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erl_epmd.html 22163316a0ce3970220e7320614737dfdcbe91682207d1c195a0cbd0ae5b7f95 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/erpc.html a599a3c74f20d4c1344d0e178d346998be6f98d1e897e0962073277f427abba9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/error_handler.html 9675973cfd6afe8ba7b86b3c3e477eb2ffcb3d1e493947a0c5857b32b222c379 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/error_logger.html a6f363d5133b7e87e02b522736e4a47a9737895b7fc64b7691c3e3fde6a80cde 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/file.html 36c593570fde82e498957225e14de725ccad2e1d25d82fec7df29e330236c840 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_sctp.html b5d298458632e9611e486866e48fb742dcd5193fbf6095d58751ecf94b60b051 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_tcp.html 9de7e2700612caccaea0766b1dec906b8e524ed96d75cf5b41a1983772e52b50 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_udp.html 7b8b230b2524655f0d5af0fa1a08ddded9842ac63cb567eaf7f09e0b5d34c76b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global.html 1f76baa30e19531fa6b4dcdc54690b4582803381ecc069b6be4fffe0f531164f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global_group.html 3e2d2842647e325b9966fa65782f4b9d4b8da19110926ff835b5ba542033e2c0 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/heart.html 9353eb595b8faabf4c322cd8dd8e12b44ee038bab54c3373d5b25bda2ffbbcb7 2 @@ -3427,26 +3427,26 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/inet.html 9a88b95663b6aa4464f8d25457c0e9727b05e69fd1d198ea6cb74606de10abe1 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/inet_res.html 108b62a16e292165a77d44b14fbb668726f46cba35be184aabffe5cb5b3beefa 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/introduction_chapter.html df43a1cee7ed8bb3aa1029d8e026df2cdccb71fef1bcd724ea9e7f2a09a8aa42 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub 6557b0e5ba61bda79e465f27e727b5c20f16fdd2b4f8dd7d6b33ba46c312dedc 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel_app.html 524b8fedb8f483e3763e46cb57af645b88d92dd48757485aeb160a6d8a07f3a5 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger.html 1dff9b485b7cadd236841049e4724f5c086593c9244cb42e132d54b59039629b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_chapter.html 877904bb1b246be232801e07b9d4243ec1943d9d5c803077388c8580555f23d7 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_cookbook.html 17dae630d4e4e4e5605850f7a8446be5ee5f11372fddd047dd5c836b1368557b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_disk_log_h.html aead840e02e097e6e26715bba71e363bdb520a332c460c24f82c4474d6193b26 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_filters.html 033b446acb2485aafd4aba7fbd15b61f3a987446e0ea3c86b039f8b030035e44 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_formatter.html d0484518809b4ec7b53514c091ea4b26617f7399883e24779d2a2d6cbcd2feae 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_handler.html 9409ae24c75ac9c6537db8f0295794b20d47bdc3d1299cd88ca769d21fd2d215 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_std_h.html e4456e58deba10e337dd0b880b43e857ad3370c80f762acab945e20bbf1b2b3c 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net.html fb3f624f4662d5f7cd48a9643a4d265e4d0e2be83d727bb8a7fae181dfdc67c7 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_adm.html 73bc486f0ad0633fab0818b2e9216991637ffacf3e644cbf4ed0d98ea56c4f53 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_kernel.html f28670fd08c907754e745f3cbcc3b3ac94be6706aed04f144377c45e59afa91c 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/notes.html d905229754d4d7771a4402ac9b9e6dd10042aec7eef0758431b0079c2c650718 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/os.html 609ae2c7b1b4dfbd3bf826632cac36e60d9ed674501b3db62f443efb8aca6a9d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/pg.html 5ca0746f33180b7d63dc95bea6cf3cacb044e6dca7be49446f08b296ca59058a 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/rpc.html 4469573fa33901741237750506764071681e8e09dc5edf086f3ebafa9e35b1db 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/search.html 48214d9e18c66ecc50fb2a4d49e61f9f330c3c27891e569797f5d07c28ca8d46 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/seq_trace.html 726b895f6bdc815ffb3021ac03b191dab07124d77fdea99c9bc461c9d1a7889f 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket.html 63a1c11de0db8606f9131b132953aecd26ab3581e4c9933df4c9e24f630f3aee 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket_usage.html 43c1aa44a87953759314501aa6890dbef32dc70dc80140b7c2bc71d79669a798 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/trace.html a7159a235e8e45fcbabbda4c05f2127a56fa23a3887329c05eb10dda75a183b7 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/wrap_log_reader.html 46e66a5cb04cd5b158f9ca9f0fd84a77b8d1b612758fd6b157d5638b268b9b0d 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/inet.html cdb9cff550902f9ec74d93533ce20fb5a6e3d33821d637bc344d3b920c99c04c 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/inet_res.html df726b99eb3d717133cf1af299737e9fbab240f32e5e79d663adc57f0deef955 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/introduction_chapter.html a607664f823cfe61c0218be4056fc7f699629e4e338bf7625998397151445945 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub a726987c35098f6d0684b903b1d25b6e3b36cc60086c6142327ad8ac3baa7ac7 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel_app.html ccf81a22d3f7b057faf555a6ec3945988750221a9b5ecaf01c42d46b5d111ad6 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger.html 942ebc69f0f0cff313fc5d978f890e79e70ca7f2d5806e46c405d2d7e5f12662 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_chapter.html 5a69ed64c47099524bc27504c79f21dc44c31fe09084cdbe0fd1e08a79fdb2bf 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_cookbook.html 5a64855a31fddce2873b7f7dcecb69be2f35fe6e6862b58b60b5776fea00cf1a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_disk_log_h.html b68e650993b2ad47c5686620cc9debe5d1c81ae30be06a9d4be54b7f0dc72693 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_filters.html 7ae345dae7e369939070a8e78577a47ec26b826faf42495a86e73b457a900caf 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_formatter.html 53a77366930be4ed517c270ab6ce3be9a0e943f419d9134f0c372ecb0129f8e9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_handler.html 8a898e4356a70319922ba181436784adc252f2fd8f56b07456e0c0f52ccd9c94 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_std_h.html db1838945bdd60293e3defb73902649da23daa3a4cb9e3e7b83c66183e818e39 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net.html d2dd3679790a6a406acdfb6c6f6c8b954f58e01a89095ca1632f8aa303ab39b1 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_adm.html bc99bc70dbe1102c5839e18b59dd368721f5c1b026f9988a18c935871df22b15 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_kernel.html d84912f68510d197a7a807f26b707c9b4c5ce0a5f8f876fa92716b19f24088f6 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/notes.html a26f9d4a6d058abf0f4c956ebc6acbef03900dfaa6c3c98031a8328ca8bfd27c 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/os.html 7a409ce82e3bfc8be38b6ffc93254727d69d529b94ef56703477951423f91c11 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/pg.html 39b8793499fd203700b5b46e5a1575d37119bdec1e455ab91af25a534f6cb24f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/rpc.html 296bdd70559092f888ec9af7c4bf338bbc066f3949ee77095921659de1b738a0 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/search.html 794e11ce599793cf1ce634d2ca805e545ddf03d377d6421803e88c090c97622d 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/seq_trace.html fad0a76e6b9b80168b901b553971f1b0e89b88238b67d663eaa0ac82aaa5f908 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket.html 326b5d783f215ed39813092d56624405ebc4fab8c997306eec0fd986e8a0368b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket_usage.html cfbecd6c1773f0e7894eebe5aa846e5188c9581b8dffbe72ba949b0657c59329 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/trace.html 78ae1e1ac19b03a9e992704c1d9d5960c8cfaa4bbdee394803895da2bd3126c0 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/wrap_log_reader.html c901aa8e1e6a05676ec9ca8294cf260e12c783ab5828e8d185145b9044317455 2 @@ -3473,2 +3473,2 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/404.html 06b8f5599f31ec431d1c5b1ee54afa6406cafa2d85fbb13b413db61f950386e1 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/api-reference.html 0c2afb00c8c213c8604b3430bc70e4abcef7dece7867876e1acb9a1195855cd3 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/404.html 31ddab357e6fea5a6daaf35dd8d4d09e55d0861672eacb43e6acf476500e324a 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/api-reference.html a96d8bb69860420a182bfbfbbf487f2d61ebd3204a371e932863d32404e16975 2 @@ -3488,26 +3488,26 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub 2e800cf5a09ee4267f3953bc27ff5ddb70e2983b10da0bc7fe1ca22856c8d207 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.html 0f7946655e0837227768b0a898be1ffab5a245700c324d644616243d111690ad 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_architecture.html 80d58e961003e1a88f465accf623f5aaf279bb6e6a570d4c0ac02102d6785d88 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_meas.html e7e0af911b0810414e193e59e053379f6ae44166822bf031ebe9614d3793ddd1 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone1.html 4a87a5acad3aefb8652f862a37389415a3e98360f38302588cc372083727d5a7 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone2.html 38aed9ffedd51b9431dac57ea22893039c1bb1a4a05db757334f9415a07a991e 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_transform.html 1bccb6b537177ccce5c12e66f0ce7bb223472a7eff6c25bf0b9a8d69a2fd260a 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_debug.html d2a571c33c847cafbb50c33d8376ab7aac325d97ecbb03c23460ec12e37f8cf1 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_digit_map.html bd9e04c435a6b0bdac50749ab2514dc1c79dec1935c05baff7d5c0acc16cc0a2 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_edist_compress.html 2c434ab0956c631be8301e5a72883d77636725d8ea786d4c779af1ea4bd70b86 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encode.html 91784b2982195c15983e30e7a0ec3ed679b1a6975fa67467bb0cffe4483de8f5 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encoder.html 0628b64827a9f87e530c8b50461beef5580dd1f611d03e811dad97af8c6a88a5 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_examples.html b89eee4927788ac2ced42b9e447bb3f66c36240fafe81571e38e888807d06b2a 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_flex_scanner.html c71eb91ffd7ade22cf0d57c7b6a61492d678670c1e72c2faed5c70cf3417cca0 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_intro.html 181df29dcacdf37073569cda1afcfcb7e943407ab68b544a1feed8d47a376b92 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_mib.html b840ce21bb3afbd3c679e1702a9876d9405df94e58107aab0000d11ec2f0ca74 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_performance.html 5ed9d1cdcdf56bfeec2a4354191c44ebf59d3fa8bce315a94acf67367afa2ec9 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_run.html 1fa122b30274fb30a6a065a29cf1e1b97da513e740d928f9fffb118ac00b61f2 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_sdp.html cb0b07f9bf4daf697722d23b8c9f5c942c9173bc53b285f06a437d5bed5517ce 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_tcp.html fd13fb3db9ff010217f5cc2a6222600c3157316cb918b1adc236d97fb279883b 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport.html bc1e2f2c35412eef61bcf411041755ec1a0e00f2efc32062e99c5d7ef2e94dbf 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport_mechanisms.html 328623e653ecf145352c592e052fa47a2633b12a06d4b25894714198ab8e985a 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_udp.html e3f443d317f32dd107a8bb180493fd000cc79f912c82c56af60656e1c573c8cf 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_user.html a7146d52bb24c03e942dd32b54945b504f6aab1bf197b2c8ec09dd994e278c34 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/notes.html 1b8132cc9c3238071f25ff2d67aff6d5d8a128337ffbd946bd3bc01bf2ce5132 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/search.html ad704bbc958f3953ba51a90ef1d4d3bb309ac81542f43e341b77b4334e5abf32 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub 603b46041749c482cde7dc182dc157a6b7d5ac11e3534d2820c8143996512201 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.html 031b11566df7529eb2868d10c891b612e47ec742a5e2f7e992d0555a2381d675 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_architecture.html 411dbd6bdf82c0ee61c086c71d5b43cc49f02953da77ef4d843b780cc2bf6690 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_meas.html 36701f6142da80023d23b2f59f7e23907c146e1caa9926a26fa41875e587fe50 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone1.html b35f7416d413aa46fce5cf2275fd38e50ac057b3534cdfd70ab4dca335718326 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone2.html fafa442285819b1bc209390bc476a3ce3dde4586cdf8513f964cb7696f52878e 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_transform.html 99a6e9fe49287d2dda5976c310b81d793c368f8d92b344a39c1e70248918f0bd 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_debug.html b78234336dcb176942d174577036b0bbd6a1ad329ace9f81334aef55b723b28e 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_digit_map.html e179cb6fff34f6f602809540060b3a69ab6eb8f8cc50d3d454ba2de2acbebc83 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_edist_compress.html c900e461676e7496f05485aebbeea530153235b472bd29f5b24194b7bdb239f3 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encode.html be2815953b2151d69af4182ecb5f2037628195a6e792fd84f2d268483abd53b2 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encoder.html c244a47c864e63d9160dafd81f21819a85b8355dd556bcf77f35e3e552a2418d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_examples.html 18f59a02d967d6956df7c2f5a2e3f89828bb5454251b8849fd8e9a4fb4c23e11 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_flex_scanner.html 32e3a0e4ec9447ab471cb8a942ec9bd937116383ba195e2f10be7fb496ef3795 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_intro.html a302097ebc88f299c6df7a2d969b9986356351d93b26b23d617c80f49924cd6d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_mib.html e415a7cf3090f8679bf5bdce24a032b815881ec279821322bbb9110acd3ab080 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_performance.html 71f9eb93f4b756b10ebd06061d9defde76755371e6bb98a4b076b87060c33e6b 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_run.html ebfdf1883a6663933bc8eef84ac4d08705d3f602951f8baf90e4748e6787a46f 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_sdp.html f3440b52ab9dc3182d63325beb29192077ca68c7e001846fcca60d7326733751 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_tcp.html 4a822b5791e2d37a42c2437b596b7d8fcbb4b23f496eb58c4e6233cb322b38b1 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport.html f8be435ccc04cf8db5dbc246d2e33ab6cf269fc51bc127bc0d46aa105052fcb0 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport_mechanisms.html 10d10413560abce6cc3ca89a947e10307d16fc6eb9120df2bc743f8e00811045 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_udp.html b53e69426b4f9afe2183aca049af2125889bb7f0f74b06a3aed166a2a5ef0ee3 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_user.html 150845b1b4e66e70473cd65bbdecdc7d1150fe5b606f854d7542cfd4c20f53f9 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/notes.html 4048d11dbfd8c63ee35c649473317b8b42e0e2b23612b12135c62beeef2b2ed8 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/search.html ad76a5fcaa888f67fe08e0c60c231141ee03b9a5905eb5976ce7079752a7ff1a 2 @@ -3542,2 +3542,2 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/404.html d8cc823af39978c7c074a7e016e4906b47709dcedd158680e54ad25e554922e3 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/api-reference.html bcad702add73b9f6d48ca5c09edd6afea80eb8566fd2ebbdbcb6b36c93fc590d 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/404.html b17e2608c7651d2a77378b211f4c4625244c233dd62c43b1f3c09fcbc0f3e8bc 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/api-reference.html 8cebb4ddd64186359380c47ed55f911e08d898ad33533557e70ede462bedd1ef 2 @@ -3557,17 +3557,17 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub c47a27a004d4a912d44a324a4dbc2e4e320ee3f9039489402e196ecbff3f2dcb 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.html 1472967191fdcbf95d1542a83843ee35e38ead84b3997fb8c4fced31ecefa98c 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_a.html ffe2996614afec309814cf135897313c16b5d8c30b917896231cb2f0300b279c 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_b.html 12409ab1b232f3cf9df5de1f49b2368837816d7cc464e01ed831adea619a9361 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_c.html 953d9cca63b1c68c57548fb41ee33c5ad6c61e31a54a573c5ed179a9244e24e8 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap1.html aa3e13e9fe13b6ef7f5fde312e9f2ae1ba1494305f09aa743abe88d1487bd113 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap2.html ffbe429865a44694c51b405f9354cca61e34f66886027a8ac128ffb20f39b8e4 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap3.html d844e5abf649a9b0a2f37cb7a8fffdcc78db9297435a09d522284c7ae3dec0f9 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap4.html b589c379e9b230c80491bc298637615fb689b8bbc58be4971235d08e91c297b9 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap5.html 6c97200b2ac89f80774421e97523a327a4eaa6a5c7878a5cd978e8d2c7673338 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap7.html 28585b6a0443548e3d58eda10f3c470c5021646c5bfc0f41511ada1a8eab289e 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap8.html b8a920a0895264303a7bffb201deab9471e944f7a50b4e8c3de01b745fc53577 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_frag_hash.html 5d3c0d4eff3f3d3b0ee1700830b5aa385ce90c837088457b204fe065806602bb 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_overview.html 6578828b082d1955c01461efeab90ece39fb7417834bb4597ab4fe1f19127dc4 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_registry.html ddc817fa9eee9393aa5563e06650966ede6eaf970a4db20b267d8f6a812208a3 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/notes.html 22559cbbe1494c7eb4737380b60f2a7525f6475bdebff89676fc9c5231903994 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/search.html 2a33e0a3ec5bb90ed45b35b1f75455c34a2cc3f2036ee322a17c8f4b80f8837c 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub ce9cf52db7291242a4b91c09816b5aa9ead53adcde45662e032f0a86eec4aa67 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.html 89503f54057e453e1652c88080c7bd4ee027a0430dc912b99eeb2e4a11e94215 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_a.html 8dd4fb386ccd0cc7cd9aae4bb4432081197a75ba1e51e61ad68f584687478def 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_b.html 1efcf925129e89f36b301ef70025ac8ed752cbc4e169054efdd5e32bef5c3386 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_c.html 782caa9ba73c9121ad30b824bb64a6adf1e7039e457b728e423dc89027b5c0d4 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap1.html fdfa3992dc38be0ce56578628c5538985567e36b82a4dd1692ccd510b86f2ede 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap2.html 1055ca5c37d39ccaae86761122a601501b798f7a5e402dbcef6c57fbeba3ffd9 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap3.html b1ef65f15752abb0f063647dcbe8c9722c4e51dbfdfdbfcdab2f002dc373a861 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap4.html ca5bb6603d5a557589d8d83a4cd62924adc01a933743eaf55f5b5d1627df0ded 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap5.html eb22c648c1d1bb8f40df700728cc38a2eac1bb1aafbe76cf99d348440977c2e0 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap7.html a97280df64a276008cba89bc6e9e3fe294a5edf1da12f70f20330e81705d3810 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap8.html 8fec4fc8441d0850c3e55d4213cbe51ed542c2339edae2ec91ae3cc780cfcccf 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_frag_hash.html 90480a4c29bfe64b03570d01b52a889f36361ae51f0ecd1fec30ccaae245911a 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_overview.html 4e98f64a76b76393549374a459d2e3873b3c69596c51c6572725e2d570b19480 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_registry.html e48cb8a53acf0975a4dc2c332b9ce714041de777c900dd4a507ce5b13721b7dc 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/notes.html 8c83b58607db9d58072d5a56af8f26d115aa2b5aef39f7ca5e627eb8588e04ad 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/search.html 1a68a7da808699aec9bd9ba1f0a9f4c657f835cd18da7e11d1dafdebf2c5934a 2 @@ -3579,2 +3579,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/404.html 0604608c6c47a7b6b092c903ac4418e7c907c9c173b0c16498b2f588d7e6f956 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/api-reference.html 3873c6ff62f25e8f862ef9d07051b0ebdc3bc507417d519593ef7258ad05cd3e 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/404.html 65698807b3b38ee41b93a2c8e97963bef48a15ad3cdb17096ef91e7b818992cf 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/api-reference.html 9837333e56e5e1931205c8b78d5681bfd0f089714b8bd03961c0bf3a90ab231c 2 @@ -3585,3 +3585,3 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/cdv_cmd.html 4fb1e554fabb61c805e33322f83360b91a05fe0338c35ff5efb5f0a6e0f2299d 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_ug.html 338ec84638cdeb4a207e3f1784d1ed6f45245ae46dbec46e1ab17f59a74ada97 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_viewer.html c1916ff7b3703ca0bf0223d1dec5a5a522bbc81008c1e49f9ca49cb46a5c1f48 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/cdv_cmd.html 8f4934a72c453605eb8b3d12deec859f9315b2d39335f1b833180c47bed20b3b 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_ug.html 32d84a0ccd9f0b38d136192dad97d661e32a5a1b8920f84ec77d9f154d1fd208 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_viewer.html dd1f1075a0a6dd952452a0c6c757df2bb7aa9e7a25192cbcd5f33207cb5dca2d 2 @@ -3598,2 +3598,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop.html f152316d0d240f8e4e6e90de4542f46a468f4839d40ed37c28453eefd7075b74 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop_ug.html 56dc25307b8f09e917c521c2333ad9a3930e0c3c62ddfd9a1df796a210d4e6fc 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop.html 0b65a6e2778836ece60d88d335e2a030b36f4874087f5830a9d6765ad5f58b5f 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop_ug.html 493a09d6525a437249017241d1917596fbda33cc090bf12bd3d0b5fededdc93e 2 @@ -3601,9 +3601,9 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/introduction_ug.html 50c1e2ae893eb3df82b507ab07a7f71cb2c220798e67aab723d273767dc465da 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/notes.html 82664b98acb14831761f372c62b3aa2d6cd1fb729eceb64509aae54fd61ac5b3 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub 1998bc7c85354788c8f7d287b1a8163bac7ad19d5a467ad851db0cb2157e8c08 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.html 6afbb1409eab01e910d386a70ac3dca5a5ef87437ad9440cd7705544cd6ba035 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_app.html ea043cae711403abec6a3011b8f6d75440a9e5fb44e00fe7566776615404dec4 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_ug.html 79130d9be079b9a46f530c23a1a8ac36cb85a835b0ac5c0d3df98cfc4885fa93 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/search.html 18b7290e8c2b9fb73164a5eda2a70a57351398b5a2a9cc91e7d54ca9957bbd6f 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb.html 406b7d2a51134f413aa941f924b22f88bb68753f86c048c89a8a4ff6fa039fe8 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb_ug.html a5a59cc456e2bd66eb9ae2437e57f39f0593bcdcf6ff208097281cf94391d010 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/introduction_ug.html 82e388c95acf112599489df0181395133d65550be77ebd56eec1ddadd363d30b 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/notes.html d562168d4264d86eb99784cfae3ce39b58918d30df6476c97deba110170f2c1a 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub 07023f7d0a1f84d44ca30496e3056af4307b6f1cbc0ddc7d347562a5176b3fa5 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.html 2287f903b8d40059e832db33720cfbdfd6cfd9e5e446b86ff92ab4dd3c8a249a 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_app.html 48e4d19c8583ce5d52e69d6d2798604adb921d2c07c1c45f6ec601cc66fb4246 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_ug.html f3ea81e0cbb01ad10de72216dec6809044832bffb418d4e39cca4bac9ab0f8a6 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/search.html 9422ab7ba572f88a3cf641b4fceeabe748a92408048672f2c41e18b66f5804f2 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb.html 031a10162b382dd60880132588ace9467af1064c7abcd0d9d95c017122e009b7 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb_ug.html b7fe17121ed8e4e8df1745a5dda25cc28acfdb34ee63a2a1a50c42fc4a90d992 2 @@ -3613,2 +3613,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/404.html 23527db39323ab4c1a6a0f6a8435b863225bfab8e0fd3767c48e9443e91e1f46 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/api-reference.html cbaaa039f345381d45b7a2d5443ea59c000e8d1fde550eea785f6f6fc4940cd5 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/404.html 5fe782e621b113e97fe2a1eae1c89ea00e64eef6a0070be1ba2f769977b9023f 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/api-reference.html fe729dcd11aabe98abdc06b26a267c1f51b0146fecc0f7593c6b9c86d98fc533 2 @@ -3618 +3618 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/databases.html 069250a8fe949e14fd5119759c27c719c71c739f9e16d0c45f53839c53967684 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/databases.html 6daf6325fc7bb404ad0c1ea6afa226fa8517444deef6c880018d08e376ce3893 2 @@ -3629,2 +3629,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/error_handling.html f041173cfca9a59e3c0f4572ac96c2234545e881f3eaaa2b0d4807d85f417019 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/getting_started.html 275d07fb643f2540e9cfcbd0f6925624a6bccc00177fcb60de2d93832302a5e2 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/error_handling.html d540c65c4a52bb26aea2079a6c97de3ba5c77f1bf69580ede70f83e59bcb6280 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/getting_started.html 68a4c434d1ab414fcdaa866f33c3e492fc39990e52c234052aa31ad1cf13d883 2 @@ -3632,5 +3632,5 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/introduction.html 805d590cc88aa801195729433d346e29735f84b1acb6f311ea21521aaff6057d 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/notes.html 1b10562de26cbbd71e480dbd750baf506b1bed7b85f63f6fb289da1d0634e2af 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.epub 0d07dc71e93acbe20452b370aa4c9b8754f818b080b1a74adaa4a6725aaae603 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.html 6f90fff89d4c21a3868bdc76221681efea24f8015b12e9b81015ce6c35b7b845 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/search.html c3c2801958ed4e06cb636f0885695c083933563691dd621005a63f620b45b5fc 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/introduction.html 799100c53c0211e9d40d0684a566502b035746d85b04449197c36fba2962fce9 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/notes.html 658a45157dfc23ad7e35c188b9e8197b01a442beba4fb2deccae790d20c8432c 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.epub 8e55a4eaff6786ecb6db55bf720301266596e99c3499a97158630a012caf80d9 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.html ed7c08eca7e7b0f41500070c92f7075e4a2a321f0d069effd115b4002024da33 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/search.html bc5b1474216f3a4ebac689ff3b193c0c1a21947934aa7159b356b77d69f8a0cb 2 @@ -3640,2 +3640,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/404.html 159fd41041affc761f4ba55ba9a55b55824c435c2ea4022830fe4d4ef7ed25bb 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/api-reference.html 169d69896ac9588955422c898a682ab0a21a0a8e162a6aff0f6837d312e621df 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/404.html 1b3dd150790a16ff0282558b59ad854256ad190c6b09675a706306e5651ac6ac 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/api-reference.html 1b854b62c797aac30a8a231e654122f3904bbbafa6c31d16dc5120fd72dd016b 2 @@ -3644,2 +3644,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/cpu_sup.html f7754b61fd30e583967b480859b581d539cc54e8854ea06073bc0ceb90c1d324 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/disksup.html 18df0b8e4fbc5258782a04838f7acd5234cd5b03d4828a16c4aba64246c941d4 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/cpu_sup.html bef204522070a9689a6ee5149b7d83688275fe555b5ab82be2f8280bd0202ac9 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/disksup.html 1fafbcf6b47ff33887a735a0cf2eeec7ad3377cbe9893ba989a92a973f28376c 2 @@ -3657,7 +3657,7 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/memsup.html 81eb7bba647aa14ca8074e247d8a286247ee9019fab7bad90ee94363c3d5528a 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/notes.html ae9c0c8175fdcc60cd6bce3b7125a37efa0f27712ccb685ade08ebdf6ae090d4 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/nteventlog.html 88deceac91e2561169ed8bfd4878ccfe5e187688ec4ab93f1e78921b82868c31 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon.epub 793ad560259c66a2a3590679a37a53c67727038f8d4c9f5d879f7aaead2b692e 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon_app.html 2fdfdb34e2afce6209808599e31c73edbc81df0264b57e40588175c68b83891a 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_sup.html 7ced5322835dad90d687436b4581bfc2d05bb16f159286b311b51b913713af21 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/search.html 90aa176ddcd08300f06d0204a5c817f5191c1eb8ab576a0986d559baef9d2764 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/memsup.html 9bb84c3e1205c83ac1933663a2a8a9f593858d823102c6ee23ab43096376cd5d 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/notes.html 4e03ff6a2d0cb491001367a6e29f7fbbde2908bd402c5b61c93e397f76346d7d 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/nteventlog.html a919c9d20bee0ead532ef1c03a08b316b7925ffbdd45cbee563a7b3a48c3c075 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon.epub 85a4aa195ca5cc631aadd7140377c51dc688bfa03cea679c76c066cf3243826e 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon_app.html aa227328695124210f71bd5543c5bd23898e7e77d4883e156c550ae8a4c41224 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_sup.html 03146425bf6396e6a0079124ccae51c475ff6778995e99db358e4f4ee16439ab 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/search.html a923f0ab4d2027317be7faf0e038bed9cfb44a249c210f9cc73fe7f5e571b5eb 2 @@ -3667,2 +3667,2 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/404.html 5697988aeaa32515ceace20efe64007ae8bde9df5a2b1d401007befbdc4e0676 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/api-reference.html aaae63e3a04f94cbda9f77d754b6c322a7e48c67ef4358d41fd393522b0bae42 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/404.html 72e21449053916644ea9f25fcc071c5fdb3f8d6a81478e5791703a554c5299e0 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/api-reference.html bd54acb0b4fefda7e5421dd0b135cc575315aa66a71b8eb3a617b44ee5bcda89 2 @@ -3682,5 +3682,5 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/leex.html 1e76305b6b53f2de045215b07e14df625128e00682d4c2f05d71a5840e41a9c9 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/notes.html 58082c5a0b2f492450a4d479799abc932ee3a1dba742a5eed96ac0441ba4303e 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub 6ad4a64e8728cfa58355a65bd5962b125e00b607fda58651270697dbd093b826 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/search.html 52cf6b6e495845bc265a169c6c222058b19ad22a5e3695f2e4136e9a8c4578d7 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/yecc.html 754867e0c2be0a35a56e88bd2c5c9bf25bec1544abdcae15733af8ace4bf0336 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/leex.html cd47ef68563efc797e4e2f95fa2fcd692405db1b14754e6444afbc4ea61e86b2 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/notes.html 2be45e25bfddab7f5b776d1abd2d878a8ed0861abef26eff6b6372317372b7c9 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub 5220a711f7d3e6e817e7570c4ae40bb6aa2ed43ded7e7fdde6679cb7bd5ef879 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/search.html ff960bf5fee2e7a9136a790e3fd292adc1a378e18900b5290a00a7686779499a 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/yecc.html 88d4952921dddc4f249d2294e1542b111bb1459ec9ea09610ada17853220fcd2 2 @@ -3690,2 +3690,2 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/404.html 853073869a01cebad550091abfc60552c16e3679c990afda95bd6cffc05809b2 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/api-reference.html fdc85ca01abc84fb36f71815b440af5fa1924e3f4a0b87fa100d54ed8e67ea80 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/404.html 6f4253c2df6408a212e56c48c0a20f0d9d08b6fe1c6865616cc0a0eae3f621ee 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/api-reference.html aea4d1600579513648bcade7af23e94a2f9681f40cc7ef9a6df437246f992f2c 2 @@ -3705,7 +3705,7 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/notes.html caff8d74bc56dad6f74d4ac911418b96144680c0e3ff6d1a0fe363d48f2a6fce 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub 31e78f601d556582a1f5951593343b479acb6ee9caff3db8ae17e9f0b95c0506 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.html cd3d040fd47922cbb71ed4d04791d1ef65daa6f72f7f4890912ac1864a6dc8da 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_app.html 1fc504386345432930c14b251b399dc528c73d5a189ddc925f07f2e137aafa89 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_records.html 65f8e71ffe64d294ffdccf1dabda344d48dc1e3df87447bdc2a8797bef4757e8 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/search.html 360d8ba9221b4602e03dd8c9664b03b8678af6c6fc4e809a7ac511d977b2e48a 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/using_public_key.html 14103e8524495cd957c3f130e24d78de469a3085ce9204deb0e7d08285ae2fb8 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/notes.html 5cda5dfbe6fa0b8f4bca893b5ee31754d76fa6b1b2be241b148671bf697dd65a 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub a374d09e099bf30536a99af4ecded2d867a90b245cbb536ccbd2e13b707c2872 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.html c9f0310273dbab7a9dcba605741c3a95d35fdba01082cdfc2ccd3630cf0d4fda 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_app.html d64b9a64ea5244a66231e005c41f398a64bc9ce6b27efde1e66251f7f2767b2a 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_records.html 28dd048072b61d7d9d49ba020d9a5a711145e0b79df0786e14d889fcbe2a0265 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/search.html 3d5da6ff65f6488464a10181afa84cf703e18136a3a5b64ce164769d13e1d4b3 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/using_public_key.html bd2fa0a07dd75cf1e036722cc92416709e9702ec5b70dd9f203bc60a08813d1f 2 @@ -3718,2 +3718,2 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/404.html 84942016bd41489b15a771ac2375a1fa886278d6f382cfc298da52c0ed99a1bf 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/api-reference.html 6d55053666c61c7fba49109fcd06e5f2f29413c4ddebda68f46857fe694a16c7 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/404.html af26707271e9192aef2a6ec790d370b886cec2b30dc1876fdcd5ef39c3e4e0ac 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/api-reference.html 1c8c449bae755d3776a43cc3e0ef3836e00f1ce7fdd468c128c2f0184c834672 2 @@ -3733,7 +3733,7 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/notes.html b8b1638baed8bf5007464c683bdaa1c45cfc143976f897077c4ed4df25036459 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.epub 5d26d1c6cb606e09cd63607b3a8eb3bed393e46b0fb5679e8d155abc0806053b 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.html 0491606996851d10ab57fc303f2c89b7882314c9584fa1ad18293220b738f69c 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_examples.html e8d7cabc9477468783297560e1352e87ae85c1be70aebd06473086b5d2e33cd1 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_intro.html 442049c3ee84c1b6debed49673afa5e571b174382fe09c162482e63e3147809b 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_usage.html 088d115391b6a3c2cb11e388ed13df9514cab5f5169b41532a125d4e5d570d53 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/search.html 1069d8cde48d55d6cc88a3c82c349f19148d2925cc3bf96a40c2654ea691ca1e 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/notes.html 991c837b6e584976fb93bbb18a2ce55967a0a909d17273ad6c397fc1de88cc15 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.epub c20f4a3dc48c570105e312914d4fdfc0cf330af22490e2d56d9555c964d054de 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.html fbf75ad2201d932eebae55e3ee24f5c9514723b09fa6f7af2069dd046f4b7b53 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_examples.html 6410baac673cd9dbb75db68486458c2a107a61cb6d5aa836c8c77fe1e0e4ec1f 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_intro.html 19d6ff17990bb2192826366826fab65f8081cd920320363b8baf64e4366bfa00 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_usage.html cc611106a9656e1fc69c093e1faaa209658e5a625808b425ded9b69c633d1769 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/search.html 8e8c5ff3253b25970a6daeb302576dd44711cf4eb2f3d0b30096bc8315547015 2 @@ -3766,2 +3766,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/404.html e4d3b42ec69b986e7bd25d1b6566245272adc333567d8e5393585557181796ab 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/api-reference.html 8ca2fed4c8698e011d3366c5448706b55400383f9191e1b7c24671bfbde6aacc 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/404.html ab5adde73b39294a0fd6dd0ef717ab04d7acdb7cabef886e4885c96ff1291beb 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/api-reference.html 05edcf75061f7d76f7c48596cd9b5dc432759dfcfc2127b083138d4e831d4e67 2 @@ -3770,2 +3770,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg.html cafa3f3cbf0ad728cbf51e93de4b7cdc51c9bcb0fc6a76b4f65342aad927d5af 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg_guide.html 4437fb7cb9551f1fb16d58b55ebf2fa464d20fadd1154ca2b584d3743cebdf25 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg.html acc19f5a2b65c9a23c151f33881bc276fdb7d88965d812d4f01aa238ccf3b5c1 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg_guide.html c024afeeab5cffcbce24ca0732c05c271838ee5b7a992206f29f2d4900bac57b 2 @@ -3782,2 +3782,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dtrace.html 988bafc9b16b7b5130f1bbf4cfa6562fe67b87c0dd97173034c83e69dfbbf691 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dyntrace.html d0c34403af9a1f8ecf0394d6ac149b0c8401f895da8ece2d8128c7e748a7a2de 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dtrace.html dc568417e743056c0cc889b63f2e181b25ffab35520d1426fdfb9b63791d9467 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dyntrace.html a137f56806dec3ec4c38fddeb2fd9f288182e76945280192e48acb5fcfac654b 2 @@ -3785,10 +3785,10 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/instrument.html d43bcd1f9d47a84e2e7d3527af217220ae0496693d28d9d5f7960a8287de18a6 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/lttng.html a8be3560f543de52260ecfbd99bd360c64580392d02d4eca485ed8764c575896 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/msacc.html c8c7c1d2b0d8417596d63a94363af94389b91e43320acaf320331220ebd6f171 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/notes.html d2023e2d7238dc11e56c4ed2f435ddc52e421a055b638f0254e60c9f8e0b4684 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub 844a6a9d6a9f0577f9126fc1bd96bfccfa4ead5d9ef3b6ada85c1e3362fff6a9 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools_app.html a45a79be07268fb9843555e8d5746f7e6f59d21668ea7508272838f812a4f949 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/scheduler.html ac789aede6a085e62a3e56d8742d82b1c17752e496ac7c8f163d8d5c70b9518c 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/search.html 91c200791bb9e02919655fcc582871759278966261e3b193fcf50038b893aced 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/system_information.html 9fb0c0086f2291104078d8fdd743cac34f94c6b1c7590e74ef7bc74a4b8e9cc9 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/systemtap.html d83b7f4565b49065e9ad9b6f5f35f3d6913a2a0ab0206211a507696cb85fb6d5 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/instrument.html b8844210e554faa4fd79b26b34581dcbb5dbf2a55133c0c41252a364d03718b8 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/lttng.html 8e19515d27273c5d1f9d2c9517107fc620cbdc2dda196ffc33ee072799b7c7b9 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/msacc.html 3853d52231b6f815ca5496b2de1436933410b2019065710bdf950efceb4e23cf 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/notes.html 95645319f973b8a87c0abf4c26ed3846e0ff1e0419acb898f6e2b990d8d1631b 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub d4ce5268c47aaa9611c1ac88b303099280190dd29a52d2b7ef5c59016739df80 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools_app.html f9bb73d0ca93d53005bf6e399ecf91e7a1beca8e6dc6ad6f79b4671361316859 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/scheduler.html 8d9bbdc49e6753afadae41ecee2cd0666b8de9eed81453cce706060fc7f68e87 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/search.html ebafbdcfa6b9f2565f2cb083c1e7c69b61054191c4e5f9c82c3fbbd3fe41e7c1 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/system_information.html bc64f90a9ba2ef344e9b0b081d752f1758b329a2ed48296de08064019c461e92 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/systemtap.html 4fdf964c7b8eabf8c33531d91adcff744c9afd64a42a6dde523abfa359c84027 2 @@ -3804,4 +3804,4 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/404.html 5231e0d136cb20096725197a14a69be326e8c70321675a9c22af3478413a03de 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/alarm_handler.html 490a47e410ee57bce0a63c14e52f0b615e470341f65a4a4d6153d82340b4524c 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/api-reference.html f65a89dcdb6b56330f3d605c41b5099b3c6b621138aad70ff436c041e86b6398 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/appup.html 75d3385b5a46eeea8eea75fa2707ee27337788c4090d89f1da0a82a7f3aeec4d 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/404.html 31832808ad3f7bed394de3068f875371fc91855246b08862c8cac90318c4f501 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/alarm_handler.html e1d085566527630440e60a1468b44d8259852e5c0dd7624b7e9326b7f1e78f6f 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/api-reference.html 788945695bfd15df72708489ea5e10255d3800d2500009747d63bd4073d15f66 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/appup.html 7ca027f2db5e37ca8c0233d5d5dc0b7072227044d7fe0f78978d09dee601e1c7 2 @@ -3820 +3820 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/error_logging.html 9d85c0758010e412f5cf8667db09328474f92ff8b2e973f5fe8ad82001722f12 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/error_logging.html 9fd1172c20e2d1939ed5285a57ba5bf3930ce9f63ff125b6e1b5803cbe009b2b 2 @@ -3822,11 +3822,11 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/notes.html 99e43913287b685ccde1846371dc4dd3ae2b43a47d83880d5aa7969bb7638d6f 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rb.html 5c1546646ec5ccf5e29cc55de04374f630c39ba34dd4b979d68056d087236dd2 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rel.html 30d4023b670be0dd065888617190a1d2d41df14354384cc1885c2bc87c7ecd83 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/release_handler.html 9c6cb95be9da0e110b36385ff1b77eaad7d7279dd4aeb1b4f837423988bd31ef 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/relup.html b76a6a8f58a43cbd8f34c55906aeda102bde7e323f95c7d86539e3dc26e06a65 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub bf435757e43bd3064d1ce09c55c50846a55e0a468b879b6518c5ca46ff475d35 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_app.html 10412939a208d78104bdb22b54ed9725a72d7c67252aa1c40137ccd42866dc7c 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_intro.html 9db8008649be83129c640fe345ccbc2884c6d8395f0b11a7f65d155cfce83d35 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/script.html f38d07bd1d81a8ed1e95fb09081b0592e62f2afcc6dcae44b8ee50115942aa96 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/search.html 6d39bafac20c94d48973d895447a7cf34fec43591ccc1c962bc92b0d9f3a77dc 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/systools.html f41788202090fea3348dbf7a6b09b0642cc6245f1b20ebc6a1b37fb417a21ec8 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/notes.html bb1428f04ba47585bf23815da972f0e5b7137146c1a9e459036ef5c3b13b3e33 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rb.html e3845800e3c6e7490a82d810a2f2a10773c4be4eef975768336d29609e2ea6f4 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rel.html 19b645004985a68823b8693ef623cc79cd202677c95e97549efe3b0df6d70311 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/release_handler.html 8e8adc61a0153171ffc2c2efea9769c72ba24f53b10c4d4a0d2d98112893b2e3 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/relup.html c822602e6af1b16a6f9498cc306ce68e318d441f49b17ff10f6ce16fa8535c53 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub 3ec07ba887085714800c766b0cfb1c141b74e8f00c9ea59a5ad33e619cdb21ef 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_app.html f3d3f472c86891027174c2ed7a5a72562f550b647f09b2a02c1162a42f69f87f 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_intro.html a1536eb350698a799f8a4a0769d2d550e93824c1fb0c80dedbe968612527dc0a 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/script.html 39e7c0822aab61fcfe4913154103c24dbbfba3341a93ef10e9fcad914ec4631d 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/search.html 68e5ed6723e9bef8b1e49b8232fe85b41f11dfef3247052db02e4924a9be7417 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/systools.html dd5ec584b9ef420bd355f4650ef9f96ff2d9a84d88fc7d6111e529178cdb53e5 2 @@ -3848,2 +3848,2 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/404.html 8e6b5684ab7eb631ab679da5eb906be917789ad80b20f675e079989ce0a42cc9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/api-reference.html d040bfa3f8980afacf0846a26bc1859755eae5d7e291cb7f23bc27722e2076e1 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/404.html beb4015cbeb039a2ac30102ab35bc980dfa2cb24ed423bc46f5a6a2b33a4bbac 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/api-reference.html fbbe3008ba79aef5c2d8f82954b3d140d4bf084a09f7cf3992cc7b9365c7bc35 2 @@ -3883,57 +3883,57 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/notes.html 2ee54a68349d4635afc7c43644c65e932872db4798d98add9d82e6a650cb0388 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/search.html 693d22fe74f4a1092733beef8153c6b1a7c0f19f052aca676bb2e3ca21170c7c 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub 9fa1daa28b89c2518bcb29a8cecc207272e4d9f2e0de18269758f973dbeaa0fd 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.html b151d5d54268607fcaa992bf7e31046ceeadc06c832b3c72bd5fb5d254d040b9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_advanced_agent.html 4fa994c4ca92beb4c409e2b100a8d9d73304d6643ef9ed1349e6bc0557c638ce 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_config_files.html 02b407ef9cbef01d97c1088c6e628d4127410256224de2a61ed91ddfcf7bdf59 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_funct_descr.html c188a108573c0a449aa0d23470a815cf4266a4b598df193a42ca918a8c836507 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_netif.html f3a8479974c32c313ba76b72f6d476232394b424cf80dc2d068f5a68606d9a69 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app.html 3c7229ecdd5ea706a3ca61f53608f585334e6786ffffa24abf055432eedb4bac 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_a.html 37bbe3ccf0b39f3e51c5381c5315c36a09fe5e96c6b30cde1939e259eb71acdd 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_b.html 218109039f2de212b710cf42c511689a880723de3101e336d8cf12b8f4bd30df 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_c.html b971c7dec50f61c4884166b4fb7a523a7353527cbfc24334cfd0297b378a2eeb 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_audit_trail_log.html 83e951faf8fab250077fd5ae7cbc150d68aa3ba489f48d452e30060aa17fe839 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_community_mib.html 7ed4a5135d79aa0bdfc8ea385d9993f79c2b359a99205e236b8f9355bf2c8fb8 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_config.html 0fd884133749107ff657c34fa062f8d01759c6a77c45c56ee86a7b5881161d63 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_def_instr_functions.html cc10aa8a57dbe7dd01d6521e92d4dada338e1cd355cdbf49c35ce3fdb8923abe 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_framework_mib.html 848163ab7c507133cf3743cc18a48608d64c03350c2b6fb9b66e337fa9031535 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_generic.html 90b00a8c7734203d5d0eef95cf7b3aa84a1eac5f22c7696589ab933e4b9ff25e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_agent.html dfd5d27fb9b57c4ccf36079d499d6d63d86ab5c9a5501d375ce86e8e95d98e10 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_manager.html 2bcfed730056fe6b55219618268bb216e50b5f794468d17b0913ce64de83d557 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_index.html e2ddcf96a39cfe5586427d3b2b55558e142ada2a15bc87787ace9306f2e5efed 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_instr_functions.html fe5edf934486b3d53aef1071cb40f2d4ced30372b1eb858620e34532f95f4b22 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_intro.html 25e2d3205a6526278ef3f515a1fedc1819dc0fa4ce7e4a6ece25b7cc54b2df6d 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_config_files.html 1da2c9d56606a20fde3262643f7390916222447045fc353fb1bb3f8e35a129ac 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_funct_descr.html 35550aa18e5da274035511397534680643c62ee4f5f6c0844f0309e9209faa85 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_netif.html 1561fab7388641bb20bd0ab396b13f47a82c2692bd6a10dd45003a048079e553 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_mib_compiler.html d1f5a0f5ddb4c5c0b246e53fabc5685ffad6a338f1533fe360d3e89432ff8044 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_notification_mib.html 394babdc3ef87fac76a870e2ef8ce456f17a5401463be7c631836120cbbcd7f8 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_pdus.html e64f4def5493fa341bdb7bae2705b8cba31eb8a2ba3a96413d49b608eab746fb 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_standard_mib.html 3908723252f4962a08fc285a5f5f8f821baafddd02962d52b0cf4cacdf5c3fc9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_target_mib.html 440c4d91b9a166ca13eb6b2bab3245ba7edcc997d02fa6c1187b3169f0c4239f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_user_based_sm_mib.html d00dce312d0db8c239ea4c4a6b58e6bca18e0ab5d6c57cafb302db84e48a104a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_view_based_acm_mib.html ce76e6f021a771d39b1a923f4c3d46f1de7ad3562dbfbd01bca9af2e0628ab99 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa.html 3e27541f86446ca71c2509b67798033cb1cfe7dc71249887f552f66408e76263 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_conf.html 022e98b557cda355ce810af91f45078a9f34ba01359774fe8705a28cf9ff34e9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_discovery_handler.html 90ab614948a9697b95cf4e1db7e01fb31b47578a9f649ccacc50290967d0dd10 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error.html c6076f122346d97f18df8d391e7c0733a2d1caea73d6177e8fd79bd4b0f1d913 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_io.html 97bb11fc9fe74c3d1c4b2e5deb02ead3b67ba96a5137b54c2f1b6076c761eb22 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_logger.html a50530fb2dc492ce3509ebd4ae721a29962c84f9d7672527a9f011cc478627f3 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_report.html 51a2d85c64937e6fdaa17b5fd4eb4d23e697984af638db79fbb197ff58982021 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_local_db.html 55eedc3de07c86156eaef7d10ffb0452faaaff0b720d9711e923e9063826f8ff 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_data.html 9d4fd9dedb61f1fb484f94f5c478f32259d5cee9add62c1da9b74d2fadb26908 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_storage.html c5ed2c21a38f7266407ec9a509d9617dcc51a3aa79206a07ece3d000c6b02ad7 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mpd.html 37f704e98ce1a329cf71da0c235e99371ec87d9bbb2e8e11e95de252fe8ac214 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface.html 3b690b861766a62f1f22aefa8c7c3dfdb0c79b9ce481242c0c71e62a0fa0679f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface_filter.html 2633d193d7a96e15b7e69dfe6d49114832b53956c3f0f74b3dbd1b8f91b80287 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_delivery_info_receiver.html 87ab65c888008f0ac7a3c57c6a1e8ea7602ed8e6fbdeef9316c64b50cc506a5a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_filter.html c1b36da2c1e2363196a156a414b089999864fa4b0c4d4b93e53bfbb747cad097 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_supervisor.html e35fdd07cf232867d4fcd1c0d059a2b5830b598a2b3c6d162d01382404fa4b67 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc.html b277d8ea273b6c981121d08a4b34612f20c27eee6e15102c5783a4e101e665aa 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc_cmd.html 255024512184e211f2b56cfdb685c7413334b482721ec3742a3cca51acc05e25 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm.html fbc2c73b11d47c108913dafb88147beff92cb519f528f6f408f323d32a828519 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_conf.html c492f223317e252cfea07f501da18fb7feb0b4806050df25a175e0872ea2aece 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_mpd.html 90d50c721382d1ffd0e0791c60e74f5f770eb43c3d00db4e1c930082f41dc563 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface.html 99b15b72c6a01ed175cab126651ad59870a5b641c63a9516972a8e44a44bb37c 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface_filter.html ee54eeca34c9f26f7f4a3fbe4b3496387d3192b7f4565e7e7a1c829ced4ad0a5 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_user.html afe179321bf633e5032d77763f8248767b06e3a28f22a26c5961c9513db68b0f 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/notes.html c222a7bf0ac6eec03242a0c521f88be1f261bb6fd291126be4a1490a246f5b16 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/search.html 03d88c106d40cb44da62c4ca28652af1b580caf3a28bf4d6202c984a40302f4b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub 903a6dee700012550fb5ac8b5e4bae0c04064c12f0415d0040387f7b04779f9f 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.html 806f0549eb218ae3d26ead615ededd70f784fbb764797fbc2bac34fc7df1b82a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_advanced_agent.html de1d37d37cde1a3f62ba1cff37f3828f5473bf767085ac3944209fc67eb4fe4d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_config_files.html 3434734b1324a9d73dbfe58c1e1692a320159af3d981029b0fcfc4897414f2ed 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_funct_descr.html 9dfb92ed471d85782cc38efa1a0fcc694b9f872fb273778791d7045150bd4609 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_netif.html dba58a98b33661783eb9b8d4961c09d56489e95a787988f4f75c2a53eb3d9375 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app.html 9238a37f5e25e679301bf64ec63b219d0b207e18a9ba9e2ccde75d9c47fd67f4 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_a.html a3d72a8a1768b85cd934327426723d3758f5f6135f3307be44d031dcbab32f8a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_b.html 4e31d4d98665447690b9e7027ca5a4e7ba8926e3279bf8842598928121993d08 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_c.html 6e1f9ddfba4ad55a52ce8ba2406530c9b1ccd1ee31c9840371d7c83ba9220bcf 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_audit_trail_log.html 2116c0420ef2f8224722c5b177c28fc21953a82b12a060a955aea0ac7bab8829 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_community_mib.html 20630923ee15674b60c498a4817afb36e858496d014f201abcadeba07e99e788 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_config.html 0bfe40743504ddd47e2627558d6ac705ec26e4530f21f9e04166cf099eb9886c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_def_instr_functions.html 9e3bd0225d8f594163ad4e52100e936fb6236d1626262d7ae1029def674caa0d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_framework_mib.html 97d167f7a5a0cd985d5b6602d9d201e2c0fc577c61f11677a87c5ba6d6d923e9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_generic.html 5bda62f8b22bf3c123cd29424ac29b163a4ebbea7b26d2166909538e34cb7db3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_agent.html 7b49a2eec8be6b2ebc7a0e5ba0a2b18129b0b8b216ee0545da1296997c9a9bd4 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_manager.html 235edc77e34992fd8b6307b5eab1ebbb6395634bef26c7602844628051433fc7 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_index.html 5b36951621872be782282d196a2a9013d2e110c12d1d58c151166a01299b689c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_instr_functions.html 5f393a99d60b05c767fc5b5891ddfb33bf2eae56387189a0d585573d0fed4e5e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_intro.html 33b6f493c47101b662f56a47fea579c452a41d65322b2869e8d34963daae0feb 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_config_files.html 4c3cfe065c6732574ed923293663ff164224151154184d47c3473e3453967243 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_funct_descr.html 94e8a3ddd300b56ae26459af8a9dac84aeecae683d6f67a432c7cabb31032207 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_netif.html f70561d1ed96e5b48eca5c353d281e2c90588fcf460dd79ccb86a6e4243697a9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_mib_compiler.html 66bbc86a59fc0268f158eea9ea074172e97ea77de87091391e4eebf348675ec0 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_notification_mib.html d795ce2a0a673165cf437b3e8a243aa7bcc506af634b2899d7415fff344103f0 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_pdus.html de10338e8ca728cfd02c29d29aadab75867d65051134397d3eb3f562fed52be1 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_standard_mib.html 62b872c1cfee739a9a008dce0a4fce19f81f1750968134f69b8a9dd82c6d39d7 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_target_mib.html ea5d25bd951fcf3132c68377b414aa70ee0af13e89d7d6945e3925b26cd5321c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_user_based_sm_mib.html 08d927c1d7aaf377c1bf89f598536a6d55edaa330bcd67b47a7f22259de79481 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_view_based_acm_mib.html 7612035f88216ebf609835dbc863376f9b04d81d6e7d2ec427bb677ac19b64ef 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa.html 60e883ee6f8b68d5e1564c3ab837aef67d88c0d5325c6410032516be0b2e9c49 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_conf.html bee23f5d351b400fb5a8ba7023fada289818d39cc552bd8d289b117b1d0679ed 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_discovery_handler.html 4a7e03f678d47896f7b2120c67b7c521d33957a116c2fc5a0f04f9391c05d30e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error.html 1694aed9d0b060917e67f51ceeb990333f6bf75d51f6777c61db02c96e62d173 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_io.html ed220cea33dbf5c861eb440f39c7756cc6eb20f039b6d4e4c1de30c8e6c49d12 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_logger.html 3d6dec223a00af67e32c8bc999d36aac521b0b675b913d3c8d8fc24e0abaed96 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_report.html f01979a732a40e831fbf19b5508ff6db566a2274feeb7a915e6394dd06e38222 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_local_db.html 9a5f1747a2ea172b822895ff700f165d69e0ce268d9c5ee9a93a3179c7c5ae70 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_data.html af3ddda04a4240c42fdec04119968e7c6bb009c9e9181c9a564126058480986a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_storage.html 6a65963a1fbbe50ff4709ba795b911407003d3496fd757e5a2accefc0d9c74ff 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mpd.html bc9ebf4c718ae4f5e43a327f030043df7e6936042fe62ffebf04444a2a88f6ba 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface.html 5d577c1d3ea5507749e6d5ee11a4ab22318036a6228831d654dd7c75978bdda9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface_filter.html 2fbd8b66a55b8363740586ec748c43e9e571d1c6fb8ffc2e5b6ab26b2be5db62 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_delivery_info_receiver.html 370e937ecd3807d21505a90ae625ee7e4fe56e0055e6a039da74c160f19a6714 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_filter.html b1b8e29b15536e22dc0e794aab306bb766c1f16aeb8b765f6141f72369c809ab 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_supervisor.html 57853b34ca38ae9ea0a53e7d2c6f17708cc59125ecf79c900c13d02e82812618 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc.html ba01e0dbb329d0d87c11edd6503f9b2c44108e3cb31ad949f52cd32c259d0220 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc_cmd.html 94349271e0e2e62e93c0871a6eddbaaca71b32d2792e9e5665206ddf30754b36 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm.html 8a666784f6be65dd1101683e2d06910fc45519e88e5f13952d2b8e90c7e05227 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_conf.html ffadeb2bdf1b39877520e0c66eb6d8038eb0a74ace87c01ac5a34145a6e5a1a7 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_mpd.html 4431ca6558ef4959bbc3af5648001c1d555f3d976c8c098aa2d3aef21c2595f2 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface.html 38153d4cca5a82502e597ba97ffb821c508e3c0718585004c10965d5cddf2392 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface_filter.html b738e9897bce2a6a8602f0ff8688e982ef7b6b28160c0aef358f69b12acd1e01 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_user.html 3fa52b78cfa301481c47ed83e6d189e454fb1874eb90e1c8ed6823e2beef1eab 2 @@ -3943,2 +3943,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/404.html c61bc942f67a3791afbe3f1ad38b5926e93e0889005a3684694a75463e2f1dac 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/api-reference.html 91ad1b79e8e9e711081a779b18aac96b2af25ebae0c8083ff4eca057124a66b7 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/404.html 30569e9b137a19a8373a410f49c1cba35522d5e3c651d8184af267a2cba3632b 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/api-reference.html 7f30506dc31b52ea223f3f7b3b971cbbd5b3a1b304be3a76161c7217d5e21f6c 2 @@ -3949,2 +3949,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configurations.html c6cab6ba7d372a96d24e5e65334b532ea6d42c85704de45e2dcc0ca35e89cb71 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configure_algos.html 293b0ed472006757b112bc5373b7182a7bd61d28c3c1a464f56b821e58b773c4 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configurations.html b4a1ec1e600fd5fd545f53f8ee44f8b7f8ba5dfd5583b3513223147eb016ee9b 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configure_algos.html fcd19c378f32fb5573b40d5058f954db1e19f2f36da43bc8059d48b145e0a361 2 @@ -3961 +3961 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/hardening.html cfca59e31b1cd8daa01460a767f26c2a40aa60046ad306259268f8ca9c4f0fea 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/hardening.html 1931e6d17ffc7e00aa3da0ea0d1b3b74dd7f42229670edac34f194fa09e5423c 2 @@ -3963,17 +3963,17 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/introduction.html 4cc695058b85932abe02539c78f7110e895cfae971aee06c43e4dca9be33d2a9 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/notes.html ae9325e5cd9bdc9bcef2263782e3ff1a30d1bedfee5e44bd18f8eb9e1f218331 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/search.html b9787bb403f67d26d01569a833de3f07bf420ca0ac5474d515bbf75fa67bb758 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub cdd68fc4382a02a85a5675c38507a9a39ae82287697e7ffbac97784b1f2bd7d4 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.html c780c4f11140eedaf6bcc74d9ac0f4fc835f888069b8c9a533052b139eb3d3d6 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_agent.html 5884aaeb351b3277af790e87b66fed8c791a3b7e23624cbc338da6453ac77a98 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_app.html dab63051a1d1a6c00925cd0c5c99d8c43d26dd2ecd69d4e66463e840f00af707 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_channel.html 8bd42d68174b686fddaa62b76bcad8a3231c6d96ad0743950d2544889909a7de 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_key_api.html d7f8c05503f94c8f0b6a20ec65bf8e92ae401fa597871030eabc18f182172712 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_connection.html 93df603ffb0132111728fb2514eb2cc971f24e453e527f4c637222838ccc4a9d 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_file.html 80c0d236185dfec1ad4ebbc766510262ee0339caf5224eded63fcac53793111f 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_channel.html 3b5b8dc05bc4927502b73e012bd42c32d0308e6ce0680ef1850030a45b57719c 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_key_api.html 6b7c6bd025349e3e74d2f096a4ffdb18584a273fa98298d357ee8ebe5bca83b7 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftp.html 4d20151caa2776ed81b7f7bec256dc663cc3e0337c81357c7e12b68fb7d22974 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftpd.html 39578587c87fc07cd50b2c3811a4a39ff177abb97fa64e5011da6539041a1790 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/terminology.html 10cb5d88c049f9245fda6ef5c7035f33a10a960fbfd7b150e30f340936b6c163 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/using_ssh.html d8865dee9afd1e6e0244aa1a922d7aac2f81a18adb7dafa974d8b2d2f7452735 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/introduction.html 9fee65b81eaac4da10382030bff111d1a64db00a671fb3b6b6aebb94018b9ed6 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/notes.html 219883cb9b5024b6422acaab3d770d9557b46ef07a645061a62caaa7d6ea1863 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/search.html 85d3194032b0f27dbd706a74ba14e61825eed12ede29669bdab38d3493c0aba4 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub 8f350b87fe06cc9ac3df656e38e379184b6a6349968de93a782d9af948e9aaaa 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.html 7f663ed9a1321847e2fa12f1e77dd26b16bc9a1cb5340a7d38282583eada2ae6 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_agent.html d8a5eb402cb16350ce32fc054954ed73bc225c296baec1cdfa671bf1563794e5 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_app.html d4cd0563c9f81819ea741aac6b44ef17128fa5146ec2d62ca4f5427d981df007 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_channel.html a16238ea00da3db84838e1879ded00817a19d6a497e6640b1d81a1d7b3e1498d 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_key_api.html 78ee917a04b22c86aa0e5b53bfb0608fe037a621fe307f0211827f32a6b05fd7 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_connection.html 616d0c2aad00aaa7ef8ae0a43eff1b8556a518374649a208e0a497e110d046c4 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_file.html aa4a1c3596096f1e4f59e18d2299350666686c1ea6c79c6adea58dfc7fd4f0ae 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_channel.html b2b81b8c3058b79dab5afb7011ad453b5f53f093d502ec7a1ee38cd6410fb122 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_key_api.html 91e9f49ec53b3eddbcf87a389befe5a354a4bd768a3c58eaa6e2f11030509c57 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftp.html 28ef1729678cdf1d9d3ad511e05c947da001aaf05191207c15dac3e0c7728bf2 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftpd.html 5a6cf7636a188e22afd314d2574e442c30c9577c4794bb874e7c4cc8b433f8bc 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/terminology.html 3ae089a256c22953bdfa731dfe8eaf36447d2da96a89ee739ea9c1d3e9e606a0 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/using_ssh.html 83f5c08164eb0b3f981696fd2f65cc5dbf6b77f0f22f35582d1774b6cdda9b11 2 @@ -4003,2 +4003,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/404.html a005cb495468df6968242abf795087fdffad2da39962132a8971907c466ac7e0 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/api-reference.html c0e50b04bef9760ab8861dd27c2bd2be7caba8c1776419aa0e80c7b11fa2083e 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/404.html aa2fd904073754e79f45bdc8f2b168523690170915d418c3243930bfcb4acd03 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/api-reference.html c257f06bb75c0da7c933862c7d132ee803cabc468c7e26d66b5f7d282afcd1b7 2 @@ -4018,12 +4018,12 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/notes.html 091a2498e7271a78d7a3733dea27777d23a077608b97e4a2a5c1510552435242 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/search.html 85b0eb42b88722be5996904a7e0ff68ceabc460485c40cec82608fec29d45694 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub 91a22904e8efb42dda2902f385a250f1b1af6977ba6c24b31754bec236dffdde 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.html 47474381e9c9c24c8c328d6311bd55dfeb8f5ddde55e532a18b9b24c18a1733c 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_app.html 1a567f760e9f7c73aef40bf76a9aee79d05ccaca16c0970b9853d25df46e4c79 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache.html 57b1c2616caabd10d4d437e5f920c124fe5b40ae64d4f171528c8bac8056dbcb 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache_api.html 54d983c47d26f88fbf5c5118648fe2ba45dfef0b06be9446320a049a42b65d94 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_distribution.html a8ab14d8903c0391e70badf80f39e51b65937e15f11442d8c561c8a6842e8c5c 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_protocol.html fb685f2af2ffee0b50d660b3f8cadc25e18e07560e741fc2f58450319237f2c9 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_session_cache_api.html 20455dae8ac616c12a00dd9eecbfd515407ad32767dffefd4edfa0ec6caab4e1 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/standards_compliance.html 2ab9433055e5ba96633a47043dd45bb8e37e548ba6da1a14c797f28b964f5edb 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/using_ssl.html 5ce03abc9efdbef3ec4e19aabd879ee59befb3c5e3b413db0d0361b975f84209 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/notes.html 6eb1024f927c21b0addca052de09f8e8510b59ebdd8edd25899e5d142004deab 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/search.html 47171713dde05b0e2e40a9a60cc86b20e60d91cd1cff86623c50c8d161a0cba4 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub 624d8d8c9e173ba6ed9c3dd7c99273e63221a5ad501492ca25818f8d303d11a2 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.html 8d0e6627ed678be25e19ccfadc14555a8441b69177b2c75ac244497444d10157 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_app.html 17c7ac5618aca6c074e85d37c60944ef26aa3df573e19fbf10a615832e4cd2ff 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache.html 04d2f1f6c0d38233947988b5b1a11f7305038518182c167481ad1654a7a5752c 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache_api.html c6c1092729600b0b7436191e4664c5d64028c41573befc7cf694d2b756ab9431 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_distribution.html b08ecbc21305537d562440013062f25fd9106520902ec6d1959e13b79c8a57e9 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_protocol.html 0161f3b761b532c93b6f6041f83b31483123cf61bbd8324379ff8ae57fa69e1f 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_session_cache_api.html 44bc379770692dbbefacb4cd673d8228378c636a1b4fae5a468e3e8d3e5c5832 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/standards_compliance.html 27478151dec72819761aad7659f4a013d0373ad1b2c45e4e869bbeb2b7129d4b 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/using_ssl.html 9baf1a5a722d5339411f93481321f5dd4bba2bdaaeb476494102accd25ef8473 2 @@ -4035,5 +4035,5 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/404.html 050c55e2cad286e594418a3d5a8099dfbd48e1b137c684e3024fcbca8dbf5df1 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/api-reference.html 3ce8130ba0d7606e601e37399f71ab122291bb1a93dfc301d804736078e3ff08 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/argparse.html cdb68894625685d677596a65e739101d0bc99e434c72b41005f5db0e9ff21bd1 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/array.html 9372c23a9015e00d8ff2076c38bde4c86828fdefe5c19044bfbcd4ef64b920f5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/assert_hrl.html 277053aba8c49a0ff9ff00f45b65d4a8935308b11e3a3f6c12996bbcc99d7ed6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/404.html 390644617c6bd281a4d2d21a27fd1378b9fc9f32dd50cc600afd4cbd120eb188 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/api-reference.html 3b9425c55787d6890b98d920496e0730322e49179c61bbcfcec9acfb0febf338 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/argparse.html 3ebf555e1405792a031c9067771c95878f476f0cf73ad8fe3d97b578f8949766 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/array.html a97d7ed466617ee981618b29bbc538c7906d437991a486f64cc3944e74194e6e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/assert_hrl.html 87a37d3bfa89b800961aa23d967205a5ba41fd9b8939441e4d02d11da53c1a90 2 @@ -4044,10 +4044,10 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/base64.html 47d67c9df83caec0b45512dc245d9c3f6e24045bd1ef287fb30b9bf520b439d7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/beam_lib.html 52e2d7892579169f2ca1d0411cd32e22d0c87132eef52a2e3904c9a7f9158acc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/binary.html 065350f5ea762955996abfc6ed847a6bdf51018d8a98d17f774a06ed4de6c616 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/c.html a4c1d1e79076f6284ac0156b10a3d3ccede6c35b50e64ba08740fdda954cf66d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/calendar.html 3d023ee411923a67784db54b2d51088f3f9e516ddbbff1aaaed07425474b4526 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/custom_shell.html f2728be683d8c157f2ebab3f429ccfab3e3f5efb5dd4ed8005f69f506ccb8b9a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dets.html e8347d7a80bc1f4a9477b899cf4d38e13e986b3af0e95ab34a87ef5c44f87be0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dict.html 26b52279f3823e7e1d8c066c05545f0a0d49f4e7fa8bf8bf7ae5bca91f8a8e32 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph.html 689b73f534fdd5d9f0b085fd6b12f12959df05708389d329162a14235b575495 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph_utils.html ead9587886ede34803b834bc129094ef54522bca9f2a5d1a6d71ad29c5994d00 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/base64.html 0eb4437be7e8f1d46390f6ef14cad70b0e71e7839fda1e5f51816cc97c214998 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/beam_lib.html 1257d68c26fb53fb0b4e248862b477a2cf166ffdaf3682a6410bb2ad6c2f83b0 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/binary.html a54aad3694767d5f1023c5631b641b18d7231b42980f9d277eeac404ccda3a34 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/c.html 8f9f17bc91ca8e01bf52ce1175da9a3e27423ee15f205ac884561aa0606b99f2 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/calendar.html a8c5a78e284ae9af9ddeff31b72973b00d2e69b53caee5770cf176c33b57a06a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/custom_shell.html 1033512677dc6e34c559a9e8c455a75f6f9f281a0177850c24ad5a88d903e6e8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dets.html 3a980fba493c16708a0ef532967478a794a6332a54f7c7b0175cb798235509b8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dict.html 6df5593b390b94907e8aaf66cbd775797c5b7b3ef7bc14f5727a412a003a2e2b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph.html ce1fcc9a77969478d15da41ede82162b49d8eff5d7c95fdb8f9af182511eee4f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph_utils.html 9fc795b2142a8982f7186e721d255e70547d25b091e3eb47bb8f9368612848ee 2 @@ -4064,26 +4064,26 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin.html 07d01a45fc2de4d0ce5996bd3c0bc2f5e78622cce4923db35bf3220b5647060a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin_expand.html 09508832abd08891f74887f48675378fda2e47a12d432ccff46ba87bab2b5916 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/epp.html 17cc6c1b37a69ffaeee5465f5683e16dc2f5749267f9cdaa378187592e22a8cd 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_anno.html d16388d6e53ac23ee71f51b265afdb170b35c3903bba3bee51250f9b1f84a50d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_error.html bc0f083b3b302e7ccf9b505894399063d77ea94041fe09b68706339e1e26b46f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_eval.html 0e741e47979b2c482f3e7e2f5ce6ee015c2b60f3d478378c2561190f67a8a98a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_expand_records.html b91176c2fcaa5e345bf5324c99c037b83b45af6b74579e487eff8b179074c021 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_features.html a093a1910e54c7cae8ca079e8035c076c418c0d56427798239f7c224e871ebc8 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_id_trans.html fc6e35eb9af58c092c381e9d15f77277bb86bf612ac6ff6ec7c2ca91103a1476 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_internal.html 1845c89366ff0e4baddd57eaad9cc2d6fed93f17166157c468d49c18fe1283fb 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_lint.html a703b6faa220b8eb433329a4dfc5a524791be9a9fe24634f4e70b2acdee7002a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_parse.html bb99d5bdd50aa266e095e533c78421af0778ca533be514ed499f2b8cf96f79dc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_pp.html 6fcf068f1fceeb04e8097e08f3010d2653ca947fd8320f803e36ea70cacdaafb 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_scan.html 44b38aa72ca07a10e38d1413ab90b4c9d23a1f229f1745ed4f1d2e81ed4f7a14 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_tar.html 7ebe9dfa28233c967d99fdb5e4267208efef5d513ad6000bb12405ed6917453f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/escript.html e2a9f73f71e63e1f7c079888c62ac5b6eb5151f4150bc9d7727312c970509ea9 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ets.html a89f4fe2d353c8e28e73b6a58e4858e2ba6d907432704f6e805aa0b87fb8bbaa 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/file_sorter.html 638e339fee032dae28c7c842c47b734ec5354169d0e84037b8cd65938a4231ee 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filelib.html cc09b9e4ef004e26169d2945a0b3d67ccdfd5c053111842b7f66c3fbd049501e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filename.html f53a2e610ded82ac5223e471dccb308b677183afacf7efd1a0d3481df75dae69 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_sets.html 762ff022fc76fdcf51af71c062d95e4e2874fd1f7ae09afc4f8deffa32d674af 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_trees.html 0f8f0923f4e09211159b3a5b81f7a344b70acb2dfe921aa35c985dbb015f23a2 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_event.html 7012388217df504c8a0357cd8cdc48d40121c6f1869abab839807ce98e0efe06 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_fsm.html c4a6003bd00371ca086bc82f1aa9e43c6234bd9eebef568ca3fb5a921aa7504f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_server.html bca73eeb51f8892e9adf7834c54314f05763f7f54f476458317bbaf4db84544b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_statem.html b0ce80fffb929258f4682fc05150fa83cfe0f129e2b83ad3864b4fc075decf54 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin.html 25f02fe868bf4c05a4709e442eb46eecb5cc19df4a1f9960d6f2e61b1274bc9c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin_expand.html f4046ac2c96a6e4f638fc916a16de516e0652ec2ddc538403388afe89aa1d194 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/epp.html 69fe89d1d1fe68ec26ed2f81c81d526aae468b1faeb4036924575e0a80aebd90 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_anno.html 20adf74a3e683043259c95fb4ede969b71df5ed627fa5c17949b377343b38600 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_error.html 9a277f5de88b1dd1da3086bcf140c756c02d4b8ca779245701f373cc73f25725 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_eval.html 9b34c0c74b897b185b91e2266c74091465b33ee970bd58199c44938be63ad3b3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_expand_records.html 32de7b68b36f01db444fd595bfcf2120de16673434c8ad9b15ed37c7ab887a3a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_features.html 9cd7aad924a15705770702cbfc60df16f95f1c97a89a28c486ce6d50f2acfe08 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_id_trans.html 7044ad34f4bbef46f4ac091370e66b967bfd791249a516d3e997968f4b941355 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_internal.html 5527825103a5146c3886afd98625725b2eb6eda2b7b6d7275a7df1a299f02b32 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_lint.html 0397d6bb39e4aead7960011541a23464076c751d70aaf3f0d6dec0c4488f1727 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_parse.html bb76a02c75f30120cd2bef46d3ddca960646343b9918340227d4104c7d08066b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_pp.html 0565e57ae3b9c8c2f7a29f430e93c4223416f94d240f91291b691ca4dce83e57 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_scan.html bbe9f0cf9703a1849ba5a95bf51a95c398d1a9a9cb3c4edb42dc3b7ea1dda053 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_tar.html b7bc31ea7943db365a9e0f1c95b4647ce745561785495c8f38b4ba1c1e8d26bd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/escript.html 4d55051017e67d7e76e0f55546bf375416ae2ebfea49d7a5282caf3e1d81c26e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ets.html 16e6c0bc7236c299092e679fcae9451d2a01fb75f18fc32fef9e9b19ae332235 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/file_sorter.html 5eefa59b9bc198b42cd477d3afc90b6d3d85683326d10713ba563073dab00b78 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filelib.html d12103c9762c7a8788719c646213b5a68e8c51da0f27e9af548872bed50da0ad 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filename.html 6ad8ba686f899feaabec78e1e0a006e1d10105469b28cb5ee0837c109c266180 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_sets.html 7d98a2b7a0d957fb5d69d633782528c92b0beb0e014a6bcf453f51258159f0d4 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_trees.html fee885c9e49976acb02e424277c46c2a81147d3f0ca288c77a486b00e8abd8aa 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_event.html 7c06bcce6ae18b1d4a2aaeece655eaa09d675266d6a5110a631ca99fa713f13d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_fsm.html be82c63845b7c0cd1eea8a636b44af03e3bf44d15c061515f230851190df4302 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_server.html 0d207e9c3d97b9bab2cdd8388a489292534fcb503ce6d9f46af5add909fbc7f0 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_statem.html a3c39d71ad344b240dfd9c092e979b5132f233bd870e8e9483b87dd290087dbf 2 @@ -4091,45 +4091,45 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/introduction.html 68c0ab5aecd2ad567ef07d9f772ce788ac10a959b1d00d296c766f252ec5198d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io.html 2a0010229746da03fa9829cd0a23763385298d8f86186e937c9662d2239b95ae 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_lib.html 417af0a7c36118e4c0d6cb6058c7e7cb6803d69dcada8395adbf32d8cd248194 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_protocol.html a6c82ed334ff39e25b0e281b2e279be48db1fe203940df0f5911800d2aba883b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/json.html a816c5bab1e3957773a0e92c685ea8192d12afba970a48e77ffd1b564e06dfe1 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/lists.html aa58601b7970f0315e503f0884b877cb470ed87bcf53546fe2a5f9d8af8bab37 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/log_mf_h.html 0a708cdb028e7bdc97e77de7e2a4aee78263650f3c69768967c95724f221efdf 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/maps.html ebadb7ec92e8a4a166e3553441ddd0226c69217194c2145937f4ee9e653640f6 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/math.html 79719346eb6136ae43baab1c751cc0e3eb519f00a77b3ed3e6e08b2d4c89a6c7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ms_transform.html 6c85cd59d84256db0c714c487beb160be8cc2d947d62ee40a501d05d5eb95ad5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/notes.html 671e2c1b234f66ee12070d5b93a715c1baa420e7a54964460b0f9978995dc1d4 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/orddict.html e6e57b4ca58d9119e50ec6ce1785863c299ce2a90ffad16a70d9fe2e02514cc0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ordsets.html 51a894f4ea0b0acd256e67b3aa4b527e4622f1b1da6051573d0ba2da4ce6a9fa 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/peer.html 9c93146a747c6647e554674a0bc597a08c1ee88e56f7860a1bfc2965c5359799 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/pool.html 314f8de27ea9f340e2358135f7c23e99221ce31b556c8c897788ed3f2e72bf0c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proc_lib.html ebfbb57bdf5c22a829ae431c203d7ed6637bd484362c9989cd928e791f1ae53f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proplists.html 95e1621a9b1bf93de1597e599d30888a1bf6eb88fe715248418aef1be47458c3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/qlc.html e173b293a4a08ba39bc6971ae1da8fc6b4c98e8c0e39f1ced55a044fbeb53d0e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/queue.html b76f21283b6f3dc9f791864c8bc76ea8ffc02a9ae6aa860b87a21694f44760ca 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/rand.html 27261a2583856915f69b15a10bdf1b6c09eda6ee51af98afae5485b50c107b4d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/random.html ca3fe3b70996c08680d67c53cd814b92932cb0a4969fb787c99a9783cf625010 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re.html 23e534ccb9e7efc8b36843a29d721dd3548cd7d41e65dcc62d962fdbeeb25e20 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re_incompat.html 8d4093b9d737ed9a2132dee1264db5625bda87fae2216d76f72c470562b8acd6 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/search.html 887729b0c0f2e038e58d58debf0423415ff33ca1c7860f6fafe23a1378ec89f7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sets.html af0e966a617e6ffb0f49711ae9b971317d593b6ec9c70f7200606101ac97a47e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell.html e62d4d07135b3411fa1dba9b82acfafbe92d8cc4499409d5a08c9e2eeda1fcd0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_default.html 18d8280f747964181dc38ebba9ccff143d686d9e0a4fd9f9be429ebb66d6aa22 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_docs.html d388e903cb2555e5efecb67fc1412692561378347ac718f53566af7a36e29739 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/slave.html 2bd00adcb6e46544bb969f066992ec71fca1a540b53825274f7b21dc0205bb3e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sofs.html e117658766577cabcfe9c9d94f3be592ec3f4e308a7f038d8c1e1a7a873df13b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub a3a24ec02fa693367e56ad5df367f6eb9655b729b42854f191d73725e04e12b3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib_app.html 1249adcdeb923e55b3cc5636cb195c1fb4cfa86013916d38eb707025de789502 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/string.html 52a77832a9b593af31c5dc7dfca8babe100668f67162caa64e2a26ff257d799e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor.html bc8b6e60a9afe015c747258a208d895885656b8549fdcfa96f846565e2fb6241 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor_bridge.html b109c823431880530e79d46f076b73e3451259ab5d7592e653227f1722d82ef3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sys.html d54997e87925abeb1376c0f70cb4a28017936ae680ecfda10c6f437bfd5e6c98 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/terminal_interface.html 396313a825cb7ff38948072c4c7180c03343838657215df5981d56f41c0526c3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/timer.html 0ea8d662d49cd2539491cd73e49e5f35c44016fafd2bd168a7c4770c379e9d70 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode.html 14c6d7111ab332a36dd8f4a87f2d7a3b5ca18dd0b444661b9330775243078567 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode_usage.html 24fba0e48a218f0933db51ed6a13ece08ac4dc88c6e3e11691c4c9d056d3ac7d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string.html cf6976b56fb252fcf5fdc0de66455ac8987c585549735e59aa946f43957489a3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string_usage.html dfd8a8db776ee87f369be6f8fc38aff562a6cf9b507c28e2dcb3f9bf4032c969 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/win32reg.html c3512bc32c797e379ce5b2beacfca38880bf7d29d8739ca322d335f69c00c19c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zip.html 38ddf59c95b9c4626098488bdee71c149a785742b29ebded8a5d2e35d9ea2327 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zstd.html 535f35250cc3816c9f7c7235b6713a7042eee66497bc6e0f22719d444e9e4814 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/introduction.html 9e3d50ce3e89cee36cce08ffbaada3c90db5bca4243507fa139f8c2e72a60704 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io.html 8d54be807fa7b76748e6a804f8e6933662db12f84120c254944c78ffeb6d11dd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_lib.html 2e5b817f891194e5e9b2764aeb119a372d3ef80623107f24442e07e31f959e66 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_protocol.html d7e8d15e3c06f0c22fae10f16a775a35b560d637b499df48c8e1f1afcbec4162 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/json.html 3a3d18ba3a9e472c849be3b226229f38aee56531981c93822912706c0db22371 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/lists.html 69a177587e88240b51bf18d6db329af072c058a50414f8b6ddfe31ace1a6fb26 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/log_mf_h.html 96b54b36c6e1467a657797f024d9fa2824d6c1daeab4fdd5208cdd1e0331d740 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/maps.html 8f98b7378e2b5132043fc6ee0d24c7902382be74f51b7a7909c51ce6fa6918a4 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/math.html b3384f3a4a88518cf640ab00693eed5b09a18534dcb3a71937170f52d4cff48e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ms_transform.html 9a9add60f19dd54e7fbfd067b523a7ade60e9f66251ab4a3efab0bccd50ed972 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/notes.html 8b6c2555a12119e01776a4ef5b0322f160e1f6fb193eea74f432c81625ac09fb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/orddict.html c41f7ba41c558a1ddf58b17bbff876d9fdb1ca3cb58d8090ce6e0c5af8538589 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ordsets.html f8641bc72a2a6e1f938e54215d14e080ae041c396d59b35dc3e89a6c23b43468 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/peer.html dc500f84375d066233812ef9c8f08f0d79f87c17725dc7e6b3e3fb4b1e68b7d9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/pool.html 704c82fec332478ffa231ca54ca6db2a247fc29f556479faf7638c504381eae2 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proc_lib.html f6745dc36aa277fbe08365d59d3c9933f6f0a05263272eaabafb8569269d5b15 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proplists.html 0501d65bbbad7e0ce33dd1561b49ce45a73523cc75aa672d90462bb8c2de1ded 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/qlc.html af11a25c85c333d92367a36b04d94f8b4c69dfcde2e2d112c84a9440c1f90584 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/queue.html 8df20d78cbf0e0dd738d4cbff5980061a2af33ef1245a5d951323a36cfd46eea 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/rand.html a8447c705df831a6bb0fa57bc4015950cc2650086bb9e507df60d907e45514f8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/random.html 74724fa8f0d30e31338344406179b7ad66c378194987dbfe9642207e8dbccf4a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re.html 9aa1f1a237da4d4f26268a0957460ce7901a7afd2625af0b481eb1e7b233ce0b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re_incompat.html 3b18541a945a4cbe69b93a9a74cb51610b59732421853227faa6f62d2bbfd5e6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/search.html d5584db29dd1dfb1a433d5482d06090a964fbe6ea88315c15ffbd9f0e25cf93a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sets.html 5efc560530ef4032dc49ad64ba32bba646c8bf7dddaff40bfb303ba72f9b4c56 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell.html cd5954d69f4876fc2c408dc67ee0a0e81e5375ee58e12c140348f652121ca1fa 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_default.html d69b2ff5cf9253399a5753dea4fc33c16c85c401abc909d2aa85d31275b1dea6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_docs.html 776165453af8d293ccf83809563e0aa1ffb41d994a7eda770a4ee8047737750b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/slave.html 7349e8fd8d291d1a340220744b1255a5b8f77b3e8c779c5b3faa426e2a04d67f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sofs.html 9753b157137fc4b6164c9636d03acad7ffc9d8389e70dcefc6207e5c64f04aa7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub 39a3e34943d8ce9f02878dcc3de41f75dce7415722367b718e5c975c1ed889ef 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib_app.html cd2e312746d9694f6f6a94e2c25c210d1a3e1043ba416f08cf5922484fadcad5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/string.html 20cf16a7dbb6860cf6fef7ae2cfde49b6822a9b86855e5e94dd3de5bda2f9952 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor.html 44ff806d8722df3b2ef44c303cec348489293b03d8d33308043e86295807faba 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor_bridge.html 9e47ba319b3ddeb84e88030c99df947f8fc8516bed7a5beb3e296373e46978f8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sys.html 9e0c170524c8ac27b75ea1d9477757fb9e3cea059a1182ab4adacda02103acca 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/terminal_interface.html ea1f147d8e5d26ec92fbb7b909e022b6ab88364c0d6f1cadd52b471de902f6a9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/timer.html 46a599c7157cbffff801b6200174bc3558162287dc9fa030850c98c5dd4d2b55 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode.html 7d0ac94dbd8f98b95325011d96dbd7c3104ad336c7cf52d8a168ebe3f165433b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode_usage.html 47073968977adfc5890d5d09fa350f30bc0f98f9063352894441bc4839b0c80d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string.html e41c958391561f9f0f2fa2c81a062d82bc455183f744cee6dbc0a1a209bad615 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string_usage.html 10e796ce7dc6c587857c3b0747e53bb7d3e516930ce35c10df6baf59247eb0bb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/win32reg.html ffced0da3644698a280f0336fa479baf3349a503c49d96bb817b646a732d2c52 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zip.html 397b0b9425a2602648f5c6c749a54c86be0bf0d555f4fcd1c344324249dee983 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zstd.html 3fb320d86dca0e3dca673a05779bd9d6bc7bfb050272dcda4452aaa6407ac39b 2 @@ -4141,2 +4141,2 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/404.html 3b0d38a60d8351a0f5d0f56170575552f8f7e42e12c900ed0a8fcde5d7cafe0e 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/api-reference.html 15d20e983aaa07bdad83c699b1015db5e532630ad88ba9aa46e2cb41b6b57662 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/404.html 493446546e3f51d7827a5b2fa3230e3577256a27f0432c422c5cb1b15e83efbb 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/api-reference.html a817fedb2bdd1366e6d667fca608d45149c182eea97f777899114b0df9b6b7c0 2 @@ -4146 +4146 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/chapter.html 0681e429c068d73a106c162061995a13e9fc44b333017d8e23d70fe1ecb5a7a0 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/chapter.html 708d9e16f13b15f1f45ec38e61e64f52d3d1ec2e66ce5243a800e76934f9a957 2 @@ -4157,6 +4157,6 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/epp_dodger.html cb5869d70431d9e0bade69da80f033817034edba78dadbf28e9f9432ba05b2db 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_comment_scan.html 252e96223ddf356c393c899c7b372daa0b4e32ac5b1f9c8c535a3fc4bbf3e6d7 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_prettypr.html 68ad4137a3dede4cc861f191a1ab4f827a231d375fb972e57db4906a6e8ccbc9 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_recomment.html 31987f0340a0521067b95e71c971eee965aaef4f4cae46140ac20f5d7018ab76 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax.html 6580deab4724c20bbea52ac227e574dbc0bc7532035165d00b4b169de08816a7 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax_lib.html 03a0bf635270fc2180c66bf483d1a2ca53ea2b21135b412423ac29332a12932b 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/epp_dodger.html dcc5ccbd7728d36d1abfe5ac9792f0ec913be20e00b0ccc319f6a99bd0179cbd 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_comment_scan.html 18c5d0b13b54d13b8e6d2cf3fe3a2368e037b17e60523222805e7127af0055bf 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_prettypr.html bd056622d3405aa586959740f801039e02adca545691b0fa93f207812cf91c0b 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_recomment.html a4ee22db7cef50bece1f4cd2b9d27e5978a55d98a76b5cd25f8015e8a748c1e5 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax.html b90cbc123b37fe7e1b4c9e203c680feaf5a75b1d67609800e60815667effe4bf 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax_lib.html c3ee17492b61a835af94aa181a7284b3a4662dd09d0c5b279320339b228904dd 2 @@ -4164,5 +4164,5 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl.html 8895541b51d4c94d534fae73810be683124fc18ba7314d53475737f1080e257f 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl_transform.html dea978545020880d909a675fb6100b1889cf44077be01f17e69082b79d98d703 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/notes.html 2029ffe85e68712d285699925dc12294e1b9dbb52ddb88f9b15e71188135e179 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/prettypr.html ed9f53afcbc5f1ca36dce591a9088cdffaf5c9b4bd288e2d0150913fe43de991 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/search.html 17d3e5c871fc520711249105d7df804c515cf8448d027c9a574d036429a1e2ea 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl.html 4bc1e177f4451095b2bd2e4bff1d0189f1deca8a721acd0e7aa5723ebb7b4d24 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl_transform.html 574a6cf677f6fba45be5917534720bba6d820d050fc5f04c746fa316381372ef 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/notes.html 0f1e2b7ac52a2eb75e5bfc870f3a0e713d2c472a44fad01ea1b61a81ef046ca9 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/prettypr.html e51f2a5b2e5c40844a2f9cdc2bf01d9c4362cdcadb31be72ade6ccc718ef0567 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/search.html 377235083ba1e8e9da8fe2abc991356c80c357bc82ac30e3e173d534816f40a3 2 @@ -4172,2 +4172,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/404.html 52c929da4d69ad65bbfe803274e8e38695c84b3d418fab4d6bb67acbca3c126a 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/api-reference.html a999fe070159934e9b80bc6b235b5da7586b4b0f394000d55934f61f7fe3aedf 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/404.html 0170efc11f3f402c14767e87ddac61154e960ca1413a378d9a52fe7780ad695e 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/api-reference.html c1b67f6a204d6cf037b8acf0f6e39ccdd7b19cbcbff8411d02c69545cc0a0266 2 @@ -4186 +4186 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/getting_started.html 44aa8e9f319b1c47a1ed770584d616c161b08930de5d47ebe656d9e894fd9b81 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/getting_started.html f86f43611c29dafba1704f3d8faaf159b101e465683142e26fda8147846a93e5 2 @@ -4188,6 +4188,6 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/introduction.html c076770a8f2e89f5b24fb8df746bc66edb62594ef702730ae182122d98d0df1b 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/notes.html d984f55f9cd87674a7dfe24b8d46ed50bdee74762f1935c2b72b21601e96320e 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/search.html 104ea7705b2318b7fd169743f68fae3e706d6cc5c54c72f0b05a70c924192257 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.epub 5cf138b4e7483e1b403a8a1fec45201f0ef574e6c22f62f68ac04ad45a9ba787 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.html d4a56d1938e0a164b361649c310403331d098dea6c68422dae0d643a372b72de 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp_logger.html e1965aa62bacb289872d39ce4e4cdd8542387952e8a32607450ea289e699e17e 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/introduction.html 1a9ba57302022b259a6fa44f1a1ee625d9f9df8970b84ba6614d3f9316cd6992 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/notes.html a42b45b970179b336c46cf3f8e41dfeb68a8c658361505e1b4709290eac2351e 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/search.html cff519db295fdb70305b63a9f60287dcd1977f4350d18bfa4ae30208de6331fb 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.epub 7f7e153ce385dcf6887377b2e102431a20586649a3662fc498ac3a96674beda9 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.html c4219899178f9a174eec44286542f691515f16533895dd44fd080b4028622107 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp_logger.html 457d03ede5fb9a502aef0e85d902707be316a2f64637e40fd33db2e30aab5dd5 2 @@ -4199,2 +4199,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/404.html 755f7d10f8af27667610def4fed9f908023aca71c8933edf5b64c514b715ca62 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/api-reference.html 804c1e3d99b45530ba4aba60dd3ae93e93972d514669500ecb30e8bdd68e77a9 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/404.html bd5e8ef5ff64555abb9f4027bd65dddc7dc24be1713b4125d4f45cb75b403cac 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/api-reference.html a2e9a0e963f6c915f5e8d8c59ddc1f3eab3eb0f423de3a280b2c6b36d80387e9 2 @@ -4205,4 +4205,4 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover.html 2af123f03edadb129d423595b264835b5609746166794d8cf1ea207e51b59e39 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover_chapter.html 86b5464318926a8cd22361ecea61e324e9e7a79835c68b35d9009b70a6afb82f 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof.html 635204ab00e26f7ed40b2f8001ac40df3ddcf299338bdb817ea4409b5258e050 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof_chapter.html 4d3c1a39a607779c0b287c60b8dfca48f33913695858aca4da586e5ca60bf729 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover.html 4d79b2ac71e7f531776a4b01dffada23a2ecca77fa2e806b557faaad1e574918 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover_chapter.html 2bba398932d36758b514f185db752a79ae3fad8daea84b4f01ca3439dc10a7af 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof.html 33e21aaa46093f7caf343a5bda049524a1ffe83af230a5b29a78377f27e461e2 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof_chapter.html f7470d1c9ecc9c01aa51640e0d4ca84890b879e9d0769d9eb764ff1290b14349 2 @@ -4219,5 +4219,5 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/eprof.html 55893f788689a516ce0e9e0091014e6a9247ecf2d259fcfe3390cfb63e02e8bb 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang-el.html 8fbe0ac1f96c13c2064c879e59ab77822a27d54fb609fb90edab382939ba1696 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang_mode_chapter.html 40f7b514660a7f63828a46f21496402e56a62c291fa5048c8450472f6205ecf6 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof.html 46d01197e48b89b9c086bdf2856703083598d355a1c9c818f139356e38b89cf7 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof_chapter.html bf31210342bc0bee888dc5bbeea20df5074b4d769be890fa56e1038dbd7285c6 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/eprof.html df9a4cafe2be4d38c09699a02d9012b9964691727bdb0edceba9dfd6a9cb77b8 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang-el.html 44307c7aee45b313a2d962662f309e4e16f449b22f5ae44418b202e4d2755488 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang_mode_chapter.html da776cd89827328d9b99a688b9c30989a1a89209e0154fb1eaf3a58077bde0fd 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof.html 66a2c22413d09856dc7af7ca761dd2d0285c52ba3ca8ff4c5fe0182260b9cbb3 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof_chapter.html 32759cec46133054793270f707c2096731fa2162742eb30e0f2553e3fa7298e7 2 @@ -4225,10 +4225,10 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt.html a5db62a1379dbfceaa3061734301799f04770022255969b9f2b5748bdd23abdb 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt_chapter.html fd11c07bfd6fa396c5a5c85eaded46d1362054d7896adb862205a432f8a46595 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/make.html 352ff5982d9bc9f445c3f0d80b107c62e7ff18ca586fa22a08028c20653c5636 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/notes.html ae42011dc07adb8b9bb196cd9df31b60d34c976b5de3e5b038c45f86db1a3064 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/search.html d3a3c7003e00b3fb932062eb10e9a43b3dd3acc152959b792c7767daae0cf988 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tags.html 8934ecefc78cb078f74f4ce18157dda0f2f25984619f7b9c338a72029d70304b 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub af2166bf38884a21e0dedc9f90a5daebf19d7c4ae6cbcbeceb2b51a7a44ba326 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tprof.html 542a57407ec4ef81eb62879f710b7a5087b316e4acbedd2f502cec6999fa5b41 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref.html 4f17c6e3be100f0839d2e5ad4c51c2068778e94a54e8135b894caf3326f942ac 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref_chapter.html ba28b93a5a422f907e88346a548fe049ef74f9c7926e1c92440fb73f2aa310ca 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt.html 6ed8ec480285e587fb78f864d110f3d1e198a5de241f8ea80c2fca928ba216aa 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt_chapter.html 35f9cc61101a83d50a29ef1b0f826e965330652bcf90b674aef3a3c5dd56e08f 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/make.html 44fd4c9bc5519320f4232256be04853e9436f08c9d711acb38025aa1e5591a50 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/notes.html c90c688c241b34c4968dc52e1e959448c78d7eed6f2c4735ef013b2b40d32c8b 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/search.html 50dc04646286d698136bff56d39d440b618f807537e3b884853d2a5785eff0a6 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tags.html 4d9b8921800ca4ad1f09a00ccae66ac8af5ef11471d09b4ee87f50bcb2851bcd 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub 864b711547fef75ee38b4ac6b3b3ec90626f0669d2b4e6d4e02bb38603a5f906 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tprof.html bd067ec9cb0b1cae475e919777389eca963b4ad1fe7b70800a751c83ed4fc231 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref.html dc4ac1dd9e1f8df901e0bb1a3d3283099ffc15f843abc519e9a540c6928ef8c1 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref_chapter.html 3f6e10d9d5587cb005a709930899119ea1723205f9af2445309560fce9d1eee1 2 @@ -4301,2 +4301,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/404.html 400e1f3af8a679161e8d03a52091777c69c005a71868e42ac9366b0bdc6a9ad3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/api-reference.html 55ac50d7522f764a51f65d3bbe751e5450812f058482d05fdee147cb6e8f19ca 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/404.html aecd27ffa735f795ab72a191aa856af2d69fb7f75ffd316ccfce7d1fafc0d59b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/api-reference.html 4e637ca9c2fe90bbf6b670acbdb3232c7e939b491199fb37c00bfe425b95e949 2 @@ -4305 +4305 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/chapter.html 19ad6087aac0761b7217c3309b86991f0c14478a8036ef9590768ad72385db4c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/chapter.html 608c751c3720913253ce561739df56d0f5df528748600500d69e471b6373c3ef 2 @@ -4316,2 +4316,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/gl.html b20019b0acf30960353ddc7f7297b64988e6b50fc787b68d9ca33ef2cce5bfb0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/glu.html e73bff4b9ffd18952656976a7622598eea4b7d37c35552edd2e89ceada93694f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/gl.html bfba4ca1eb71b8b845b03f92a6c418caea1e02ea02dca37901f4380bd698dc01 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/glu.html 2f4bc295d14905a301ccd947dedffdf1eee78d0f4a3b1f8b69c7e1747cd6f795 2 @@ -4319,239 +4319,239 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/notes.html 7067baf0afdcad2be79c0ca67ce78de361ff914959fa16f068072099cb01418a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/search.html 889dcd3a598bee08ef09e7ee96df14ad81aa672e8ce17562639a68f4ce810dfc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub 80865207e4a3ccd6b5f248f9dc6d728d10bac6d26ee8a5236b30818caaa1192d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.html 429602ddaae0ae94859a20be2558171d2ea56186e821642021a4ff61369db67e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorEntry.html 8d641c9757e50aaae84ac99ca665b587674de2b3753cc9bfdc2b58ec533e7d86 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorTable.html a1ff0ba9a187ec4e353e36974249fa41081adf8e423f48ffabec94d5313e3b00 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxActivateEvent.html 9c1c78f47ffa89f1753a32ae328384c1212d2df7434a22267ab73872c5392c47 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxArtProvider.html 8d2056db2f9fe3fd44996ec0ad633f46a5ad3c4e923c5f330ea7748f380657b0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiDockArt.html e836ddb0b56ff6fa5bf011d2f6a892b8cb63911dd0783ff2acf76392e6092bdb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManager.html cfb24aee5fe1bafd3c27e37bd7c35acccec7b4263ec414020d0c25af3326bece 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManagerEvent.html 17a0d1cdb4288cdbd291e18cde1829316527f47b7caa9157d0637aa61b966218 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebook.html cf63d4790626fa907e9a0d420e30b14c261a43f4b3f41e2b9b31a4a1d5a651e6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebookEvent.html 8903e256ba743b38e747b63537d6ec567a153adc3db0e99a3573fac9271a433e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiPaneInfo.html 22e7d696f1573b2b8c44e4967aea57723ecaca5d3202d2079f0eedfc730c2596 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiSimpleTabArt.html c0e363bd31144087c235de149f4c56e1830b9a3de4e5a6796711833cbf78dfe9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiTabArt.html 9ff909209700f093916b87eb011393de69ab203838f0262b2399174670c6431d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmap.html f990d8c105e39705b5a755d4961b6d206b0253931df2ddc386887f77230d1aa3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapButton.html 9805b5726e67a92ac1bd7ab3aaeaa3aeaf9d940044e333ee10b368cc7d0b8562 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapDataObject.html 4e76e045e4b6d84855f9b3c097a4c1cdc7d34424a973a139f4a04d206373712d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlBase.html 0ddd1a28522e19647c7bb5c5a6f1314f7122552a667bc2c282f564f368edd627 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlEvent.html 9eabbd320f0b601d32dedb5fa130c358f5713ac24eacb035ae604448375f6152 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBoxSizer.html 571eb497fcbf06272d1c765076c70f3abc196ffc162eb269a9f780182cb661e1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBrush.html 7428e29ffc755d809077295afbecfa0c0ce437dd8615ee0731657bd864e11fbb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedDC.html e9b66644062ad0f4ccf6d673dfeac8741c263732ee014e478786c4dae231aa6e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedPaintDC.html ba7da7ae4141358ef958a6879989f03dc1874c17d63db1a32759425e6a514afa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxButton.html b0f43ee4dcf1f995882682bc63e0f40a20dbb74ff30e219b993d6a64cdceac70 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarCtrl.html de3ae0b10435405dbb4a5f5d3e784a8b98cc8810832e3dd6b4431158dc897da6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarDateAttr.html 650099c01f01ae7ce6e11c43e744d459cddc5f3da5e3694b0e7577d8614b25c6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarEvent.html df6d12fe7bfe9afd01b2283b1b0e218b88c48c2f694fcc169774682c9b3a286a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCaret.html 1df49aebaa26e0ade6b8f6d9e30df0c0448f0812a7271501340cb64081939d10 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckBox.html d8c150beee99612d921ee89ad5d6e6a8c64ce4e28207a764aad050e23d8f8266 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckListBox.html f2ff803ea292ca3e7434dfaeb95649238393f804d00d46612d8534ae6621f561 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChildFocusEvent.html 8ed12afaf6bc2ca50d1507be10209f3d72246b84d37174b9e372b4bee251fec1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoice.html 75559fd41b725997adb47f6afd52ac3588736b42ef34ea09f7540ee463f79147 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoicebook.html 0ff48e361e8be0836ed27fdb40f2a8735c3d05c39ffe55488782cd916d0ca8e5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClientDC.html fa029850c6e54ba9c58cb85bf0d29bfee86b3fc8c0e21cbd81a29170e6e97f49 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboard.html 2d337da24e1bad2fbdf1de829f295997c56fdd740cd7273b55fac7d31fa4cab8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboardTextEvent.html b555562a01d6921a8502f1774c49b2069b9acb2340299c8a232c7d2bdbb1c667 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCloseEvent.html 4db1668b0249c149dfa95d49a0417082e150472285bd6499c270931fb637dedd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourData.html 5a73c88208f4ff5e5964ca0ec26648d73418d1005a13c940b2d8c70ac02bea74 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourDialog.html b0476b6d5717a4dfc1c60a0939dadc70203d3905de4621535e320f23eced9c9d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerCtrl.html 2d64d1bf645e5f679bd0ec4ad374578cac9dad7986281d4ca0fe4c4b04fcc536 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerEvent.html 1ff32f25a39c3449abdc7e8b0208683829e469df26c4d01ae49345e8ab81365c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxComboBox.html f41baca93c40035415d50bb293c99c5956eeb4425d910e4693bbbec581013d1d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCommandEvent.html 5fd9ba0803b2036b8a1993be33e0fd94bf2fb7d86ae82748693f70196bb26b21 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxContextMenuEvent.html 8f92979e91e48bae0701c8145c0466fab2d16570c1ccea518200d25c2c679e58 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControl.html 2799f6b7c9aa9c9159cd1cc5027fd752158801e1211c67c717ab472e3fd7f43b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControlWithItems.html 82cc57c9b10591c96ddbec48ddd35d612b967d6c076dbeaeaf85b844f38a04e3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCursor.html 7321f4b3762688cb8975e08e19839101b9532695223754cefba799952ddc3ce3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDC.html 950761c573abb0ef3be5a97cc18741c12cf528db765c7eeb78f643f396e1e42b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDCOverlay.html 0cf2233f0807433e69c95b43f0e629cce1e650c590f13bcbc3df246e75e527ab 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDataObject.html cebed6154dbaba40fc753bf573c7ca8289ff3dab1fcb9251eed180440e3be7d5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDateEvent.html a6b2dd06f530cb79aabd9a17dde6f19832eaea573312d459c1853bee86cd1a3b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDatePickerCtrl.html 104a29c8aa86168aa91ae758bb861dfe6ed3de9599d8d225953b22f15255a4bb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDialog.html 6bd9d45a10a9f79affcbe1faf34104ecab7558ce3c624d24b7abaeb16804a35d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirDialog.html e0318b2c3199c114b4558290186b43e062619bde29825a244222bdb1aa6c82a8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirPickerCtrl.html 6879ab01e68601325663809359315cb8ad9da45f61e859a23810a14944bc2d55 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplay.html 55220676e0ee4db715c78c9d772d7799cb97cd820fa423e4721897806f359aa0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplayChangedEvent.html 6d125471fc6db34cdf5e1a9c2e63f86d73ce0fce35391d9c098e28f29669fa88 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDropFilesEvent.html b93766d37d3148fd580238a637057e2f9ae08fe225ef7662f18bee66533df612 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEraseEvent.html 922cd7536ceed6cde023f71b5dc6907c0b9043d707cdbbc4973b75206e472b83 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvent.html fd82d7e4b05bf08ab3fea4194ecd382b4f7320dce0e84e4423dc4bf385840e71 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvtHandler.html 8ddc5f5d455ef01e0a24fced1ea6841d378db99d12707e53c63d3d134d11e5e5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDataObject.html 1cf9529a2df73d8476adc97f82d4302be2e9e8c723283f81b59edc9ff4e64073 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDialog.html d6e4e64854ac5b8b9b23954e2a6e1b883d445b13c30f855b5ed45b0cfef4160d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDirPickerEvent.html ef1c139c09524b956a7e9a940d67198e93ad9b815f05d87bb097337adb0afae1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFilePickerCtrl.html 85fd2dc6b88bd33027acc3c74953ddbc4e940f89bcac8b8a92ad1d1f97c3031a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceData.html 1f8d20d384511485664e745050739b039b02a4514ee25e71152e341ddb370382 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceDialog.html edf207d9b576c091d5fa8b6815aff5afe799bc34aafb168a73d8ffdc481ae6a9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFlexGridSizer.html 251c31253207435b56de5f4afefdb2b0a96b4a6f0308c5f4d87faa5958461184 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFocusEvent.html 1f02ff5d875b8173f34978daf64a3a308514b745135d2d6f46ce727ffa44ccb7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFont.html fef1c56824be67cb7036da7833f913dd37c1cf32eccf1af778c22c6a1600cae0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontData.html fdda3b20d3ef515b760f1680520abc3c80e8d235a61eea45d5ecbbd054299fbf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontDialog.html 8e1562553a409d532d179a4e7c045d72fd2748a0745ddce5603729732cfaaa89 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerCtrl.html df7dcdde9d3fc356f45d546eaa8f7c79cee5a2e127e0f429156dd2e92aeba73f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerEvent.html ed25e9db84f14c612b778b1f859d035ed9e42690c0312989cf145b1857630f20 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFrame.html 89bfbcded5408570b30f12f4e00eb85ae97e11d7bfa0f53479ddbfcd5d7bd87b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGBSizerItem.html 04c9ce430afc38c3ed181d7f2189407a84bfdfd57d81f93aa180e121ade7e618 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGCDC.html 37ac3bcaf9e7c95fe7f09c4a0cd66876ff460246a42dd2fbcde236ffb12f6af9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLCanvas.html 7f5c621fd06e4d9e123aba6501c12b0810369c70d0ce0eadbcef3e0f5fe29fb6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLContext.html 8613f8ae0c081e02f7c6db7d29764b87f4d71378d71afdfc2f095ffe0b8e5cf4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGauge.html 4df81dab32c9798682018cfcc655dc0636bcfe03fccb03cd8e4019d39938a116 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGenericDirCtrl.html 603eb75b1d71403a6c4cc01caa925a2e8b958d996f5824a8628f292a309bb4f8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsBrush.html 2b4ea02ea7b1fc0d1a4668f07bf6cde8d76a9e44219ecaf7ed004888c4603237 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsContext.html 0f760cc4a80ff0829823412e9545ef32a8237da531f0204f42ea7ee116bd9995 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsFont.html 4d914629822742ba658eed0eac3519780577ec724c6e463b0cb5aba5e28360df 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsGradientStops.html 1d5728e7e36ea2edc5ba44d6cdf52339d5e0a39451a4aca35c968a312ebbd147 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsMatrix.html 08989ff670100cb58e21dbf651b0ac0899bce262c71c5f8a3af0fcae16e69421 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsObject.html 5877aa74da7cc9147b7db4e83eb2407dfe5f0e6267a9901901e200a0f404a8b9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPath.html e3bd0037abfcba3d19d68ab9664b264a77fc2cc44673093fbe13439c0db74234 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPen.html 490489568a3e6383aee29f37ab4effee966496301e76adfe3730e905d2a3fe9d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsRenderer.html fc4a5abfa185a32844530b9777fc6eb697607179ef0a1ce27cc8bcba8f392d51 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGrid.html ffe5bceb44cd059270175299477ece2f271badbf599775f30330ab59155f3238 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridBagSizer.html e3e1f99f9b313ddcbc35a4638d1143a619c71049964ced8e0b1bfee84a061eb1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellAttr.html 16eba45c43b9cbeff2fcd3f708a59da589d04ed16709aa37b81cf1417be1a825 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolEditor.html 98fc1829d99fa2217098d39c1929cffb96a5b7b33ad3055c05641186ee737d0b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolRenderer.html 6ae820efc88d872ceeec94f12927e43ad98832c6d7fdec4dbfff650611b527b7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellChoiceEditor.html 89f591137f3e3d2b63609dd7ce29db8002f5281570f22fc5adf61803be78dcde 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellEditor.html f3cc3bbc091856e5b52bec25369720b177769650ff32278af17d0c80dc0b5448 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatEditor.html e83c5bab5218b044cc89ee87e990ae592d192e5f78ebaeb99db571ac5ef6432d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatRenderer.html f1952f8ad3d9fe7d4cabc17f0d8365a93b85b9f36add55e2991d93a719deb86c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberEditor.html d43abc1d6ee5b09fdf0a6f3a3f8a91a1572336ebbafd40d9c7fe7da737f909cf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberRenderer.html b2229bb3e2b78bcff67f46f9edc8ce7ebd51a588022a9df99c0e3b653ed1ba5a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellRenderer.html 65f495d66626a7a2485ccbc07325539eccf2e7165692cadda039fbfd3bf39588 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellStringRenderer.html c6da9ca11806d72b79951fe6d01efee2285ad401a0742390fe0dd348b27daa7c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellTextEditor.html e36d5849b573b194146b7ca4dd650464ae6430818d1b2ef6599c67c450c67e6e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridEvent.html 25c50396668d3badb4f9167f0dd6340a869aef0489acd71f333453641965957f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridSizer.html 70d18e797ebe09f255d1074d721c3e0fc62f6f58c20d91b2152b529ebe93126f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHelpEvent.html bf53d5f289faaa0e185c7e25df7818955137ce49bdec59718e8007bf21cde2aa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlEasyPrinting.html c8379e37fbe3be012da907855a1cef1822906fe468f36f44186fbb17f74e46f8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlLinkEvent.html 385d364ef9dc478107961718663cb7d4688f1902fc6411ca15bc4727eee2f995 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlWindow.html 76fd5f52253a602129c15983356a02d2d65621f5515a674b392be37e6dc08b72 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIcon.html 9d4cb20320452b5d93c6147fea11510c96565e08aa20266cc05bbd28d571e99d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconBundle.html 0b6d8379742aaa333cd2b57945445325bbee36becc47bb31e8d1f9d6b3014bfb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconizeEvent.html 5d69af0be7d83645759cc582535ba286e8b285b9799cfea24afb4349f866b3e5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIdleEvent.html c3c5006ed827ca55ad0089210a6584e9be8c98a9f20db95c1e5f38b24b1f7feb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImage.html 0533c54026b93abc66a1793feba9cc725573835af3345c1410a9293a1549eb9f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImageList.html 9b12828911a758688d021ef7f04d1945eb5a51ad8661d97d1ecad615135d8f59 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxInitDialogEvent.html 04d177faf478fc17b2d3bb654a046b722cb2ee1aabfe4d3c5eacf318892a34a4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxJoystickEvent.html 4adbecab1d4ea81c6e57e0f4e0fddf17f4a41e5391a796252d05690256c01d0b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxKeyEvent.html 291ca908e560990fe7bb6788f745e10987bf5dec3a8860603ac273cd190ba61a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLayoutAlgorithm.html 38176725879849ef7f865cbf80bc67928dd1d01820029fe6866c891a023ab010 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListBox.html ab543b27760332fb8d09c068760be25514e5993ef397fb7a5c46df13d9fb7967 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListCtrl.html 244f033c6736c44a3707eb66df3fdc3da884581fd9da522e6851d5f92b4edf67 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListEvent.html f1aea737291945fff853d98550a51b908a867e842d809e0c0ba3c94ef21145e2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItem.html 371bfa32721f935da0bcd4c5a6ca85b3b69440f3ec59d8ac3ae846bbea9f3d5e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItemAttr.html f7f9b71a6c1b0cba22d30ee4967af88843d37ca82c2f88a998205fe4c9c1b5ae 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListView.html 9a866911441e558c80d25d3a5db634b500503680910bd432cbebfc6bf570134a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListbook.html 229b664c03411fcba7e58c5d9b6d38481249d23dcf7e67a5cf859aa7ff513595 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLocale.html 9eb1a16dc2df7fb0fdf5000f3c79dbe6903de8577101945da1050a3c57ae2331 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLogNull.html 1272f7a3ad63cd4256f0ca14372c450bb7131523f9bdf01906dacce60e5375c7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIChildFrame.html c3404438a7c64f7a7fa130d85cf34fa7c80a893c3a38381d9c3ea18ce1c18873 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIClientWindow.html 668da3b9f059d0a4dfba37ffa9dbee9899c95668e125e4f287964daf6631056f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIParentFrame.html 4b9ba849cef9cd08738fc2463df04383cdbfc119f91c29211e70172b8c78f1b6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMask.html 6964b3662061e5c1edb84228e5d08bfdd3a5af09b8b22f1374a3e0edc816d52a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMaximizeEvent.html 2bc8eca6224674f5fdc58798c660f68324a6d45bd670e6690dc8064fbf7fb045 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMemoryDC.html eb566f4bdf949c7e0552fbc14026a2adc51ddc046caf88b308d8dfc6f1961df6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenu.html b7d86847145a2a605e12f21691f8f56c0e278b6a4ffbe3c79e74c944b6e035ed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuBar.html 97ce37f4af6351364cb04591333aebc40ca45960a94370809b6cfa47042dafb9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuEvent.html cd551bbb34e8cfdb0bc0cb8e1bf8763e7e0eea83343b17e0372b203e9ae98aa0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuItem.html 6cca2f237d483a95d3ccb8a0fe66be83edbfc96b7fa71f44945685e26c7f0d96 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMessageDialog.html 74e05f3fe080468dd69f7a0a0a72e1b88bd20e2e0be4935857db302b4884f82a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMiniFrame.html 4c0e2aba68561d84edc475973bafef934f262feed224d4bd076867c81228b409 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMirrorDC.html df3798ffcef587e31a44b3eb2d1efebd6ee5f4b7d19b8d0c153c10d1b059c58f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureChangedEvent.html 61417c2f61d9360eb52cd7d9ffc0627446d50862e12e750f326217f659d47984 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureLostEvent.html cef96c9057b0254fc1a88984de50c2daad0a8f6ece2183a810f928e57c0118e8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseEvent.html 4ae6ea0439e557527cb7d0b5f8796204961479b1d55dc228caef5be8937c6652 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMoveEvent.html c09dee32f2b93cc364d70490f361b36bf9ffa4e33f2f864c6ba8f7d1071533f4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMultiChoiceDialog.html 3a1be4bc3e7eb4bf394f651d08afde18b3946afeaf56c44e73b04192238a67fb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNavigationKeyEvent.html 41ac5d3b0818faf8de7e03031b56780c0ef5f2ee470a2cf3bffcb1ab305ab36f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotebook.html 9f0329597e25de6c42f353a7228c652e1304338b382e1477f2b29482e1e4aeb2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotificationMessage.html 581d09b97870b20849450b619f6f9faf3ece35fc47b736318606b62f69bba250 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotifyEvent.html 89d4b11e41a7efd4eb795ab750fb7f421bfb5d7531d38e54556db76eaa4e2e80 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxOverlay.html 0b8167100ec28023d8ccb1fd0410e58a9ebbcb04b551cb061126839624363647 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialog.html 869e869f6eb03ca4daccb909b6e101b9bf0c98a3d17be6606cb648fa5ab5b8c3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialogData.html 721a5ac09c04bfd93a7b6528bcef114b29fb8f9fec24d26c0f0399b886c762ee 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintDC.html 728426a14f7421375215dce3b10a90a0187eff021bf6355dc0ff090ce3a05035 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintEvent.html 8fbd81260ec1ff9b610f4a45977fef30868c672539c516cedf4b79d13c35b367 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPalette.html 84437d1d96c746c1b43a1d510e737ec2639f259fe2c1840fb16202ed36186885 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaletteChangedEvent.html 85369a601c11433322ab1f8fdb8d3888c1e7b8208705ae8b8acd61c9a26637be 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPanel.html 7f7bb40c207981c694f551f76fea08d972a877080e5f12524f47c7fbed35fe6f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPasswordEntryDialog.html 0b063bb786627614a773989da381dde65005efe51651073eeb3c37fa260473ce 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPen.html 9280aecd1e09a0e8c6dc21b132fb5f61c60a3d3ce72682673a2cff99e070cd8d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPickerBase.html cca1ec901736b2bd81cce8e8a284da96a45489e6b648223e413c6345634198ea 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupTransientWindow.html 3224d7e8757125a7071352f0c7070e8f3d58c76b50479f4b082f39e0a3641eb2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupWindow.html 805423b5fb63855dd1754d2761131f7f13b4b738cac2cd9c2c110dca89a785fd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPostScriptDC.html 51858c937c3ea5809418fab0d899f50667628172e2f1082b69a53f32a6a877b1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewCanvas.html 40f9db1a50e6c65cb86ea7d5b749689a0622e40373aa12297b7cc54cc3a8fd5b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewControlBar.html 3219504be7e559ff508a1b29575f4840c95397cc82be51977583ddd832e7352d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewFrame.html 1327bcd2f2d4e10a9d29690e03c36bcb542a97109b0c8418386c820f89a2e45c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintData.html 902b506c2b842cd1e94e3a38f9259f79b140e5a5dfe8657f3f8cccee000c08f1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialog.html 9fab923f317616e03f55d05c19cccf60769999b37dfad20f844fa834142b2fbe 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialogData.html 289a53eb073de9808528750d1e6e1c11279930f9b138649ec273d220a200bb41 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintPreview.html 152f0df175fc75910ac80d7c1c100974e9345b75dc50ada9d5f546c0b6bda82a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrinter.html 0cabf96a3f4f42defcf097d3cf6fb7e2b83fe01fc457f28c917c6c4289ca1697 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintout.html e7cf1f706b39fed1ec89f95d36b6f7db2ff1d1d482cbdbde76b4a6dc9e228ffa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxProgressDialog.html ff7a53c710285c18a4f788617de3cb8cc7eba2034588a90603fd638a7502fc1f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxQueryNewPaletteEvent.html 0ddd39688e2cadd3777c5ba15116901b6546ea24da0cf0389c09c281904c235d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioBox.html 637e5b85958449d7992971b20d8ce72160bea13c02cab37d751605a90b7109a5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioButton.html 39525f57c8fea583bc7e3c00d9401893e6ab1a2731901e174dd4eb1ed60fcaba 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRegion.html 3fa2687209304acb297b4259c0eec4a7172a5b10b201d37678bb4386377329c9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashEvent.html 39b3130879884cc718339148ea2d0f663a53808a4644f9183defa179ac14f53d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashLayoutWindow.html 4f61e993ceeb0bbaf510be55b222cd987a14a8a40178b2a8f4bc8e201359f3f1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashWindow.html a566b7102e59f1b88a5ae95e5a0ecff4be1a1406d12507c9059e367df217e87f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScreenDC.html 1f4c4bf3020cbfade8810f432fbca938bc3e6ac16be3646bd036731d2c2ca241 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollBar.html c9e65ac34e332abe7e52c1988d54ac09fe2c3abe4c3dcbdb20d906c09f9dc248 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollEvent.html ba3192801ca3a61e5f8e536c1f0417334619627d2ea280aa26b7df789700e180 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollWinEvent.html 24092bc8b48448987374adbcac7934a2e36374941b161e33bb61b27a3ba7521f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrolledWindow.html e6d6a7ff06525cd802a259d33abdb66ac08bcac9d0ba0871511d2b82478ecceb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSetCursorEvent.html 4f0b9ff61f571d1029a4eecdb027037857679f0b7a7b50b6824fb75eb7517918 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxShowEvent.html 3d4ea102248951eb98e215f65c788b7bdb238015b090daf7cb91336fca98318b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSingleChoiceDialog.html fb3e832dc2e40ba0bd218a3811412f2681d9a1686ffc3b1ac71c4633b958b38b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizeEvent.html aa7c53a98a478d44e29cb65325ae10d1b0b79f4a978714246b82987711c212e9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizer.html b885c371c146457ace68b11b6e7647150cdf62a8c2d139b97894396f0981caab 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerFlags.html 94321e58ee0a27cfa5c4e9a34457ad1307fd9e7d71f5f61ad40da33cb6943037 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerItem.html 17667117be0af954c553e38400e0bb3edef4e6ede09020a59560de09ec81f3c4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSlider.html 519eb850d2639406d6d02efdca3bbabfdacc6cc4fd5b734c460503a469da785e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinButton.html fd2f4d3861eb90e5196ac0af6e3cfeaa6330a9cbe74dbc783f5a3b369f23f59b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinCtrl.html f24495ac6faaf3398ed82557d55a98d502b89db89d42586823e24abe7eab63b0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinEvent.html 162ecc86fdec1ca851ff96e10bcd600d46eb666abe7dc375acf4f5dab6e486d5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplashScreen.html 669fdf99d43913ddf24dc99d3d0cad26c3604ec4499aaa0d0a11817454d1375f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterEvent.html 4ac03b006905976d81d622e2f7325e99ef6ca67f36eba2ded44ce8de87c98e66 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterWindow.html 9d47a162f385fe1dc1707bd0d9ec4019ed50ec79d73561dfd47585478f4defa1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBitmap.html ee9d1ada940891aa9cc9962aee43289296663dd9cd4817f8d9cbfb2aeb3ff7e5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBox.html 0f9681f6bebc35528a1b92dd3b67b3f7694f6349ae8c762ee3596e0f272884b8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBoxSizer.html 212e34ae5df555afa3c9cbc0f8046bc01ad9ef152677df8a577fcee7d57eac08 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticLine.html f26672e756d58bbe449c031f832bb8cfd99780c13a5e2492a98317bad15601e5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticText.html f82b2c3e7bc86081391c25f3b56c9ab3b24228613d38e45c9b5bc0bd7de1771e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStatusBar.html c99c8c76bdf9761865fe3c4c7e7d687daf9f0f2a42a333e638634bed0f81eea3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStdDialogButtonSizer.html b765782927484b802823d6c1814ec5aea97ba3df796893409ff51d88d8e9d4f7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextCtrl.html 0cf630a8a19e623b6b06ac17ddb24a9e3f66fbb4dccc828f1b2ca78aa18330c2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextEvent.html 758cd35c53d98dbf16cc562be7c94a0818e9f96716952286dcbdf025a12f4fed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSysColourChangedEvent.html a8ab925da6fab3979fe4fb6161ea4339437f4f758d1debc41dbfc7290b65a42a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemOptions.html 9d6a0d8fc3e2942f0dae6be7d867e40f9a155e0d071952eab1a5100bc0e579d4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemSettings.html 4daf84846edbc18f53486061136ae3f71435eb74e7ef964f401428d65aeee39b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIcon.html 8f2707948633460d2a91dbbb891c125391bfdbf34ae8cd9ce9fcb299c0093e43 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIconEvent.html 0f72626e4040b81c115403fb2590a1e4b1e68c01ddc8ec521858e348bd57c7f9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextAttr.html d491c911d188470c08e3cab02c6562a54771a1df809402fe4b157eb0259ad0c8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextCtrl.html 2af18306bc8b581f286d9f2abbe729ec1a0adb488cc4ae2ab53dc2fcd75692f4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextDataObject.html 7e5cef11393c729a8172307bc5b12c0c4640f22dfedaa308f34d7dd2788e1190 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextEntryDialog.html 7dec7f67abfa281efc120e11027bc237b66d6a131ed288732d22de50c649eb1b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToggleButton.html 4ba8f2ff892442c72ed5a6a402cbd33c06994fdbee2909eaf96fa81862ca263c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolBar.html af1e1984081a6a45e718aac4b95281e50d84ace620d5861bccecbded49035c24 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolTip.html 9d7a889a628d6459d3eaf7c158f1f766000988f4fc8d688254454be3a38dc098 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolbook.html 4e1d9981d403adfe9a7dd43dab343222ca6d17bb9a29008a105f540dc395d8ea 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTopLevelWindow.html 5de35371096aa29825fe595e2b3124af769e0039187fd26d3cdf93887305b8d1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeCtrl.html 38aedd6d96832ac6bc4f669249264b337f0128215cb7ea80d6b743dc5f84e145 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeEvent.html f7725f4b9288f9d57744994a1ba9ce406fc91b98e4432acc7c6182450a77deb6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreebook.html 6d55957136a87926ea78927060b4211d6965377bbfba679514b1eb7f6f210b85 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxUpdateUIEvent.html ecd08f76b156e7d1dd26ab4f2ec830a6a73311230fbd8c95a68ecf64c4d802ae 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebView.html 306f4854c01ab08d36befa1e21757e8fc2c18f39488bb7ee0cb62e5728c799a7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebViewEvent.html 41b8a953fe9da3183f3e4a1065159ff0ecef6535a4aeb8b46d30d599fa51d676 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindow.html 5b6d405bda672310b99297bdaf4e0fdabb66043f6435c4d22862044a05abb41c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowCreateEvent.html f1ac0f080b29d8dfef887c08632cfed3c9645673451776a0c8ce2f522bffef7d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDC.html 489b517b4df0fa9c7275b19d0860058d0b14312946d9bb1d55d815372e96ef4a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDestroyEvent.html 2e0a1078d6539ff9a9d7e649b912f1bfb406d50963a68dbd8991d41644044739 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxXmlResource.html 35f01da13bb84a52af270d07504be28db0c0c09724a20c6890c96bd416753e7b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_misc.html a3df4362865371060860cff255169bc6a94246c357c4650241021fac8b927883 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_object.html bd154263d132cbe3a36927a10b2b81aa229c2d2bf28a027eb14e53018459d0b0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/notes.html 4e5a705167f53445da8e3ca0539b33ec1ae749ff43a6737dee9775488369d37c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/search.html e190b5d0bf01c0db4473258f58ad96fa238977050f5a2ea6f64bbf033db5d512 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub 031f1a490d9a36897a25fedd2b29fe9cf1813e52bca420d430f6d2cf004e404c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.html 310f6e0d643d70bfea91db42bf57bf3810f58ac6ebfa208cdf430535726d70d4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorEntry.html 5b1eb2360aa95c347738510afe74068d5531f04468b793fc20551eb09bab86a9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorTable.html 54c52a8a78e9aa1b68560d4c2917301abe576782e82aaf4ab92b2b0cc084746d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxActivateEvent.html 9304d1c821168ac4f1bd7ea23572797f3359a0b781e8424fc742e2a47d6176cb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxArtProvider.html 85f8a4963cb35f7f6c898a959d28a77112d52fb28b4714aad3e7077ed98ed1f4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiDockArt.html 8236eee1afa902086ae7b127c47f1b220f4ed4ff592ee7fd70d31f65366f7b6c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManager.html 083a7c470341c501573c62285f45a67d8136202d662c992fb076b5366971c699 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManagerEvent.html 001d1f60ae472dadc98569d87fd0040b60e8f733179da12f24137638fd21d8a1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebook.html 98a0b07b13f33a67e73460268458bcfba2b8f0cda32e7ca6469c7264cad1ea9e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebookEvent.html 12c93a5dac7f45c2db1556e3c6f3e00229aa9f14c5282ebadb800918a2171c21 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiPaneInfo.html 45db395ee20384323f9fb7c931c26c49367df2ec164397e41c12bcd40c20717c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiSimpleTabArt.html c7e055fe8a00ec158d50029003295318d5547585f1fba96f46a26eaba7c60bfe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiTabArt.html 28ad7d85e48130eee671d99371ca82dcd189ff48a2b960c2a10d3ee1a04dea64 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmap.html eda2742e9b0bfbf624c6559626eb76874f3c9ab6d8186026d63fc34cc0bdd8e0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapButton.html 2333c2aaa79650dd75b52106751be2bc9608b40f41a458c55172430dfa3c9caf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapDataObject.html d092392c69fe45d0ca42a680dee8b69007bb68cd05ed59d2f4ad330711044fa3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlBase.html e56ad5e22395c63fd423d3cbdddd5e9b49178563b20f3e567e1cfcc11b3a37e5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlEvent.html 162e74e2bd5ef38d21729f000df903eaed8ee9bc697d4b93de0c143d22a1cb85 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBoxSizer.html fd8986d17b9386bc2f7f1ae0110c609c2407fe7bb310abaf71e9f5ff084ae385 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBrush.html 39058dce5a1a37fed907e0e742627a4375e88ecc66e499119fec8433ce3a6c42 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedDC.html 82f52f4d9f687e24cfd24111557a4b15e5749e7c56f2cb1f8d163df95ddc70af 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedPaintDC.html 3a58348869e548a1e7a6069399ef63deb3fc6dc24a94289887e18473d61712b4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxButton.html c64cc6d2607e0580ebdd6e13f8a6b6c17ada70f79adf7a15ef361f26f11b3052 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarCtrl.html 06ce2d0033975eab0807d8680752ff6d15e5444e16947a8c1e6ccd4e3e110e53 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarDateAttr.html 36bb7a6e7c0315ce359f985bf87f748f13b811dedb0b227c990be14f992cf553 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarEvent.html 142e215ac862fb2e791243147ba1c1ab9654b598a730fa3399052df4f9214a9d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCaret.html 4fe3f27310eb2af111ac684567024c67a7b614f294e9520a0e570d1c66d5b3f2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckBox.html 6be733bb91df4d60661696dafde00954ecc1ea215cc3d4433d87dca133a4f3ad 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckListBox.html 1f7111f435ba845fa68d920d8d3e90bf6dd31be49501ac5be5a0ac6cd1f6a268 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChildFocusEvent.html 5a3e31a7b197c760a0ceb68b798f35896f6c79e488fde6497af1c9bb3112b961 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoice.html c8d8b9a3f107e6bfba09e6d4f9564af9ef2c9280bbeb3f8f8836887f3189ca7a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoicebook.html 92acd9b6bd7f15bedb1b39478cb4d01daabf5fec659bf3a247bbef3a9439a420 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClientDC.html 285b2b3ba0c6c8c478ca740981c043fdb569782e13d76bb0f7667ef6046d5d89 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboard.html 401d1c056679b9f55b5984afacd260d76ecb4ca7f0966f414a8424407dfdcdda 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboardTextEvent.html a4e5ba6e5cd9ccbadc0741566eadd9d3eba30b2ffaaaeb1dea09d449b90f0d7d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCloseEvent.html 44e44a6abafb6aa17395e3a0aa4ae82c99e8799586276158b949f662a0bca152 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourData.html ff2399b44f1e305fcafdfcf85a747eb5619531767d6b099a74953564a58f1f21 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourDialog.html e7795e413cd51a205f45aa31edf91b5a65b14e566b0ecfabcb5d8d23a2d31972 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerCtrl.html 0771fb287e64ae5015d2c16ec5b89b84ebaa3a0c0b39bf4f8355e48342c00b62 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerEvent.html 76dd841c95f61e3886e1a02f68fdefcd6cfe53109b0cdb83f466428c316bea3c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxComboBox.html 194d635ca03d4eb0c780fcf70da02319b608dfa0d54e7e6b13330c99fe5a3742 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCommandEvent.html 644492ee6bac122ab9d5e0c01aecd8906bcc19491d65a3c6e5d6b0d672b5dfe9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxContextMenuEvent.html 7c2377dd2d51fe75e5a1fde092d0d7805d2fc17335d6430d6be8b7a620475aae 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControl.html 7c952496dff6a5d5d5189d13e7bf39f9f84c95e3b599f8d8ef31f4615f20499b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControlWithItems.html 185e38b59c822ecac522def66e72cb91a09d284fe2dca725e5338dc0e1f52aaa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCursor.html 2ede18c187c1e9a013ca8a5b88577e5ad40ed3a567f9bafaee98ccffa3305019 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDC.html 63eb7af7ecff24271bd33f28061a439851d9e3b59906ed393094be37ba2ff8b0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDCOverlay.html d8de8e036903b3998a123a1273a1debeab4a627ee978f2aaa505edeb3825ddf0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDataObject.html 7a90742a81d9343f405a8c6e51b143d26bcca49c0a922e50f37d17dd3ecd6dd2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDateEvent.html cb411d1bfaa0f04afbeca41fd2dd0fe68e7fa8e7362a8d4a2fe3e52358bb4291 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDatePickerCtrl.html bf431b371c763ebebe7f2c50e2818375c72344a933bb813a6306f4cfb97fc072 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDialog.html dd37076d4d4565787cedca5cae1b68fdcf09386272c620b2661c5d8db8f1fc78 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirDialog.html 8d5422ac50adc3a84ed731ddae444c2ea0d00ee8a1c6169a82c1e45c686a2502 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirPickerCtrl.html 778d6ab7e4112dfca50b5ff6f16828a0cd098150b2a6d115b727d03ddc396730 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplay.html 8b308bf3c5d95bd9c9d2c4ccdbea5a959c371cec64682bd3387e41e0d7f4361a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplayChangedEvent.html 22e5c70947bd56dfce054e150454ad5c06c0c27df2dd28ceb61b63044f7355fb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDropFilesEvent.html 566b85e51157e30911c20a416c9a887ca187aebcbb17c07b834e77d16c38f159 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEraseEvent.html dbc0246391a5d63fb54b0d7f37f965aff13250e21e5ce39347bfb1d864fd8674 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvent.html 8c94ea7a39f16714a0aa090c9c1d7dbe4fa5b2c37ac1d7c424ddd3a3fced8512 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvtHandler.html c567b0d06ad91e2cff3e7da168531dc38fc75f5e15ea2d2dc0b2c3cfa0d18385 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDataObject.html 26b7c950a6de785ac4d5f5bdde3a1ffe6252974a37e9cc0155ab419f0dde4fd8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDialog.html bfeb0a32c598b5411a2a5ca8bf815d95038528be0a42c6ad3a9438159d5d9c33 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDirPickerEvent.html 9bd3e173204949e6876e08936c4ab4bd7c2dd87ff0980b42a7f0f8163e747e7a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFilePickerCtrl.html ec7a4573ff09ec332a67091d41e24c0b4fb4828b32d85e69cfeff5db76ddf96d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceData.html eee17d8bf9c534bbdac0c51f7eb0437a800082912f5c6be82cb50e0c32db4f01 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceDialog.html 0f3360dbc1af3f65c4f9fa29d6a04348c40eee2dbadd64d7ad7b17660649f819 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFlexGridSizer.html e15b8dd425ea6448eb78bfa60e9a166b68a6965a79ff8d33811a0d8ba87bfcd0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFocusEvent.html bd00e52944e7d4ff0b2396f04bd5022551e6467eb8d4f188f0ab9b9222062c58 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFont.html b5e9295a9a8a94cf0f36350a88469e81e56356714ffdda00e5fc2aa6950a5b57 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontData.html 0bf5bd1b9fbba36020768ed73db4465de7f6bf7e48d2dc26e88bcf505803c15f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontDialog.html 86fe5d997d7feb2805e77296d277b4999c56a1476973ac21bfbf337656811deb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerCtrl.html cbc6aa2079e160b5b2f8a13244f084c6c89943967547a5bedb2b5a66c5edc54f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerEvent.html 3525726fcdd16fcb8a9d5164a4a64e303d9cfb91244449cf56c5dfdab88e226e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFrame.html a54eb4190d2c48c6c549cd006c129df5fa5066e7f74dac141e57ac59db9ed322 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGBSizerItem.html 24d7fead415f1d81d25de0452ef3cce48457f227767e22f3f54757a9cc8f841b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGCDC.html e33c68d62da39ca508d8549812167222c1a9abe28b48cf8071dc6fab0ccae72b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLCanvas.html 48a7dda61279e166621c21d30c9354fdd60580bd2186494f04fa4687802ced6a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLContext.html 84eb67c274b64ead3393fda40aa0354e2ef350abc59002b1467cdcfba7807474 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGauge.html 373ad8bda7aa5eab20f1344bbf92740bae2442322f51331e20dd5183212d1acc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGenericDirCtrl.html 606e30b783a2ca55c21a5dc349bd16069cc0851c1e2bdb7d96d74f9f59150655 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsBrush.html a9f2b886f760b6753de814f180be7299d5f649e4f795894ab81e6ab1c6a3aad0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsContext.html a2e9486c310fb1df897efeaa1c6b2f2f8b2026c0ca9309051d1ddece5da5f1f6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsFont.html 9bb909e437b6213e07a6b3d36577f509a096b7d6e95b3eeb6805d8397d64869f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsGradientStops.html edcc957901cf45b5fdcac407ee16c093d2c9dcdff68811fcfe90aadcf69484a1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsMatrix.html 308e30697c6af8355ba3969d9d417c82fb2c4afaf104ea75ff4daa388851ef7a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsObject.html 836874ec7428ba8944084c2aef27aadcdd3e9549d7021fb8e8e9e69321b6d428 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPath.html f61a75af11ef75b07f29f85ff49760107e696d98adb95d18e1e973f3f04de725 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPen.html 3338cbff0f47a1ae47d8bec703e350e6ea4291b9c9643851d1f216e939df5635 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsRenderer.html 114b88f560d54218198ff3360a58368fbd33f25f4159dc54b69fbfb28bfafa44 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGrid.html f7e3330ef68e802aa8828a5be620014500aa9c78465376789f1decd85c4494c1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridBagSizer.html 5d6911c3d8c64a4423ca261faf8f8973246246c6dbc016d41645441356a8f615 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellAttr.html 420cb69abea276ba99cb93119149f6c0b5feb6e61aeb987ae353efdbb4c00956 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolEditor.html 3b0ba4d7a2ce402f613af33b6cbffec8ca70d4ddfe883bea49357653c4d8cbc6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolRenderer.html bd9c7f5ff93e06a9134fef6d1ccc9e1f5de1e630d56eb6dba3bc0bdc94eb8f3e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellChoiceEditor.html eec5351380f94361fea4c24384ccaa5730249d71d7c9c0488c25ee7b1035e5c2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellEditor.html c4a47d1fab418f024e4d537cd726c18181fdc025934eab3284ad21c495f00b70 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatEditor.html 77afbbe00aa70a47c902bef0229eb432756619b16a26b4fc1ff33323589ad257 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatRenderer.html f3a631d0d68d23c97fb926706556b28839cb6e0f8c8bfb595cd751ad47f0ac48 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberEditor.html 4e6e1eac9345cbb0010a0f2e8fc8d112316e176d099e5329d0c74eb4eb63acdd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberRenderer.html b7444638ceda76ea9f46162a08a84d7837226c2b1b530241f3d7056422693b2f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellRenderer.html 888a661f6fdece97b1bd1a2171e7d2ac4786ea5bf5d27f1ac8eb020dfaa93d43 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellStringRenderer.html 6d6da29b1bdf0553b982299db5c8c682b4053744f8428a716908c83a4698c9a6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellTextEditor.html e9a700c7ddb2aed0089439f1b00b5b10b175a8db17bccfe7a5becfbc85569272 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridEvent.html 836f3aa5c853efd15d11bdc5f1ccd99a2c17dbad9a77797bfd4a7980c0e6fda9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridSizer.html 2dbfbc16f987991290357a16cfc09a9d977aa969c166a3aa5c665885851af2db 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHelpEvent.html a1db129879ed7700b33b1854054169257dea7ebdc5fdbd91b6cddf8e5832937f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlEasyPrinting.html d91494fecbba1ba6c1e84fbd2e80c351742e9384c133e0e014e2ab60dd738bb1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlLinkEvent.html 36a6510f07fd100ae4165da4e8c094a72cfc18ad690bd0d468e30fa2ed957175 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlWindow.html ecbc641db15cc5f0431baadc10a84a56bc17feafe2e4f03d1c3886683f003cf2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIcon.html c341b743c860d509f275fd6f9e732a6a3974e172af3bc9f99ac99a6c6562d3bb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconBundle.html c70732e3a7ff5413f30b0cb5b5ace87ccc20b14eccad9074e365325fda11fb82 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconizeEvent.html 47925197bcb8af88f6c03f9dea016e54449d6ea47f0f1be5771a8985dce0a3fd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIdleEvent.html 9b94be383b297ee6b2fab5b9afe8f1f4987270a69beaeaedfc703478e7f56dd3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImage.html 45dcd9f2fe14bbd4aaab419749d2e79f04d338226dfd8c195f250071c70ada3a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImageList.html 057814e36f1b49426736aba4ce6cc55b3934665ac0196265dd6247380686db71 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxInitDialogEvent.html 2646a98fedf21457bc1bb7bf6aac1b78bc42b149271bef32aca7988f25988088 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxJoystickEvent.html ce023f16720d31d9ab6e0584824b5296a2b1f4b74cf3c5187f00b5892f4661d0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxKeyEvent.html a482958dc0191dac8937fae0a5b052c3dce1a1d5b528f3a30c843baafbdf8f3c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLayoutAlgorithm.html 6d62c84c4c67d5cc86e64d630b85713a09068746916f5533248137436a167aef 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListBox.html 014380e6aea9df4bafc5d16cae3c424ac7290824f7d6198f707ff6791bb11097 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListCtrl.html 1f71b1b16cb0202493b3076100f7a84091a3d531e45cba4f988c5749c2fd8fa1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListEvent.html 091b6186555d19e18ad07fd431737fe97f6327bccc6f1ed6fef208e92e1993ec 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItem.html 45236e0d4c2788f5b728fb9d2273ae41275dfb666a041d05d0c3841e044eaccf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItemAttr.html 44f8157c8ab97d6dc6919acb9d960b080c744716d287e9ed79bd3fcc9c13abe3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListView.html 4004da90d482f3a1437abfa3f7a96d6362351e38fba0375cf79fec25e486efc4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListbook.html 53b9599ed4c8bf530799261667430e96499033cafbf37c8a0d77e10b79a6755e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLocale.html 9496ed4fd898d439e57c3a8e2029e0c20d8cfdd43d52baee806abea7c419e311 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLogNull.html 5a455344405a470ef8a5a9af097b0f51a1cb2d82cf6e7abc2fb63fb234597780 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIChildFrame.html 188a8d52fa48b446c60acc6fa5709ca2692c8f53dbee173053f4ddf72310ff84 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIClientWindow.html 10115dde32e86af03cd8e3c58859324357358c66551edac47b0b5e71b1111605 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIParentFrame.html 747082734635204af5a831f79d320599409d01fba3804b80f4eb99c1dd310fb2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMask.html 7caec2becbd5151dd69b35874024d5e6c59dc81325112bd25b19da41cf5bdb5d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMaximizeEvent.html 793b73297b96faf8bc5c75f8aef7d35e12ac2ddcc5af48918f9a2ca58519ca79 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMemoryDC.html 5e266cbb3171acef8b167b3799d8b85a834c56d0bc00b95e19b18ade8d465fbb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenu.html 9ed9d08a24758eb2b6ab5b5ca013f31582f642cd712a3abad205fabd912a41b2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuBar.html 87376e9b4a1937182b6484fd56400f54b24a79abbb7b169d7ae90ff00c310de2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuEvent.html 650875bd637806616f2a5148537aef4b953caafa039aea07394780dc2e32bd20 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuItem.html 0e13c9c54eae8129e1c86a66ea44e2fe426786d6ff9816b8870cc0b12170d4dd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMessageDialog.html d340118043ab0a5679d4b989057970e88e24de99c6ea3732e43a6587550c43a1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMiniFrame.html 555ba6c12329dc40c55596a404729e6e22856c45ad813249c047f83ff07cc6f4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMirrorDC.html f241e392283e5b368981683d4a0ce4651eabc7618014a94cc72a5a29b83f2534 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureChangedEvent.html eada3e496162d5a6f901be9b6dc75e1212ed108be8576664c70d95a9638e29c8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureLostEvent.html c357465276efc8364b8ecc49b721ed1f83047575fc2dd6a9bbdbc2ca424105b9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseEvent.html bf3187c813e08cdcab4e9f6a945dced87ebd1a67dfec7116168c694a7fbc7806 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMoveEvent.html 9991b0f8227810959f1191f0fd765bd0d145da813873508110eac6d1bdb1f536 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMultiChoiceDialog.html 9bdb253e46217154da16e4c9eb846d9d095e3e92002e5a5f94fd3e48dd97ada3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNavigationKeyEvent.html 4c53a08083cb662e826460e26452160f18f3fcdd8dfad7edfa469a48d7340bdd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotebook.html c7eba78e79de037bace12472d421e383c0868ae021cce2938298dd271d5bb889 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotificationMessage.html 01db924fda88ed401ebc9d566bf35d62c503a38f23b4e33d23b0d21c5758f98c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotifyEvent.html 12a9917a9587ebcbe1b3457a134e9e54bd8228d32b40ce4be85a14294b362b80 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxOverlay.html 812742eb3fd897791a215eec6a88105bd86340184eeb5465aa8ef78244d4960f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialog.html b23883ea72f30c7626d497fc9c7657ffd6599086d21c98de092e419a438f2a94 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialogData.html 98585298bfbd48f934e3617ca9ca5769e3d9732480303b441e8b64d8b7089ed4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintDC.html 52b1254471d522c13d6313d9c7e2f8b0d0811156e051bab03c54df20bf17ed34 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintEvent.html 6aee10ff7624a9179678290f5bd2702ff0f121bf1124a59b2cc454c08b9cbaa6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPalette.html f1568461cfa7588210fea56429fb56e04c235c95531904d5cfcfaaee0b1b95d4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaletteChangedEvent.html 394dfe8190aba130147d0ef68c49559860da9a3a69c8d1d43285ebb61b48e868 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPanel.html 49f71a55b88dadd998caee958c0d4ed65ccfef83f49f7d962eb9a177a121966b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPasswordEntryDialog.html 481542cdefbcc8caba4469103676c4733c4bec38c13194d9dca0727b6200d170 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPen.html 9b07f3a3ae20559bb76bba88a5cf2733328c50ff475a1ad8c7bf52624df5432a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPickerBase.html 19a35d13ba1bc2a06facb9052fc2919864a9461327c11d7997e596dad8cf180c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupTransientWindow.html 9e59fac1b91006f90a68334be20a67f2a5a0ab183d1112b5bcd57cc441aa17e5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupWindow.html c89d6af94e98d85938ffa591adae5dd83636f22ad5f8f522fd3b36466e067e7e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPostScriptDC.html a991e3bf76a12784ea9440a18357ab1fe44ec70ed8385471a0e8770eab6603f1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewCanvas.html ef8b605c2b88cddfb3f7a72bb60fd12be9021a50a47fe75ac38de3ec1ed400dc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewControlBar.html 871d9111745a1eb25997cf1153a84b437b35b9cb49eab652903045682a116b38 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewFrame.html 1014c651d811d12f0314255a888c56165bde67cd3925d5fc13ffd33fdf0bfa3b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintData.html 4ed8d33245eef55e21d6396ae10314dccb4addf779726bc49df6be7d5ec3a505 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialog.html bb12ea6d062c4be51a638e191d59bdf704cf10c3cae278511cc6b773a79471e9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialogData.html 023868cc37837f8c60a8c873e2b4814950fc6ad011db7245f1351c20040eec0f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintPreview.html f1a3cd5e7acff07e1372f4d2c265e6969e02cf5e49c2c826e0aa93155aabdda1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrinter.html d8e29c8ef32cda5ce08145c941b6bf87ccb35526db4058ba2513f67dee7aac1e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintout.html d54ffc9f6699288a77a0564e2af716908fb7ad914c75b326618900cf37c68fdc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxProgressDialog.html 6fedf12ae29cbe71ba9893d62e3195f526add8612afb79aff86bed499f3cfd38 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxQueryNewPaletteEvent.html 2dbb6d359ee933cd87c49301ea13f7bd44cafae4b449ff994639a0b39b6f80de 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioBox.html f79329c2913862b19dd9a28a196b94901f92cfa15c3b6bd3337f40b52f3e0411 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioButton.html 256894561f92579c1ec524d837a410e0fb49d5116370170c4eca64ee963e28af 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRegion.html c67fbc6fde4cd9fb9a6c33ddbd0027b24a874de4c5339d30d1df3a9e6a051b66 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashEvent.html a3a32225521f47f0710d875bb598853f28ed0b0df2e11d5e556a57e5afe00a1a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashLayoutWindow.html ec0c18c3e84909754521975843ce312d72f81a598738fffa20fc619770994cb9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashWindow.html e964234b6a3c921be1bd9217e07de435831b14260824759b273f16f65965ab28 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScreenDC.html 1d4ccb9f1b5543e9b664a5ea697400166bbd3bb8b0bf772061b7db6ff74b5e29 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollBar.html 7c622353d288ede62b623c0bc199f72794fdfbecab8b4ac3e33834f7660d18ca 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollEvent.html 8737ca8e2b561c4910205ee10c86fa64828969a798cb5fe7be60bfca9183039c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollWinEvent.html 8946e7186ce29f3bb0084cb97bbaf784c55946c68034dce9a42fb35e437d846c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrolledWindow.html dd51478ad6975dc04f796cae3ad964b4b1037a290d64a0689b0701312b37cbdd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSetCursorEvent.html 00258ac9b0145af2700ca4fd0a2a09f3f7432269f6e672db29984849bfba40e7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxShowEvent.html 04b509bb952fefece18a2432fc5e2143e70d60d6fa994a3f006e57a07377fb10 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSingleChoiceDialog.html f5adc9c5c9d849cef50ac48ebd3245c955bf74053b29c5ffa88d79753be3ef46 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizeEvent.html 90c089573b247cacbf6f7e914e3291787bff4255ab75fbc5786d873d003f94f0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizer.html 7c31f66cf59eb7f969b6bc61b66f316b948a303640169b2d520945d8d554b19d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerFlags.html bc54b2b08acf1b66249765d093c4444052d6b046f379e488998f4d44d32ff0f8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerItem.html 231e10790c53458b40c1aa0d57d7614dbf84c64eef39ea60a1ec3c19cf6254a2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSlider.html a2d4d439a717f276927ea92863d73c613592aac490d098e9909a2a633407b68d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinButton.html afaf12d98825249b53665c7d70db1a339e9f5f987acb7a657869bed47d876b37 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinCtrl.html eef074ea071a7cb1634e3d0f42f69c55f76fa9fdfdcb930b046560bb2c4b9302 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinEvent.html cded254ed8b0253e3962f0a997bfe4ec340f755c2efb5dab3570875b5282c996 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplashScreen.html b70b1d1990f790cdf7bba857c85bf0c43ab1b2daa35509ad4d60d5d873b66a63 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterEvent.html 0ee92ea75464f5df8ef99bc32dee8b088ea075d827c5d7672e68b146b408762f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterWindow.html 8fa55f068d2146f886d01bb4e37bfa909878aefd38e7362607a860bde48abb9c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBitmap.html 061428c616ebb990478b575853a2802a4b1ab60675d7731632dc338abe50a6d7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBox.html 1d1a52cd5826b44aac2f3f8a140f8bdc41ac52c26759bf93a7bea10e56cb579f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBoxSizer.html 9846820958c94bea3740bd13e1e135b5776efadc3470f6a8d6e6c6622437fc85 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticLine.html b7beaf849655560c77fecae46a645a61e65854ac25eaadfd4d15fad13c73d034 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticText.html 20e9d08de9963062ab887f4324ac6aadc53c845ddaf0f2af35913fcc96b2ce38 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStatusBar.html 448b37317998c79e6b6cded8b099a8260d65d442705ff53ecb505581c0c3fa84 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStdDialogButtonSizer.html d505834ea1234878aa8aded1b0828edc520ec4090969aa4c4916113c7bb4dcc9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextCtrl.html e275c565721cbc9b46cc191e24872033c0001f5b5903dcc7445aadda4bfe1fdb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextEvent.html 2e5b5ab1baa0518f8a1548de0f3652fbaa73a8b4eed76239d9f240c30c16108b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSysColourChangedEvent.html cd30c532db89658e1a2afa38e456586290a84df0fa93c6d91a598b982f243493 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemOptions.html 0a92df92810864c329b8ff5f2ccd780aa0c7772461b35b3179197dc445ee3002 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemSettings.html f0583ff1244578fb08c7ff36b3a0ab6f8fbe969ef3d8ac4be152ab9489641c67 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIcon.html 7031bb9b5bd4c8695199c822807d8f5cd2b40452eca480c0e651044732abee57 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIconEvent.html a27c75c553ec0cad67dd2c4eb6263a1485baacf989509b3279716530ddf6a275 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextAttr.html b7d77b49cb504e3b65907b14e4d3f9ae822822ed0fc46e9606cba669289722f6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextCtrl.html 329edf53d49920e35a83654f105e65897c4f01027261ca82184177f89ca79e6a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextDataObject.html 7fa73e9e31e466eab691d2cab535984da25a13b0f4e11487165cf8b193b2f542 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextEntryDialog.html d49efb400e1dbb045222fa88045bfd603ed8972bdc0b7fb8783bb7d66ac3fb1b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToggleButton.html 5089f862797ab066999163f7894163ef522ac67829dc5018f7912ec8da70a8d4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolBar.html 46a36340c8e4fd52f2a6127eeea37184edfbac3b4d40173db4730d2540c9b466 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolTip.html 48d9e0a723af2f377ce1a74c9578a84cf2b8e64b42f4a4da9114227f6589c5e0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolbook.html b124106ad61f35900b68d3ef7d1622cc6f13046ebd1ea1d5617ac65047f00cb4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTopLevelWindow.html d2f9a5154c03c9beabbc95cb47a408681ab65857f818ca1c60f6f498d91200b1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeCtrl.html 67352f6fa55a1c4280bb9244894b98e13661d0d8d84f96222d980016a3c4667a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeEvent.html 1b30b5f1292c8ce014cfdcab5535eb1217ee6570349a970955f1bd4af6c4ddec 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreebook.html fe75f0e6a5bd1fd6ebb1e53d4d0b405a0b40b7deb7ef212988f41e80248e2abd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxUpdateUIEvent.html bd4dfc4f8a65bcb5fb712adfa3f7f2ec4660a3e72c078a5ebe527480789a8e94 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebView.html ef9bf4d9cd675c20e85c5f05602df418d113d440565a050f9474f6c718c5f9b7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebViewEvent.html 69d496a6578b226685df592730b2b900d1debc8b6cc14f405a3e682d07379cb2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindow.html 0297d7b1335cc4039d55812f9817d71b1b05f9407b02d319835901ca33a0e141 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowCreateEvent.html 8359192145aeb7f4d4cecd546cbc20c90848e1317c2b616706b7fd1fbec73158 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDC.html c778087f6061f7a2596c7f2448bdb126038cbd61e5cd33396c3b7e64664b9df6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDestroyEvent.html 04a248d7a40190f970e94fdb6a5461507aab7fa5b3572e63e8c5bef24cb8dbaa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxXmlResource.html fcba038dccdbcbbda94f666f5352e80fef71cb63db126aacb47c43cf639f5f96 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_misc.html 8b5d937075d7acb05fd9c87b1b22e2ccbaaa6c98de1e8a2adfa2bddf45edbd4e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_object.html 97f85de1c44ab4a74739f7445b8b454c71bc2638d0e99db28e31f5c3948dff5e 2 @@ -4561,2 +4561,2 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/404.html 1ee94690d7b37228d6948e89d3d4b16adc7e5b2b6e1f473c02769a800757203a 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/api-reference.html 40186d6a7d0aa02b17b9fd6efa1808d272b22bdffd5754bbde60b1e937dd8acf 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/404.html 335a7fe8404a47012cf60c47fb45f2366eea85f29e4adcd38a9b55982331ffed 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/api-reference.html 7d6752e804bff4a4f37bbffa35976006ba2e2c80773e73f24cc3ba84ef0da2ee 2 @@ -4587,12 +4587,12 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/notes.html e1f522ef57ab07024649d02d0f8db4a985e34320f703aaa3eed210189841b602 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/search.html cb16364f56fdc6c09d76fa9dc7def4cbbe6df5bb606d9465d88c863614b2e317 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl.html 932fa28f60a66b9c37948f76f2e8e5e7dcf94a7726226a355af88a7b1a6b0865 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_eventp.html d5bd5923eac32d132e7aef0396a7f407f3d471bca1e21ec366dcdc58d2bdbb06 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_examples.html c721fd984019d4bde9f252d8485ffa8ad34bf24ed6a1ef25d6c86e6a11b4f1a4 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_sax_parser.html 7db304c1dcd79adfef317b4e9fa9afebc093ec738e3fb87b9cfb6c674d18d004 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_scan.html 65823d98aefa74399df9006e93005803dccdd70da35f14fc43a3d2d8de4006a9 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_ug.html e462453fede80129583f4e9ba38f53a34116a503e8ad762e130633bf609f874e 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xpath.html 160cbcda94fa2a59d2fb514762d52ece7ec0a0983cca352a1b881e90d88dc79c 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs.html 2f33c401000252bb2a2ea7607428ecfff9dc40adcb6090f9e5199d47861c1cf6 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs_examples.html 0bc8ec72d46064cff70c124deac8ad67176a5cd61d5f770563aac24c537dfc03 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xsd.html 9ecdda1e90fce1bce026edcecd36657bf36a3fa6b5b1be9a331e07e48c63f888 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/notes.html 17d6e72d5d4048bb04e3ae4e14de53dc16795024fc95a7b40653fe8a386196f1 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/search.html 558713b10728f7b0bfc281f5283cb363f62faac9fefdbc78043459ae517351b9 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl.html 70145130a0527569219897c3402149d70675c02cd0af77887b1586145519e701 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_eventp.html 9b3f7e9f690d0d9226dba7e3795bc41e021f67195fe82f729fed1905a6e8687d 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_examples.html c8d67253083c3478a28e90e097ef4a7f5691abcbdc8217af132bfcc1292a83f3 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_sax_parser.html aab40ec1eda9844c586e6d2081a31a57eb45137fcb1e6ed99e8f02f41ecd8f74 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_scan.html c6feddb290f553a3f64d069259f8243d53643052a4f56557e0905802b28a3f59 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_ug.html 3d11716dba880b124515eee28f85aeef9baab3766d5ba7147f7ea2b281635e97 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xpath.html 7bfb66d3572d97c5f9d6745721442b68193875f52b5ff733403221b192fd806e 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs.html 7a62d846ff65e7ad2ce426448820b9029b24c3b0f80c806d3ba33cb7ab90b1c4 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs_examples.html 3b4727933aa680599f5af51160b275996bff3643991ea564c6ac994b7633b641 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xsd.html b4600de640f93f2ba10e62244b7b35fe01e33d73a3b61e025846af4759531497 2 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist --- old-filelist +++ new-filelist @@ -552,7 +552,7 @@ /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.9/doc/html/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.9/doc/html/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/remixicon-QPNJX265.woff2 2 (none) 120777 root root 0 4294967295 ../../../../xmerl-2.1.9/doc/html/dist/remixicon-QPNJX265.woff2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-272F0D3A.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-D25CF93C.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/sidebar_items-0FCC6507.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 2 (none) 100644 root root 0 4294967295 comparing file checksum creating rename script RPM meta information is different Extracting packages /usr/share/doc/packages/erlang-doc/doc/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/404.html 2026-04-20 17:48:21.561562671 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/404.html 2026-04-20 17:48:21.565562697 +0000 @@ -104,7 +104,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/deprecations.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/deprecations.html 2026-04-20 17:48:21.593562876 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/deprecations.html 2026-04-20 17:48:21.593562876 +0000 @@ -196,7 +196,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/man_index.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/man_index.html 2026-04-20 17:48:21.677563414 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/man_index.html 2026-04-20 17:48:21.673563388 +0000 @@ -137,7 +137,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/readme.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/readme.html 2026-04-20 17:48:21.705563593 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/readme.html 2026-04-20 17:48:21.705563593 +0000 @@ -128,7 +128,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/removed.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/removed.html 2026-04-20 17:48:21.737563798 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/removed.html 2026-04-20 17:48:21.737563798 +0000 @@ -175,7 +175,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 2026-04-20 17:48:21.773564029 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 2026-04-20 17:48:21.773564029 +0000 @@ -151,7 +151,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/search.html 2026-04-20 17:48:21.801564208 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/search.html 2026-04-20 17:48:21.801564208 +0000 @@ -104,7 +104,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/system/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/404.html 2026-04-20 17:48:21.829564387 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/404.html 2026-04-20 17:48:21.825564362 +0000 @@ -108,7 +108,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml" 2026-04-20 15:20:40.000000000 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml" 2042-05-23 04:39:34.000000000 +0000 @@ -29,8 +29,8 @@ Releases), the code for each application is placed in a separate directory following a pre-defined directory structure.

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)

Notice that this function is not thread-safe.

driver_cancel_timer()

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 on monitors, for whatever reason.

Returns 0 if monitor1 and monitor2 are equal, < 0 if monitor1 < -monitor2, and > 0 if monitor1 > monitor2.

driver_connected()

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,
+monitor2, and > 0 if monitor1 > monitor2.

driver_connected()

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,
         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.

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.

    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>
    @@ -8589,11 +8589,11 @@

    Returns an integer or float representing the absolute value of Float -or Int.

    Examples

    1> abs(-3.33).
    +or Int.

    Examples

    1> abs(-3.33).
     3.33
    -2> abs(-3).
    +2> abs(-3).
     3
    -3> abs(5).
    +3> abs(5).
     5
    @@ -8625,8 +8625,8 @@

    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 -faster.

    Examples

    1> erlang:append_element({one, two}, three).
    -{one,two,three}
    +faster.

    Examples

    1> erlang:append_element({one, two}, three).
    +{one,two,three}
    @@ -8694,11 +8694,11 @@ characters are encoded using UTF-8, where some 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.

    Examples

    1> atom_to_binary('Erlang', latin1).
    -<<"Erlang">>
    -2> atom_to_binary('π', unicode).
    -<<207,128>>
    -3> atom_to_binary('π', latin1).
    +representation for Atom contains a Unicode character > 255.

    Examples

    1> atom_to_binary('Erlang', latin1).
    +<<"Erlang">>
    +2> atom_to_binary('π', unicode).
    +<<207,128>>
    +3> atom_to_binary('π', latin1).
     ** exception error: bad argument
          in function  atom_to_binary/2
             called as atom_to_binary('π',latin1)
    @@ -8734,12 +8734,12 @@
     
     

    Returns a list of unicode code points corresponding to the text representation of Atom.

    See the unicode module for instructions on converting the resulting list into -different formats.

    Examples

    1> atom_to_list('Erlang').
    +different formats.

    Examples

    1> atom_to_list('Erlang').
     "Erlang"
    -2> atom_to_list('π').
    -[960]
    -3> atom_to_list('你好').
    -[20320,22909]
    +2>
    atom_to_list('π'). +[960] +3> atom_to_list('你好'). +[20320,22909]
    @@ -8813,13 +8813,13 @@

    Extracts the part of the binary described by Start and Length.

    A negative length can be used to extract bytes at the end of a binary.

    Start is zero-based.

    Failure: badarg if Start and Length in any way reference outside the binary.

    For details about the semantics of Start and Length, see -binary:part/3.

    Examples

    1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
    -2> binary_part(Bin, 0, 2).
    -<<1,2>>
    -3> binary_part(Bin, 2, 3).
    -<<3,4,5>>
    -4> binary_part(Bin, byte_size(Bin), -5).
    -<<6,7,8,9,10>>
    +binary:part/3.

    Examples

    1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
    +2> binary_part(Bin, 0, 2).
    +<<1,2>>
    +3> binary_part(Bin, 2, 3).
    +<<3,4,5>>
    +4> binary_part(Bin, byte_size(Bin), -5).
    +<<6,7,8,9,10>>
    @@ -8893,9 +8893,9 @@ than binary_to_atom/2.

    The number of characters that are permitted in an atom name is limited.

    Change

    As from Erlang/OTP 20, binary_to_atom(Binary, utf8) is capable of decoding any Unicode character. Earlier versions would fail if the -binary contained Unicode characters > 255.

    Examples

    1> binary_to_atom(<<"Erlang">>, latin1).
    +binary contained Unicode characters > 255.

    Examples

    1> binary_to_atom(<<"Erlang">>, latin1).
     'Erlang'
    -2> binary_to_atom(<<960/utf8>>, utf8).
    +2> binary_to_atom(<<960/utf8>>, utf8).
     'π'
    @@ -8979,14 +8979,14 @@ binary_to_existing_atom(<<"some_atom">>, utf8) will fail.

    Note

    The number of characters that are permitted in an atom name is limited. The default limits can be found in the -Efficiency Guide (section System Limits).

    Examples

    1> binary_to_existing_atom(~"definitely_not_existing_at_all", utf8).
    +Efficiency Guide (section System Limits).

    Examples

    1> binary_to_existing_atom(~"definitely_not_existing_at_all", utf8).
     ** exception error: bad argument
          in function  binary_to_existing_atom/2
             called as binary_to_existing_atom(<<"definitely_not_existing_at_all">>,utf8)
             *** argument 1: not an already existing atom
     2> hello.
     hello
    -3> binary_to_existing_atom(~"hello", utf8).
    +3> binary_to_existing_atom(~"hello", utf8).
     hello
    @@ -9021,11 +9021,11 @@

    Returns the float whose text representation is Binary.

    The float string format is the same as the format for Erlang float literals, except that underscores -are not permitted.

    Failure: badarg if Binary contains an invalid representation of a float.

    Examples

    1> binary_to_float(~"10.5").
    +are not permitted.

    Failure: badarg if Binary contains an invalid representation of a float.

    Examples

    1> binary_to_float(~"10.5").
     10.5
    -2> binary_to_float(~"17.0").
    +2> binary_to_float(~"17.0").
    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlc_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlc_cmd.html	2026-04-20 17:48:27.341599686 +0000
    +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlc_cmd.html	2026-04-20 17:48:27.337599661 +0000
    @@ -217,7 +217,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlsrv_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlsrv_cmd.html 2026-04-20 17:48:27.377599917 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erlsrv_cmd.html 2026-04-20 17:48:27.377599917 +0000 @@ -231,28 +231,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); - } -}

    Notes

    Although the options are described in a Unix-like format, the case of the + SetConsoleCtrlHandler(&service_aware_handler, TRUE); + } +}

    Notes

    Although the options are described in a Unix-like format, the case of the options or commands is not relevant, and both character "/" and "-" can be used for options.

    Note that the program resides in the emulator's bin directory, not in the bin directory directly under the Erlang root. The reasons for this are the @@ -310,7 +310,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erts_alloc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erts_alloc.html 2026-04-20 17:48:27.413600147 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/erts_alloc.html 2026-04-20 17:48:27.417600173 +0000 @@ -429,7 +429,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/escript_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/escript_cmd.html 2026-04-20 17:48:27.449600378 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/escript_cmd.html 2026-04-20 17:48:27.449600378 +0000 @@ -89,30 +89,30 @@ -

    Run a script written in Erlang.

    Synopsis

    script-name [arg1 arg2...]

    Description

    escript provides support for running short Erlang programs without having to +

    Run a script written in Erlang.

    Synopsis

    script-name [arg1 arg2...]

    Description

    escript provides support for running short Erlang programs without having to compile them first, and an easy way to retrieve the command-line arguments. escripts are created by either writing them by hand or using escript:create/2.

    escripts are run by directly invoking them (does not work on Windows):

    script-name [arg1 arg2...]

    or by calling the escript program (works on all platforms):

    escript [escript-flags] script-name.escript [arg1 arg2...]

    For example:

    $ chmod u+x factorial
     $ 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
    @@ -125,7 +125,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 @@ -144,7 +144,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. @@ -152,7 +152,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.

    Precompiled escripts

    A script can also contains precompiled beam code. To create a precompiled escript it is recommended that you use escript:create/2. In a @@ -248,7 +248,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/garbagecollection.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/garbagecollection.html 2026-04-20 17:48:27.485600608 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/garbagecollection.html 2026-04-20 17:48:27.485600608 +0000 @@ -89,23 +89,23 @@ -

    Erlang manages dynamic memory with a tracing garbage collector. More precisely a per process generational semi-space copying collector using Cheney's copy collection algorithm together with a global large object space. (See C. J. Cheney in References.)

    Overview

    Each Erlang process has its own stack and heap which are allocated in the same memory block and grow towards each other. When the stack and the heap meet, the garbage collector is triggered and memory is reclaimed. If not enough memory was reclaimed, the heap will grow.

    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!"}}}.
    -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 of 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.

    Generational Garbage Collection

    In addition to the collection algorithm described above, the Erlang garbage collector also provides generational garbage collection. An additional heap, called the old heap, is used where the long lived data is stored. The original heap is called the young heap, or sometimes the allocation heap.

    With this in mind we can look at the Erlang's garbage collection again. During the copy stage anything that should be copied to the young to space is instead copied to the old to space if it is below the high-watermark.

    Garbage collection: heap scan

    The high-watermark is placed where the previous garbage collection (described in Overview) ended and we have introduced a new area called the old heap. When doing the normal garbage collection pass, any term that is located below the high-watermark is copied to the old to space instead of the young.

    Garbage collection: heap scan

    In the next garbage collection, any pointers to the old heap will be ignored and not scanned. This way the garbage collector does not have to scan the long-lived terms.

    Generational garbage collection aims to increase performance at the expense of memory. This is achieved because only the young, smaller, heap is considered in most garbage collections.

    The generational hypothesis predicts that most terms tend to die young (see D. Ungar in References), and for an immutable language such as Erlang, young terms die even faster than in other languages. So for most usage patterns the data in the new heap will die very soon after it is allocated. This is good because it limits the amount of data copied to the old heap and also because the garbage collection algorithm used is proportional to the amount of live data on the heap.

    One critical issue to note here is that any term on the young heap can reference terms on the old heap but no term on the old heap may refer to a term on the young heap. This is due to the nature of the copy algorithm. Anything referenced by an old heap term is not included in the reference tree, root-set and its followers, and hence is not copied. If it was, the data would be lost, fire and brimstone would rise to cover the earth. Fortunately, this comes naturally for Erlang because the terms are immutable and thus there can be no pointers modified on the old heap to point to the young heap.

    To reclaim data from the old heap, both young and old heaps are included during the collection and copied to a common to space. Both the from space of the young and old heap are then deallocated and the procedure will start over from the beginning. This type of garbage collection is called a full sweep and is triggered when the size of the area under the high-watermark is larger than the size of the free area of the old heap. It can also be triggered by doing a manual call to erlang:garbage_collect(), or by running into the young garbage collection limit set by [spawn_opt(fun(),{fullsweep_after, N}]) where N is the number of young garbage collections to do before forcing a garbage collection of both young and old heap.

    The young heap

    The young heap, or the allocation heap, consists of the stack and heap as described in the Overview. However, it also includes any heap fragments that are attached to the heap. All of the heap fragments are considered to be above the high-watermark and part of the young generation. Heap fragments contain terms that either did not fit on the heap, or were created by another process and then attached to the heap. For instance if the bif binary_to_term/1 created a term which does not fit on the current heap without doing a garbage collection, it will create a heap-fragment for the term and then schedule a garbage collection for later. Also if a message is sent to the process, the payload may be placed in a heap-fragment and that fragment is added to young heap when the message is matched in a receive clause.

    This procedure differs from how it worked prior to Erlang/OTP 19.0. Before 19.0, only a contiguous memory block where the young heap and stack resided was considered to be part of the young heap. Heap fragments and messages were immediately copied into the young heap before they could be inspected by the Erlang program. The behaviour introduced in 19.0 is superior in many ways - most significantly it reduces the number of necessary copy operations and the root set for garbage collection.

    Sizing the heap

    As mentioned in the Overview the size of the heap grows to accommodate more data. Heaps grow in two stages, first a variation of the Fibonacci sequence is used starting at 233 words. Then at about 1 mega words the heap only grows in 20% increments.

    There are two occasions when the young heap grows:

    • if the total size of the heap + message and heap fragments exceeds the current heap size.
    • if after a fullsweep, the total amount of live objects is greater than 75%.

    There are two occasions when the young heap is shrunk:

    • if after a young collection, the total amount of live objects is less than 25% of the heap and the young heap is "big"
    • if after a fullsweep, the total amount of live objects is less than 25% of the heap.

    The old heap is always one step ahead in the heap growth stages than the young heap.

    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)) {
    +

    Erlang manages dynamic memory with a tracing garbage collector. More precisely a per process generational semi-space copying collector using Cheney's copy collection algorithm together with a global large object space. (See C. J. Cheney in References.)

    Overview

    Each Erlang process has its own stack and heap which are allocated in the same memory block and grow towards each other. When the stack and the heap meet, the garbage collector is triggered and memory is reclaimed. If not enough memory was reclaimed, the heap will grow.

    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!"}}}.
    +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 of 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.

    Generational Garbage Collection

    In addition to the collection algorithm described above, the Erlang garbage collector also provides generational garbage collection. An additional heap, called the old heap, is used where the long lived data is stored. The original heap is called the young heap, or sometimes the allocation heap.

    With this in mind we can look at the Erlang's garbage collection again. During the copy stage anything that should be copied to the young to space is instead copied to the old to space if it is below the high-watermark.

    Garbage collection: heap scan

    The high-watermark is placed where the previous garbage collection (described in Overview) ended and we have introduced a new area called the old heap. When doing the normal garbage collection pass, any term that is located below the high-watermark is copied to the old to space instead of the young.

    Garbage collection: heap scan

    In the next garbage collection, any pointers to the old heap will be ignored and not scanned. This way the garbage collector does not have to scan the long-lived terms.

    Generational garbage collection aims to increase performance at the expense of memory. This is achieved because only the young, smaller, heap is considered in most garbage collections.

    The generational hypothesis predicts that most terms tend to die young (see D. Ungar in References), and for an immutable language such as Erlang, young terms die even faster than in other languages. So for most usage patterns the data in the new heap will die very soon after it is allocated. This is good because it limits the amount of data copied to the old heap and also because the garbage collection algorithm used is proportional to the amount of live data on the heap.

    One critical issue to note here is that any term on the young heap can reference terms on the old heap but no term on the old heap may refer to a term on the young heap. This is due to the nature of the copy algorithm. Anything referenced by an old heap term is not included in the reference tree, root-set and its followers, and hence is not copied. If it was, the data would be lost, fire and brimstone would rise to cover the earth. Fortunately, this comes naturally for Erlang because the terms are immutable and thus there can be no pointers modified on the old heap to point to the young heap.

    To reclaim data from the old heap, both young and old heaps are included during the collection and copied to a common to space. Both the from space of the young and old heap are then deallocated and the procedure will start over from the beginning. This type of garbage collection is called a full sweep and is triggered when the size of the area under the high-watermark is larger than the size of the free area of the old heap. It can also be triggered by doing a manual call to erlang:garbage_collect(), or by running into the young garbage collection limit set by [spawn_opt(fun(),{fullsweep_after, N}]) where N is the number of young garbage collections to do before forcing a garbage collection of both young and old heap.

    The young heap

    The young heap, or the allocation heap, consists of the stack and heap as described in the Overview. However, it also includes any heap fragments that are attached to the heap. All of the heap fragments are considered to be above the high-watermark and part of the young generation. Heap fragments contain terms that either did not fit on the heap, or were created by another process and then attached to the heap. For instance if the bif binary_to_term/1 created a term which does not fit on the current heap without doing a garbage collection, it will create a heap-fragment for the term and then schedule a garbage collection for later. Also if a message is sent to the process, the payload may be placed in a heap-fragment and that fragment is added to young heap when the message is matched in a receive clause.

    This procedure differs from how it worked prior to Erlang/OTP 19.0. Before 19.0, only a contiguous memory block where the young heap and stack resided was considered to be part of the young heap. Heap fragments and messages were immediately copied into the young heap before they could be inspected by the Erlang program. The behaviour introduced in 19.0 is superior in many ways - most significantly it reduces the number of necessary copy operations and the root set for garbage collection.

    Sizing the heap

    As mentioned in the Overview the size of the heap grows to accommodate more data. Heaps grow in two stages, first a variation of the Fibonacci sequence is used starting at 233 words. Then at about 1 mega words the heap only grows in 20% increments.

    There are two occasions when the young heap grows:

    • if the total size of the heap + message and heap fragments exceeds the current heap size.
    • if after a fullsweep, the total amount of live objects is greater than 75%.

    There are two occasions when the young heap is shrunk:

    • if after a young collection, the total amount of live objects is less than 25% of the heap and the young heap is "big"
    • if after a fullsweep, the total amount of live objects is less than 25% of the heap.

    The old heap is always one step ahead in the heap growth stages than the young heap.

    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)) {
       /* 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.

    Binary heap

    The binary heap works as a large object space for binary terms that are greater than 64 bytes (from now on called off-heap binaries). The binary heap is reference counted and a pointer to the off-heap binary is stored on the process heap. To keep track of when to decrement the reference counter of the off-heap binary, a linked list (the MSO - mark and sweep object list) containing funs and externals as well as off-heap binaries is woven through the heap. After a garbage collection is done, the MSO list is swept and any off-heap binary that does not have a move marker written into the header words has its reference decremented and is potentially freed.

    All items in the MSO list are ordered by the time they were added to the process heap, so when doing a minor garbage collection, the MSO sweeper only has to sweep until it encounters an off-heap binary that is on the old heap.

    Virtual Binary heap

    Each process has a virtual binary heap associated with it that has the size of all the current off-heap binaries that the process has references to. The virtual binary heap also has a limit and grows and shrinks depending on how off-heap binaries are used by the process. The same growth and shrink mechanisms are used for the binary heap and for the term heap, so first a Fibonacci like series and then 20% growth.

    The virtual binary heap exists in order to trigger garbage collections earlier when potentially there is a very large amount of off-heap binary data that could be reclaimed. This approach does not catch all problems with binary memory not being released soon enough, but it does catch a lot of them.

    Messages

    Messages can become a part of the process heap at different times. This depends on how the process is configured. +} 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.

    Binary heap

    The binary heap works as a large object space for binary terms that are greater than 64 bytes (from now on called off-heap binaries). The binary heap is reference counted and a pointer to the off-heap binary is stored on the process heap. To keep track of when to decrement the reference counter of the off-heap binary, a linked list (the MSO - mark and sweep object list) containing funs and externals as well as off-heap binaries is woven through the heap. After a garbage collection is done, the MSO list is swept and any off-heap binary that does not have a move marker written into the header words has its reference decremented and is potentially freed.

    All items in the MSO list are ordered by the time they were added to the process heap, so when doing a minor garbage collection, the MSO sweeper only has to sweep until it encounters an off-heap binary that is on the old heap.

    Virtual Binary heap

    Each process has a virtual binary heap associated with it that has the size of all the current off-heap binaries that the process has references to. The virtual binary heap also has a limit and grows and shrinks depending on how off-heap binaries are used by the process. The same growth and shrink mechanisms are used for the binary heap and for the term heap, so first a Fibonacci like series and then 20% growth.

    The virtual binary heap exists in order to trigger garbage collections earlier when potentially there is a very large amount of off-heap binary data that could be reclaimed. This approach does not catch all problems with binary memory not being released soon enough, but it does catch a lot of them.

    Messages

    Messages can become a part of the process heap at different times. This depends on how the process is configured. We can configure the behaviour of each process using process_flag(message_queue_data, off_heap | on_heap) or we can set a default for all processes at start using the option +hmqd.

    What do these different configurations do and when should we use them? Let's start by going through what happens when one Erlang process sends a message to another. The sending process needs to do a couple of things:

    1. calculate how large the message to be sent is
    2. allocate enough space to fit the entire message
    3. copy the message payload
    4. allocate a message container with some meta data
    5. insert the message container in the receiver process' message queue

    The process flag message_queue_data, of the receiver process, controls the message allocating strategy of the sender process in step 2 and also how the message data is treated by the garbage collector.

    The procedure above is different from how it worked prior to 19.0. Before 19.0 there was no configuration option, the behaviour was always very similar to how the on_heap option is in 19.0.

    Message allocating strategies

    If set to on_heap, the sending process will first attempt to allocate the space for the message directly on the young heap block of the receiving process. @@ -159,7 +159,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/inet_cfg.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/inet_cfg.html 2026-04-20 17:48:27.521600839 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/inet_cfg.html 2026-04-20 17:48:27.525600864 +0000 @@ -117,11 +117,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 @@ -129,61 +129,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.

      User Configuration Example

      Assume that a user does not want Erlang to use the native lookup method, but +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.

    User Configuration Example

    Assume that a user does not want Erlang to use the native lookup method, but wants Erlang to read all information necessary from start and use that for resolving names and addresses. If lookup fails, Erlang is to request the data from a nameserver (using the Erlang DNS client, set to use EDNS allowing larger @@ -192,19 +192,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"'
    @@ -252,7 +252,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/init.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/init.html 2026-04-20 17:48:27.565601121 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/init.html 2026-04-20 17:48:27.561601095 +0000 @@ -120,8 +120,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 @@ -169,13 +169,13 @@ atoms.

    Example

    % 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

    See Also

    erl_prim_loader, heart

    @@ -471,12 +471,12 @@

    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:

    • root - The installation directory of Erlang/OTP, $ROOT:

      2> init:get_argument(root).
      -{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.

    +{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.

    @@ -774,7 +774,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/introduction.html 2026-04-20 17:48:27.597601325 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/introduction.html 2026-04-20 17:48:27.597601325 +0000 @@ -138,7 +138,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/match_spec.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/match_spec.html 2026-04-20 17:48:27.637601582 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/match_spec.html 2026-04-20 17:48:27.637601582 +0000 @@ -281,64 +281,64 @@ matches or does not. The effect when the expression matches is a trace message rather than a returned term. The ActionTerms are executed as in an imperative language, that is, for their side effects. Functions with side effects are also -allowed when tracing.

    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 +allowed when tracing.

    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 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'],
    -  [],
    -  []},
    - {'_',[],[]}]

    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 +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 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.

    @@ -386,7 +386,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/notes.html 2026-04-20 17:48:27.797602606 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/notes.html 2026-04-20 17:48:27.797602606 +0000 @@ -89,27 +89,27 @@ -

    This document describes the changes made to the ERTS application.

    Erts 16.3

    Fixed Bugs and Malfunctions

    • Fixed a documentation build warning when one or more applications failed their configure step and were skipped.

      Own Id: OTP-19914 Aux Id: ERIERL-1251,PR-10537

    • The (IPv6) flowinfo control message header was not properly supported.

      Own Id: OTP-19977

    • Fixed NetBSD thread naming, using pthread_setname_np(); used for debugging.

      Own Id: OTP-19987 Aux Id: PR-10684

    Improvements and New Features

    • The erlang:link_option/0 type is now exported.

      Own Id: OTP-19904 Aux Id: PR-10451

    • Added persistent_term:put_new/2 that will quickly do nothing if a term with the given name and value already exists, and raise a badarg exception if the term exists with a different value.

      Own Id: OTP-19908 Aux Id: GH-9681, PR-9695

    • The manifest.xml file for the Windows build now has version numbers updated to correctly report OS versions on Windows 10, 11, Server 2016, 2019, 2022.

      Own Id: OTP-19920 Aux Id: GH-10371, PR-10546

    • Improved yielding inside re:run. Regular expressions searching for one specific byte character could spin in memchr() without any yielding or reduction counting.

      Own Id: OTP-19950 Aux Id: PR-10486

    • Updated openssl from 3.6.0 to 3.6.1.

      This change does not perform any changes in the md5 vendor implementation from openssl. The change merges upstream cosmetic changes from openssl. This is necessary to automatically migrate cleanly to the next openssl version without conflicts with upstream.

      Own Id: OTP-19959 Aux Id: PR-10630

    • Updated ryu implementation used to convert floats to strings.

      Own Id: OTP-19974 Aux Id: PR-10672

    • Upgraded asmjit to v1.18

      Own Id: OTP-19979 Aux Id: PR-10675

    • Updated zlib to version 1.3.2.

      Own Id: OTP-19998 Aux Id: PR-10752

    Erts 16.2.2

    Fixed Bugs and Malfunctions

    • Fixed bug in erlang:monitor_node for rare reconnect race with multiple node monitoring from the same process.

      Own Id: OTP-19902 Aux Id: PR-10518

    • Add missing copyrights.

      Own Id: OTP-20008

    Erts 16.2.1

    Fixed Bugs and Malfunctions

    • Fail the windows build properly when nsis is not recognised.

      Own Id: OTP-19926 Aux Id: PR-10547

    • Socket accept cancel could cause fatal crash (core dump) on Windows.

      Own Id: OTP-19958

    • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

      Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

      Own Id: OTP-19962 Aux Id: PR-10616

    • A missing memory barrier when unlocking process locks could cause unexpected behavior on architectures with weak memory ordering such as for example ARM.

      Own Id: OTP-19978 Aux Id: PR-10664

    • A process could fail to wake from hibernation when a non‑message signal followed by a message signal arrived concurrently as the receiving process hibernated. If the process had a large heap, triggering a dirty GC, the wakeup could be lost.

      This bug existed since OTP 27.0.

      Own Id: OTP-19983 Aux Id: GH-10651, PR-10696

    Erts 16.2

    Fixed Bugs and Malfunctions

    • Fixed a build issue on modern compilers.

      Own Id: OTP-19789 Aux Id: PR-9983

    • When multiple processes called the same fun whose defining module was not loaded, a badfun exception could sometimes occur in one of the calling processes. This would only happen with the JIT runtime system.

      Own Id: OTP-19803 Aux Id: PR-10257

    • Fix a bug where Erlang/OTP tools could load a different boot script from CWD.

      Own Id: OTP-19819 Aux Id: PR-10317

    • Fixed a bug when more than one session traced the same BIF. Disabling tracing for a BIF in one session could incorrectly disable tracing of the BIF in other trace sessions as well.

      Own Id: OTP-19840 Aux Id: PR-10349

    • Fixed a slight performance regression in erlang:binary_to_term/1,2.

      Own Id: OTP-19859 Aux Id: PR-10383, GH-8329

    • Two socket related code warts found by PVS Studio has been fixed. One caused gen_tcp to no convert the send error econnaborted to econnreset on Windows. The other caused socket:sendfile/* to indicate the wrong error for a bad Offset.

      Own Id: OTP-19862 Aux Id: PR-10362, PR-10388

    • Fixed bug causing VM crash if an Erlang process gets killed while executing re:run with a (presumably) large subject string.

      Own Id: OTP-19888 Aux Id: GH-10432, PR-10439

    Improvements and New Features

    • Updated the vendor dependencies SHA to improve the accuracy of the source SBOM with purl pointing to the exact vendor commit that Erlang/OTP builds upon.

      Own Id: OTP-19777 Aux Id: PR-10216

    • Receive buffer allocation has been optimized for socket socket in that an underutilized buffers' content is copied to a freshly allocated binary of the right size instead of being reallocated.

      This optimization was already implemented for the socket:recv/1 functions, but now the same buffer stragegy is shared between all socket receive operations.

      Own Id: OTP-19794 Aux Id: PR-10231

    • Option(s) to create gen_tcp and socket sockets with protocol IPPROTO_MPTCP has been implemented.

      See functions gen_tcp:listen/2, gen_tcp:connect/4 and the type socket:protocol/0.

      Own Id: OTP-19814

    • erlc will now limit the number of ports and processes when starting erl in order to use less memory.

      Own Id: OTP-19852 Aux Id: PR-10364

    • Support for the socket options TCP_KEEPCNT, TCP_KEEPIDLE, and TCP_KEEPINTVL have been implemented for gen_tcp, as well as TCP_USER_TIMEOUT for both gen_tcp and socket.

      Own Id: OTP-19857 Aux Id: OTP-19814, PR-10390

    • Limit size of sctp_event_subscribe on Linux

      Own Id: OTP-19863 Aux Id: PR-10321

    • Updated MD5 implementation from OpenSSL 3.5.0 to 3.6.0

      Own Id: OTP-19870 Aux Id: PR-10405

    • Improved performance when doing socket:accept on the same socket from many processes on large multi core systems under high rate of connections. Mitigating performance regression seen since OTP 28.0.

      Own Id: OTP-19873 Aux Id: PR-10323, GH-10322

    • Updated STL version used.

      Own Id: OTP-19876

    • Updated PCRE2 to 10.47. Also picked newer fix, from upstream PCRE2, to bug that could cause benign random uninitialized data in exported regular expressions.

      Own Id: OTP-19880 Aux Id: PR-10391

    Erts 16.1.2

    Fixed Bugs and Malfunctions

    • Fixed a JIT bug that could miscompile equality tests on empty bitstrings.

      Own Id: OTP-19846 Aux Id: PR-10359

    • The documentation building code produced warnings during the build, if none of the applications were skipped. The warnings were resolved.

      Own Id: OTP-19865 Aux Id: ERIERL-1251,PR-10396

    Erts 16.1.1

    Fixed Bugs and Malfunctions

    • Fixed the erl documentation of the default timewarp mode used.

      Own Id: OTP-19790 Aux Id: PR-9970

    • The erlang:suspend_process() BIFs failed to suspend processes currently executing on dirty schedulers.

      Own Id: OTP-19799 Aux Id: PR-10241

    Erts 16.1

    Fixed Bugs and Malfunctions

    • Made sure to not set any terminal settings when they have not been changed. Doing so can trigger a SIGTTOU signal which would terminate Erlang when it should not.

      Own Id: OTP-19685 Aux Id: PR-9906

    • As an optimization, when the unicode:characters_to_binary/3 was used to convert from latin1 to utf8 or vice versa, it would return the original binary unchanged if it only contained 7-bit ASCII characters. That otpimization was broken in Erlang/OTP 27, and has now been mended.

      Own Id: OTP-19728 Aux Id: GH-10072, PR-10093

    Improvements and New Features

    • Fixed C compiler warnings generated by codechecker.

      Own Id: OTP-19671 Aux Id: PR-9832

    • Added support in module re for export and import of compiled regular expression in order to safely move them between Erlang node instances.

      Own Id: OTP-19730 Aux Id: PR-9976

    • Added new erl command line flag +Mumadtn <bool> causing MADV_DONTNEED to be passed to madvise() instead of MADV_FREE.

      Own Id: OTP-19739 Aux Id: PR-10113

    Erts 16.0.3

    Fixed Bugs and Malfunctions

    • Update PCRE2 from 10.45 to 10.46. Fixes potential buffer read overflow on regular expressions with (*scs:) and (*ACCEPT) syntax combined.

      Own Id: OTP-19755 Aux Id: CVE-2025-58050

    • Fixed bug that could cause crash in beam started with erl -emu_type debug +JPperf true with any type of tracing return from function.

      Own Id: OTP-19761 Aux Id: PR-19755

    Erts 16.0.2

    Fixed Bugs and Malfunctions

    • prim_net nif used incorrect encoding for family resulting in non-functional address selection.

      Own Id: OTP-19674

    • Fix windows uninstall command.

      Own Id: OTP-19683 Aux Id: PR-9887, GH-9992, GH-9884

    • With this change erlang will start if it receives short (ms-dos compatible) path to executable.

      Own Id: OTP-19690 Aux Id: PR-9996

    Improvements and New Features

    • The maximum amount of connections for epmd on Windows platforms has been increased from 64 to 1024.

      Own Id: OTP-19710 Aux Id: PR-10039

    Erts 16.0.1

    Fixed Bugs and Malfunctions

    • Fix Erlang to not crash when io:standard_error/0 is a terminal but io:standard_io/0 is not. This bug has existed since Erlang/OTP 28.0 and only effects Windows.

      Own Id: OTP-19650 Aux Id: GH-9872, PR-9878

    • In a debug build, the BIFs for the native debugger could cause a lock order violation diagnostic from the lock checker.

      Own Id: OTP-19665 Aux Id: PR-9926

    • When building ERTS make sure correct pcre2.h file is included even if CFLAGS contains extra include paths.

      Own Id: OTP-19675 Aux Id: PR-9892

    Erts 16.0

    Fixed Bugs and Malfunctions

    • ETS tables with more than 2 billion keys are now supported.

      Own Id: OTP-19144 Aux Id: PR-8589

    • The zlib library included in Erlang/OTP has been updated to version 1.3.1.

      Own Id: OTP-19259 Aux Id: PR-8862

    • to_erl no longer clears the screen when attaching to a run_erl session.

      Own Id: OTP-19263 Aux Id: PR-8943

    • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

      While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

      External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19285 Aux Id: PR-8913

    • Fixed a bug where erlc would crash if its path contained spaces.

      Own Id: OTP-19295 Aux Id: PR-8937

    • The -noshell mode has been updated to read data lazily from standard input. Before this fix any data would be read greedily which meant that Erlang could consume data not meant for it. It also meant that in order for shell:start_interactive/0 to work on Windows an API that did not support reading of Unicode characters had to be used.

      Own Id: OTP-19313 Aux Id: PR-8962, GH-8113

    • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

      This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

    • Fixed erlang:localtime_to_universaltime/2 with IsDST set to true and a timezone without daylight saving (for example UTC) to assume that the provided localtime does not have DST. This has always been the behaviour, but glibc versions after 2.37 changed it so that the behavior in Erlang also changed.

      Own Id: OTP-19453 Aux Id: PR-9207

    • Support for the TZ environment variable has been added on Windows. Before this change only the time zone configured in the OS was ever used.

      Own Id: OTP-19454 Aux Id: PR-9207

    • Suppressed various warnings when building the emulator with recent versions of GCC

      Own Id: OTP-19488 Aux Id: GH-9413, PR-9417

    • Fixed a bug in re:run and re:compile where the pattern parameter would be read incorrectly if it was a sub-binary.

      Own Id: OTP-19507 Aux Id: PR-9478, GH-9438

    • Fixed a broken makefile rule that made it so that O2 and -O2 could not be part of the directory path when building Erlang/OTP. Bug has been present since R11B released 2006.

      Own Id: OTP-19518 Aux Id: PR-9488, GH-9487

    • Fixed the index types of modules atomics and counters from integer() to pos_integer(), which is more correct.

      Own Id: OTP-19532 Aux Id: PR-9538

    • Fix erl flags +Q, +P and +t to not allow values greater than 4294975487. Before this fix, the runtime would either truncate the value or crash depending on which value was given.

      Own Id: OTP-19594 Aux Id: PR-9671, GH-9668

    • The socket option names for built-in socket options in the module socket has been cleaned up.

      Now, for known socket options, it is only the canonical protocol names that are allowed such as ip for the socket option {ip,recvtos}. Previously, due to being a protocol alias; {'IP',recvtos} was also allowed, as was the incorrect {hopopt,recvtos} because the protocol hopopt on Linux has the same protocol number as ip.

      So, to reduce confusion, all enumerated protocol names with the same number, are not allowed for the known protocol options, only the canonical name.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19615 Aux Id: PR-9718

    • On windows, socket:sendv could incorrectly return {ok, integer()} on Windows.

      Own Id: OTP-19617 Aux Id: OTP-19482

    Improvements and New Features

    • Functionality making it possible for processes to enable reception of priority messages has been introduced in accordance with EEP 76.

      Own Id: OTP-19198 Aux Id: PR-9269, PR-9519, PR-9590

    • The trace:system/3 function has been added. It has a similar interface as erlang:system_monitor/2 but it also supports trace sessions.

      Own Id: OTP-19271 Aux Id: PR-8660

    • Added support for SIGWINCH, SIGCONT, and SIGINFO signals to os:set_signal/2 where available.

      Own Id: OTP-19278 Aux Id: PR-8887, PR-8938

    • The erl -noshell mode has been updated to have two sub modes called raw and cooked, where cooked is the old default behaviour and raw can be used to bypass the line-editing support of the native terminal. Using raw mode it is possible to read keystrokes as they happen without the user having to press Enter. Also, the raw mode does not echo the typed characters to stdout. An example of how to create a tic-tac-toe game using this mechanism is included in the documentation.

      Own Id: OTP-19314 Aux Id: PR-8962, GH-8037

    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

      -type meter() :: integer().
      --type foot() :: integer().

      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

      -nominal meter() :: integer().
      --nominal foot() :: integer().

      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

      Own Id: OTP-19364 Aux Id: PR-9079

    • Two BIFs have been added to the erlang module.

      erlang:processes_iterator/0 returns a process iterator that can be used to +

      This document describes the changes made to the ERTS application.

      Erts 16.3

      Fixed Bugs and Malfunctions

      • Fixed a documentation build warning when one or more applications failed their configure step and were skipped.

        Own Id: OTP-19914 Aux Id: ERIERL-1251,PR-10537

      • The (IPv6) flowinfo control message header was not properly supported.

        Own Id: OTP-19977

      • Fixed NetBSD thread naming, using pthread_setname_np(); used for debugging.

        Own Id: OTP-19987 Aux Id: PR-10684

      Improvements and New Features

      • The erlang:link_option/0 type is now exported.

        Own Id: OTP-19904 Aux Id: PR-10451

      • Added persistent_term:put_new/2 that will quickly do nothing if a term with the given name and value already exists, and raise a badarg exception if the term exists with a different value.

        Own Id: OTP-19908 Aux Id: GH-9681, PR-9695

      • The manifest.xml file for the Windows build now has version numbers updated to correctly report OS versions on Windows 10, 11, Server 2016, 2019, 2022.

        Own Id: OTP-19920 Aux Id: GH-10371, PR-10546

      • Improved yielding inside re:run. Regular expressions searching for one specific byte character could spin in memchr() without any yielding or reduction counting.

        Own Id: OTP-19950 Aux Id: PR-10486

      • Updated openssl from 3.6.0 to 3.6.1.

        This change does not perform any changes in the md5 vendor implementation from openssl. The change merges upstream cosmetic changes from openssl. This is necessary to automatically migrate cleanly to the next openssl version without conflicts with upstream.

        Own Id: OTP-19959 Aux Id: PR-10630

      • Updated ryu implementation used to convert floats to strings.

        Own Id: OTP-19974 Aux Id: PR-10672

      • Upgraded asmjit to v1.18

        Own Id: OTP-19979 Aux Id: PR-10675

      • Updated zlib to version 1.3.2.

        Own Id: OTP-19998 Aux Id: PR-10752

      Erts 16.2.2

      Fixed Bugs and Malfunctions

      • Fixed bug in erlang:monitor_node for rare reconnect race with multiple node monitoring from the same process.

        Own Id: OTP-19902 Aux Id: PR-10518

      • Add missing copyrights.

        Own Id: OTP-20008

      Erts 16.2.1

      Fixed Bugs and Malfunctions

      • Fail the windows build properly when nsis is not recognised.

        Own Id: OTP-19926 Aux Id: PR-10547

      • Socket accept cancel could cause fatal crash (core dump) on Windows.

        Own Id: OTP-19958

      • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

        Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

        Own Id: OTP-19962 Aux Id: PR-10616

      • A missing memory barrier when unlocking process locks could cause unexpected behavior on architectures with weak memory ordering such as for example ARM.

        Own Id: OTP-19978 Aux Id: PR-10664

      • A process could fail to wake from hibernation when a non‑message signal followed by a message signal arrived concurrently as the receiving process hibernated. If the process had a large heap, triggering a dirty GC, the wakeup could be lost.

        This bug existed since OTP 27.0.

        Own Id: OTP-19983 Aux Id: GH-10651, PR-10696

      Erts 16.2

      Fixed Bugs and Malfunctions

      • Fixed a build issue on modern compilers.

        Own Id: OTP-19789 Aux Id: PR-9983

      • When multiple processes called the same fun whose defining module was not loaded, a badfun exception could sometimes occur in one of the calling processes. This would only happen with the JIT runtime system.

        Own Id: OTP-19803 Aux Id: PR-10257

      • Fix a bug where Erlang/OTP tools could load a different boot script from CWD.

        Own Id: OTP-19819 Aux Id: PR-10317

      • Fixed a bug when more than one session traced the same BIF. Disabling tracing for a BIF in one session could incorrectly disable tracing of the BIF in other trace sessions as well.

        Own Id: OTP-19840 Aux Id: PR-10349

      • Fixed a slight performance regression in erlang:binary_to_term/1,2.

        Own Id: OTP-19859 Aux Id: PR-10383, GH-8329

      • Two socket related code warts found by PVS Studio has been fixed. One caused gen_tcp to no convert the send error econnaborted to econnreset on Windows. The other caused socket:sendfile/* to indicate the wrong error for a bad Offset.

        Own Id: OTP-19862 Aux Id: PR-10362, PR-10388

      • Fixed bug causing VM crash if an Erlang process gets killed while executing re:run with a (presumably) large subject string.

        Own Id: OTP-19888 Aux Id: GH-10432, PR-10439

      Improvements and New Features

      • Updated the vendor dependencies SHA to improve the accuracy of the source SBOM with purl pointing to the exact vendor commit that Erlang/OTP builds upon.

        Own Id: OTP-19777 Aux Id: PR-10216

      • Receive buffer allocation has been optimized for socket socket in that an underutilized buffers' content is copied to a freshly allocated binary of the right size instead of being reallocated.

        This optimization was already implemented for the socket:recv/1 functions, but now the same buffer stragegy is shared between all socket receive operations.

        Own Id: OTP-19794 Aux Id: PR-10231

      • Option(s) to create gen_tcp and socket sockets with protocol IPPROTO_MPTCP has been implemented.

        See functions gen_tcp:listen/2, gen_tcp:connect/4 and the type socket:protocol/0.

        Own Id: OTP-19814

      • erlc will now limit the number of ports and processes when starting erl in order to use less memory.

        Own Id: OTP-19852 Aux Id: PR-10364

      • Support for the socket options TCP_KEEPCNT, TCP_KEEPIDLE, and TCP_KEEPINTVL have been implemented for gen_tcp, as well as TCP_USER_TIMEOUT for both gen_tcp and socket.

        Own Id: OTP-19857 Aux Id: OTP-19814, PR-10390

      • Limit size of sctp_event_subscribe on Linux

        Own Id: OTP-19863 Aux Id: PR-10321

      • Updated MD5 implementation from OpenSSL 3.5.0 to 3.6.0

        Own Id: OTP-19870 Aux Id: PR-10405

      • Improved performance when doing socket:accept on the same socket from many processes on large multi core systems under high rate of connections. Mitigating performance regression seen since OTP 28.0.

        Own Id: OTP-19873 Aux Id: PR-10323, GH-10322

      • Updated STL version used.

        Own Id: OTP-19876

      • Updated PCRE2 to 10.47. Also picked newer fix, from upstream PCRE2, to bug that could cause benign random uninitialized data in exported regular expressions.

        Own Id: OTP-19880 Aux Id: PR-10391

      Erts 16.1.2

      Fixed Bugs and Malfunctions

      • Fixed a JIT bug that could miscompile equality tests on empty bitstrings.

        Own Id: OTP-19846 Aux Id: PR-10359

      • The documentation building code produced warnings during the build, if none of the applications were skipped. The warnings were resolved.

        Own Id: OTP-19865 Aux Id: ERIERL-1251,PR-10396

      Erts 16.1.1

      Fixed Bugs and Malfunctions

      • Fixed the erl documentation of the default timewarp mode used.

        Own Id: OTP-19790 Aux Id: PR-9970

      • The erlang:suspend_process() BIFs failed to suspend processes currently executing on dirty schedulers.

        Own Id: OTP-19799 Aux Id: PR-10241

      Erts 16.1

      Fixed Bugs and Malfunctions

      • Made sure to not set any terminal settings when they have not been changed. Doing so can trigger a SIGTTOU signal which would terminate Erlang when it should not.

        Own Id: OTP-19685 Aux Id: PR-9906

      • As an optimization, when the unicode:characters_to_binary/3 was used to convert from latin1 to utf8 or vice versa, it would return the original binary unchanged if it only contained 7-bit ASCII characters. That otpimization was broken in Erlang/OTP 27, and has now been mended.

        Own Id: OTP-19728 Aux Id: GH-10072, PR-10093

      Improvements and New Features

      • Fixed C compiler warnings generated by codechecker.

        Own Id: OTP-19671 Aux Id: PR-9832

      • Added support in module re for export and import of compiled regular expression in order to safely move them between Erlang node instances.

        Own Id: OTP-19730 Aux Id: PR-9976

      • Added new erl command line flag +Mumadtn <bool> causing MADV_DONTNEED to be passed to madvise() instead of MADV_FREE.

        Own Id: OTP-19739 Aux Id: PR-10113

      Erts 16.0.3

      Fixed Bugs and Malfunctions

      • Update PCRE2 from 10.45 to 10.46. Fixes potential buffer read overflow on regular expressions with (*scs:) and (*ACCEPT) syntax combined.

        Own Id: OTP-19755 Aux Id: CVE-2025-58050

      • Fixed bug that could cause crash in beam started with erl -emu_type debug +JPperf true with any type of tracing return from function.

        Own Id: OTP-19761 Aux Id: PR-19755

      Erts 16.0.2

      Fixed Bugs and Malfunctions

      • prim_net nif used incorrect encoding for family resulting in non-functional address selection.

        Own Id: OTP-19674

      • Fix windows uninstall command.

        Own Id: OTP-19683 Aux Id: PR-9887, GH-9992, GH-9884

      • With this change erlang will start if it receives short (ms-dos compatible) path to executable.

        Own Id: OTP-19690 Aux Id: PR-9996

      Improvements and New Features

      • The maximum amount of connections for epmd on Windows platforms has been increased from 64 to 1024.

        Own Id: OTP-19710 Aux Id: PR-10039

      Erts 16.0.1

      Fixed Bugs and Malfunctions

      • Fix Erlang to not crash when io:standard_error/0 is a terminal but io:standard_io/0 is not. This bug has existed since Erlang/OTP 28.0 and only effects Windows.

        Own Id: OTP-19650 Aux Id: GH-9872, PR-9878

      • In a debug build, the BIFs for the native debugger could cause a lock order violation diagnostic from the lock checker.

        Own Id: OTP-19665 Aux Id: PR-9926

      • When building ERTS make sure correct pcre2.h file is included even if CFLAGS contains extra include paths.

        Own Id: OTP-19675 Aux Id: PR-9892

      Erts 16.0

      Fixed Bugs and Malfunctions

      • ETS tables with more than 2 billion keys are now supported.

        Own Id: OTP-19144 Aux Id: PR-8589

      • The zlib library included in Erlang/OTP has been updated to version 1.3.1.

        Own Id: OTP-19259 Aux Id: PR-8862

      • to_erl no longer clears the screen when attaching to a run_erl session.

        Own Id: OTP-19263 Aux Id: PR-8943

      • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

        While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

        External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19285 Aux Id: PR-8913

      • Fixed a bug where erlc would crash if its path contained spaces.

        Own Id: OTP-19295 Aux Id: PR-8937

      • The -noshell mode has been updated to read data lazily from standard input. Before this fix any data would be read greedily which meant that Erlang could consume data not meant for it. It also meant that in order for shell:start_interactive/0 to work on Windows an API that did not support reading of Unicode characters had to be used.

        Own Id: OTP-19313 Aux Id: PR-8962, GH-8113

      • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

        This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

      • Fixed erlang:localtime_to_universaltime/2 with IsDST set to true and a timezone without daylight saving (for example UTC) to assume that the provided localtime does not have DST. This has always been the behaviour, but glibc versions after 2.37 changed it so that the behavior in Erlang also changed.

        Own Id: OTP-19453 Aux Id: PR-9207

      • Support for the TZ environment variable has been added on Windows. Before this change only the time zone configured in the OS was ever used.

        Own Id: OTP-19454 Aux Id: PR-9207

      • Suppressed various warnings when building the emulator with recent versions of GCC

        Own Id: OTP-19488 Aux Id: GH-9413, PR-9417

      • Fixed a bug in re:run and re:compile where the pattern parameter would be read incorrectly if it was a sub-binary.

        Own Id: OTP-19507 Aux Id: PR-9478, GH-9438

      • Fixed a broken makefile rule that made it so that O2 and -O2 could not be part of the directory path when building Erlang/OTP. Bug has been present since R11B released 2006.

        Own Id: OTP-19518 Aux Id: PR-9488, GH-9487

      • Fixed the index types of modules atomics and counters from integer() to pos_integer(), which is more correct.

        Own Id: OTP-19532 Aux Id: PR-9538

      • Fix erl flags +Q, +P and +t to not allow values greater than 4294975487. Before this fix, the runtime would either truncate the value or crash depending on which value was given.

        Own Id: OTP-19594 Aux Id: PR-9671, GH-9668

      • The socket option names for built-in socket options in the module socket has been cleaned up.

        Now, for known socket options, it is only the canonical protocol names that are allowed such as ip for the socket option {ip,recvtos}. Previously, due to being a protocol alias; {'IP',recvtos} was also allowed, as was the incorrect {hopopt,recvtos} because the protocol hopopt on Linux has the same protocol number as ip.

        So, to reduce confusion, all enumerated protocol names with the same number, are not allowed for the known protocol options, only the canonical name.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19615 Aux Id: PR-9718

      • On windows, socket:sendv could incorrectly return {ok, integer()} on Windows.

        Own Id: OTP-19617 Aux Id: OTP-19482

      Improvements and New Features

      • Functionality making it possible for processes to enable reception of priority messages has been introduced in accordance with EEP 76.

        Own Id: OTP-19198 Aux Id: PR-9269, PR-9519, PR-9590

      • The trace:system/3 function has been added. It has a similar interface as erlang:system_monitor/2 but it also supports trace sessions.

        Own Id: OTP-19271 Aux Id: PR-8660

      • Added support for SIGWINCH, SIGCONT, and SIGINFO signals to os:set_signal/2 where available.

        Own Id: OTP-19278 Aux Id: PR-8887, PR-8938

      • The erl -noshell mode has been updated to have two sub modes called raw and cooked, where cooked is the old default behaviour and raw can be used to bypass the line-editing support of the native terminal. Using raw mode it is possible to read keystrokes as they happen without the user having to press Enter. Also, the raw mode does not echo the typed characters to stdout. An example of how to create a tic-tac-toe game using this mechanism is included in the documentation.

        Own Id: OTP-19314 Aux Id: PR-8962, GH-8037

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        +-type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        +-nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • Two BIFs have been added to the erlang module.

        erlang:processes_iterator/0 returns a process iterator that can be used to iterate through the process table.

        erlang:process_next/1 takes in a process iterator and returns a 2-tuple, consisting of a process identifier and a new process iterator. When the process iterator runs out of processes in the process table, none will be returned.

        Using these BIFs to scan the processes scales better than using erlang:processes/0, at the cost of giving less consistency guarantees. Process identifiers returned from consecutive calls of erlang:process_next/1 may not be a consistent snapshot of all elements existing in the table during any of the calls. A process identifier is only guaranteed to be returned from a call to erlang:processes_next/1 if it was alive before the call to erlang:processes_iterator/0 and was still alive when erlang:processes_next/1 returned none.

        Own Id: OTP-19369 Aux Id: PR-9129

      • Improved open debug for gen_tcp_socket (connect and listen) and gen_udp_socket (open).

        Own Id: OTP-19386

      • Module re has been updated to use PCRE2, which is mostly backward compatible with PCRE.

        The most noticeable incompatibilities are

        • The default character encoding is pure ASCII and not Latin1. Unicode support is still available with options unicode and ucp.
        • Options bsr_anycrlf, bsr_unicode and {newline,_} are only set when a regex is compiled and cannot be changed at matching for precompiled regex.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19431 Aux Id: PR-9299, PR-9610

      • When booting the runtime system on a 32-bit computer with a single core, the boot code will try to minimize the peak memory use by disabling parallel loading of BEAM files.

        Own Id: OTP-19450 Aux Id: PR-9342

      • A socket option {otp,select_read} has been added that enables keeping a socket in the VM select/poll set between calls to recv functions.

        This increases throughput by reducing the number of calls to said functions.

        Own Id: OTP-19451 Aux Id: PR-9344

      • erlc will now write compiler warnings and errors to standard error, instead of standard output, in common with other language compilers.

        Own Id: OTP-19460 Aux Id: GH-9255, PR-9363

      • Fixed the Windows build to always include .pdb files for all DLLs and executables to help with debugging.

        Own Id: OTP-19465 Aux Id: PR-9229

      • Improve the naming of the (internal) esock mutex(es). It is now possible to configure (as in autoconf) the use of simple names for the esock mutex(es).

        Own Id: OTP-19472 Aux Id: PR-9388

      • An optimization for appending 0 bits to a binary was removed in patch releases for OTP versions 25, 26, and 27. This optimization has been reintroduced in Erlang/OTP 28.

        Own Id: OTP-19473 Aux Id: PR-9396, PR-8697

      • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

        Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

      • When using enif_select_read (or enif_select with ERL_NIF_SELECT_READ) on systems with kernel polling enabled (that is most Unix systems), file descriptors that are always re-enabled as soon as they trigger are now part of a specialized pollset just as driver_select. This reduces the CPU usage in such scenarios as the erts does not have to re-insert the FD everytime it it triggered. As a result of this optimization socket based reading uses a lot less CPU and achieves a higher throughput.

        Own Id: OTP-19479 Aux Id: PR-9275

      • Added support for compiling Erlang/OTP for Windows on ARM64.

        Own Id: OTP-19480 Aux Id: PR-8734

      • The Windows installer no longer creates the erl.ini file, making installations redistributable.

        Own Id: OTP-19481 Aux Id: PR-9330

      • Added erlang:hibernate/0, which hibernates a process without discarding the stack.

        Own Id: OTP-19503 Aux Id: PR-9406

      • The asmjit library (used by BeamJIT) has been updated to version 029075b84bf0161a761beb63e6eda519a29020db.

        Own Id: OTP-19509 Aux Id: PR-9495

      • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

        Own Id: OTP-19519 Aux Id: PR-9441

      • If a process being suspended using erlang:suspend_process() currently is waiting in a receive ... after expression, the timer for the timeout will now also be suspended until the process is resumed.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19536 Aux Id: PR-8670

      • A test module for TLS distribution over socket has been implemented.

        Own Id: OTP-19539 Aux Id: PR-9511

      • Upgrade pcre2 to 10.45

        Own Id: OTP-19541 Aux Id: PR-9582

      • The +R emulator options has been removed. It has had any effect since Erlang/OTP R9.

        Own Id: OTP-19551 Aux Id: PR-9608

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      • Increase the default inet-driver buffer size(s). Also introduce kernel parameters for UDP and SCTP to change the sizes when creating (those) sockets.

        Own Id: OTP-19576

      • Add +JPperfdirectory <dir> for specifying which directory Erlang should place perf symbol information files.

        Own Id: OTP-19589 Aux Id: PR-9639, GH-9500

      • Allow multiple static nifs to be part of the same archive. See the NIF documentation for details.

        Own Id: OTP-19590 Aux Id: PR-9625

      • Various improvements reducing lock contention on run queues due to task stealing.

        Own Id: OTP-19591 Aux Id: PR-9594

      • The new implementation has the same behavior as the previous one. The newer compilers already have native support for FP16, so this implementation is only relevant for older compilers. For this reason, the new implementation has not been tested for speed.

        Own Id: OTP-19603 Aux Id: PR-9735

      • An experimental API for a native debugger has been added. The main components are the following:

        • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

        • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

        • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

        • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

        Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

      • Update internal ryu implementation to use latest version. The new version is a little bit faster in some scenarios. ryu is used by float_to_list/1 and similar functions to convert floats to strings.

        Own Id: OTP-19613 Aux Id: PR-9733

      • Update of MD5 implementation from OpenSSL version 3.1.4 to 3.5.

        Own Id: OTP-19614 Aux Id: PR-9775

      • Small optimization in binary_to_term by not allocating an unnecessary large native stack frame.

        Own Id: OTP-19618 Aux Id: PR-9759, PR-9809

      Erts 15.2.7.6

      Fixed Bugs and Malfunctions

      • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

        Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

        Own Id: OTP-19962 Aux Id: PR-10616

      • A missing memory barrier when unlocking process locks could cause unexpected behavior on architectures with weak memory ordering such as for example ARM.

        Own Id: OTP-19978 Aux Id: PR-10664

      • A process could fail to wake from hibernation when a non‑message signal followed by a message signal arrived concurrently as the receiving process hibernated. If the process had a large heap, triggering a dirty GC, the wakeup could be lost.

        This bug existed since OTP 27.0.

        Own Id: OTP-19983 Aux Id: GH-10651, PR-10696

      Erts 15.2.7.5

      Fixed Bugs and Malfunctions

      • Fixed a JIT bug that could miscompile equality tests on empty bitstrings.

        Own Id: OTP-19846 Aux Id: PR-10359

      • Fail the windows build properly when nsis is not recognised.

        Own Id: OTP-19926 Aux Id: PR-10547

      Erts 15.2.7.4

      Improvements and New Features

      Erts 15.2.7.3

      Fixed Bugs and Malfunctions

      • Fixed the erl documentation of the default timewarp mode used.

        Own Id: OTP-19790 Aux Id: PR-9970

      • The erlang:suspend_process() BIFs failed to suspend processes currently executing on dirty schedulers.

        Own Id: OTP-19799 Aux Id: PR-10241

      • When multiple processes called the same fun whose defining module was not loaded, a badfun exception could sometimes occur in one of the calling processes. This would only happen with the JIT runtime system.

        Own Id: OTP-19803 Aux Id: PR-10257

      Erts 15.2.7.2

      Fixed Bugs and Malfunctions

      • As an optimization, when the unicode:characters_to_binary/3 was used to convert from latin1 to utf8 or vice versa, it would return the original binary unchanged if it only contained 7-bit ASCII characters. That otpimization was broken in Erlang/OTP 27, and has now been mended.

        Own Id: OTP-19728 Aux Id: GH-10072, PR-10093

      Erts 15.2.7.1

      Fixed Bugs and Malfunctions

      Improvements and New Features

      • The maximum amount of connections for epmd on Windows platforms has been increased from 64 to 1024.

        Own Id: OTP-19710 Aux Id: PR-10039

      Erts 15.2.7

      Fixed Bugs and Malfunctions

      • Fixed an emulator crash when setting an error_handler module that was not yet loaded.

        Own Id: OTP-19577 Aux Id: ERIERL-1220, PR-9696

      • Fixed a rare bug that could cause an emulator crash after unloading a module or erasing a persistent_term.

        Own Id: OTP-19599 Aux Id: PR-9724

      Erts 15.2.6

      Fixed Bugs and Malfunctions

      • Fixed bug in call_memory tracing that could cause wildly incorrect reported memory values. Bug exists since OTP 27.1.

        Also fixed return type spec of trace:info/3.

        Own Id: OTP-19581 Aux Id: ERIERL-1219, PR-9706

      Erts 15.2.5

      Fixed Bugs and Malfunctions

      • On Windows, using socket:sendv, a large IOV (size > MAX), the tail was not sent.

        Own Id: OTP-19482

      • Uplift pcre 8.44 to pcre 8.45

        Own Id: OTP-19565

      Erts 15.2.4

      Fixed Bugs and Malfunctions

      Erts 15.2.3

      Fixed Bugs and Malfunctions

      • Fixed failed runtime assert in debug VM when built with statically linked NIFs.

        Own Id: OTP-19443 Aux Id: GH-9306, PR-9307

      • Fixed a bug where reading a binary from persistent_term could cause a segmentation fault on Windows. This bug was introduced in Erlang/OTP 27.0.

        Own Id: OTP-19458 Aux Id: PR-9349, GH-9222

      • Fixed a crash in erlexec (an executable used by erl during startup) when a PATH longer than 10240 was set.

        Own Id: OTP-19471 Aux Id: PR-9331

      • Fixed bug in erlang:halt. Two processes calling erlang:halt at the same time could lead to one of them crashing with badarg as if it called erlang:halt(undefined,undefined).

        Own Id: OTP-19490 Aux Id: PR-8640, GH-8634

      • Fixed BEAM crash when a custom thread sends a large map (>128 keys) externally encoded with, for example, erl_drv_send_term().

        Own Id: OTP-19495 Aux Id: GH-8208, PR-8209

      Erts 15.2.2

      Fixed Bugs and Malfunctions

      • Disabled an unsafe runtime optimization in binary construction that caused silent memory corruption.

        Own Id: OTP-19462 Aux Id: ERIERL-1177, PR-9372

      Erts 15.2.1

      Fixed Bugs and Malfunctions

      • Fixed configure tests for GCC 14

        Own Id: OTP-19407 Aux Id: GH-9211, PR-9234

      • Fix bug where log printouts would go missing when application_controller is stopping while log messages are being sent.

        This bug was introduced by OTP-19078 in Erlang/OTP 26.2.5.

        Own Id: OTP-19418 Aux Id: GH-9163, PR-9274

      Erts 15.2

      Fixed Bugs and Malfunctions

      • 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.

        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.

        Own Id: OTP-19225 Aux Id: PR-8789

      • Fixed a bug where Erlang would corrupt the terminal settings if stdin was a TTY but stdout was not.

        Own Id: OTP-19232 Aux Id: PR-8794, GH-8487

      • Fixed a bug in the non-JIT VM when loading a NIF over a function that is already traced by more than one session. This caused a VM crash. This bug has existed since OTP-27.0, where multiple trace sessions were introduced.

        Own Id: OTP-19248 Aux Id: PR-8856

      • Fixed a bug where the loading of modules with extremely large binary construction instructions crashed the emulator on AArch64.

        Own Id: OTP-19261 Aux Id: GH-8815, PR-8816

      • inet:getifaddrs/0,1 is improved when using -inet_backend = socket.

        Own Id: OTP-19264

      • win32reg:value/2 will no longer crash the emulator when the value is an unterminated REG_SZ of size 0.

        Own Id: OTP-19283 Aux Id: GH-8903, PR-8912

      • Makefile dependency generation on Windows in WSL 2 has been corrected.

        Own Id: OTP-19300 Aux Id: PR-8955

      • Fix lock order violation if a NIF monitor down callback calls enif_whereis_pid. Would cause debug emulator to crash but could potentially lead to deadlocks in optimized emulator.

        Own Id: OTP-19330 Aux Id: GH-8983, PR-9008

      • Fixed compilation faults when compiling using --enable-vm-probes.

        Own Id: OTP-19333

      • Fixed erl_nif.h on Windows to compile when gcc or clang is used.

        Own Id: OTP-19341 Aux Id: PR-9016

      • Fixed a minor issue in the JIT debug information that confused tools like GDB and perf.

        Own Id: OTP-19362 Aux Id: PR-9003

      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

      Erts 15.1.3

      Fixed Bugs and Malfunctions

      • gen_udp:send on domain local can leak inet_reply messages.

        Own Id: OTP-19332 Aux Id: #href_anchor"erts-15-1-2" class="section-heading">Erts 15.1.2

        Fixed Bugs and Malfunctions

        • 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.

          This happened with low probability when the OS signaled that the socket was ready for reading in combination with an internal time-out retry.

          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.

          Own Id: OTP-19235 Aux Id: ERIERL-1133, PR-8837

        • 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.

          Own Id: OTP-19258 Aux Id: OTP-19061, ERIERL-1134

        • The call gen_tcp:send/2 could hang indefinitely despite having set the send_timeout option for the following unfortunate combination of circumstances:

          • The socket has to be in passive mode.
          • All output buffers had to be filled util the high_watermark was hit, causing the gen_tcp:send/2 operation to block.
          • While the send operation was blocked, a gen_tcp:recv/2,3 call had to be done from a different process. It had to block, waiting for data for a while before completing the operation, and the received packet had to fill at least 75% of the receive buffer.

          Under these circumstances he information that a send operation was waiting got lost, so the send operation that blocked in the first placed would never return. The data it had would be sent, though, and send operations from other processes, still work.

          This bug has been fixed.

          Own Id: OTP-19267 Aux Id: GH-6455, OTP-18520, ERIERL-1138, PR-8892

        • In rare circumstances, in code that matches multiple tuples, the JIT could generate code that would raise a badmatch exception even if the given tuples were correct.

          Own Id: OTP-19268 Aux Id: GH-8875, PR-8895

        • Fixed beam crash that could happen if resetting call_time or call_memory trace counters of a function while it is called. Bug exists since OTP R16.

          Own Id: OTP-19269 Aux Id: GH-8835, PR-8897

        Erts 15.1.1

        Fixed Bugs and Malfunctions

        Erts 15.1

        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:

          {&#href_anchor"p">,
          -  '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

        Improvements and New Features

        • Added functions getservbyname and getservbyport to the net module.

          Own Id: OTP-19101 Aux Id: OTP-18835

        • Introduced enet | esock variants of inet functions, either when called with sockets, -with explicit inet_backend config or with the e inet_backend kernel config option.

          Own Id: OTP-19132 Aux Id: OTP-19101

        • Optimize process and port creation when such tracing is not enabled by any trace session.

          Own Id: OTP-19167 Aux Id: PR-8655

        • Compiler warnings for some removed functions have been corrected to point out the correct replacement functions.

          Own Id: OTP-19186 Aux Id: PR-8709

        • 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.

          Own Id: OTP-19199 Aux Id: OTP-19175, GH-8561, GH-8690, GH-8785

        • The zip module has been updated with support for:

          • zip64 archives - Archives larger than 4GB or with more than 2^32 entries.
          • extended timestamps - Higher resolution and in UTC.
          • UID/GID - Save and extract the original UID/GID.
          • Fixes so that permission mode attributes are correctly read and set for files in archives.
          • zip:list_dir/2 now also returns directories, not only files. (You can disable this behaviour by using the option skip_directories).

          Various bugs in the original implementation have also been fixed, such as:

          • Correctly encode and decode the DOS timestamps for entries within an archive (that is the non-extended timestamp).
          • Fix DOS timestamps to be set to localtime instead of UTC (use extended timestamps for UTC timestamps).
          • Use the unix file attributes read from disk when creating archives instead of setting everything to 644.

          Own Id: OTP-19214 Aux Id: PR-8765

        Erts 15.0.1

        Fixed Bugs and Malfunctions

        • In rare circumstances the JIT could do an unsafe in-place update of a tuple.

          Own Id: OTP-19108 Aux Id: PR-8539

        • When a port command crashed in the inet driver during gen_tcp:send/2, a monitor 'DOWN' message could be left lingering in the caller's mailbox. This has now been fixed.

          Own Id: OTP-19121 Aux Id: GH-8484

        • 'DOWN' messages originating from a monitored port, contained the atom process instead of the atom port as the third element when the exit reason was not an immediate term.

          Own Id: OTP-19123 Aux Id: GH-8484, PR-8546

        • Fix so that the options to enable Transparent Huge Page alignment of the Erlang VM executable are only applied to the Erlang VM and not other native programs such as erlc and dialyzer. This bug was introduced in Erlang/OTP 27.0.

          Own Id: OTP-19137 Aux Id: GH-8574

        • When no time warp mode was enabled, a smaller Erlang monotonic time could be read than a previously read time, i.e., breaking the monotonic property. The runtime system will abort when detecting an issue like this since OTP 24.3.4.17 and OTP 25.0.

          Up until OTP 25 no time warp mode is the default. As of OTP 26 multi time warp mode is the default.

          Own Id: OTP-19147 Aux Id: ERIERL-1043, ERIERL-1106, PR-8619

        • When calling trace:function(Session, _, true, [meta]) the meta tracer was incorrectly set to be the calling process. Now it's set to the session tracer as expected.

          Own Id: OTP-19151 Aux Id: PR-8616, GH-8614

        Erts 15.0

        Fixed Bugs and Malfunctions

        • Bugs in how erl -extra interacts with passing flags via ERL_*FLAGS or -args_file have been fixed.

          Own Id: OTP-18766 Aux Id: PR-7639

        • Fixed a bug that prevented the emulator from building on recent versions of Yocto Linux.

          Own Id: OTP-18918 Aux Id: PR-7952

        • Fixed spectre mitigation configure test to work with GCC patches to always add -fcf-protection=full.

          Own Id: OTP-18928 Aux Id: PR-8006

        • A call to socket:[recv|recvfrom|recvmsg]/* with Timeout = 0 on Windows could cause a (case clause) crash if data is immediately available.

          Own Id: OTP-19063 Aux Id: OTP-18835

        • Fix bug on Windows where exit_status would not be sent when a port exits after the stdin/stdout handles have been closed.

          Own Id: OTP-19077 Aux Id: PR-8324

        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}).
          +inet_backend = socket.

          Own Id: OTP-19264

        • win32reg:value/2 will no longer crash the emulator when the value is an unterminated REG_SZ of size 0.

          Own Id: OTP-19283 Aux Id: GH-8903, PR-8912

        • Makefile dependency generation on Windows in WSL 2 has been corrected.

          Own Id: OTP-19300 Aux Id: PR-8955

        • Fix lock order violation if a NIF monitor down callback calls enif_whereis_pid. Would cause debug emulator to crash but could potentially lead to deadlocks in optimized emulator.

          Own Id: OTP-19330 Aux Id: GH-8983, PR-9008

        • Fixed compilation faults when compiling using --enable-vm-probes.

          Own Id: OTP-19333

        • Fixed erl_nif.h on Windows to compile when gcc or clang is used.

          Own Id: OTP-19341 Aux Id: PR-9016

        • Fixed a minor issue in the JIT debug information that confused tools like GDB and perf.

          Own Id: OTP-19362 Aux Id: PR-9003

        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

        Erts 15.1.3

        Fixed Bugs and Malfunctions

        • gen_udp:send on domain local can leak inet_reply messages.

          Own Id: OTP-19332 Aux Id: #href_anchor"erts-15-1-2" class="section-heading">Erts 15.1.2

          Fixed Bugs and Malfunctions

          • 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.

            This happened with low probability when the OS signaled that the socket was ready for reading in combination with an internal time-out retry.

            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.

            Own Id: OTP-19235 Aux Id: ERIERL-1133, PR-8837

          • 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.

            Own Id: OTP-19258 Aux Id: OTP-19061, ERIERL-1134

          • The call gen_tcp:send/2 could hang indefinitely despite having set the send_timeout option for the following unfortunate combination of circumstances:

            • The socket has to be in passive mode.
            • All output buffers had to be filled util the high_watermark was hit, causing the gen_tcp:send/2 operation to block.
            • While the send operation was blocked, a gen_tcp:recv/2,3 call had to be done from a different process. It had to block, waiting for data for a while before completing the operation, and the received packet had to fill at least 75% of the receive buffer.

            Under these circumstances he information that a send operation was waiting got lost, so the send operation that blocked in the first placed would never return. The data it had would be sent, though, and send operations from other processes, still work.

            This bug has been fixed.

            Own Id: OTP-19267 Aux Id: GH-6455, OTP-18520, ERIERL-1138, PR-8892

          • In rare circumstances, in code that matches multiple tuples, the JIT could generate code that would raise a badmatch exception even if the given tuples were correct.

            Own Id: OTP-19268 Aux Id: GH-8875, PR-8895

          • Fixed beam crash that could happen if resetting call_time or call_memory trace counters of a function while it is called. Bug exists since OTP R16.

            Own Id: OTP-19269 Aux Id: GH-8835, PR-8897

          Erts 15.1.1

          Fixed Bugs and Malfunctions

          Erts 15.1

          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:

            {&#href_anchor"p">,
            +  '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

          Improvements and New Features

          • Added functions getservbyname and getservbyport to the net module.

            Own Id: OTP-19101 Aux Id: OTP-18835

          • Introduced enet | esock variants of inet functions, either when called with sockets, +with explicit inet_backend config or with the e inet_backend kernel config option.

            Own Id: OTP-19132 Aux Id: OTP-19101

          • Optimize process and port creation when such tracing is not enabled by any trace session.

            Own Id: OTP-19167 Aux Id: PR-8655

          • Compiler warnings for some removed functions have been corrected to point out the correct replacement functions.

            Own Id: OTP-19186 Aux Id: PR-8709

          • 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.

            Own Id: OTP-19199 Aux Id: OTP-19175, GH-8561, GH-8690, GH-8785

          • The zip module has been updated with support for:

            • zip64 archives - Archives larger than 4GB or with more than 2^32 entries.
            • extended timestamps - Higher resolution and in UTC.
            • UID/GID - Save and extract the original UID/GID.
            • Fixes so that permission mode attributes are correctly read and set for files in archives.
            • zip:list_dir/2 now also returns directories, not only files. (You can disable this behaviour by using the option skip_directories).

            Various bugs in the original implementation have also been fixed, such as:

            • Correctly encode and decode the DOS timestamps for entries within an archive (that is the non-extended timestamp).
            • Fix DOS timestamps to be set to localtime instead of UTC (use extended timestamps for UTC timestamps).
            • Use the unix file attributes read from disk when creating archives instead of setting everything to 644.

            Own Id: OTP-19214 Aux Id: PR-8765

          Erts 15.0.1

          Fixed Bugs and Malfunctions

          • In rare circumstances the JIT could do an unsafe in-place update of a tuple.

            Own Id: OTP-19108 Aux Id: PR-8539

          • When a port command crashed in the inet driver during gen_tcp:send/2, a monitor 'DOWN' message could be left lingering in the caller's mailbox. This has now been fixed.

            Own Id: OTP-19121 Aux Id: GH-8484

          • 'DOWN' messages originating from a monitored port, contained the atom process instead of the atom port as the third element when the exit reason was not an immediate term.

            Own Id: OTP-19123 Aux Id: GH-8484, PR-8546

          • Fix so that the options to enable Transparent Huge Page alignment of the Erlang VM executable are only applied to the Erlang VM and not other native programs such as erlc and dialyzer. This bug was introduced in Erlang/OTP 27.0.

            Own Id: OTP-19137 Aux Id: GH-8574

          • When no time warp mode was enabled, a smaller Erlang monotonic time could be read than a previously read time, i.e., breaking the monotonic property. The runtime system will abort when detecting an issue like this since OTP 24.3.4.17 and OTP 25.0.

            Up until OTP 25 no time warp mode is the default. As of OTP 26 multi time warp mode is the default.

            Own Id: OTP-19147 Aux Id: ERIERL-1043, ERIERL-1106, PR-8619

          • When calling trace:function(Session, _, true, [meta]) the meta tracer was incorrectly set to be the calling process. Now it's set to the session tracer as expected.

            Own Id: OTP-19151 Aux Id: PR-8616, GH-8614

          Erts 15.0

          Fixed Bugs and Malfunctions

          • Bugs in how erl -extra interacts with passing flags via ERL_*FLAGS or -args_file have been fixed.

            Own Id: OTP-18766 Aux Id: PR-7639

          • Fixed a bug that prevented the emulator from building on recent versions of Yocto Linux.

            Own Id: OTP-18918 Aux Id: PR-7952

          • Fixed spectre mitigation configure test to work with GCC patches to always add -fcf-protection=full.

            Own Id: OTP-18928 Aux Id: PR-8006

          • A call to socket:[recv|recvfrom|recvmsg]/* with Timeout = 0 on Windows could cause a (case clause) crash if data is immediately available.

            Own Id: OTP-19063 Aux Id: OTP-18835

          • Fix bug on Windows where exit_status would not be sent when a port exits after the stdin/stdout handles have been closed.

            Own Id: OTP-19077 Aux Id: PR-8324

          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}).
             
            -update(#href_anchor"ss">rec{a=needs_update,b=N}=R0) ->
            -    R = R0#rec{a=up_to_date},
            +update(#href_anchor"ss">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, @@ -1513,9 +1513,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 @@ -5884,12 +5884,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:
            @@ -6165,7 +6165,7 @@
                       Erlang programming language
             
                   

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/persistent_term.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/persistent_term.html 2026-04-20 17:48:27.865603042 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/persistent_term.html 2026-04-20 17:48:27.861603016 +0000 @@ -147,9 +147,9 @@ collected into a larger term, for example, a map or a tuple.

            Example

            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).
    @@ -604,7 +604,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/portsignals.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/portsignals.html 2026-04-20 17:48:27.897603246 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/portsignals.html 2026-04-20 17:48:27.897603246 +0000 @@ -326,7 +326,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/processmanagementoptimizations.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/processmanagementoptimizations.html 2026-04-20 17:48:27.929603451 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/processmanagementoptimizations.html 2026-04-20 17:48:27.929603451 +0000 @@ -253,7 +253,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/ptables.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/ptables.html 2026-04-20 17:48:27.961603656 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/ptables.html 2026-04-20 17:48:27.957603631 +0000 @@ -383,7 +383,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/run_erl_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/run_erl_cmd.html 2026-04-20 17:48:27.993603861 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/run_erl_cmd.html 2026-04-20 17:48:27.993603861 +0000 @@ -192,7 +192,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/search.html 2026-04-20 17:48:28.025604066 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/search.html 2026-04-20 17:48:28.025604066 +0000 @@ -104,7 +104,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_cmd.html 2026-04-20 17:48:28.049604220 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_cmd.html 2026-04-20 17:48:28.049604220 +0000 @@ -141,7 +141,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_erl_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_erl_cmd.html 2026-04-20 17:48:28.081604425 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/start_erl_cmd.html 2026-04-20 17:48:28.081604425 +0000 @@ -181,7 +181,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/supercarrier.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/supercarrier.html 2026-04-20 17:48:28.109604604 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/supercarrier.html 2026-04-20 17:48:28.109604604 +0000 @@ -163,12 +163,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. @@ -244,7 +244,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/threadprogress.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/threadprogress.html 2026-04-20 17:48:28.141604809 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/threadprogress.html 2026-04-20 17:48:28.145604834 +0000 @@ -337,7 +337,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/time_correction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/time_correction.html 2026-04-20 17:48:28.181605065 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/time_correction.html 2026-04-20 17:48:28.177605039 +0000 @@ -366,9 +366,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 @@ -442,7 +442,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tracing.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tracing.html 2026-04-20 17:48:28.217605296 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tracing.html 2026-04-20 17:48:28.217605296 +0000 @@ -101,23 +101,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).

    Export tracing

    In the interpreter, breakpoints are set inside the code trampoline for +bar(N) -> + bar(N - 1).

    Export tracing

    In the interpreter, breakpoints are set inside the code trampoline for export entries, and their address vector is updated to point to them. This way, only remote calls will hit the breakpoint while local calls to the same function are left alone, but it otherwise acts the same way as @@ -277,7 +277,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tty.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tty.html 2026-04-20 17:48:28.253605526 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/tty.html 2026-04-20 17:48:28.253605526 +0000 @@ -148,7 +148,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/werl_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/werl_cmd.html 2026-04-20 17:48:28.281605705 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/werl_cmd.html 2026-04-20 17:48:28.281605705 +0000 @@ -159,7 +159,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/zlib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/zlib.html 2026-04-20 17:48:28.329606013 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.3/doc/html/zlib.html 2026-04-20 17:48:28.325605987 +0000 @@ -98,18 +98,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 F(end_of_data) ->
    -                 zlib:deflate(Z, [], finish);
    -               F(Data) ->
    -                 [zlib:deflate(Z, Data)|F(Read())]
    +Compress = fun F(end_of_data) ->
    +                 zlib:deflate(Z, [], finish);
    +               F(Data) ->
    +                 [zlib:deflate(Z, Data)|F(Read())]
                end,
    -Compressed = Compress(Read()),
    -ok = zlib:deflateEnd(Z),
    -zlib:close(Z),
    -list_to_binary(Compressed)

    In all functions errors, {'EXIT',{Reason,Backtrace}}, can be thrown, where +Compressed = Compress(Read()), +ok = zlib:deflateEnd(Z), +zlib:close(Z), +list_to_binary(Compressed)

    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 @@ -818,11 +818,11 @@ 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])
    @@ -1374,20 +1374,20 @@ {'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.
    @@ -1463,18 +1463,18 @@ 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).
    @@ -1613,7 +1613,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/404.html 2026-04-20 17:48:28.361606218 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/404.html 2026-04-20 17:48:28.361606218 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/api-reference.html 2026-04-20 17:48:28.389606397 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/api-reference.html 2026-04-20 17:48:28.389606397 +0000 @@ -118,7 +118,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1ct.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1ct.xhtml 2026-04-20 15:18:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1ct.xhtml 2042-05-23 04:37:11.000000000 +0000 @@ -378,9 +378,9 @@ mostly work for old specifications based on the 1997 standard for ASN.1, but not for most modern-style applications. Another limitation is that the test functions may not work if options that change code generations strategies such -as the options macro_name_prefix and record_name_prefix have been used.

    • test/1 iterates over all types in Module.
    • test/2 tests type Type with a random value.
    • test/3 tests type Type with Value.

    Schematically, the following occurs for each type in the module:

    {ok, Value} = asn1ct:value(Module, Type),
    -{ok, Bytes} = Module:encode(Type, Value),
    -{ok, Value} = Module:decode(Type, Bytes).

    The test functions use the *.asn1db files for all included modules. If they +as the options macro_name_prefix and record_name_prefix have been used.

    • test/1 iterates over all types in Module.
    • test/2 tests type Type with a random value.
    • test/3 tests type Type with Value.

    Schematically, the following occurs for each type in the module:

    {ok, Value} = asn1ct:value(Module, Type),
    +{ok, Bytes} = Module:encode(Type, Value),
    +{ok, Value} = Module:decode(Type, Bytes).

    The test functions use the *.asn1db files for all included modules. If they are located in a different directory than the current working directory, use the include option to add paths. This is only needed when automatically generating values. For static values using Value no options are needed.

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2026-04-20 15:18:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2042-05-23 04:37:11.000000000 +0000 @@ -29,37 +29,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}}

    Module Dependencies

    It is common that ASN.1 modules import defined types, values, and other entities +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}}

    Module Dependencies

    It is common that ASN.1 modules import defined types, values, and other entities from another ASN.1 module.

    Earlier versions of the ASN.1 compiler required that modules that were imported from had to be compiled before the module that imported. This caused problems when ASN.1 modules had circular dependencies.

    Referenced modules are now parsed when the compiler finds an entity that is @@ -100,16 +100,16 @@ module and the NIF library in asn1/priv_dir are needed at runtime.

    By calling function info/0 in a generated module, you get information about which compiler options were used.

    Special Decode Functionality for JSON Encoding Rules (JER)

    When using the JSON encoding rules, it is possible to call the decode/2 function in the following way with data that has already -been decoded by json:decode/1:

    SomeModule:decode(Type, {json_decoded, Decoded}).

    Example:

    1> asn1ct:compile("People", [jer]).
    +been decoded by json:decode/1:

    SomeModule:decode(Type, {json_decoded, Decoded}).

    Example:

    1> asn1ct:compile("People", [jer]).
     ok
    -2> Rockstar = {'Person',"Vince Eclipse",roving,50}.
    -{'Person',"Vince Eclipse",roving,50}
    -3> {ok,Bin} = 'People':encode('Person', Rockstar).
    -{ok,<<"{\"name\":\"Vince Eclipse\",\"location\":2,\"age\":50}">>}
    -4> 'People':decode('Person', Bin).
    -{ok,{'Person',"Vince Eclipse",roving,50}}
    -5> 'People':decode('Person', {json_decoded,json:decode(Bin)}).
    -{ok,{'Person',"Vince Eclipse",roving,50}}
    +2> Rockstar = {'Person',"Vince Eclipse",roving,50}.
    +{'Person',"Vince Eclipse",roving,50}
    +3> {ok,Bin} = 'People':encode('Person', Rockstar).
    +{ok,<<"{\"name\":\"Vince Eclipse\",\"location\":2,\"age\":50}">>}
    +4> 'People':decode('Person', Bin).
    +{ok,{'Person',"Vince Eclipse",roving,50}}
    +5> 'People':decode('Person', {json_decoded,json:decode(Bin)}).
    +{ok,{'Person',"Vince Eclipse",roving,50}}
     

    Errors

    Errors detected at compile-time are displayed on the screen together with line numbers indicating where in the source file the respective error was detected. If no errors are found, an Erlang ASN.1 module is created.

    The runtime encoders and decoders execute within a catch and return {ok, Data} @@ -127,30 +127,30 @@ 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

    ASN.1 Types

    This section describes the ASN.1 types including their functionality, purpose, 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),

    BOOLEAN

    Booleans in ASN.1 express values that can be either TRUE or FALSE. The +{ok,Bytes} = MyModule:encode('Operational', Val),

    BOOLEAN

    Booleans in ASN.1 express values that can be either TRUE or FALSE. The meanings assigned to TRUE and FALSE are outside the scope of this text.

    In ASN.1 it is possible to have:

    Operational ::= BOOLEAN

    Assigning a value to type Operational in Erlang is possible by using the following Erlang code:

    Myvar1 = true,

    Thus, in Erlang the atoms true and false are used to encode a boolean value.

    INTEGER

    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,
    @@ -175,7 +175,7 @@
     specified values, whereas an integer can have any value.

    BIT STRING

    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 @@ -197,7 +197,7 @@ misinterpret a BIT STRING value in this format.

    OCTET STRING

    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 @@ -212,11 +212,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 @@ -225,49 +225,49 @@ 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).
    -<<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]
    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2026-04-20 15:18:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2042-05-23 04:37:11.000000000 +0000
    @@ -39,31 +39,31 @@
     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)

    Writing an Exclusive Decode Instruction

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
    +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}}.
     
    -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 @@ -123,78 +123,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).
    -<<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).
    +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).
     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).
    -<<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,
    -                                                       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>>]},
    +        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,
    +                                                       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>>]},
                       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,
    -                                                       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>>]},
    +                                                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>>]},
                       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}}]}

    Selective Decode

    Selective decode decodes a single subtype of a constructed value. This is the + 1,255>>}}} +14> 'GUI':decode_part(ChoiceKey, ChoiceUndec). +{possibleActions,[#'Action'{number = 16, + handle = #'Button'{number = 17,on = true}}]}

    Selective Decode

    Selective decode decodes a single subtype of a constructed value. This is the fastest method to extract a subvalue. Selective decode is typically used when one want to inspect, for example, a version number to be able to decide how to handle the entire value.

    Procedure

    To perform a selective decode:

    • Step 1: Include the following instructions in the configuration file:

      • The name of the user function
      • The name of the ASN.1 specification
      • A notation that tells which part of the type to be decoded
    • Step 2: Compile with the additional option asn1config. The compiler @@ -207,23 +207,23 @@ {selective_decode,{'ModuleName',[{selected_decode_Window,TypeList}]}} do the selective decode by {ok,Result} = 'ModuleName':selected_decode_Window(EncodedBinary).

      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]+
      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text)
      --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/content.opf	2026-04-20 15:18:36.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/content.opf	2042-05-23 04:37:11.000000000 +0000
      @@ -4,10 +4,10 @@
                version="3.0">
         
           asn1 - 5.4.3
      -    urn:uuid:e0315e72-1474-4243-e6e8-8c8dcf15c8a2
      +    urn:uuid:4805d35c-cfcc-1572-dd81-6c551f4e585b
           en
       
      -    2026-04-20T15:18:36Z
      +    2042-05-23T04:37:11Z
       
         
         
      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/notes.xhtml	2026-04-20 15:18:36.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1.epub/OEBPS/notes.xhtml	2042-05-23 04:37:11.000000000 +0000
      @@ -17,7 +17,7 @@
         
       
           

      asn1 Release Notes

      -

      This document describes the changes made to the asn1 application.

      Asn1 5.4.3

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      Asn1 5.4.2

      Fixed Bugs and Malfunctions

      • Decoding a constrained BIT STRING using JER was broken.

        Own Id: OTP-19681 Aux Id: PR-9949

      • NIFs and linked-in drivers are now loadable when running in an Erlang source tree on Windows.

        Own Id: OTP-19686 Aux Id: PR-9969

      Asn1 5.4.1

      Fixed Bugs and Malfunctions

      • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

        Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

      Asn1 5.4

      Fixed Bugs and Malfunctions

      • The undec_rest option would be ignored in generated functions for exclusive decode. The option is now respected, meaning that the return value from such functions are now three-tuples instead of a two-tuples.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19290 Aux Id: PR-8798

      Improvements and New Features

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      • The ancient ASN.1 modules used in public_key has been replaced with more modern versions, but we have strived to keep the documented Erlang API for the public_key application compatible.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19612 Aux Id: PR-9774

      Asn1 5.3.4.2

      Fixed Bugs and Malfunctions

      • Decoding a constrained BIT STRING using JER was broken.

        Own Id: OTP-19681 Aux Id: PR-9949

      Asn1 5.3.4.1

      Fixed Bugs and Malfunctions

      • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

        Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

      Asn1 5.3.4

      Fixed Bugs and Malfunctions

      • Negative REAL numbers greater than -1 would be incorrectly encoded (the minus sign would be lost).

        Own Id: OTP-19567 Aux Id: ERIERL-1214, PR-9658

      Asn1 5.3.3

      Fixed Bugs and Malfunctions

      • The JER backend will now include the SIZE constraint in the type info for OCTET STRINGs, and a SIZE constraint with a range will now be included for BIT STRINGs. This does not change the actual encoding or decoding of JER, but can be useful for tools.

        Own Id: OTP-19542 Aux Id: ERIERL-1204, PR-9588

      Improvements and New Features

      • When using the JSON encoding rules, it is now possible to call the decode/2 function in the following way with data that has already been decoded by json:decode/1:

        SomeModule:decode(Type, {json_decoded, Decoded}).

        Own Id: OTP-19547 Aux Id: ERIERL-1206, PR-9611

      Asn1 5.3.2

      Fixed Bugs and Malfunctions

      • Multiple bugs in decoding of the REAL type has been eliminated. Also, the documentation for REAL has been updated to mention the special values 0, PLUS-INFINITY, and MINUS-INFINITY.

        Own Id: OTP-19504 Aux Id: GH-9096, PR-9469

      Asn1 5.3.1

      Fixed Bugs and Malfunctions

      • Fixed a cosmetic but harmless issue with the ASN.1 compiler passing on the undec_rest option to the Erlang compiler.

        Own Id: OTP-19218 Aux Id: GH-8779, PR-8781

      Asn1 5.3

      Fixed Bugs and Malfunctions

      Improvements and New Features

      • Specs have been added to all asn1ct API functions.

        Own Id: OTP-18804 Aux Id: PR-7738

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • The jer (JSON Encoding Rules) for ASN.1 now use the new json module for encoding and decoding JSON. Thus, there is no longer any need for an external JSON library.

        Own Id: OTP-19018 Aux Id: PR-8241

      Asn1 5.2.2.1

      Fixed Bugs and Malfunctions

      • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

        Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

      Asn1 5.2.2

      Fixed Bugs and Malfunctions

      • An ASN.1 module that contains named BIT STRING values would fail to compiled if both the BER and JER back-ends were enabled.

        Own Id: OTP-19039 Aux Id: GH-8291, PR-8297

      Asn1 5.2.1

      Fixed Bugs and Malfunctions

      • Fix benign warning from gcc 11 about mismatching call to free().

        Own Id: OTP-18844

      Asn1 5.2

      Fixed Bugs and Malfunctions

      • The ASN.1 compiler would ignore a constraint such as (SIZE (1..4), ...), +

        This document describes the changes made to the asn1 application.

        Asn1 5.4.3

        Improvements and New Features

        • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

          A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

          make release_docs places the documentation in the released code under the doc folder.

          make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

          The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

          Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

          Improves the source Software-Bill-of-Materials

          • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
          • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
          • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

          Own Id: OTP-19886 Aux Id: PR-10434

        Asn1 5.4.2

        Fixed Bugs and Malfunctions

        • Decoding a constrained BIT STRING using JER was broken.

          Own Id: OTP-19681 Aux Id: PR-9949

        • NIFs and linked-in drivers are now loadable when running in an Erlang source tree on Windows.

          Own Id: OTP-19686 Aux Id: PR-9969

        Asn1 5.4.1

        Fixed Bugs and Malfunctions

        • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

          Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

        Asn1 5.4

        Fixed Bugs and Malfunctions

        • The undec_rest option would be ignored in generated functions for exclusive decode. The option is now respected, meaning that the return value from such functions are now three-tuples instead of a two-tuples.

          POTENTIAL INCOMPATIBILITY

          Own Id: OTP-19290 Aux Id: PR-8798

        Improvements and New Features

        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

          Own Id: OTP-19575 Aux Id: PR-9670

        • The ancient ASN.1 modules used in public_key has been replaced with more modern versions, but we have strived to keep the documented Erlang API for the public_key application compatible.

          POTENTIAL INCOMPATIBILITY

          Own Id: OTP-19612 Aux Id: PR-9774

        Asn1 5.3.4.2

        Fixed Bugs and Malfunctions

        • Decoding a constrained BIT STRING using JER was broken.

          Own Id: OTP-19681 Aux Id: PR-9949

        Asn1 5.3.4.1

        Fixed Bugs and Malfunctions

        • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

          Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

        Asn1 5.3.4

        Fixed Bugs and Malfunctions

        • Negative REAL numbers greater than -1 would be incorrectly encoded (the minus sign would be lost).

          Own Id: OTP-19567 Aux Id: ERIERL-1214, PR-9658

        Asn1 5.3.3

        Fixed Bugs and Malfunctions

        • The JER backend will now include the SIZE constraint in the type info for OCTET STRINGs, and a SIZE constraint with a range will now be included for BIT STRINGs. This does not change the actual encoding or decoding of JER, but can be useful for tools.

          Own Id: OTP-19542 Aux Id: ERIERL-1204, PR-9588

        Improvements and New Features

        • When using the JSON encoding rules, it is now possible to call the decode/2 function in the following way with data that has already been decoded by json:decode/1:

          SomeModule:decode(Type, {json_decoded, Decoded}).

          Own Id: OTP-19547 Aux Id: ERIERL-1206, PR-9611

        Asn1 5.3.2

        Fixed Bugs and Malfunctions

        • Multiple bugs in decoding of the REAL type has been eliminated. Also, the documentation for REAL has been updated to mention the special values 0, PLUS-INFINITY, and MINUS-INFINITY.

          Own Id: OTP-19504 Aux Id: GH-9096, PR-9469

        Asn1 5.3.1

        Fixed Bugs and Malfunctions

        • Fixed a cosmetic but harmless issue with the ASN.1 compiler passing on the undec_rest option to the Erlang compiler.

          Own Id: OTP-19218 Aux Id: GH-8779, PR-8781

        Asn1 5.3

        Fixed Bugs and Malfunctions

        Improvements and New Features

        • Specs have been added to all asn1ct API functions.

          Own Id: OTP-18804 Aux Id: PR-7738

        • The documentation has been migrated to use Markdown and ExDoc.

          Own Id: OTP-18955 Aux Id: PR-8026

        • The jer (JSON Encoding Rules) for ASN.1 now use the new json module for encoding and decoding JSON. Thus, there is no longer any need for an external JSON library.

          Own Id: OTP-19018 Aux Id: PR-8241

        Asn1 5.2.2.1

        Fixed Bugs and Malfunctions

        • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

          Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

        Asn1 5.2.2

        Fixed Bugs and Malfunctions

        • An ASN.1 module that contains named BIT STRING values would fail to compiled if both the BER and JER back-ends were enabled.

          Own Id: OTP-19039 Aux Id: GH-8291, PR-8297

        Asn1 5.2.1

        Fixed Bugs and Malfunctions

        • Fix benign warning from gcc 11 about mismatching call to free().

          Own Id: OTP-18844

        Asn1 5.2

        Fixed Bugs and Malfunctions

        • The ASN.1 compiler would ignore a constraint such as (SIZE (1..4), ...), causing incorrect behavior of the encoding and decoding function for the PER and UPER backends. Corrected to handle the constraint in the same way as (SIZE (1..4, ...)).

          Own Id: OTP-18729 Aux Id: PR-7575

        Improvements and New Features

        • The JER backend has been internally refactored in a way that is compatible for /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_getting_started.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_getting_started.html 2026-04-20 17:48:28.589607680 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_getting_started.html 2026-04-20 17:48:28.585607654 +0000 @@ -101,37 +101,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}}

          Module Dependencies

          It is common that ASN.1 modules import defined types, values, and other entities +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}}

          Module Dependencies

          It is common that ASN.1 modules import defined types, values, and other entities from another ASN.1 module.

          Earlier versions of the ASN.1 compiler required that modules that were imported from had to be compiled before the module that imported. This caused problems when ASN.1 modules had circular dependencies.

          Referenced modules are now parsed when the compiler finds an entity that is @@ -172,16 +172,16 @@ module and the NIF library in asn1/priv_dir are needed at runtime.

          By calling function info/0 in a generated module, you get information about which compiler options were used.

          Special Decode Functionality for JSON Encoding Rules (JER)

          When using the JSON encoding rules, it is possible to call the decode/2 function in the following way with data that has already -been decoded by json:decode/1:

          SomeModule:decode(Type, {json_decoded, Decoded}).

          Example:

          1> asn1ct:compile("People", [jer]).
          +been decoded by json:decode/1:

          SomeModule:decode(Type, {json_decoded, Decoded}).

          Example:

          1> asn1ct:compile("People", [jer]).
           ok
          -2> Rockstar = {'Person',"Vince Eclipse",roving,50}.
          -{'Person',"Vince Eclipse",roving,50}
          -3> {ok,Bin} = 'People':encode('Person', Rockstar).
          -{ok,<<"{\"name\":\"Vince Eclipse\",\"location\":2,\"age\":50}">>}
          -4> 'People':decode('Person', Bin).
          -{ok,{'Person',"Vince Eclipse",roving,50}}
          -5> 'People':decode('Person', {json_decoded,json:decode(Bin)}).
          -{ok,{'Person',"Vince Eclipse",roving,50}}
          +2> Rockstar = {'Person',"Vince Eclipse",roving,50}.
          +{'Person',"Vince Eclipse",roving,50}
          +3> {ok,Bin} = 'People':encode('Person', Rockstar).
          +{ok,<<"{\"name\":\"Vince Eclipse\",\"location\":2,\"age\":50}">>}
          +4> 'People':decode('Person', Bin).
          +{ok,{'Person',"Vince Eclipse",roving,50}}
          +5> 'People':decode('Person', {json_decoded,json:decode(Bin)}).
          +{ok,{'Person',"Vince Eclipse",roving,50}}
           

          Errors

          Errors detected at compile-time are displayed on the screen together with line numbers indicating where in the source file the respective error was detected. If no errors are found, an Erlang ASN.1 module is created.

          The runtime encoders and decoders execute within a catch and return {ok, Data} @@ -199,30 +199,30 @@ 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

          ASN.1 Types

          This section describes the ASN.1 types including their functionality, purpose, 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(&#href_anchor"p">, Val),

          BOOLEAN

          Booleans in ASN.1 express values that can be either TRUE or FALSE. The +{ok,Bytes} = MyModule:encode(&#href_anchor"p">, Val),

          BOOLEAN

          Booleans in ASN.1 express values that can be either TRUE or FALSE. The meanings assigned to TRUE and FALSE are outside the scope of this text.

          In ASN.1 it is possible to have:

          Operational ::= BOOLEAN

          Assigning a value to type Operational in Erlang is possible by using the following Erlang code:

          Myvar1 = true,

          Thus, in Erlang the atoms true and false are used to encode a boolean value.

          INTEGER

          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,
          @@ -247,7 +247,7 @@
           specified values, whereas an integer can have any value.

          BIT STRING

          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 @@ -269,7 +269,7 @@ misinterpret a BIT STRING value in this format.

          OCTET STRING

          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 @@ -284,11 +284,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 @@ -297,49 +297,49 @@ 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).
      -<<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
      +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
      + 1081,32,1043,1085,1086,1084]
      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_introduction.html	2026-04-20 17:48:28.625607911 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_introduction.html	2026-04-20 17:48:28.625607911 +0000
      @@ -156,7 +156,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_overview.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_overview.html 2026-04-20 17:48:28.649608064 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_overview.html 2026-04-20 17:48:28.645608039 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_spec.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_spec.html 2026-04-20 17:48:28.685608295 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1_spec.html 2026-04-20 17:48:28.689608320 +0000 @@ -111,31 +111,31 @@ 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} = &#href_anchor"p">: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}}.
    +decode_part/2 as follows:

    {ok,PartMessage} = &#href_anchor"p">: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}}.
     
    -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 @@ -195,78 +195,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).
      -<<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).
      +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).
       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).
      -<<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,
      -                                                       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>>]},
      +        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,
      +                                                       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>>]},
                         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,
      -                                                       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>>]},
      +                                                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>>]},
                         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}}]}

      Selective Decode

      Selective decode decodes a single subtype of a constructed value. This is the + 1,255>>}}} +14> 'GUI':decode_part(ChoiceKey, ChoiceUndec). +{possibleActions,[#'Action'{number = 16, + handle = #'Button'{number = 17,on = true}}]}

      Selective Decode

      Selective decode decodes a single subtype of a constructed value. This is the fastest method to extract a subvalue. Selective decode is typically used when one want to inspect, for example, a version number to be able to decide how to handle the entire value.

      Procedure

      To perform a selective decode:

      • Step 1: Include the following instructions in the configuration file:

        • The name of the user function
        • The name of the ASN.1 specification
        • A notation that tells which part of the type to be decoded
      • Step 2: Compile with the additional option asn1config. The compiler @@ -279,23 +279,23 @@ {selective_decode,{'ModuleName',[{selected_decode_Window,TypeList}]}} do the selective decode by {ok,Result} = 'ModuleName':selected_decode_Window(EncodedBinary).

        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]+
        /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1ct.html differs (HTML document, UTF-8 Unicode text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1ct.html	2026-04-20 17:48:28.733608602 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/asn1ct.html	2026-04-20 17:48:28.733608602 +0000
        @@ -460,9 +460,9 @@
         mostly work for old specifications based on the 1997 standard for ASN.1, but
         not for most modern-style applications. Another limitation is that the test
         functions may not work if options that change code generations strategies such
        -as the options macro_name_prefix and record_name_prefix have been used.

        • test/1 iterates over all types in Module.
        • test/2 tests type Type with a random value.
        • test/3 tests type Type with Value.

        Schematically, the following occurs for each type in the module:

        {ok, Value} = asn1ct:value(Module, Type),
        -{ok, Bytes} = Module:encode(Type, Value),
        -{ok, Value} = Module:decode(Type, Bytes).

        The test functions use the *.asn1db files for all included modules. If they +as the options macro_name_prefix and record_name_prefix have been used.

        • test/1 iterates over all types in Module.
        • test/2 tests type Type with a random value.
        • test/3 tests type Type with Value.

        Schematically, the following occurs for each type in the module:

        {ok, Value} = asn1ct:value(Module, Type),
        +{ok, Bytes} = Module:encode(Type, Value),
        +{ok, Value} = Module:decode(Type, Bytes).

        The test functions use the *.asn1db files for all included modules. If they are located in a different directory than the current working directory, use the include option to add paths. This is only needed when automatically generating values. For static values using Value no options are needed.

        @@ -529,7 +529,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/notes.html 2026-04-20 17:48:28.769608833 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/notes.html 2026-04-20 17:48:28.773608858 +0000 @@ -89,7 +89,7 @@ -

        This document describes the changes made to the asn1 application.

        Asn1 5.4.3

        Improvements and New Features

        • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

          A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

          make release_docs places the documentation in the released code under the doc folder.

          make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

          The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

          Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

          Improves the source Software-Bill-of-Materials

          • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
          • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
          • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

          Own Id: OTP-19886 Aux Id: PR-10434

        Asn1 5.4.2

        Fixed Bugs and Malfunctions

        • Decoding a constrained BIT STRING using JER was broken.

          Own Id: OTP-19681 Aux Id: PR-9949

        • NIFs and linked-in drivers are now loadable when running in an Erlang source tree on Windows.

          Own Id: OTP-19686 Aux Id: PR-9969

        Asn1 5.4.1

        Fixed Bugs and Malfunctions

        • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

          Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

        Asn1 5.4

        Fixed Bugs and Malfunctions

        • The undec_rest option would be ignored in generated functions for exclusive decode. The option is now respected, meaning that the return value from such functions are now three-tuples instead of a two-tuples.

          POTENTIAL INCOMPATIBILITY

          Own Id: OTP-19290 Aux Id: PR-8798

        Improvements and New Features

        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

          Own Id: OTP-19575 Aux Id: PR-9670

        • The ancient ASN.1 modules used in public_key has been replaced with more modern versions, but we have strived to keep the documented Erlang API for the public_key application compatible.

          POTENTIAL INCOMPATIBILITY

          Own Id: OTP-19612 Aux Id: PR-9774

        Asn1 5.3.4.2

        Fixed Bugs and Malfunctions

        • Decoding a constrained BIT STRING using JER was broken.

          Own Id: OTP-19681 Aux Id: PR-9949

        Asn1 5.3.4.1

        Fixed Bugs and Malfunctions

        • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

          Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

        Asn1 5.3.4

        Fixed Bugs and Malfunctions

        • Negative REAL numbers greater than -1 would be incorrectly encoded (the minus sign would be lost).

          Own Id: OTP-19567 Aux Id: ERIERL-1214, PR-9658

        Asn1 5.3.3

        Fixed Bugs and Malfunctions

        • The JER backend will now include the SIZE constraint in the type info for OCTET STRINGs, and a SIZE constraint with a range will now be included for BIT STRINGs. This does not change the actual encoding or decoding of JER, but can be useful for tools.

          Own Id: OTP-19542 Aux Id: ERIERL-1204, PR-9588

        Improvements and New Features

        • When using the JSON encoding rules, it is now possible to call the decode/2 function in the following way with data that has already been decoded by json:decode/1:

          SomeModule:decode(Type, {json_decoded, Decoded}).

          Own Id: OTP-19547 Aux Id: ERIERL-1206, PR-9611

        Asn1 5.3.2

        Fixed Bugs and Malfunctions

        • Multiple bugs in decoding of the REAL type has been eliminated. Also, the documentation for REAL has been updated to mention the special values 0, PLUS-INFINITY, and MINUS-INFINITY.

          Own Id: OTP-19504 Aux Id: GH-9096, PR-9469

        Asn1 5.3.1

        Fixed Bugs and Malfunctions

        • Fixed a cosmetic but harmless issue with the ASN.1 compiler passing on the undec_rest option to the Erlang compiler.

          Own Id: OTP-19218 Aux Id: GH-8779, PR-8781

        Asn1 5.3

        Fixed Bugs and Malfunctions

        Improvements and New Features

        • Specs have been added to all asn1ct API functions.

          Own Id: OTP-18804 Aux Id: PR-7738

        • The documentation has been migrated to use Markdown and ExDoc.

          Own Id: OTP-18955 Aux Id: PR-8026

        • The jer (JSON Encoding Rules) for ASN.1 now use the new json module for encoding and decoding JSON. Thus, there is no longer any need for an external JSON library.

          Own Id: OTP-19018 Aux Id: PR-8241

        Asn1 5.2.2.1

        Fixed Bugs and Malfunctions

        • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

          Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

        Asn1 5.2.2

        Fixed Bugs and Malfunctions

        • An ASN.1 module that contains named BIT STRING values would fail to compiled if both the BER and JER back-ends were enabled.

          Own Id: OTP-19039 Aux Id: GH-8291, PR-8297

        Asn1 5.2.1

        Fixed Bugs and Malfunctions

        • Fix benign warning from gcc 11 about mismatching call to free().

          Own Id: OTP-18844

        Asn1 5.2

        Fixed Bugs and Malfunctions

        • The ASN.1 compiler would ignore a constraint such as (SIZE (1..4), ...), +

          This document describes the changes made to the asn1 application.

          Asn1 5.4.3

          Improvements and New Features

          • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

            A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

            make release_docs places the documentation in the released code under the doc folder.

            make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

            The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

            Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

            Improves the source Software-Bill-of-Materials

            • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
            • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
            • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

            Own Id: OTP-19886 Aux Id: PR-10434

          Asn1 5.4.2

          Fixed Bugs and Malfunctions

          • Decoding a constrained BIT STRING using JER was broken.

            Own Id: OTP-19681 Aux Id: PR-9949

          • NIFs and linked-in drivers are now loadable when running in an Erlang source tree on Windows.

            Own Id: OTP-19686 Aux Id: PR-9969

          Asn1 5.4.1

          Fixed Bugs and Malfunctions

          • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

            Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

          Asn1 5.4

          Fixed Bugs and Malfunctions

          • The undec_rest option would be ignored in generated functions for exclusive decode. The option is now respected, meaning that the return value from such functions are now three-tuples instead of a two-tuples.

            POTENTIAL INCOMPATIBILITY

            Own Id: OTP-19290 Aux Id: PR-8798

          Improvements and New Features

          • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

            Own Id: OTP-19575 Aux Id: PR-9670

          • The ancient ASN.1 modules used in public_key has been replaced with more modern versions, but we have strived to keep the documented Erlang API for the public_key application compatible.

            POTENTIAL INCOMPATIBILITY

            Own Id: OTP-19612 Aux Id: PR-9774

          Asn1 5.3.4.2

          Fixed Bugs and Malfunctions

          • Decoding a constrained BIT STRING using JER was broken.

            Own Id: OTP-19681 Aux Id: PR-9949

          Asn1 5.3.4.1

          Fixed Bugs and Malfunctions

          • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

            Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

          Asn1 5.3.4

          Fixed Bugs and Malfunctions

          • Negative REAL numbers greater than -1 would be incorrectly encoded (the minus sign would be lost).

            Own Id: OTP-19567 Aux Id: ERIERL-1214, PR-9658

          Asn1 5.3.3

          Fixed Bugs and Malfunctions

          • The JER backend will now include the SIZE constraint in the type info for OCTET STRINGs, and a SIZE constraint with a range will now be included for BIT STRINGs. This does not change the actual encoding or decoding of JER, but can be useful for tools.

            Own Id: OTP-19542 Aux Id: ERIERL-1204, PR-9588

          Improvements and New Features

          • When using the JSON encoding rules, it is now possible to call the decode/2 function in the following way with data that has already been decoded by json:decode/1:

            SomeModule:decode(Type, {json_decoded, Decoded}).

            Own Id: OTP-19547 Aux Id: ERIERL-1206, PR-9611

          Asn1 5.3.2

          Fixed Bugs and Malfunctions

          • Multiple bugs in decoding of the REAL type has been eliminated. Also, the documentation for REAL has been updated to mention the special values 0, PLUS-INFINITY, and MINUS-INFINITY.

            Own Id: OTP-19504 Aux Id: GH-9096, PR-9469

          Asn1 5.3.1

          Fixed Bugs and Malfunctions

          • Fixed a cosmetic but harmless issue with the ASN.1 compiler passing on the undec_rest option to the Erlang compiler.

            Own Id: OTP-19218 Aux Id: GH-8779, PR-8781

          Asn1 5.3

          Fixed Bugs and Malfunctions

          Improvements and New Features

          • Specs have been added to all asn1ct API functions.

            Own Id: OTP-18804 Aux Id: PR-7738

          • The documentation has been migrated to use Markdown and ExDoc.

            Own Id: OTP-18955 Aux Id: PR-8026

          • The jer (JSON Encoding Rules) for ASN.1 now use the new json module for encoding and decoding JSON. Thus, there is no longer any need for an external JSON library.

            Own Id: OTP-19018 Aux Id: PR-8241

          Asn1 5.2.2.1

          Fixed Bugs and Malfunctions

          • The ASN.1 compiler could generate code that would cause Dialyzer with the unmatched_returns option to emit warnings.

            Own Id: OTP-19638 Aux Id: GH-9841, PR-9846

          Asn1 5.2.2

          Fixed Bugs and Malfunctions

          • An ASN.1 module that contains named BIT STRING values would fail to compiled if both the BER and JER back-ends were enabled.

            Own Id: OTP-19039 Aux Id: GH-8291, PR-8297

          Asn1 5.2.1

          Fixed Bugs and Malfunctions

          • Fix benign warning from gcc 11 about mismatching call to free().

            Own Id: OTP-18844

          Asn1 5.2

          Fixed Bugs and Malfunctions

          • The ASN.1 compiler would ignore a constraint such as (SIZE (1..4), ...), causing incorrect behavior of the encoding and decoding function for the PER and UPER backends. Corrected to handle the constraint in the same way as (SIZE (1..4, ...)).

            Own Id: OTP-18729 Aux Id: PR-7575

          Improvements and New Features

          • The JER backend has been internally refactored in a way that is compatible for @@ -385,7 +385,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/search.html 2026-04-20 17:48:28.801609038 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.3/doc/html/search.html 2026-04-20 17:48:28.801609038 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/404.html 2026-04-20 17:48:28.825609191 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/404.html 2026-04-20 17:48:28.825609191 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/api-reference.html 2026-04-20 17:48:28.861609422 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/api-reference.html 2026-04-20 17:48:28.861609422 +0000 @@ -248,7 +248,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/basics_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/basics_chapter.html 2026-04-20 17:48:28.893609627 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/basics_chapter.html 2026-04-20 17:48:28.897609653 +0000 @@ -155,15 +155,15 @@ the reason for termination is. If you use Erlang pattern matching effectively, you can take advantage of this property. The result is concise and readable test case functions that look much more like scripts than actual programs. A simple -example:

            session(_Config) ->
            -    {started,ServerId} = my_server:start(),
            -    {clients,[]} = my_server:get_clients(ServerId),
            -    MyId = self(),
            -    connected = my_server:connect(ServerId, MyId),
            -    {clients,[MyId]} = my_server:get_clients(ServerId),
            -    disconnected = my_server:disconnect(ServerId, MyId),
            -    {clients,[]} = my_server:get_clients(ServerId),
            -    stopped = my_server:stop(ServerId).

            As a test suite runs, all information (including output to stdout) is recorded +example:

            session(_Config) ->
            +    {started,ServerId} = my_server:start(),
            +    {clients,[]} = my_server:get_clients(ServerId),
            +    MyId = self(),
            +    connected = my_server:connect(ServerId, MyId),
            +    {clients,[MyId]} = my_server:get_clients(ServerId),
            +    disconnected = my_server:disconnect(ServerId, MyId),
            +    {clients,[]} = my_server:get_clients(ServerId),
            +    stopped = my_server:stop(ServerId).

            As a test suite runs, all information (including output to stdout) is recorded in many different log files. A minimum of information is displayed in the user console (only start and stop information, plus a note for each failed test case).

            The result from each test case is recorded in a dedicated HTML log file, created @@ -238,7 +238,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -83,15 +83,15 @@ the reason for termination is. If you use Erlang pattern matching effectively, you can take advantage of this property. The result is concise and readable test case functions that look much more like scripts than actual programs. A simple -example:

            session(_Config) ->
            -    {started,ServerId} = my_server:start(),
            -    {clients,[]} = my_server:get_clients(ServerId),
            -    MyId = self(),
            -    connected = my_server:connect(ServerId, MyId),
            -    {clients,[MyId]} = my_server:get_clients(ServerId),
            -    disconnected = my_server:disconnect(ServerId, MyId),
            -    {clients,[]} = my_server:get_clients(ServerId),
            -    stopped = my_server:stop(ServerId).

            As a test suite runs, all information (including output to stdout) is recorded +example:

            session(_Config) ->
            +    {started,ServerId} = my_server:start(),
            +    {clients,[]} = my_server:get_clients(ServerId),
            +    MyId = self(),
            +    connected = my_server:connect(ServerId, MyId),
            +    {clients,[MyId]} = my_server:get_clients(ServerId),
            +    disconnected = my_server:disconnect(ServerId, MyId),
            +    {clients,[]} = my_server:get_clients(ServerId),
            +    stopped = my_server:stop(ServerId).

            As a test suite runs, all information (including output to stdout) is recorded in many different log files. A minimum of information is displayed in the user console (only start and stop information, plus a note for each failed test case).

            The result from each test case is recorded in a dedicated HTML log file, created /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -22,8 +22,8 @@ configuration files or strings that Common Test reads before the start of a test run. External configuration data makes it possible to change test properties without modifying the test suites using the data. Examples of -configuration data follows:

            • Addresses to the test plant or other instruments
            • User login information
            • Names of files needed by the test
            • Names of programs to be executed during the test
            • Any other variable needed by the test

            Syntax

            A configuration file can contain any number of elements of the type:

            {CfgVarName,Value}.

            where

            CfgVarName = atom()
            -Value = term() | [{CfgVarName,Value}]

            Requiring and Reading Configuration Data

            In a test suite, one must require that a configuration variable (CfgVarName +configuration data follows:

            • Addresses to the test plant or other instruments
            • User login information
            • Names of files needed by the test
            • Names of programs to be executed during the test
            • Any other variable needed by the test

            Syntax

            A configuration file can contain any number of elements of the type:

            {CfgVarName,Value}.

            where

            CfgVarName = atom()
            +Value = term() | [{CfgVarName,Value}]

            Requiring and Reading Configuration Data

            In a test suite, one must require that a configuration variable (CfgVarName in the previous definition) exists before attempting to read the associated value in a test case or configuration function.

            require is an assert statement, which can be part of the Test Suite Information Function or @@ -44,13 +44,13 @@ any number of alias names, but each name must be unique within the same test suite. The two main uses for alias names follows:

            • To identify connections (described later).
            • To help adapt configuration data to a test suite (or test case) and improve readability.

            To read the value of a configuration variable, use function -get_config/1,2,3.

            Example:

            suite() ->
            -    [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].
            +get_config/1,2,3.

            Example:

            suite() ->
            +    [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].
             
             ...
             
            -testcase(Config) ->
            -    Domain = ct:get_config(domain),
            +testcase(Config) ->
            +    Domain = ct:get_config(domain),
                 ...

            Using Configuration Variables Defined in Multiple Files

            If a configuration variable is defined in multiple files and you want to access all possible values, use function ct:get_config/3 and specify all in the options list. The values are then returned in a list and the order of the @@ -99,11 +99,11 @@ </ftp_host> <lm_directory>"/test/loadmodules"</lm_directory> </config>

            Once read, this file produces the same configuration variables as the following -text file:

            {ftp_host, [{ftp,"targethost"},
            -            {username,"tester"},
            -            {password,"letmein"}]}.
            +text file:

            {ftp_host, [{ftp,"targethost"},
            +            {username,"tester"},
            +            {password,"letmein"}]}.
             
            -{lm_directory, "/test/loadmodules"}.

            Implement a User-Specific Handler

            The user-specific handler can be written to handle special configuration file +{lm_directory, "/test/loadmodules"}.

            Implement a User-Specific Handler

            The user-specific handler can be written to handle special configuration file formats. The parameter can be either file names or configuration strings (the empty list is valid).

            The callback module implementing the handler is responsible for checking the correctness of configuration strings.

            To validate the configuration strings, the callback module is to have function @@ -116,130 +116,130 @@ data being reloaded during test execution. The input argument is the same as for function check_parameter/1.

            The return value is to be either of the following:

            • {ok, Config} - if the configuration variables are read successfully.
            • {error, {Error, ErrorDetails}} - if the callback module fails to proceed with the specified configuration parameters.

            Config is the proper Erlang key-value list, with possible key-value sublists -as values, like the earlier configuration file example:

            [{ftp_host, [{ftp, "targethost"}, {username, "tester"}, {password, "letmein"}]},
            - {lm_directory, "/test/loadmodules"}]

            Examples of Configuration Data Handling

            A configuration file for using the FTP client to access files on a remote host -can look as follows:

            {ftp_host, [{ftp,"targethost"},
            -            {username,"tester"},
            -            {password,"letmein"}]}.
            +as values, like the earlier configuration file example:

            [{ftp_host, [{ftp, "targethost"}, {username, "tester"}, {password, "letmein"}]},
            + {lm_directory, "/test/loadmodules"}]

            Examples of Configuration Data Handling

            A configuration file for using the FTP client to access files on a remote host +can look as follows:

            {ftp_host, [{ftp,"targethost"},
            +            {username,"tester"},
            +            {password,"letmein"}]}.
             
            -{lm_directory, "/test/loadmodules"}.

            The XML version shown earlier can also be used, but it is to be explicitly +{lm_directory, "/test/loadmodules"}.

            The XML version shown earlier can also be used, but it is to be explicitly specified that the ct_config_xml callback module is to be used by Common Test.

            The following is an example of how to assert that the configuration data is -available and can be used for an FTP session:

            init_per_testcase(ftptest, Config) ->
            -    {ok,_} = ct_ftp:open(ftp),
            +available and can be used for an FTP session:

            init_per_testcase(ftptest, Config) ->
            +    {ok,_} = ct_ftp:open(ftp),
                 Config.
             
            -end_per_testcase(ftptest, _Config) ->
            -    ct_ftp:close(ftp).
            +end_per_testcase(ftptest, _Config) ->
            +    ct_ftp:close(ftp).
             
            -ftptest() ->
            -    [{require,ftp,ftp_host},
            -     {require,lm_directory}].
            -
            -ftptest(Config) ->
            -    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
            -    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
            -    ok = ct_ftp:recv(ftp, Remote, Local),
            +ftptest() ->
            +    [{require,ftp,ftp_host},
            +     {require,lm_directory}].
            +
            +ftptest(Config) ->
            +    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
            +    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
            +    ok = ct_ftp:recv(ftp, Remote, Local),
                 ...

            The following is an example of how the functions in the previous example can be -rewritten if it is necessary to open multiple connections to the FTP server:

            init_per_testcase(ftptest, Config) ->
            -    {ok,Handle1} = ct_ftp:open(ftp_host),
            -    {ok,Handle2} = ct_ftp:open(ftp_host),
            -    [{ftp_handles,[Handle1,Handle2]} | Config].
            -
            -end_per_testcase(ftptest, Config) ->
            -    lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,
            -                  proplists:get_value(ftp_handles,Config)).
            -
            -ftptest() ->
            -    [{require,ftp_host},
            -     {require,lm_directory}].
            -
            -ftptest(Config) ->
            -    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
            -    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
            -    [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),
            -    ok = ct_ftp:recv(Handle, Remote, Local),
            +rewritten if it is necessary to open multiple connections to the FTP server:

            init_per_testcase(ftptest, Config) ->
            +    {ok,Handle1} = ct_ftp:open(ftp_host),
            +    {ok,Handle2} = ct_ftp:open(ftp_host),
            +    [{ftp_handles,[Handle1,Handle2]} | Config].
            +
            +end_per_testcase(ftptest, Config) ->
            +    lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,
            +                  proplists:get_value(ftp_handles,Config)).
            +
            +ftptest() ->
            +    [{require,ftp_host},
            +     {require,lm_directory}].
            +
            +ftptest(Config) ->
            +    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
            +    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
            +    [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),
            +    ok = ct_ftp:recv(Handle, Remote, Local),
                 ...

            Example of User-Specific Configuration Handler

            A simple configuration handling driver, asking an external server for -configuration data, can be implemented as follows:

            -module(config_driver).
            --export([read_config/1, check_parameter/1]).
            +configuration data, can be implemented as follows:

            -module(config_driver).
            +-export([read_config/1, check_parameter/1]).
             
            -read_config(ServerName)->
            -    ServerModule = list_to_atom(ServerName),
            -    ServerModule:start(),
            -    ServerModule:get_config().
            -
            -check_parameter(ServerName)->
            -    ServerModule = list_to_atom(ServerName),
            -    case code:is_loaded(ServerModule) of
            -        {file, _}->
            -            {ok, {config, ServerName}};
            +read_config(ServerName)->
            +    ServerModule = list_to_atom(ServerName),
            +    ServerModule:start(),
            +    ServerModule:get_config().
            +
            +check_parameter(ServerName)->
            +    ServerModule = list_to_atom(ServerName),
            +    case code:is_loaded(ServerModule) of
            +        {file, _}->
            +            {ok, {config, ServerName}};
                     false->
            -            case code:load_file(ServerModule) of
            -                {module, ServerModule}->
            -                    {ok, {config, ServerName}};
            -                {error, nofile}->
            -                    {error, {wrong_config, "File not found: " ++ ServerName ++ ".beam"}}
            +            case code:load_file(ServerModule) of
            +                {module, ServerModule}->
            +                    {ok, {config, ServerName}};
            +                {error, nofile}->
            +                    {error, {wrong_config, "File not found: " ++ ServerName ++ ".beam"}}
                         end
                 end.

            The configuration string for this driver can be config_server, if the config_server.erl module that follows is compiled and exists in the code path -during test execution:

            -module(config_server).
            --export([start/0, stop/0, init/1, get_config/0, loop/0]).
            +during test execution:

            -module(config_server).
            +-export([start/0, stop/0, init/1, get_config/0, loop/0]).
             
            --define(REGISTERED_NAME, ct_test_config_server).
            +-define(REGISTERED_NAME, ct_test_config_server).
             
            -start()->
            -    case whereis(?REGISTERED_NAME) of
            +start()->
            +    case whereis(?REGISTERED_NAME) of
                     undefined->
            -            spawn(?MODULE, init, [?REGISTERED_NAME]),
            -            wait();
            +            spawn(?MODULE, init, [?REGISTERED_NAME]),
            +            wait();
                     _Pid->
                     ok
                 end,
                 ?REGISTERED_NAME.
             
            -init(Name)->
            -    register(Name, self()),
            -    loop().
            +init(Name)->
            +    register(Name, self()),
            +    loop().
             
            -get_config()->
            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text)
            --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/content.opf	2026-04-20 15:18:05.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/content.opf	2042-05-23 04:36:34.000000000 +0000
            @@ -4,10 +4,10 @@
                      version="3.0">
               
                 common_test - 1.30
            -    urn:uuid:fd83be6e-c300-84ff-5881-1f9156ccb506
            +    urn:uuid:088c8f68-a513-3f05-af4b-260f5af68a5a
                 en
             
            -    2026-04-20T15:18:05Z
            +    2042-05-23T04:36:34Z
             
               
               
            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml differs (HTML document, ASCII text, with very long lines)
            --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2026-04-20 15:18:05.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2042-05-23 04:36:34.000000000 +0000
            @@ -63,44 +63,44 @@
             Running Tests and Analyzing Results).

            The Cover Specification File

            General Config

            Here follows the general configuration terms that are allowed in a cover specification file:

            %% List of Nodes on which cover will be active during test.
             %% Nodes = [atom()]
            -{nodes, Nodes}.
            +{nodes, Nodes}.
             
             %% Files with previously exported cover data to include in analysis.
             %% CoverDataFiles = [string()]
            -{import, CoverDataFiles}.
            +{import, CoverDataFiles}.
             
             %% Cover data file to export from this session.
             %% CoverDataFile = string()
            -{export, CoverDataFile}.
            +{export, CoverDataFile}.
             
             %% Cover analysis level.
             %% Level = details | overview
            -{level, Level}.
            +{level, Level}.
             
             %% Directories to include in cover.
             %% Dirs = [string()]
            -{incl_dirs, Dirs}.
            +{incl_dirs, Dirs}.
             
             %% Directories, including subdirectories, to include.
            -{incl_dirs_r, Dirs}.
            +{incl_dirs_r, Dirs}.
             
             %% Specific modules to include in cover.
             %% Mods = [atom()]
            -{incl_mods, Mods}.
            +{incl_mods, Mods}.
             
             %% Directories to exclude in cover.
            -{excl_dirs, Dirs}.
            +{excl_dirs, Dirs}.
             
             %% Directories, including subdirectories, to exclude.
            -{excl_dirs_r, Dirs}.
            +{excl_dirs_r, Dirs}.
             
             %% Specific modules to exclude in cover.
            -{excl_mods, Mods}.
            +{excl_mods, Mods}.
             
             %% Cross cover compilation
             %% Tag = atom(), an identifier for a test run
             %% Mod = [atom()], modules to compile for accumulated analysis
            -{cross,[{Tag,Mods}]}.

            The terms incl_dirs_r and excl_dirs_r tell Common Test to search the +{cross,[{Tag,Mods}]}.

            The terms incl_dirs_r and excl_dirs_r tell Common Test to search the specified directories recursively and include or exclude any module found during the search. The terms incl_dirs and excl_dirs result in a non-recursive search for modules (that is, only modules found in the specified directories are @@ -109,7 +109,7 @@ recompile the modules. It is not sufficient to specify these directories in the cover specification file for Common Test.

            OTP application Config

            When using a cover specification in the testing of an OTP application itself, there is a special incl_app directive that includes the applications modules for -the cover compilation.

            {incl_app, AppName, Cover :: overview | details}.

            Note

            If you desire to also use some other general cover configuration together with +the cover compilation.

            {incl_app, AppName, Cover :: overview | details}.

            Note

            If you desire to also use some other general cover configuration together with this option you should insert the AppName in between the option and its value creating a three tuple.

            Cross Cover Analysis

            The cross cover mechanism allows cover analysis of modules across multiple tests. It is useful if some code, for example, a library module, is used by many @@ -130,7 +130,7 @@ {cross,[{s1,[m1]}]}.

            Then m1 is cover compiled in test run s2, but not shown in the coverage log. Instead, if ct_cover:cross_cover_analyse/2 is called after both s1 and s2 test runs are completed, the accumulated result for m1 is available in the -cross cover log for test run s1.

            The call to the analyze function must be as follows:

            ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

            Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for +cross cover log for test run s1.

            The call to the analyze function must be as follows:

            ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

            Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for each test respectively.

            Notice the tags s1 and s2, which are used in the cover specification file and in the call to ct_cover:cross_cover_analyse/2. The purpose of these is only to map the modules specified in the cover specification to the log /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -467,10 +467,10 @@

            Opens an FTP connection and sends a file to the remote host.

            LocalFile and RemoteFile must be absolute paths.

            If the target host is a "special" node, the FTP address must be specified in the -configuration file as follows:

            {node,[{ftp,IpAddr}]}.

            If the target host is something else, for example, a UNIX host, the -configuration file must also include the username and password (both strings):

            {unix,[{ftp,IpAddr},
            -       {username,Username},
            -       {password,Password}]}.

            See also ct:require/2.

            +configuration file as follows:

            {node,[{ftp,IpAddr}]}.

            If the target host is something else, for example, a UNIX host, the +configuration file must also include the username and password (both strings):

            {unix,[{ftp,IpAddr},
            +       {username,Username},
            +       {password,Password}]}.

            See also ct:require/2.

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -91,12 +91,12 @@ always a combination of a result for the suite/group/test and an updated CTHState.

            To let the test suite continue on executing, return the configuration list that you want the test to use as the result.

            All pre hooks, except pre_end_per_testcase/4, can skip or fail the test by -returning a tuple with skip or fail, and a reason as the result.

            Example:

            pre_init_per_suite(SuiteName, Config, CTHState) ->
            -  case db:connect() of
            -    {error,_Reason} ->
            -      {{fail, "Could not connect to DB"}, CTHState};
            -    {ok, Handle} ->
            -      {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
            +returning a tuple with skip or fail, and a reason as the result.

            Example:

            pre_init_per_suite(SuiteName, Config, CTHState) ->
            +  case db:connect() of
            +    {error,_Reason} ->
            +      {{fail, "Could not connect to DB"}, CTHState};
            +    {ok, Handle} ->
            +      {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
               end.

            Note

            If you use multiple CTHs, the first part of the return tuple is used as input for the next CTH. So in the previous example the next CTH can get {fail,Reason} as the second parameter. If you have many CTHs interacting, do @@ -112,18 +112,18 @@ affect the outcome of the test, return the Return data as it is given to the CTH. You can also modify the test result. By returning the Config list with element tc_status removed, you can recover from a test failure. As in all the -pre hooks, it is also possible to fail/skip the test case in the post hook.

            Example:

            post_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->
            -  case db:check_consistency() of
            +pre hooks, it is also possible to fail/skip the test case in the post hook.

            Example:

            post_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->
            +  case db:check_consistency() of
                 true ->
                   %% DB is good, pass the test.
            -      {proplists:delete(tc_status, Config), CTHState};
            +      {proplists:delete(tc_status, Config), CTHState};
                 false ->
                   %% DB is not good, mark as skipped instead of failing
            -      {{skip, "DB is inconsistent!"}, CTHState}
            +      {{skip, "DB is inconsistent!"}, CTHState}
               end;
            -post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->
            +post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->
               %% Do nothing if tc does not crash.
            -  {Return, CTHState}.

            Note

            Do recover from a testcase failure using CTHs only a last resort. If used + {Return, CTHState}.

            Note

            Do recover from a testcase failure using CTHs only a last resort. If used wrongly, it can be very difficult to determine which tests that pass or fail in a test run.

            Skip and Fail Hooks

            After any post hook has been executed for all installed CTHs, on_tc_fail or @@ -162,80 +162,80 @@ %%% ct_run -suite example_SUITE -pa . -ct_hooks example_cth %%% %%% Note `-pa .`: the hook beam file must be in the code path when installing. --module(example_cth). +-module(example_cth). %% Mandatory Callbacks --export([init/2]). +-export([init/2]). %% Optional Callbacks --export([id/1]). +-export([id/1]). --export([pre_init_per_suite/3]). --export([post_end_per_suite/4]). +-export([pre_init_per_suite/3]). +-export([post_end_per_suite/4]). --export([pre_init_per_testcase/4]). --export([post_end_per_testcase/5]). +-export([pre_init_per_testcase/4]). +-export([post_end_per_testcase/5]). --export([on_tc_skip/4]). +-export([on_tc_skip/4]). --export([terminate/1]). +-export([terminate/1]). %% This hook state is threaded through all the callbacks. --record(state, {filename, total, suite_total, ts, tcs, data, skipped}). +-record(state, {filename, total, suite_total, ts, tcs, data, skipped}). %% This example hook prints its results to a file, see terminate/1. --record(test_run, {total, skipped, suites}). +-record(test_run, {total, skipped, suites}). %% Return a unique id for this CTH. %% Using the filename means the hook can be used with different %% log files to separate timing data within the same test run. %% See Installing a CTH for more information. -id(Opts) -> +id(Opts) -> %% the path is relative to the test run directory - proplists:get_value(filename, Opts, "example_cth.log"). + proplists:get_value(filename, Opts, "example_cth.log"). %% Always called before any other callback function. Use this to initiate %% any common state. -init(Id, _Opts) -> - {ok, #state{filename = Id, total = 0, data = []}}. +init(Id, _Opts) -> + {ok, #state{filename = Id, total = 0, data = []}}. %% Called before init_per_suite is called. -pre_init_per_suite(_Suite,Config,State) -> - {Config, State#state{suite_total = 0, tcs = []}}. +pre_init_per_suite(_Suite,Config,State) -> + {Config, State#state{suite_total = 0, tcs = []}}. %% Called after end_per_suite. -post_end_per_suite(Suite,_Config,Return,State) -> - Data = {suites, Suite, State#state.suite_total, - lists:reverse(State#state.tcs)}, - {Return, State#state{data = [Data | State#state.data], - total = State#state.total + State#state.suite_total}}. +post_end_per_suite(Suite,_Config,Return,State) -> + Data = {suites, Suite, State#state.suite_total, + lists:reverse(State#state.tcs)}, + {Return, State#state{data = [Data | State#state.data], + total = State#state.total + State#state.suite_total}}. %% Called before each init_per_testcase. -pre_init_per_testcase(_Suite,_TC,Config,State) -> - Now = erlang:monotonic_time(microsecond), - {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}. +pre_init_per_testcase(_Suite,_TC,Config,State) -> + Now = erlang:monotonic_time(microsecond), + {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}. %% Called after each end_per_testcase. -post_end_per_testcase(Suite,TC,_Config,Return,State) -> - Now = erlang:monotonic_time(microsecond), - TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts}, - {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}. +post_end_per_testcase(Suite,TC,_Config,Return,State) -> + Now = erlang:monotonic_time(microsecond), + TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts}, + {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}. %% Called when a test case is skipped by either user action %% or due to an init function failing. -on_tc_skip(_Suite, _TC, _Reason, State) -> - State#state{skipped = State#state.skipped + 1}. +on_tc_skip(_Suite, _TC, _Reason, State) -> + State#state{skipped = State#state.skipped + 1}. %% Called when the scope of the CTH is done. -terminate(State) -> +terminate(State) -> %% use append to avoid data loss if the path is reused - {ok, File} = file:open(State#state.filename, [write, append]), - io:format(File, "~p.~n", [results(State)]), - file:close(File), + {ok, File} = file:open(State#state.filename, [write, append]), + io:format(File, "~p.~n", [results(State)]), + file:close(File), ok. -results(State) -> - #state{skipped = Skipped, data = Data, total = Total} = State, - #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.

            Built-In CTHs

            Common Test is delivered with some general-purpose CTHs that can be enabled by +results(State) -> + #state{skipped = Skipped, data = Data, total = Total} = State, + #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.

            Built-In CTHs

            Common Test is delivered with some general-purpose CTHs that can be enabled by the user to provide generic testing functionality. Some of these CTHs are enabled by default when common_test is started to run. They can be disabled by setting enable_builtin_hooks to false on the command line or in the test /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -36,7 +36,7 @@ of test specifications. If it is a list, the specifications are handled (and the corresponding tests executed) in sequence. An element in a TestSpecs list can also be list of test specifications. The specifications in such a list are -merged into one combined specification before test execution.

            Example:

            ct_master:run(["ts1","ts2",["ts3","ts4"]])

            Here, the tests specified by "ts1" run first, then the tests specified by "ts2", +merged into one combined specification before test execution.

            Example:

            ct_master:run(["ts1","ts2",["ts3","ts4"]])

            Here, the tests specified by "ts1" run first, then the tests specified by "ts2", and finally the tests specified by both "ts3" and "ts4".

            The InclNodes argument to run/3 is a list of node names. Function run/3 runs the tests in TestSpecs just like run/1, but also takes any test in TestSpecs, which is not explicitly tagged with a particular node name, and @@ -70,32 +70,32 @@ install an event handler).

            Consider the example in section Test Specifications in section Running Tests and Analysing Results, now extended with node information and -intended to be executed by Common Test Master:

            {define, 'Top', "/home/test"}.
            -{define, 'T1', "'Top'/t1"}.
            -{define, 'T2', "'Top'/t2"}.
            -{define, 'T3', "'Top'/t3"}.
            -{define, 'CfgFile', "config.cfg"}.
            -{define, 'Node', ct_node}.
            -
            -{node, node1, 'Node@host_x'}.
            -{node, node2, 'Node@host_y'}.
            -
            -{logdir, master, "'Top'/master_logs"}.
            -{logdir, "'Top'/logs"}.
            -
            -{config, node1, "'T1'/'CfgFile'"}.
            -{config, node2, "'T2'/'CfgFile'"}.
            -{config, "'T3'/'CfgFile'"}.
            -
            -{suites, node1, 'T1', all}.
            -{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
            -{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
            -{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
            +intended to be executed by Common Test Master:

            {define, 'Top', "/home/test"}.
            +{define, 'T1', "'Top'/t1"}.
            +{define, 'T2', "'Top'/t2"}.
            +{define, 'T3', "'Top'/t3"}.
            +{define, 'CfgFile', "config.cfg"}.
            +{define, 'Node', ct_node}.
            +
            +{node, node1, 'Node@host_x'}.
            +{node, node2, 'Node@host_y'}.
            +
            +{logdir, master, "'Top'/master_logs"}.
            +{logdir, "'Top'/logs"}.
            +
            +{config, node1, "'T1'/'CfgFile'"}.
            +{config, node2, "'T2'/'CfgFile'"}.
            +{config, "'T3'/'CfgFile'"}.
            +
            +{suites, node1, 'T1', all}.
            +{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
            +{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
            +{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
             
            -{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
            -{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
            +{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
            +{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
             
            -{skip_suites, 'T3', all, "Not implemented"}.

            This example specifies the same tests as the original example. But now if +{skip_suites, 'T3', all, "Not implemented"}.

            This example specifies the same tests as the original example. But now if started with a call to ct_master:run(TestSpecName), test t1 is executed on node ct_node@host_x (node1), test t2 on ct_node@host_y (node2) and test t3 on both node1 and node2. Configuration file t1 is only read on @@ -112,13 +112,13 @@ Common Test node in question (typically ct@somehost if started with the ct_run program), is performed. Tests without explicit node association are always performed too, of course.

            Automatic Startup of Test Target Nodes

            Initial actions can be started and performed automatically on test target nodes -using test specification term init.

            Two subterms are supported, node_start and eval.

            Example:

            {node, node1, node1@host1}.
            -{node, node2, node1@host2}.
            -{node, node3, node2@host2}.
            -{node, node4, node1@host3}.
            -{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
            -{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
            -{init, node4, {eval, {module, function, []}}}.

            This test specification declares that node1@host1 is to be started using the +using test specification term init.

            Two subterms are supported, node_start and eval.

            Example:

            {node, node1, node1@host1}.
            +{node, node2, node1@host2}.
            +{node, node3, node2@host2}.
            +{node, node4, node1@host3}.
            +{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
            +{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
            +{init, node4, {eval, {module, function, []}}}.

            This test specification declares that node1@host1 is to be started using the user callback function callback_module:my_slave_callback/0, and nodes node1@host2 and node2@host2 are to be started with the default callback module ct_slave. The specified username and password are used to log on to /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_master.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -326,7 +326,7 @@

            Gets a reference to the Common Test master event manager. The reference can be -used to, for example, add a user-specific event handler while tests are running.

            Example:

            gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
            +used to, for example, add a user-specific event handler while tests are running.

            Example:

            gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -31,7 +31,7 @@ to the server.

            Alternately, open/1,2 can be used to establish a single session on a dedicated connection. (Or, equivalently, only_open/1,2 followed by hello/1-3.)

            Connect/session options can be specified in a configuration file with entries -like the following.

            {server_id(), [option()]}.

            The server_id/0 or an associated ct:target_name/0 can then be passed to +like the following.

            {server_id(), [option()]}.

            The server_id/0 or an associated ct:target_name/0 can then be passed to the aforementioned functions to use the referenced configuration.

            Signaling

            Protocol operations in the NETCONF protocol are realized as remote procedure calls (RPCs) from client to server and a corresponding reply from server to client. RPCs are sent using like-named functions (eg. @@ -44,8 +44,8 @@ in most cases since a non-response by the server or a missing message-id causes the call to hang indefinitely.

            Logging

            The NETCONF server uses error_logger for logging of NETCONF traffic. A special purpose error handler is implemented in ct_conn_log_h. To use this error -handler, add the cth_conn_log hook in the test suite, for example:

            suite() ->
            -    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

            conn_log_mod() is the name of the Common Test module implementing the +handler, add the cth_conn_log hook in the test suite, for example:

            suite() ->
            +    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

            conn_log_mod() is the name of the Common Test module implementing the connection protocol, for example, ct_netconfc.

            Hook option log_type specifies the type of logging:

            • raw - The sent and received NETCONF data is logged to a separate text file "as is" without any formatting. A link to the file is added to the test case HTML log.

            • pretty - The sent and received NETCONF data is logged to a separate text @@ -56,17 +56,17 @@ option hosts and list the names of the servers/connections to be used in the suite. The connections must be named for this to work, that is, they must be opened with open/2.

              Option hosts has no effect if log_type is set to html or silent.

              The hook options can also be specified in a configuration file with -configuration variable ct_conn_log:

              {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

              For example:

              {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
              -                            {hosts,[ct:key_or_name()]}]}]}

              Note

              Hook options specified in a configuration file overwrite the hard-coded hook +configuration variable ct_conn_log:

              {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

              For example:

              {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
              +                            {hosts,[ct:key_or_name()]}]}]}

              Note

              Hook options specified in a configuration file overwrite the hard-coded hook options in the test suite.

              Logging Example 1:

              The following ct_hooks statement causes pretty printing of NETCONF traffic to separate logs for the connections named nc_server1 and nc_server2. Any other -connections are logged to default NETCONF log.

              suite() ->
              -   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
              -                                              {hosts,[nc_server1,nc_server2]}]}
              -                               ]}]}].

              Connections must be opened as follows:

              open(nc_server1,[...]),
              -open(nc_server2,[...]).

              Logging Example 2:

              The following configuration file causes raw logging of all NETCONF traffic in to -one single text file:

              {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

              The ct_hooks statement must look as follows:

              suite() ->
              -    [{ct_hooks, [{cth_conn_log, []}]}].

              The same ct_hooks statement without the configuration file would cause HTML +connections are logged to default NETCONF log.

              suite() ->
              +   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
              +                                              {hosts,[nc_server1,nc_server2]}]}
              +                               ]}]}].

              Connections must be opened as follows:

              open(nc_server1,[...]),
              +open(nc_server2,[...]).

              Logging Example 2:

              The following configuration file causes raw logging of all NETCONF traffic in to +one single text file:

              {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

              The ct_hooks statement must look as follows:

              suite() ->
              +    [{ct_hooks, [{cth_conn_log, []}]}].

              The same ct_hooks statement without the configuration file would cause HTML logging of all NETCONF connections in to the test case HTML log.

              @@ -2051,8 +2051,8 @@

              Edits configuration data.

              By default only the running target is available, unless the server includes :candidate or :startup in its list of capabilities.

              OptParams can be used for specifying optional parameters (default-operation, test-option, or error-option) to be added to the edit-config request. The -value must be a list containing valid simple XML, for example:

              [{'default-operation', ["none"]},
              - {'error-option', ["rollback-on-error"]}]

              If OptParams is not given, the default value [] is used.

              +value must be a list containing valid simple XML, for example:

              [{'default-operation', ["none"]},
              + {'error-option', ["rollback-on-error"]}]

              If OptParams is not given, the default value [] is used.

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -21,51 +21,51 @@ property based testing tools in Common Test test suites.

            Basic knowledge of property based testing is assumed in the following. It is also assumed that at least one of the following property based testing tools is installed and available in the library path:

            What Is Supported?

            The ct_property_test module does the following:

            • Compiles the files with property tests in the subdirectory property_test
            • Tests properties in those files using the first found Property Testing Tool.
            • Saves the results - that is the printouts - in the usual Common Test Log

            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...
             
            @@ -89,13 +89,13 @@
             Testing lib.common_test.ct_property_test_SUITE: TEST COMPLETE, 1 ok, 0 failed of 1 test cases
             
             ....

            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 ***
            /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml differs (HTML document, ASCII text, with very long lines)
            --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml	2026-04-20 15:18:05.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml	2042-05-23 04:36:34.000000000 +0000
            @@ -29,30 +29,30 @@
             directory has a subdirectory property_test, where everything needed for the
             property tests are collected. The usual Erlang application directory structure
             is assumed.

            A typical Common Test test suite using ct_property_test is organized as -follows:

            -module(my_prop_test_SUITE).
            --compile(export_all).
            +follows:

            -module(my_prop_test_SUITE).
            +-compile(export_all).
             
            --include_lib("common_test/include/ct.hrl").
            +-include_lib("common_test/include/ct.hrl").
             
            -all() -> [prop_ftp_case].
            +all() -> [prop_ftp_case].
             
            -init_per_suite(Config) ->
            -    ct_property_test:init_per_suite(Config).
            +init_per_suite(Config) ->
            +    ct_property_test:init_per_suite(Config).
             
             %%%---- test case
            -prop_ftp_case(Config) ->
            -    ct_property_test:quickcheck(
            -      ftp_simple_client_server:prop_ftp(),
            +prop_ftp_case(Config) ->
            +    ct_property_test:quickcheck(
            +      ftp_simple_client_server:prop_ftp(),
                   Config
            -     ).

            and the the property test module (in this example + ).

            and the the property test module (in this example ftp_simple_client_server.erl) as almost a usual property testing module (More -examples are in the User's Guide):

            -module(ftp_simple_client_server).
            --export([prop_ftp/0...]).
            +examples are in the User's Guide):

            -module(ftp_simple_client_server).
            +-export([prop_ftp/0...]).
             
            --include_lib("common_test/include/ct_property_test.hrl").
            +-include_lib("common_test/include/ct_property_test.hrl").
             
            -prop_ftp() ->
            -    ?FORALL( ....
            +
            prop_ftp() -> + ?FORALL( ....
            @@ -754,7 +754,7 @@ 'EQC', 'PROPER' or 'TRIQ' set, depending on which tool that is first found. This could make parts of the Erlang property tests code to be included or excluded with the macro directives -ifdef(Macro). or -ifndef(Macro)..

            The file(s) in the property_test subdirectory could, or should, include the -ct_property_test include file:

            -include_lib("common_test/include/ct_property_test.hrl").

            This included file will:

            • Include the correct tool's include file
            • Set the macro 'MOD_eqc' to the correct module name for the selected tool. +ct_property_test include file:

              -include_lib("common_test/include/ct_property_test.hrl").

              This included file will:

              • Include the correct tool's include file
              • Set the macro 'MOD_eqc' to the correct module name for the selected tool. That is, the macro 'MOD_eqc' is set to either eqc, proper or triq.
              @@ -865,8 +865,8 @@

              Presents the result of stateful (statem) property testing using the aggregate function in PropEr, QuickCheck or other similar property testing tool.

              It is assumed to be called inside the property called by quickcheck/2:

              ...
              -RunResult = run_parallel_commands(?MODULE, Cmds),
              -ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
              +RunResult = run_parallel_commands(?MODULE, Cmds),
              +ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
               ...

              See the User's Guide for an example of the usage and of the default printout.

              The StatisticsSpec is a list of the tuples:

              • {Title::string(), CollectFun::fun/1}
              • {Title::string(), FrequencyFun::/0, CollectFun::fun/1}

              Each tuple will produce one table in the order of their places in the list.

              • Title will be the title of one result table

              • CollectFun is called with one argument: the Cmds. It should return a list of the values to be counted. The following pre-defined functions exist:

                • ct_property_test:cmnd_names/1 returns a list of commands (function calls) @@ -876,15 +876,15 @@ about sequential and parallel parts from Tool:parallel_commands/1,2
              • FrequencyFun/0 returns a fun/1 which is supposed to take a list of items as input, and return an iolist which will be printed as the table. Per default, the number of each item is counted and the percentage is printed for each. The -list [a,b,a,a,c] could for example return

                ["a 60%\n","b 20%\n","c 20%\n"]

                which will be printed by the print_fun. The default print_fun will print +list [a,b,a,a,c] could for example return

                ["a 60%\n","b 20%\n","c 20%\n"]

                which will be printed by the print_fun. The default print_fun will print it as:

                a 60%
                 b 20%
                -c 20%

              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}]
              +c 20%

          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}]
          /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -113,10 +113,10 @@ [-ct_hooks_order test | config] [-exit_status ignore_config]

        Refresh HTML Index Files

         ct_run -refresh_logs [-logdir LogDir] [-basic_html]
           [-keep_logs all | NLogs]

        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]

        Start a Common Test Master Node

         ct_run -ctmaster

        See Also

        For information about the start flags, see section + [-config ConfigFile1 ConfigFile2 ... ConfigFileN] + [-userconfig CallbackModule1 ConfigString1 and CallbackModule2 + ConfigString2 and .. and CallbackModuleN ConfigStringN] + [-decrypt_key Key] | [-decrypt_file KeyFile]

        Start a Common Test Master Node

         ct_run -ctmaster

        See Also

        For information about the start flags, see section Running Tests and Analyzing Results in the User's Guide.

        /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -44,15 +44,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 /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -27,14 +27,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.

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -30,14 +30,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 = timeout(), 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 = timeout(), 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.

    Logging

    The default logging behavior of ct_telnet is to print information about performed operations, commands, and their corresponding results to the test case @@ -46,8 +46,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 @@ -64,15 +64,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, []}]}].

    See Also

    unix_telnet

    +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, []}]}].

    See Also

    unix_telnet

    @@ -759,9 +759,9 @@ 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.

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/ct.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -1862,17 +1862,17 @@

    Reads configuration data values.

    Returns the matching values or configuration elements, given a configuration variable key or its associated name (if one has been specified with -ct:require/2 or a require statement).

    Example:

    Given the following configuration file:

    {unix,[{telnet,IpAddr},
    -       {user,[{username,Username},
    -              {password,Password}]}]}.

    Then:

    ct:get_config(unix,Default) -> [{telnet,IpAddr},
    - {user, [{username,Username}, {password,Password}]}]
    -ct:get_config({unix,telnet},Default) -> IpAddr
    -ct:get_config({unix,user,username},Default) -> Username
    -ct:get_config({unix,ftp},Default) -> Default
    -ct:get_config(unknownkey,Default) -> Default

    If a configuration variable key has been associated with a name (by +ct:require/2 or a require statement).

    Example:

    Given the following configuration file:

    {unix,[{telnet,IpAddr},
    +       {user,[{username,Username},
    +              {password,Password}]}]}.

    Then:

    ct:get_config(unix,Default) -> [{telnet,IpAddr},
    + {user, [{username,Username}, {password,Password}]}]
    +ct:get_config({unix,telnet},Default) -> IpAddr
    +ct:get_config({unix,user,username},Default) -> Username
    +ct:get_config({unix,ftp},Default) -> Default
    +ct:get_config(unknownkey,Default) -> Default

    If a configuration variable key has been associated with a name (by ct:require/2 or a require statement), the name can be used -instead of the key to read the value:

    ct:require(myuser,{unix,user}) -> ok.
    -ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

    If a configuration variable is defined in multiple files, use option all to +instead of the key to read the value:

    ct:require(myuser,{unix,user}) -> ok.
    +ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

    If a configuration variable is defined in multiple files, use option all to access all possible values. The values are returned in a list. The order of the elements corresponds to the order that the configuration files were specified at startup.

    If configuration elements (key-value tuples) are to be returned as result @@ -1910,7 +1910,7 @@

    Gets a reference to the Common Test event manager. The reference can be used -to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])
    +to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])
    @@ -2198,7 +2198,7 @@ -

    Installs configuration files and event handlers.

    Run this function once before the first test.

    Example:

    install([{config,["config_node.ctc","config_user.ctc"]}])

    This function is automatically run by program ct_run.

    +

    Installs configuration files and event handlers.

    Run this function once before the first test.

    Example:

    install([{config,["config_node.ctc","config_user.ctc"]}])

    This function is automatically run by program ct_run.

    @@ -3035,7 +3035,7 @@

    Checks if the required configuration is available. Arbitrarily deep tuples can be specified as Required. Only the last element of the tuple can be a list of -SubKeys.

    Example 1. Require the variable myvar:

    ok = ct:require(myvar).

    In this case the configuration file must at least contain:

    {myvar,Value}.

    Example 2. Require key myvar with subkeys sub1 and sub2:

    ok = ct:require({myvar,[sub1,sub2]}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,Value},{sub2,Value}]}.

    Example 3. Require key myvar with subkey sub1 with subsub1:

    ok = ct:require({myvar,sub1,sub2}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,[{sub2,Value}]}]}.

    See also ct:get_config/1, +SubKeys.

    Example 1. Require the variable myvar:

    ok = ct:require(myvar).

    In this case the configuration file must at least contain:

    {myvar,Value}.

    Example 2. Require key myvar with subkeys sub1 and sub2:

    ok = ct:require({myvar,[sub1,sub2]}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,Value},{sub2,Value}]}.

    Example 3. Require key myvar with subkey sub1 with subsub1:

    ok = ct:require({myvar,sub1,sub2}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,[{sub2,Value}]}]}.

    See also ct:get_config/1, ct:get_config/2, ct:get_config/3, ct:require/2.

    @@ -3077,8 +3077,8 @@ that the value of the element can be read with ct:get_config/1,2 provided Name is used instead of the whole Required term.

    Example:

    Require one node with a Telnet connection and an FTP connection. Name the node -a:

    ok = ct:require(a,{machine,node}).

    All references to this node can then use the node name. For example, a file over -FTP is fetched like follows:

    ok = ct:ftp_get(a,RemoteFile,LocalFile).

    For this to work, the configuration file must at least contain:

    {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

    Note

    The behavior of this function changed radically in Common Test 1.6.2. To +a:

    ok = ct:require(a,{machine,node}).

    All references to this node can then use the node name. For example, a file over +FTP is fetched like follows:

    ok = ct:ftp_get(a,RemoteFile,LocalFile).

    For this to work, the configuration file must at least contain:

    {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

    Note

    The behavior of this function changed radically in Common Test 1.6.2. To keep some backwards compatibility, it is still possible to do: ct:require(a,{node,[telnet,ftp]}). This associates the name a with the top-level node entry. For this to work, the configuration file must at least @@ -3453,12 +3453,12 @@ the Erlang shell. The interactive mode can also be started from the OS command line with ct_run -shell [-config File...].

    If any functions (for example, Telnet or FTP) using "required configuration data" are to be called from the Erlang shell, configuration data must first be -required with ct:require/2.

    Example:

    > ct:require(unix_telnet, unix).
    +required with ct:require/2.

    Example:

    > ct:require(unix_telnet, unix).
     ok
    -> ct_telnet:open(unix_telnet).
    -{ok,<0.105.0>}
    -> ct_telnet:cmd(unix_telnet, "ls .").
    -{ok,["ls","file1  ...",...]}
    +>
    ct_telnet:open(unix_telnet). +{ok,<0.105.0>} +> ct_telnet:cmd(unix_telnet, "ls ."). +{ok,["ls","file1 ...",...]}
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -47,65 +47,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.

    Saving Configuration Data

    Sometimes it is impossible, or infeasible, to implement independent test cases. Maybe it is not possible to read the SUT state. Maybe resetting the SUT is impossible and it takes too long time to restart the system. In situations where @@ -127,40 +127,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}.
    +    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 +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 @@ -174,22 +174,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 /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -48,12 +48,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 /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/example_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -17,19 +17,19 @@

    Examples and Templates

    -

    Test Suite Example

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
    +

    Test Suite Example

    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
    @@ -44,8 +44,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
    @@ -55,10 +55,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()
    @@ -68,9 +68,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.
     
     %%--------------------------------------------------------------------
    @@ -83,10 +83,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.
     
     %%--------------------------------------------------------------------
    @@ -99,10 +99,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.
     
     %%--------------------------------------------------------------------
    @@ -117,28 +117,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.

    Test Suite Templates

    The Erlang mode for the Emacs editor includes two Common Test test suite templates, one with extensive information in the function headers, and one with minimal information. A test suite template provides a quick start for @@ -150,12 +150,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 @@ -173,8 +173,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) -> @@ -190,7 +190,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. %%-------------------------------------------------------------------- @@ -201,7 +201,7 @@ %% %% Description: Cleanup after the suite. %%-------------------------------------------------------------------- -end_per_suite(_Config) -> +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- @@ -217,7 +217,7 @@ %% %% Description: Initialization before each test case group. %%-------------------------------------------------------------------- -init_per_group(_GroupName, Config) -> +init_per_group(_GroupName, Config) -> Config. %%-------------------------------------------------------------------- @@ -231,7 +231,7 @@ %% %% Description: Cleanup after each test case group. %%-------------------------------------------------------------------- -end_per_group(_GroupName, _Config) -> +end_per_group(_GroupName, _Config) -> ok. /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -43,47 +43,47 @@ 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.

    A Test Suite with Configuration Functions

    If you need to perform configuration operations to run your test, you can +mod_exists(_) -> + {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    A Test Suite with Configuration Functions

    If you need to perform configuration operations to run your test, you can implement configuration functions in your suite. The result from a configuration function is configuration data, or Config. This is a list of key-value tuples that get passed from the configuration function to the test cases (possibly 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

    Questions and Answers

    Here follows some questions that you might have after reading this section with corresponding tips and links to the answers:

    • Question: "How and where can I specify variable data for my tests that must /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -136,7 +136,7 @@ which instead is printed to tty at the end of the test run.

      Note

      To use the functions ct:break/1,2 and ct:continue/0,1, release_shell must be set to true.

      For details, see ct:run_test/1 manual page.

      Test Case Group Execution

      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 @@ -168,30 +168,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 @@ -213,12 +213,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. @@ -275,8 +275,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 @@ -326,154 +326,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}.
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2026-04-20 15:18:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2042-05-23 04:36:34.000000000 +0000
    @@ -23,14 +23,14 @@
     
           

    Callback module for ct_telnet, for connecting to a Telnet server on a UNIX -host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    -       {port,PortNum},                 % optional
    -       {username,UserName},
    -       {password,Password},
    -       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, +host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    +       {port,PortNum},                 % optional
    +       {username,UserName},
    +       {password,Password},
    +       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, use the interface functions in ct_telnet, for example, open(Name) and cmd(Name,Cmd).

    Name is the name you allocated to the Unix host in your require statement, -for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server +for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server every 10 seconds if the connection is idle) can be enabled or disabled for one particular connection as described here. It can be disabled for all connections using telnet_settings (see ct_telnet).

    The {port,PortNum} tuple is optional and if omitted, default Telnet port 23 is /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2026-04-20 15:18:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2042-05-23 04:36:34.000000000 +0000 @@ -122,29 +122,29 @@ system configuration files, the test case is skipped.

    A required variable can also be given a default value to be used if the variable is not found in any configuration file. To specify a default value, add a tuple of the form {default_config,ConfigVariableName,Value} to the -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 +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"}]}
    -    ].

    Test Suite Information Function

    Function suite/0 can, for example, be used in a test +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"}]}
    +    ].

    Test Suite Information Function

    Function suite/0 can, for example, be used in a test suite module to set a default timetrap value and to require external configuration data. If a test case, or a group information function also specifies any of the information tags, it overrides the default values set by @@ -152,14 +152,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"}
    -    ].

    Test Case Groups

    A test case group is a set of test cases sharing configuration functions and +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"}
    +    ].

    Test Case Groups

    A test case group is a set of test cases sharing configuration functions and execution properties. Test case groups are defined by function groups/0 that should return a term having the following syntax:

    groups() -> GroupDefs
    @@ -175,20 +175,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 @@ -197,33 +197,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]}].
    +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}].
    +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 +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 @@ -249,13 +249,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 @@ -310,25 +310,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 /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test_app.html 2026-04-20 17:48:29.429613059 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/common_test_app.html 2026-04-20 17:48:29.429613059 +0000 @@ -133,7 +133,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/config_file_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/config_file_chapter.html 2026-04-20 17:48:29.461613264 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/config_file_chapter.html 2026-04-20 17:48:29.465613289 +0000 @@ -94,8 +94,8 @@ configuration files or strings that Common Test reads before the start of a test run. External configuration data makes it possible to change test properties without modifying the test suites using the data. Examples of -configuration data follows:

    • Addresses to the test plant or other instruments
    • User login information
    • Names of files needed by the test
    • Names of programs to be executed during the test
    • Any other variable needed by the test

    Syntax

    A configuration file can contain any number of elements of the type:

    {CfgVarName,Value}.

    where

    CfgVarName = atom()
    -Value = term() | [{CfgVarName,Value}]

    Requiring and Reading Configuration Data

    In a test suite, one must require that a configuration variable (CfgVarName +configuration data follows:

    • Addresses to the test plant or other instruments
    • User login information
    • Names of files needed by the test
    • Names of programs to be executed during the test
    • Any other variable needed by the test

    Syntax

    A configuration file can contain any number of elements of the type:

    {CfgVarName,Value}.

    where

    CfgVarName = atom()
    +Value = term() | [{CfgVarName,Value}]

    Requiring and Reading Configuration Data

    In a test suite, one must require that a configuration variable (CfgVarName in the previous definition) exists before attempting to read the associated value in a test case or configuration function.

    require is an assert statement, which can be part of the Test Suite Information Function or @@ -116,13 +116,13 @@ any number of alias names, but each name must be unique within the same test suite. The two main uses for alias names follows:

    • To identify connections (described later).
    • To help adapt configuration data to a test suite (or test case) and improve readability.

    To read the value of a configuration variable, use function -get_config/1,2,3.

    Example:

    suite() ->
    -    [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].
    +get_config/1,2,3.

    Example:

    suite() ->
    +    [{require, domain, 'CONN_SPEC_DNS_SUFFIX'}].
     
     ...
     
    -testcase(Config) ->
    -    Domain = ct:get_config(domain),
    +testcase(Config) ->
    +    Domain = ct:get_config(domain),
         ...

    Using Configuration Variables Defined in Multiple Files

    If a configuration variable is defined in multiple files and you want to access all possible values, use function ct:get_config/3 and specify all in the options list. The values are then returned in a list and the order of the @@ -171,11 +171,11 @@ </ftp_host> <lm_directory>"/test/loadmodules"</lm_directory> </config>

    Once read, this file produces the same configuration variables as the following -text file:

    {ftp_host, [{ftp,"targethost"},
    -            {username,"tester"},
    -            {password,"letmein"}]}.
    +text file:

    {ftp_host, [{ftp,"targethost"},
    +            {username,"tester"},
    +            {password,"letmein"}]}.
     
    -{lm_directory, "/test/loadmodules"}.

    Implement a User-Specific Handler

    The user-specific handler can be written to handle special configuration file +{lm_directory, "/test/loadmodules"}.

    Implement a User-Specific Handler

    The user-specific handler can be written to handle special configuration file formats. The parameter can be either file names or configuration strings (the empty list is valid).

    The callback module implementing the handler is responsible for checking the correctness of configuration strings.

    To validate the configuration strings, the callback module is to have function @@ -188,130 +188,130 @@ data being reloaded during test execution. The input argument is the same as for function check_parameter/1.

    The return value is to be either of the following:

    • {ok, Config} - if the configuration variables are read successfully.
    • {error, {Error, ErrorDetails}} - if the callback module fails to proceed with the specified configuration parameters.

    Config is the proper Erlang key-value list, with possible key-value sublists -as values, like the earlier configuration file example:

    [{ftp_host, [{ftp, "targethost"}, {username, "tester"}, {password, "letmein"}]},
    - {lm_directory, "/test/loadmodules"}]

    Examples of Configuration Data Handling

    A configuration file for using the FTP client to access files on a remote host -can look as follows:

    {ftp_host, [{ftp,"targethost"},
    -            {username,"tester"},
    -            {password,"letmein"}]}.
    +as values, like the earlier configuration file example:

    [{ftp_host, [{ftp, "targethost"}, {username, "tester"}, {password, "letmein"}]},
    + {lm_directory, "/test/loadmodules"}]

    Examples of Configuration Data Handling

    A configuration file for using the FTP client to access files on a remote host +can look as follows:

    {ftp_host, [{ftp,"targethost"},
    +            {username,"tester"},
    +            {password,"letmein"}]}.
     
    -{lm_directory, "/test/loadmodules"}.

    The XML version shown earlier can also be used, but it is to be explicitly +{lm_directory, "/test/loadmodules"}.

    The XML version shown earlier can also be used, but it is to be explicitly specified that the ct_config_xml callback module is to be used by Common Test.

    The following is an example of how to assert that the configuration data is -available and can be used for an FTP session:

    init_per_testcase(ftptest, Config) ->
    -    {ok,_} = ct_ftp:open(ftp),
    +available and can be used for an FTP session:

    init_per_testcase(ftptest, Config) ->
    +    {ok,_} = ct_ftp:open(ftp),
         Config.
     
    -end_per_testcase(ftptest, _Config) ->
    -    ct_ftp:close(ftp).
    +end_per_testcase(ftptest, _Config) ->
    +    ct_ftp:close(ftp).
     
    -ftptest() ->
    -    [{require,ftp,ftp_host},
    -     {require,lm_directory}].
    -
    -ftptest(Config) ->
    -    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    -    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    -    ok = ct_ftp:recv(ftp, Remote, Local),
    +ftptest() ->
    +    [{require,ftp,ftp_host},
    +     {require,lm_directory}].
    +
    +ftptest(Config) ->
    +    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    +    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    +    ok = ct_ftp:recv(ftp, Remote, Local),
         ...

    The following is an example of how the functions in the previous example can be -rewritten if it is necessary to open multiple connections to the FTP server:

    init_per_testcase(ftptest, Config) ->
    -    {ok,Handle1} = ct_ftp:open(ftp_host),
    -    {ok,Handle2} = ct_ftp:open(ftp_host),
    -    [{ftp_handles,[Handle1,Handle2]} | Config].
    -
    -end_per_testcase(ftptest, Config) ->
    -    lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,
    -                  proplists:get_value(ftp_handles,Config)).
    -
    -ftptest() ->
    -    [{require,ftp_host},
    -     {require,lm_directory}].
    -
    -ftptest(Config) ->
    -    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    -    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    -    [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),
    -    ok = ct_ftp:recv(Handle, Remote, Local),
    +rewritten if it is necessary to open multiple connections to the FTP server:

    init_per_testcase(ftptest, Config) ->
    +    {ok,Handle1} = ct_ftp:open(ftp_host),
    +    {ok,Handle2} = ct_ftp:open(ftp_host),
    +    [{ftp_handles,[Handle1,Handle2]} | Config].
    +
    +end_per_testcase(ftptest, Config) ->
    +    lists:foreach(fun(Handle) -> ct_ftp:close(Handle) end,
    +                  proplists:get_value(ftp_handles,Config)).
    +
    +ftptest() ->
    +    [{require,ftp_host},
    +     {require,lm_directory}].
    +
    +ftptest(Config) ->
    +    Remote = filename:join(ct:get_config(lm_directory), "loadmodX"),
    +    Local = filename:join(proplists:get_value(priv_dir,Config), "loadmodule"),
    +    [Handle | MoreHandles] = proplists:get_value(ftp_handles,Config),
    +    ok = ct_ftp:recv(Handle, Remote, Local),
         ...

    Example of User-Specific Configuration Handler

    A simple configuration handling driver, asking an external server for -configuration data, can be implemented as follows:

    -module(config_driver).
    --export([read_config/1, check_parameter/1]).
    +configuration data, can be implemented as follows:

    -module(config_driver).
    +-export([read_config/1, check_parameter/1]).
     
    -read_config(ServerName)->
    -    ServerModule = list_to_atom(ServerName),
    -    ServerModule:start(),
    -    ServerModule:get_config().
    -
    -check_parameter(ServerName)->
    -    ServerModule = list_to_atom(ServerName),
    -    case code:is_loaded(ServerModule) of
    -        {file, _}->
    -            {ok, {config, ServerName}};
    +read_config(ServerName)->
    +    ServerModule = list_to_atom(ServerName),
    +    ServerModule:start(),
    +    ServerModule:get_config().
    +
    +check_parameter(ServerName)->
    +    ServerModule = list_to_atom(ServerName),
    +    case code:is_loaded(ServerModule) of
    +        {file, _}->
    +            {ok, {config, ServerName}};
             false->
    -            case code:load_file(ServerModule) of
    -                {module, ServerModule}->
    -                    {ok, {config, ServerName}};
    -                {error, nofile}->
    -                    {error, {wrong_config, "File not found: " ++ ServerName ++ ".beam"}}
    +            case code:load_file(ServerModule) of
    +                {module, ServerModule}->
    +                    {ok, {config, ServerName}};
    +                {error, nofile}->
    +                    {error, {wrong_config, "File not found: " ++ ServerName ++ ".beam"}}
                 end
         end.

    The configuration string for this driver can be config_server, if the config_server.erl module that follows is compiled and exists in the code path -during test execution:

    -module(config_server).
    --export([start/0, stop/0, init/1, get_config/0, loop/0]).
    +during test execution:

    -module(config_server).
    +-export([start/0, stop/0, init/1, get_config/0, loop/0]).
     
    --define(REGISTERED_NAME, ct_test_config_server).
    +-define(REGISTERED_NAME, ct_test_config_server).
     
    -start()->
    -    case whereis(?REGISTERED_NAME) of
    +start()->
    +    case whereis(?REGISTERED_NAME) of
             undefined->
    -            spawn(?MODULE, init, [?REGISTERED_NAME]),
    -            wait();
    +            spawn(?MODULE, init, [?REGISTERED_NAME]),
    +            wait();
             _Pid->
             ok
         end,
         ?REGISTERED_NAME.
     
    -init(Name)->
    -    register(Name, self()),
    -    loop().
    +init(Name)->
    +    register(Name, self()),
    +    loop().
     
    -get_config()->
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/cover_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/cover_chapter.html	2026-04-20 17:48:29.509613572 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/cover_chapter.html	2026-04-20 17:48:29.509613572 +0000
    @@ -135,44 +135,44 @@
     Running Tests and Analyzing Results).

    The Cover Specification File

    General Config

    Here follows the general configuration terms that are allowed in a cover specification file:

    %% List of Nodes on which cover will be active during test.
     %% Nodes = [atom()]
    -{nodes, Nodes}.
    +{nodes, Nodes}.
     
     %% Files with previously exported cover data to include in analysis.
     %% CoverDataFiles = [string()]
    -{import, CoverDataFiles}.
    +{import, CoverDataFiles}.
     
     %% Cover data file to export from this session.
     %% CoverDataFile = string()
    -{export, CoverDataFile}.
    +{export, CoverDataFile}.
     
     %% Cover analysis level.
     %% Level = details | overview
    -{level, Level}.
    +{level, Level}.
     
     %% Directories to include in cover.
     %% Dirs = [string()]
    -{incl_dirs, Dirs}.
    +{incl_dirs, Dirs}.
     
     %% Directories, including subdirectories, to include.
    -{incl_dirs_r, Dirs}.
    +{incl_dirs_r, Dirs}.
     
     %% Specific modules to include in cover.
     %% Mods = [atom()]
    -{incl_mods, Mods}.
    +{incl_mods, Mods}.
     
     %% Directories to exclude in cover.
    -{excl_dirs, Dirs}.
    +{excl_dirs, Dirs}.
     
     %% Directories, including subdirectories, to exclude.
    -{excl_dirs_r, Dirs}.
    +{excl_dirs_r, Dirs}.
     
     %% Specific modules to exclude in cover.
    -{excl_mods, Mods}.
    +{excl_mods, Mods}.
     
     %% Cross cover compilation
     %% Tag = atom(), an identifier for a test run
     %% Mod = [atom()], modules to compile for accumulated analysis
    -{cross,[{Tag,Mods}]}.

    The terms incl_dirs_r and excl_dirs_r tell Common Test to search the +{cross,[{Tag,Mods}]}.

    The terms incl_dirs_r and excl_dirs_r tell Common Test to search the specified directories recursively and include or exclude any module found during the search. The terms incl_dirs and excl_dirs result in a non-recursive search for modules (that is, only modules found in the specified directories are @@ -181,7 +181,7 @@ recompile the modules. It is not sufficient to specify these directories in the cover specification file for Common Test.

    OTP application Config

    When using a cover specification in the testing of an OTP application itself, there is a special incl_app directive that includes the applications modules for -the cover compilation.

    {incl_app, AppName, Cover :: overview | details}.

    Note

    If you desire to also use some other general cover configuration together with +the cover compilation.

    {incl_app, AppName, Cover :: overview | details}.

    Note

    If you desire to also use some other general cover configuration together with this option you should insert the AppName in between the option and its value creating a three tuple.

    Cross Cover Analysis

    The cross cover mechanism allows cover analysis of modules across multiple tests. It is useful if some code, for example, a library module, is used by many @@ -202,7 +202,7 @@ {cross,[{s1,[m1]}]}.

    Then m1 is cover compiled in test run s2, but not shown in the coverage log. Instead, if ct_cover:cross_cover_analyse/2 is called after both s1 and s2 test runs are completed, the accumulated result for m1 is available in the -cross cover log for test run s1.

    The call to the analyze function must be as follows:

    ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

    Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for +cross cover log for test run s1.

    The call to the analyze function must be as follows:

    ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

    Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for each test respectively.

    Notice the tags s1 and s2, which are used in the cover specification file and in the call to ct_cover:cross_cover_analyse/2. The purpose of these is only to map the modules specified in the cover specification to the log @@ -270,7 +270,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct.html 2026-04-20 17:48:29.561613904 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct.html 2026-04-20 17:48:29.565613930 +0000 @@ -1949,17 +1949,17 @@

    Reads configuration data values.

    Returns the matching values or configuration elements, given a configuration variable key or its associated name (if one has been specified with -ct:require/2 or a require statement).

    Example:

    Given the following configuration file:

    {unix,[{telnet,IpAddr},
    -       {user,[{username,Username},
    -              {password,Password}]}]}.

    Then:

    ct:get_config(unix,Default) -> [{telnet,IpAddr},
    - {user, [{username,Username}, {password,Password}]}]
    -ct:get_config({unix,telnet},Default) -> IpAddr
    -ct:get_config({unix,user,username},Default) -> Username
    -ct:get_config({unix,ftp},Default) -> Default
    -ct:get_config(unknownkey,Default) -> Default

    If a configuration variable key has been associated with a name (by +ct:require/2 or a require statement).

    Example:

    Given the following configuration file:

    {unix,[{telnet,IpAddr},
    +       {user,[{username,Username},
    +              {password,Password}]}]}.

    Then:

    ct:get_config(unix,Default) -> [{telnet,IpAddr},
    + {user, [{username,Username}, {password,Password}]}]
    +ct:get_config({unix,telnet},Default) -> IpAddr
    +ct:get_config({unix,user,username},Default) -> Username
    +ct:get_config({unix,ftp},Default) -> Default
    +ct:get_config(unknownkey,Default) -> Default

    If a configuration variable key has been associated with a name (by ct:require/2 or a require statement), the name can be used -instead of the key to read the value:

    ct:require(myuser,{unix,user}) -> ok.
    -ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

    If a configuration variable is defined in multiple files, use option all to +instead of the key to read the value:

    ct:require(myuser,{unix,user}) -> ok.
    +ct:get_config(myuser,Default) -> [{username,Username}, {password,Password}]

    If a configuration variable is defined in multiple files, use option all to access all possible values. The values are returned in a list. The order of the elements corresponds to the order that the configuration files were specified at startup.

    If configuration elements (key-value tuples) are to be returned as result @@ -1997,7 +1997,7 @@

    Gets a reference to the Common Test event manager. The reference can be used -to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])
    +to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct:get_event_mgr_ref(), my_ev_h, [])
    @@ -2285,7 +2285,7 @@ -

    Installs configuration files and event handlers.

    Run this function once before the first test.

    Example:

    install([{config,["config_node.ctc","config_user.ctc"]}])

    This function is automatically run by program ct_run.

    +

    Installs configuration files and event handlers.

    Run this function once before the first test.

    Example:

    install([{config,["config_node.ctc","config_user.ctc"]}])

    This function is automatically run by program ct_run.

    @@ -3122,7 +3122,7 @@

    Checks if the required configuration is available. Arbitrarily deep tuples can be specified as Required. Only the last element of the tuple can be a list of -SubKeys.

    Example 1. Require the variable myvar:

    ok = ct:require(myvar).

    In this case the configuration file must at least contain:

    {myvar,Value}.

    Example 2. Require key myvar with subkeys sub1 and sub2:

    ok = ct:require({myvar,[sub1,sub2]}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,Value},{sub2,Value}]}.

    Example 3. Require key myvar with subkey sub1 with subsub1:

    ok = ct:require({myvar,sub1,sub2}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,[{sub2,Value}]}]}.

    See also ct:get_config/1, +SubKeys.

    Example 1. Require the variable myvar:

    ok = ct:require(myvar).

    In this case the configuration file must at least contain:

    {myvar,Value}.

    Example 2. Require key myvar with subkeys sub1 and sub2:

    ok = ct:require({myvar,[sub1,sub2]}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,Value},{sub2,Value}]}.

    Example 3. Require key myvar with subkey sub1 with subsub1:

    ok = ct:require({myvar,sub1,sub2}).

    In this case the configuration file must at least contain:

    {myvar,[{sub1,[{sub2,Value}]}]}.

    See also ct:get_config/1, ct:get_config/2, ct:get_config/3, ct:require/2.

    @@ -3164,8 +3164,8 @@ that the value of the element can be read with ct:get_config/1,2 provided Name is used instead of the whole Required term.

    Example:

    Require one node with a Telnet connection and an FTP connection. Name the node -a:

    ok = ct:require(a,{machine,node}).

    All references to this node can then use the node name. For example, a file over -FTP is fetched like follows:

    ok = ct:ftp_get(a,RemoteFile,LocalFile).

    For this to work, the configuration file must at least contain:

    {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

    Note

    The behavior of this function changed radically in Common Test 1.6.2. To +a:

    ok = ct:require(a,{machine,node}).

    All references to this node can then use the node name. For example, a file over +FTP is fetched like follows:

    ok = ct:ftp_get(a,RemoteFile,LocalFile).

    For this to work, the configuration file must at least contain:

    {machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.

    Note

    The behavior of this function changed radically in Common Test 1.6.2. To keep some backwards compatibility, it is still possible to do: ct:require(a,{node,[telnet,ftp]}). This associates the name a with the top-level node entry. For this to work, the configuration file must at least @@ -3540,12 +3540,12 @@ the Erlang shell. The interactive mode can also be started from the OS command line with ct_run -shell [-config File...].

    If any functions (for example, Telnet or FTP) using "required configuration data" are to be called from the Erlang shell, configuration data must first be -required with ct:require/2.

    Example:

    > ct:require(unix_telnet, unix).
    +required with ct:require/2.

    Example:

    > ct:require(unix_telnet, unix).
     ok
    -> ct_telnet:open(unix_telnet).
    -{ok,<0.105.0>}
    -> ct_telnet:cmd(unix_telnet, "ls .").
    -{ok,["ls","file1  ...",...]}
    +>
    ct_telnet:open(unix_telnet). +{ok,<0.105.0>} +> ct_telnet:cmd(unix_telnet, "ls ."). +{ok,["ls","file1 ...",...]}
    @@ -3834,7 +3834,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_cover.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_cover.html 2026-04-20 17:48:29.597614135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_cover.html 2026-04-20 17:48:29.597614135 +0000 @@ -282,7 +282,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ftp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ftp.html 2026-04-20 17:48:29.641614416 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ftp.html 2026-04-20 17:48:29.641614416 +0000 @@ -554,10 +554,10 @@

    Opens an FTP connection and sends a file to the remote host.

    LocalFile and RemoteFile must be absolute paths.

    If the target host is a "special" node, the FTP address must be specified in the -configuration file as follows:

    {node,[{ftp,IpAddr}]}.

    If the target host is something else, for example, a UNIX host, the -configuration file must also include the username and password (both strings):

    {unix,[{ftp,IpAddr},
    -       {username,Username},
    -       {password,Password}]}.

    See also ct:require/2.

    +configuration file as follows:

    {node,[{ftp,IpAddr}]}.

    If the target host is something else, for example, a UNIX host, the +configuration file must also include the username and password (both strings):

    {unix,[{ftp,IpAddr},
    +       {username,Username},
    +       {password,Password}]}.

    See also ct:require/2.

    @@ -739,7 +739,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks.html 2026-04-20 17:48:29.677614647 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks.html 2026-04-20 17:48:29.677614647 +0000 @@ -1366,7 +1366,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks_chapter.html 2026-04-20 17:48:29.713614877 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_hooks_chapter.html 2026-04-20 17:48:29.717614903 +0000 @@ -163,12 +163,12 @@ always a combination of a result for the suite/group/test and an updated CTHState.

    To let the test suite continue on executing, return the configuration list that you want the test to use as the result.

    All pre hooks, except pre_end_per_testcase/4, can skip or fail the test by -returning a tuple with skip or fail, and a reason as the result.

    Example:

    pre_init_per_suite(SuiteName, Config, CTHState) ->
    -  case db:connect() of
    -    {error,_Reason} ->
    -      {{fail, "Could not connect to DB"}, CTHState};
    -    {ok, Handle} ->
    -      {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
    +returning a tuple with skip or fail, and a reason as the result.

    Example:

    pre_init_per_suite(SuiteName, Config, CTHState) ->
    +  case db:connect() of
    +    {error,_Reason} ->
    +      {{fail, "Could not connect to DB"}, CTHState};
    +    {ok, Handle} ->
    +      {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
       end.

    Note

    If you use multiple CTHs, the first part of the return tuple is used as input for the next CTH. So in the previous example the next CTH can get {fail,Reason} as the second parameter. If you have many CTHs interacting, do @@ -184,18 +184,18 @@ affect the outcome of the test, return the Return data as it is given to the CTH. You can also modify the test result. By returning the Config list with element tc_status removed, you can recover from a test failure. As in all the -pre hooks, it is also possible to fail/skip the test case in the post hook.

    Example:

    post_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->
    -  case db:check_consistency() of
    +pre hooks, it is also possible to fail/skip the test case in the post hook.

    Example:

    post_end_per_testcase(_Suite, _TC, Config, {'EXIT',{_,_}}, CTHState) ->
    +  case db:check_consistency() of
         true ->
           %% DB is good, pass the test.
    -      {proplists:delete(tc_status, Config), CTHState};
    +      {proplists:delete(tc_status, Config), CTHState};
         false ->
           %% DB is not good, mark as skipped instead of failing
    -      {{skip, "DB is inconsistent!"}, CTHState}
    +      {{skip, "DB is inconsistent!"}, CTHState}
       end;
    -post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->
    +post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) ->
       %% Do nothing if tc does not crash.
    -  {Return, CTHState}.

    Note

    Do recover from a testcase failure using CTHs only a last resort. If used + {Return, CTHState}.

    Note

    Do recover from a testcase failure using CTHs only a last resort. If used wrongly, it can be very difficult to determine which tests that pass or fail in a test run.

    Skip and Fail Hooks

    After any post hook has been executed for all installed CTHs, on_tc_fail or @@ -234,80 +234,80 @@ %%% ct_run -suite example_SUITE -pa . -ct_hooks example_cth %%% %%% Note `-pa .`: the hook beam file must be in the code path when installing. --module(example_cth). +-module(example_cth). %% Mandatory Callbacks --export([init/2]). +-export([init/2]). %% Optional Callbacks --export([id/1]). +-export([id/1]). --export([pre_init_per_suite/3]). --export([post_end_per_suite/4]). +-export([pre_init_per_suite/3]). +-export([post_end_per_suite/4]). --export([pre_init_per_testcase/4]). --export([post_end_per_testcase/5]). +-export([pre_init_per_testcase/4]). +-export([post_end_per_testcase/5]). --export([on_tc_skip/4]). +-export([on_tc_skip/4]). --export([terminate/1]). +-export([terminate/1]). %% This hook state is threaded through all the callbacks. --record(state, {filename, total, suite_total, ts, tcs, data, skipped}). +-record(state, {filename, total, suite_total, ts, tcs, data, skipped}). %% This example hook prints its results to a file, see terminate/1. --record(test_run, {total, skipped, suites}). +-record(test_run, {total, skipped, suites}). %% Return a unique id for this CTH. %% Using the filename means the hook can be used with different %% log files to separate timing data within the same test run. %% See Installing a CTH for more information. -id(Opts) -> +id(Opts) -> %% the path is relative to the test run directory - proplists:get_value(filename, Opts, "example_cth.log"). + proplists:get_value(filename, Opts, "example_cth.log"). %% Always called before any other callback function. Use this to initiate %% any common state. -init(Id, _Opts) -> - {ok, #state{filename = Id, total = 0, data = []}}. +init(Id, _Opts) -> + {ok, #state{filename = Id, total = 0, data = []}}. %% Called before init_per_suite is called. -pre_init_per_suite(_Suite,Config,State) -> - {Config, State#state{suite_total = 0, tcs = []}}. +pre_init_per_suite(_Suite,Config,State) -> + {Config, State#state{suite_total = 0, tcs = []}}. %% Called after end_per_suite. -post_end_per_suite(Suite,_Config,Return,State) -> - Data = {suites, Suite, State#state.suite_total, - lists:reverse(State#state.tcs)}, - {Return, State#state{data = [Data | State#state.data], - total = State#state.total + State#state.suite_total}}. +post_end_per_suite(Suite,_Config,Return,State) -> + Data = {suites, Suite, State#state.suite_total, + lists:reverse(State#state.tcs)}, + {Return, State#state{data = [Data | State#state.data], + total = State#state.total + State#state.suite_total}}. %% Called before each init_per_testcase. -pre_init_per_testcase(_Suite,_TC,Config,State) -> - Now = erlang:monotonic_time(microsecond), - {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}. +pre_init_per_testcase(_Suite,_TC,Config,State) -> + Now = erlang:monotonic_time(microsecond), + {Config, State#state{ts = Now, suite_total = State#state.suite_total + 1}}. %% Called after each end_per_testcase. -post_end_per_testcase(Suite,TC,_Config,Return,State) -> - Now = erlang:monotonic_time(microsecond), - TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts}, - {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}. +post_end_per_testcase(Suite,TC,_Config,Return,State) -> + Now = erlang:monotonic_time(microsecond), + TCInfo = {testcase, Suite, TC, Return, Now - State#state.ts}, + {Return, State#state{ts = undefined, tcs = [TCInfo | State#state.tcs]}}. %% Called when a test case is skipped by either user action %% or due to an init function failing. -on_tc_skip(_Suite, _TC, _Reason, State) -> - State#state{skipped = State#state.skipped + 1}. +on_tc_skip(_Suite, _TC, _Reason, State) -> + State#state{skipped = State#state.skipped + 1}. %% Called when the scope of the CTH is done. -terminate(State) -> +terminate(State) -> %% use append to avoid data loss if the path is reused - {ok, File} = file:open(State#state.filename, [write, append]), - io:format(File, "~p.~n", [results(State)]), - file:close(File), + {ok, File} = file:open(State#state.filename, [write, append]), + io:format(File, "~p.~n", [results(State)]), + file:close(File), ok. -results(State) -> - #state{skipped = Skipped, data = Data, total = Total} = State, - #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.

    Built-In CTHs

    Common Test is delivered with some general-purpose CTHs that can be enabled by +results(State) -> + #state{skipped = Skipped, data = Data, total = Total} = State, + #test_run{total = Total, skipped = Skipped, suites = lists:reverse(Data)}.

    Built-In CTHs

    Common Test is delivered with some general-purpose CTHs that can be enabled by the user to provide generic testing functionality. Some of these CTHs are enabled by default when common_test is started to run. They can be disabled by setting enable_builtin_hooks to false on the command line or in the test @@ -382,7 +382,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master.html 2026-04-20 17:48:29.745615082 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master.html 2026-04-20 17:48:29.757615159 +0000 @@ -413,7 +413,7 @@

    Gets a reference to the Common Test master event manager. The reference can be -used to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
    +used to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
    @@ -763,7 +763,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master_chapter.html 2026-04-20 17:48:29.781615313 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_master_chapter.html 2026-04-20 17:48:29.789615364 +0000 @@ -108,7 +108,7 @@ of test specifications. If it is a list, the specifications are handled (and the corresponding tests executed) in sequence. An element in a TestSpecs list can also be list of test specifications. The specifications in such a list are -merged into one combined specification before test execution.

    Example:

    ct_master:run(["ts1","ts2",["ts3","ts4"]])

    Here, the tests specified by "ts1" run first, then the tests specified by "ts2", +merged into one combined specification before test execution.

    Example:

    ct_master:run(["ts1","ts2",["ts3","ts4"]])

    Here, the tests specified by "ts1" run first, then the tests specified by "ts2", and finally the tests specified by both "ts3" and "ts4".

    The InclNodes argument to run/3 is a list of node names. Function run/3 runs the tests in TestSpecs just like run/1, but also takes any test in TestSpecs, which is not explicitly tagged with a particular node name, and @@ -142,32 +142,32 @@ install an event handler).

    Consider the example in section Test Specifications in section Running Tests and Analysing Results, now extended with node information and -intended to be executed by Common Test Master:

    {define, 'Top', "/home/test"}.
    -{define, 'T1', "'Top'/t1"}.
    -{define, 'T2', "'Top'/t2"}.
    -{define, 'T3', "'Top'/t3"}.
    -{define, 'CfgFile', "config.cfg"}.
    -{define, 'Node', ct_node}.
    -
    -{node, node1, 'Node@host_x'}.
    -{node, node2, 'Node@host_y'}.
    -
    -{logdir, master, "'Top'/master_logs"}.
    -{logdir, "'Top'/logs"}.
    -
    -{config, node1, "'T1'/'CfgFile'"}.
    -{config, node2, "'T2'/'CfgFile'"}.
    -{config, "'T3'/'CfgFile'"}.
    -
    -{suites, node1, 'T1', all}.
    -{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    -{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    -{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
    +intended to be executed by Common Test Master:

    {define, 'Top', "/home/test"}.
    +{define, 'T1', "'Top'/t1"}.
    +{define, 'T2', "'Top'/t2"}.
    +{define, 'T3', "'Top'/t3"}.
    +{define, 'CfgFile', "config.cfg"}.
    +{define, 'Node', ct_node}.
    +
    +{node, node1, 'Node@host_x'}.
    +{node, node2, 'Node@host_y'}.
    +
    +{logdir, master, "'Top'/master_logs"}.
    +{logdir, "'Top'/logs"}.
    +
    +{config, node1, "'T1'/'CfgFile'"}.
    +{config, node2, "'T2'/'CfgFile'"}.
    +{config, "'T3'/'CfgFile'"}.
    +
    +{suites, node1, 'T1', all}.
    +{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    +{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    +{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
     
    -{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
    -{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
    +{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
    +{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
     
    -{skip_suites, 'T3', all, "Not implemented"}.

    This example specifies the same tests as the original example. But now if +{skip_suites, 'T3', all, "Not implemented"}.

    This example specifies the same tests as the original example. But now if started with a call to ct_master:run(TestSpecName), test t1 is executed on node ct_node@host_x (node1), test t2 on ct_node@host_y (node2) and test t3 on both node1 and node2. Configuration file t1 is only read on @@ -184,13 +184,13 @@ Common Test node in question (typically ct@somehost if started with the ct_run program), is performed. Tests without explicit node association are always performed too, of course.

    Automatic Startup of Test Target Nodes

    Initial actions can be started and performed automatically on test target nodes -using test specification term init.

    Two subterms are supported, node_start and eval.

    Example:

    {node, node1, node1@host1}.
    -{node, node2, node1@host2}.
    -{node, node3, node2@host2}.
    -{node, node4, node1@host3}.
    -{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
    -{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
    -{init, node4, {eval, {module, function, []}}}.

    This test specification declares that node1@host1 is to be started using the +using test specification term init.

    Two subterms are supported, node_start and eval.

    Example:

    {node, node1, node1@host1}.
    +{node, node2, node1@host2}.
    +{node, node3, node2@host2}.
    +{node, node4, node1@host3}.
    +{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
    +{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
    +{init, node4, {eval, {module, function, []}}}.

    This test specification declares that node1@host1 is to be started using the user callback function callback_module:my_slave_callback/0, and nodes node1@host2 and node2@host2 are to be started with the default callback module ct_slave. The specified username and password are used to log on to @@ -255,7 +255,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_netconfc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_netconfc.html 2026-04-20 17:48:29.849615749 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_netconfc.html 2026-04-20 17:48:29.849615749 +0000 @@ -102,7 +102,7 @@ to the server.

    Alternately, open/1,2 can be used to establish a single session on a dedicated connection. (Or, equivalently, only_open/1,2 followed by hello/1-3.)

    Connect/session options can be specified in a configuration file with entries -like the following.

    {server_id(), [option()]}.

    The server_id/0 or an associated ct:target_name/0 can then be passed to +like the following.

    {server_id(), [option()]}.

    The server_id/0 or an associated ct:target_name/0 can then be passed to the aforementioned functions to use the referenced configuration.

    Signaling

    Protocol operations in the NETCONF protocol are realized as remote procedure calls (RPCs) from client to server and a corresponding reply from server to client. RPCs are sent using like-named functions (eg. @@ -115,8 +115,8 @@ in most cases since a non-response by the server or a missing message-id causes the call to hang indefinitely.

    Logging

    The NETCONF server uses error_logger for logging of NETCONF traffic. A special purpose error handler is implemented in ct_conn_log_h. To use this error -handler, add the cth_conn_log hook in the test suite, for example:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

    conn_log_mod() is the name of the Common Test module implementing the +handler, add the cth_conn_log hook in the test suite, for example:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

    conn_log_mod() is the name of the Common Test module implementing the connection protocol, for example, ct_netconfc.

    Hook option log_type specifies the type of logging:

    • raw - The sent and received NETCONF data is logged to a separate text file "as is" without any formatting. A link to the file is added to the test case HTML log.

    • pretty - The sent and received NETCONF data is logged to a separate text @@ -127,17 +127,17 @@ option hosts and list the names of the servers/connections to be used in the suite. The connections must be named for this to work, that is, they must be opened with open/2.

      Option hosts has no effect if log_type is set to html or silent.

      The hook options can also be specified in a configuration file with -configuration variable ct_conn_log:

      {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

      For example:

      {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
      -                            {hosts,[ct:key_or_name()]}]}]}

      Note

      Hook options specified in a configuration file overwrite the hard-coded hook +configuration variable ct_conn_log:

      {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

      For example:

      {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
      +                            {hosts,[ct:key_or_name()]}]}]}

      Note

      Hook options specified in a configuration file overwrite the hard-coded hook options in the test suite.

      Logging Example 1:

      The following ct_hooks statement causes pretty printing of NETCONF traffic to separate logs for the connections named nc_server1 and nc_server2. Any other -connections are logged to default NETCONF log.

      suite() ->
      -   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
      -                                              {hosts,[nc_server1,nc_server2]}]}
      -                               ]}]}].

      Connections must be opened as follows:

      open(nc_server1,[...]),
      -open(nc_server2,[...]).

      Logging Example 2:

      The following configuration file causes raw logging of all NETCONF traffic in to -one single text file:

      {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

      The ct_hooks statement must look as follows:

      suite() ->
      -    [{ct_hooks, [{cth_conn_log, []}]}].

      The same ct_hooks statement without the configuration file would cause HTML +connections are logged to default NETCONF log.

      suite() ->
      +   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
      +                                              {hosts,[nc_server1,nc_server2]}]}
      +                               ]}]}].

      Connections must be opened as follows:

      open(nc_server1,[...]),
      +open(nc_server2,[...]).

      Logging Example 2:

      The following configuration file causes raw logging of all NETCONF traffic in to +one single text file:

      {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

      The ct_hooks statement must look as follows:

      suite() ->
      +    [{ct_hooks, [{cth_conn_log, []}]}].

      The same ct_hooks statement without the configuration file would cause HTML logging of all NETCONF connections in to the test case HTML log.

      @@ -2138,8 +2138,8 @@

      Edits configuration data.

      By default only the running target is available, unless the server includes :candidate or :startup in its list of capabilities.

      OptParams can be used for specifying optional parameters (default-operation, test-option, or error-option) to be added to the edit-config request. The -value must be a list containing valid simple XML, for example:

      [{'default-operation', ["none"]},
      - {'error-option', ["rollback-on-error"]}]

      If OptParams is not given, the default value [] is used.

      +value must be a list containing valid simple XML, for example:

      [{'default-operation', ["none"]},
      + {'error-option', ["rollback-on-error"]}]

      If OptParams is not given, the default value [] is used.

    @@ -3261,7 +3261,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test.html 2026-04-20 17:48:29.885615979 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test.html 2026-04-20 17:48:29.885615979 +0000 @@ -100,30 +100,30 @@ directory has a subdirectory property_test, where everything needed for the property tests are collected. The usual Erlang application directory structure is assumed.

    A typical Common Test test suite using ct_property_test is organized as -follows:

    -module(my_prop_test_SUITE).
    --compile(export_all).
    +follows:

    -module(my_prop_test_SUITE).
    +-compile(export_all).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -all() -> [prop_ftp_case].
    +all() -> [prop_ftp_case].
     
    -init_per_suite(Config) ->
    -    ct_property_test:init_per_suite(Config).
    +init_per_suite(Config) ->
    +    ct_property_test:init_per_suite(Config).
     
     %%%---- test case
    -prop_ftp_case(Config) ->
    -    ct_property_test:quickcheck(
    -      ftp_simple_client_server:prop_ftp(),
    +prop_ftp_case(Config) ->
    +    ct_property_test:quickcheck(
    +      ftp_simple_client_server:prop_ftp(),
           Config
    -     ).

    and the the property test module (in this example + ).

    and the the property test module (in this example ftp_simple_client_server.erl) as almost a usual property testing module (More -examples are in the User's Guide):

    -module(ftp_simple_client_server).
    --export([prop_ftp/0...]).
    +examples are in the User's Guide):

    -module(ftp_simple_client_server).
    +-export([prop_ftp/0...]).
     
    --include_lib("common_test/include/ct_property_test.hrl").
    +-include_lib("common_test/include/ct_property_test.hrl").
     
    -prop_ftp() ->
    -    ?FORALL( ....
    +
    prop_ftp() -> + ?FORALL( ....
    @@ -841,7 +841,7 @@ 'EQC', 'PROPER' or 'TRIQ' set, depending on which tool that is first found. This could make parts of the Erlang property tests code to be included or excluded with the macro directives -ifdef(Macro). or -ifndef(Macro)..

    The file(s) in the property_test subdirectory could, or should, include the -ct_property_test include file:

    -include_lib("common_test/include/ct_property_test.hrl").

    This included file will:

    The default StatisticsSpec is:

    @@ -1064,7 +1064,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test_chapter.html 2026-04-20 17:48:29.921616210 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_property_test_chapter.html 2026-04-20 17:48:29.921616210 +0000 @@ -93,51 +93,51 @@ property based testing tools in Common Test test suites.

    Basic knowledge of property based testing is assumed in the following. It is also assumed that at least one of the following property based testing tools is installed and available in the library path:

    What Is Supported?

    The ct_property_test module does the following:

    • Compiles the files with property tests in the subdirectory property_test
    • Tests properties in those files using the first found Property Testing Tool.
    • Saves the results - that is the printouts - in the usual Common Test Log

    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...
     
    @@ -161,13 +161,13 @@
     Testing lib.common_test.ct_property_test_SUITE: TEST COMPLETE, 1 ok, 0 failed of 1 test cases
     
     ....

    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 ***
    @@ -271,7 +271,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_rpc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_rpc.html 2026-04-20 17:48:29.957616440 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_rpc.html 2026-04-20 17:48:29.957616440 +0000 @@ -538,7 +538,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_run_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_run_cmd.html 2026-04-20 17:48:29.989616645 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_run_cmd.html 2026-04-20 17:48:29.985616620 +0000 @@ -185,10 +185,10 @@ [-ct_hooks_order test | config] [-exit_status ignore_config]

    Refresh HTML Index Files

     ct_run -refresh_logs [-logdir LogDir] [-basic_html]
       [-keep_logs all | NLogs]

    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]

    Start a Common Test Master Node

     ct_run -ctmaster

    See Also

    For information about the start flags, see section + [-config ConfigFile1 ConfigFile2 ... ConfigFileN] + [-userconfig CallbackModule1 ConfigString1 and CallbackModule2 + ConfigString2 and .. and CallbackModuleN ConfigStringN] + [-decrypt_key Key] | [-decrypt_file KeyFile]

    Start a Common Test Master Node

     ct_run -ctmaster

    See Also

    For information about the start flags, see section Running Tests and Analyzing Results in the User's Guide.

    @@ -232,7 +232,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_slave.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_slave.html 2026-04-20 17:48:30.021616850 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_slave.html 2026-04-20 17:48:30.021616850 +0000 @@ -532,7 +532,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_snmp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_snmp.html 2026-04-20 17:48:30.065617132 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_snmp.html 2026-04-20 17:48:30.061617106 +0000 @@ -115,15 +115,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 @@ -1895,7 +1895,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ssh.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ssh.html 2026-04-20 17:48:30.125617516 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_ssh.html 2026-04-20 17:48:30.125617516 +0000 @@ -98,14 +98,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.

    @@ -3837,7 +3837,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_suite.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_suite.html 2026-04-20 17:48:30.173617823 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_suite.html 2026-04-20 17:48:30.169617798 +0000 @@ -1617,7 +1617,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_telnet.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_telnet.html 2026-04-20 17:48:30.213618080 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_telnet.html 2026-04-20 17:48:30.213618080 +0000 @@ -101,14 +101,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 = timeout(), 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 = timeout(), 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.

    Logging

    The default logging behavior of ct_telnet is to print information about performed operations, commands, and their corresponding results to the test case @@ -117,8 +117,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 @@ -135,15 +135,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, []}]}].

    See Also

    unix_telnet

    +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, []}]}].

    See Also

    unix_telnet

    @@ -846,9 +846,9 @@ 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.

    @@ -1188,7 +1188,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_testspec.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_testspec.html 2026-04-20 17:48:30.249618310 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/ct_testspec.html 2026-04-20 17:48:30.249618310 +0000 @@ -204,7 +204,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/dependencies_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/dependencies_chapter.html 2026-04-20 17:48:30.285618541 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/dependencies_chapter.html 2026-04-20 17:48:30.281618514 +0000 @@ -119,65 +119,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.

    Saving Configuration Data

    Sometimes it is impossible, or infeasible, to implement independent test cases. Maybe it is not possible to read the SUT state. Maybe resetting the SUT is impossible and it takes too long time to restart the system. In situations where @@ -199,40 +199,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}.
    +    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 +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 @@ -246,22 +246,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 @@ -320,7 +320,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/event_handler_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/event_handler_chapter.html 2026-04-20 17:48:30.321618771 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/event_handler_chapter.html 2026-04-20 17:48:30.325618797 +0000 @@ -120,12 +120,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 @@ -258,7 +258,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/example_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/example_chapter.html 2026-04-20 17:48:30.361619027 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/example_chapter.html 2026-04-20 17:48:30.357619002 +0000 @@ -89,19 +89,19 @@ -

    Test Suite Example

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
    +

    Test Suite Example

    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
    @@ -116,8 +116,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
    @@ -127,10 +127,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()
    @@ -140,9 +140,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.
     
     %%--------------------------------------------------------------------
    @@ -155,10 +155,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.
     
     %%--------------------------------------------------------------------
    @@ -171,10 +171,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.
     
     %%--------------------------------------------------------------------
    @@ -189,28 +189,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.

    Test Suite Templates

    The Erlang mode for the Emacs editor includes two Common Test test suite templates, one with extensive information in the function headers, and one with minimal information. A test suite template provides a quick start for @@ -222,12 +222,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 @@ -245,8 +245,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) -> @@ -262,7 +262,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. %%-------------------------------------------------------------------- @@ -273,7 +273,7 @@ %% %% Description: Cleanup after the suite. %%-------------------------------------------------------------------- -end_per_suite(_Config) -> +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- @@ -289,7 +289,7 @@ %% %% Description: Initialization before each test case group. %%-------------------------------------------------------------------- -init_per_group(_GroupName, Config) -> +init_per_group(_GroupName, Config) -> Config. %%-------------------------------------------------------------------- @@ -303,7 +303,7 @@ %% %% Description: Cleanup after each test case group. %%-------------------------------------------------------------------- -end_per_group(_GroupName, _Config) -> +end_per_group(_GroupName, _Config) -> ok. /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/getting_started_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/getting_started_chapter.html 2026-04-20 17:48:30.393619232 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/getting_started_chapter.html 2026-04-20 17:48:30.393619232 +0000 @@ -115,47 +115,47 @@ 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.

    A Test Suite with Configuration Functions

    If you need to perform configuration operations to run your test, you can +mod_exists(_) -> + {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    A Test Suite with Configuration Functions

    If you need to perform configuration operations to run your test, you can implement configuration functions in your suite. The result from a configuration function is configuration data, or Config. This is a list of key-value tuples that get passed from the configuration function to the test cases (possibly 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

    Questions and Answers

    Here follows some questions that you might have after reading this section with corresponding tips and links to the answers:

    • Question: "How and where can I specify variable data for my tests that must @@ -232,7 +232,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/install_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/install_chapter.html 2026-04-20 17:48:30.417619386 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/install_chapter.html 2026-04-20 17:48:30.417619386 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/introduction.html 2026-04-20 17:48:30.449619590 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/introduction.html 2026-04-20 17:48:30.453619616 +0000 @@ -157,7 +157,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/notes.html 2026-04-20 17:48:30.509619974 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/notes.html 2026-04-20 17:48:30.509619974 +0000 @@ -1185,7 +1185,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/run_test_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/run_test_chapter.html 2026-04-20 17:48:30.561620307 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/run_test_chapter.html 2026-04-20 17:48:30.561620307 +0000 @@ -208,7 +208,7 @@ which instead is printed to tty at the end of the test run.

      Note

      To use the functions ct:break/1,2 and ct:continue/0,1, release_shell must be set to true.

      For details, see ct:run_test/1 manual page.

      Test Case Group Execution

      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 @@ -240,30 +240,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 @@ -285,12 +285,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. @@ -347,8 +347,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 @@ -398,154 +398,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}.
    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/search.html	2026-04-20 17:48:30.593620512 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/search.html	2026-04-20 17:48:30.597620538 +0000
    @@ -108,7 +108,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/test_structure_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/test_structure_chapter.html 2026-04-20 17:48:30.629620743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/test_structure_chapter.html 2026-04-20 17:48:30.629620743 +0000 @@ -183,7 +183,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/unix_telnet.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/unix_telnet.html 2026-04-20 17:48:30.657620923 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/unix_telnet.html 2026-04-20 17:48:30.657620923 +0000 @@ -94,14 +94,14 @@

    Callback module for ct_telnet, for connecting to a Telnet server on a UNIX -host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    -       {port,PortNum},                 % optional
    -       {username,UserName},
    -       {password,Password},
    -       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, +host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    +       {port,PortNum},                 % optional
    +       {username,UserName},
    +       {password,Password},
    +       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, use the interface functions in ct_telnet, for example, open(Name) and cmd(Name,Cmd).

    Name is the name you allocated to the Unix host in your require statement, -for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server +for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server every 10 seconds if the connection is idle) can be enabled or disabled for one particular connection as described here. It can be disabled for all connections using telnet_settings (see ct_telnet).

    The {port,PortNum} tuple is optional and if omitted, default Telnet port 23 is @@ -255,7 +255,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/why_test_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/why_test_chapter.html 2026-04-20 17:48:30.689621127 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/why_test_chapter.html 2026-04-20 17:48:30.689621127 +0000 @@ -163,7 +163,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/write_test_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/write_test_chapter.html 2026-04-20 17:48:30.733621409 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.30/doc/html/write_test_chapter.html 2026-04-20 17:48:30.733621409 +0000 @@ -194,29 +194,29 @@ system configuration files, the test case is skipped.

    A required variable can also be given a default value to be used if the variable is not found in any configuration file. To specify a default value, add a tuple of the form {default_config,ConfigVariableName,Value} to the -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 +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"}]}
    -    ].

    Test Suite Information Function

    Function suite/0 can, for example, be used in a test +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"}]}
    +    ].

    Test Suite Information Function

    Function suite/0 can, for example, be used in a test suite module to set a default timetrap value and to require external configuration data. If a test case, or a group information function also specifies any of the information tags, it overrides the default values set by @@ -224,14 +224,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"}
    -    ].

    Test Case Groups

    A test case group is a set of test cases sharing configuration functions and +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"}
    +    ].

    Test Case Groups

    A test case group is a set of test cases sharing configuration functions and execution properties. Test case groups are defined by function groups/0 that should return a term having the following syntax:

    groups() -> GroupDefs
    @@ -247,20 +247,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 @@ -269,33 +269,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}].
    +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 +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 @@ -321,13 +321,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 @@ -382,25 +382,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 /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/404.html 2026-04-20 17:48:30.773621665 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/404.html 2026-04-20 17:48:30.773621665 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/api-reference.html 2026-04-20 17:48:30.801621843 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/api-reference.html 2026-04-20 17:48:30.797621818 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/beam_ssa.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/beam_ssa.html 2026-04-20 17:48:30.829622022 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/beam_ssa.html 2026-04-20 17:48:30.829622022 +0000 @@ -146,8 +146,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.

    Exception Re-issuing

    A typical user-written try-catch expression will catch a subset of @@ -174,7 +174,7 @@ succeeded:body-instruction unless one of the following exceptions apply:

    • The function call can statically be proven to always fail.

    • The function call is to the erlang-module and can statically be proven to always succeed or fail.

    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 @@ -233,7 +233,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl.html 2026-04-20 17:48:30.937622714 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl.html 2026-04-20 17:48:30.937622714 +0000 @@ -11521,7 +11521,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_clauses.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_clauses.html 2026-04-20 17:48:30.981622997 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_clauses.html 2026-04-20 17:48:30.989623047 +0000 @@ -641,7 +641,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_trees.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_trees.html 2026-04-20 17:48:31.021623253 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/cerl_trees.html 2026-04-20 17:48:31.029623305 +0000 @@ -698,7 +698,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compile.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compile.html 2026-04-20 17:48:31.069623561 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compile.html 2026-04-20 17:48:31.069623561 +0000 @@ -106,7 +106,7 @@ compiler recursively from inside a parse transform.

    The list can be retrieved with env_compiler_options/0.

    Order of Compiler Options

    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.

    Inlining

    The compiler can do function inlining within an Erlang @@ -124,14 +124,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}).

    Inlining of List Functions

    The compiler can also inline various list manipulation functions from the module +-compile(inline). +-compile({inline_size,100}).

    Inlining of List Functions

    The compiler can also inline various list manipulation functions from the module list in STDLIB.

    This feature must be explicitly enabled with a compiler option or a -compile() attribute in the source module.

    To enable inlining of list functions, use option inline_list_funcs.

    The following functions are inlined:

    Parse Transformations

    Parse transformations are used when a programmer wants to use Erlang syntax but with different semantics. The original Erlang code is then transformed into @@ -861,10 +861,10 @@ 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 @@ -930,7 +930,7 @@ 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 @@ -1320,7 +1320,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2026-04-20 15:17:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2042-05-23 04:36:25.000000000 +0000 @@ -74,8 +74,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.

    Exception Re-issuing

    A typical user-written try-catch expression will catch a subset of @@ -102,7 +102,7 @@ succeeded:body-instruction unless one of the following exceptions apply:

    • The function call can statically be proven to always fail.

    • The function call is to the erlang-module and can statically be proven to always succeed or fail.

    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 /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/compile.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/compile.xhtml 2026-04-20 15:17:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/compile.xhtml 2042-05-23 04:36:25.000000000 +0000 @@ -35,7 +35,7 @@ compiler recursively from inside a parse transform.

    The list can be retrieved with env_compiler_options/0.

    Order of Compiler Options

    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.

    Inlining

    The compiler can do function inlining within an Erlang @@ -53,14 +53,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}).

    Inlining of List Functions

    The compiler can also inline various list manipulation functions from the module +-compile(inline). +-compile({inline_size,100}).

    Inlining of List Functions

    The compiler can also inline various list manipulation functions from the module list in STDLIB.

    This feature must be explicitly enabled with a compiler option or a -compile() attribute in the source module.

    To enable inlining of list functions, use option inline_list_funcs.

    The following functions are inlined:

    Parse Transformations

    Parse transformations are used when a programmer wants to use Erlang syntax but with different semantics. The original Erlang code is then transformed into @@ -774,10 +774,10 @@ 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 @@ -843,7 +843,7 @@ 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 /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/content.opf 2026-04-20 15:17:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/content.opf 2042-05-23 04:36:25.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> compiler - 9.0.5 - urn:uuid:791a5a98-511f-f8c9-600d-a992e6536a0e + urn:uuid:10680887-4252-6a8b-cd8e-e94d68955c45 en - 2026-04-20T15:17:57Z + 2042-05-23T04:36:25Z /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/notes.xhtml 2026-04-20 15:17:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/notes.xhtml 2042-05-23 04:36:25.000000000 +0000 @@ -17,48 +17,48 @@

    Compiler Release Notes

    -

    This document describes the changes made to the Compiler application.

    Compiler 9.0.5

    Fixed Bugs and Malfunctions

    • Fixed a compiler alias analysis bug that could generate unsafe code for repeated binary segments.

      Own Id: OTP-19951 Aux Id: PR-10588

    Compiler 9.0.4

    Fixed Bugs and Malfunctions

    • For some function heads or case expressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code.

      Own Id: OTP-19797 Aux Id: PR-10252

    • Passing a type for a fun as a macro argument would result in a "badly formed argument" error message from the compiler. Example:

      -module(test).
      --define(FOO(X), X).
      --type foo() :: ?FOO(fun(() -> ok)).

      Compiling this module would result in the following error message:

      test.erl:3:17: badly formed argument for macro 'FOO'
      +

      This document describes the changes made to the Compiler application.

      Compiler 9.0.5

      Fixed Bugs and Malfunctions

      • Fixed a compiler alias analysis bug that could generate unsafe code for repeated binary segments.

        Own Id: OTP-19951 Aux Id: PR-10588

      Compiler 9.0.4

      Fixed Bugs and Malfunctions

      • For some function heads or case expressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code.

        Own Id: OTP-19797 Aux Id: PR-10252

      • Passing a type for a fun as a macro argument would result in a "badly formed argument" error message from the compiler. Example:

        -module(test).
        +-define(FOO(X), X).
        +-type foo() :: ?FOO(fun(() -> ok)).

        Compiling this module would result in the following error message:

        test.erl:3:17: badly formed argument for macro 'FOO'
         %    5| -type foo() :: ?FOO(fun(() -> ok)).
        -%

        Own Id: OTP-19821 Aux Id: GH-10280, PR-10309

      • In certain edge cases, the compiler could emit code that would do an unsafe destructive update of a tuple. This has been corrected.

        Own Id: OTP-19879 Aux Id: GH-10367, PR-10435

      Improvements and New Features

      • The compiler option beam_debug_stack combined with beam_debug_info will attempt to make as many variables as possible visible in the debugger. The option has no effect if given without beam_debug_info.

        Own Id: OTP-19854 Aux Id: PR-10374

      Compiler 9.0.3

      Fixed Bugs and Malfunctions

      • Fixed broken type inference for lists:mapfoldl/r.

        Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

      Compiler 9.0.2

      Fixed Bugs and Malfunctions

      • Fixed a compiler crash caused by patch order in destructive update.

        Own Id: OTP-19660 Aux Id: GH-9903, PR-9909

      • Fixed a compiler crash in beam_ssa_pre_codegen caused by wrong handling of multiple phi patches in the destructive update pass.

        Own Id: OTP-19689 Aux Id: GH-9987, PR-9990

      • Fixed a crash when a zip generator contains a map pattern.

        Own Id: OTP-19693 Aux Id: PR-10009, GH-10002

      • In rare circumstances, the compiler could crash when compiling code using bit syntax construction.

        Own Id: OTP-19722 Aux Id: GH-10077, PR-10090

      • A few minor bugs that could affect the beam_debug_info option were fixed.

        Own Id: OTP-19758 Aux Id: PR-10153

      Compiler 9.0.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that could cause empty bitstring matches to always succeed, even when they should not.

        Own Id: OTP-19711 Aux Id: GH-10047, PR-10048

      Compiler 9.0

      Fixed Bugs and Malfunctions

      • The compiler will now emit warnings when some map patterns cannot possibly match because a previous clauses matches the same pattern. For example:

        mm_1(#{}) -> a;
        -mm_1(#{b := B}) -> {b,B}.
        +%

        Own Id: OTP-19821 Aux Id: GH-10280, PR-10309

      • In certain edge cases, the compiler could emit code that would do an unsafe destructive update of a tuple. This has been corrected.

        Own Id: OTP-19879 Aux Id: GH-10367, PR-10435

      Improvements and New Features

      • The compiler option beam_debug_stack combined with beam_debug_info will attempt to make as many variables as possible visible in the debugger. The option has no effect if given without beam_debug_info.

        Own Id: OTP-19854 Aux Id: PR-10374

      Compiler 9.0.3

      Fixed Bugs and Malfunctions

      • Fixed broken type inference for lists:mapfoldl/r.

        Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

      Compiler 9.0.2

      Fixed Bugs and Malfunctions

      • Fixed a compiler crash caused by patch order in destructive update.

        Own Id: OTP-19660 Aux Id: GH-9903, PR-9909

      • Fixed a compiler crash in beam_ssa_pre_codegen caused by wrong handling of multiple phi patches in the destructive update pass.

        Own Id: OTP-19689 Aux Id: GH-9987, PR-9990

      • Fixed a crash when a zip generator contains a map pattern.

        Own Id: OTP-19693 Aux Id: PR-10009, GH-10002

      • In rare circumstances, the compiler could crash when compiling code using bit syntax construction.

        Own Id: OTP-19722 Aux Id: GH-10077, PR-10090

      • A few minor bugs that could affect the beam_debug_info option were fixed.

        Own Id: OTP-19758 Aux Id: PR-10153

      Compiler 9.0.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that could cause empty bitstring matches to always succeed, even when they should not.

        Own Id: OTP-19711 Aux Id: GH-10047, PR-10048

      Compiler 9.0

      Fixed Bugs and Malfunctions

      • The compiler will now emit warnings when some map patterns cannot possibly match because a previous clauses matches the same pattern. For example:

        mm_1(#{}) -> a;
        +mm_1(#{b := B}) -> {b,B}.
         
        -mm_2(#{a := A}) -> {a,A};
        -mm_2(#{a := A, b := B}) -> {b,A,B}.

        The second clause of these function can never match and the compiler will now emit a warning for both of them.

        Note that the compiler is not guaranteed to emit warnings for every possible map pattern that cannot match.

        Own Id: OTP-19141 Aux Id: GH-8558, PR-8600

      • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

        While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

        External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19285 Aux Id: PR-8913

      • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

        This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

      • The final validation step in the compiler will now reject modules containing functions with more than 255 arguments. No impact is expected as the emulator has always refused to load these modules.

        Own Id: OTP-19376 Aux Id: GH-9113, PR-9121

      • Replaced calls to deprecated crypto:start() with application:start(crypto).

        Own Id: OTP-19485 Aux Id: PR-8592

      • Refactor code to not rely on +nowarn_shadow_vars.

        Own Id: OTP-19574 Aux Id: PR-9678

      Improvements and New Features

      • The EEP-48 doc chunk embedded into .beam files by the compiler is now compressed and deterministic.

        Own Id: OTP-19096 Aux Id: PR-8494

      • Provided that the map argument for a maps:put/3 call is known to the compiler to be a map, the compiler will replace such calls with the corresponding update using the map syntax.

        Own Id: OTP-19115 Aux Id: PR-8540

      • For various error types, the compiler now tries to suggest potential fixes by adding "did you mean ...?" at the end of error messages.

        When a function is used with wrong arity, the compiler will try to suggest a defined function with the same name but a different arity. For example, given the following module:

        -module(typos).
        --export([t/0]).
        -bar(A) -> A.
        -bar(A,A,A) -> A.
        -bar(A,A,A,A) -> A.
        -t() -> bar(0, 0).

        The compiler will emit the following message:

        typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
        +mm_2(#{a := A}) -> {a,A};
        +mm_2(#{a := A, b := B}) -> {b,A,B}.

        The second clause of these function can never match and the compiler will now emit a warning for both of them.

        Note that the compiler is not guaranteed to emit warnings for every possible map pattern that cannot match.

        Own Id: OTP-19141 Aux Id: GH-8558, PR-8600

      • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

        While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

        External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19285 Aux Id: PR-8913

      • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

        This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

      • The final validation step in the compiler will now reject modules containing functions with more than 255 arguments. No impact is expected as the emulator has always refused to load these modules.

        Own Id: OTP-19376 Aux Id: GH-9113, PR-9121

      • Replaced calls to deprecated crypto:start() with application:start(crypto).

        Own Id: OTP-19485 Aux Id: PR-8592

      • Refactor code to not rely on +nowarn_shadow_vars.

        Own Id: OTP-19574 Aux Id: PR-9678

      Improvements and New Features

      • The EEP-48 doc chunk embedded into .beam files by the compiler is now compressed and deterministic.

        Own Id: OTP-19096 Aux Id: PR-8494

      • Provided that the map argument for a maps:put/3 call is known to the compiler to be a map, the compiler will replace such calls with the corresponding update using the map syntax.

        Own Id: OTP-19115 Aux Id: PR-8540

      • For various error types, the compiler now tries to suggest potential fixes by adding "did you mean ...?" at the end of error messages.

        When a function is used with wrong arity, the compiler will try to suggest a defined function with the same name but a different arity. For example, given the following module:

        -module(typos).
        +-export([t/0]).
        +bar(A) -> A.
        +bar(A,A,A) -> A.
        +bar(A,A,A,A) -> A.
        +t() -> bar(0, 0).

        The compiler will emit the following message:

        typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
         %   6|     t() -> bar(0, 0).
        -%    |            ^

        For compiler errors that can easily be caused by typos, the compiler will try to suggest what the correct variable or function name, could be. For example, given the following module:

        -module(typos).
        --export([bar/2]).
        +%    |            ^

        For compiler errors that can easily be caused by typos, the compiler will try to suggest what the correct variable or function name, could be. For example, given the following module:

        -module(typos).
        +-export([bar/2]).
         
        -bar(A0, B0) ->
        +bar(A0, B0) ->
             A + B.

        the compiler will emit the following error messages:

        typos.erl:5:5: variable 'A' is unbound, did you mean 'A0'?
         %    5|     A + B.
         %     |     ^
         
         typos.erl:5:9: variable 'B' is unbound, did you mean 'B0'?
         %    5|     A + B.
        -%     |         ^

        Error types that now suggest correct arities: bad_inline, undefined_nif, bad_nowarn_unused_function, bad_nowarn_bif_clash, undefined_function.

        Error types that now suggest correct names: bad_inline, undefined_nif, bad_nowarn_unused_function, undefined_on_load, undefined_function, undefined_record, undefined_field, unbound_var.

        Using a function with wrong arity has higher precedence than having a typo in the function name. If the compiler can find a defined function with the same name but a different arity, it will not suggest a defined function with a close-enough name, regardless of arity.

        Own Id: OTP-19180 Aux Id: PR-8699, PR-9094

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        -[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • Documentation chunks (EEP-48) has been updated to include the following reserved metadata fields: behaviours, group, source_path, and source_annos. The compiler has also been updated to emit this metadata. See the EEP-48 documentation for more details.

        Own Id: OTP-19306 Aux Id: PR-8945, PR-8975

      • New strict generators have been added for comprehensions.

        The currently existing generators are "relaxed": they ignore terms in the +% | ^

      Error types that now suggest correct arities: bad_inline, undefined_nif, bad_nowarn_unused_function, bad_nowarn_bif_clash, undefined_function.

      Error types that now suggest correct names: bad_inline, undefined_nif, bad_nowarn_unused_function, undefined_on_load, undefined_function, undefined_record, undefined_field, unbound_var.

      Using a function with wrong arity has higher precedence than having a typo in the function name. If the compiler can find a defined function with the same name but a different arity, it will not suggest a defined function with a close-enough name, regardless of arity.

      Own Id: OTP-19180 Aux Id: PR-8699, PR-9094

    • Comprehensions have been extended with zip generators according to EEP 73.

      Example:

      1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
      +[5,7,9]

      Own Id: OTP-19184 Aux Id: PR-8926

    • Documentation chunks (EEP-48) has been updated to include the following reserved metadata fields: behaviours, group, source_path, and source_annos. The compiler has also been updated to emit this metadata. See the EEP-48 documentation for more details.

      Own Id: OTP-19306 Aux Id: PR-8945, PR-8975

    • New strict generators have been added for comprehensions.

      The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

      The new strict generators fail with exception badmatch if a pattern doesn't match.

      Examples:

      Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

      1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
      -[{ok,1},{error,2}]

      If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

      1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
      +[{ok,1},{error,2}]

      If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

      2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
      +that term not matching will cause a crash:

      2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
       ** exception error: no match of right hand side value ok

      Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

      The strict version for bitstring generators is <:=.

      Own Id: OTP-19317 Aux Id: PR-8625

    • New options for suppressing behaviour warnings have been added:

      • nowarn_conflicting_behaviours
      • nowarn_undefined_behaviour_func
      • nowarn_undefined_behaviour
      • nowarn_undefined_behaviour_callbacks
      • nowarn_ill_defined_behaviour_callbacks
      • nowarn_ill_defined_optional_callbacks

      Own Id: OTP-19334 Aux Id: GH-8985, PR-9020

    • Some BIFs with side-effects are optimized in try/catch in the same way as guard BIFs in order to gain performance.

      The following BIFs that are optimized in this way: binary_to_atom/1, binary_to_atom/2, binary_to_existing_atom/1, list_to_atom/1, and -list_to_existing_atom/1.

      Own Id: OTP-19339 Aux Id: PR-9042, PR-9122

    • The compiler now converts known documentation attribute metadata entries from unicode:chardata/0 to unicode:unicode_binary/0.

      Own Id: OTP-19394 Aux Id: PR-9192

    • The warn_deprecated_catch option enables warnings for use of old-style catch expressions on the form catch Expr instead of the modern try ... catch ... end. To prevent new uses of uses of old catches to be added, this compiler option can be enabled on the project level and -compile(nowarn_deprecated_catch). added to individual files that still contain old catches.

      Own Id: OTP-19425 Aux Id: PR-9154

    • Defining a fun in terms of an imported function is not allowed. Before this release, the compiler would not catch this kind of error if the name of the imported function happened to be a BIF. Consider this example:

      -module(fun_example).
      --export([foo/0, bar/0]).
      --import(m, [max/2, not_a_bif/0]).
      +list_to_existing_atom/1.

      Own Id: OTP-19339 Aux Id: PR-9042, PR-9122

    • The compiler now converts known documentation attribute metadata entries from unicode:chardata/0 to unicode:unicode_binary/0.

      Own Id: OTP-19394 Aux Id: PR-9192

    • The warn_deprecated_catch option enables warnings for use of old-style catch expressions on the form catch Expr instead of the modern try ... catch ... end. To prevent new uses of uses of old catches to be added, this compiler option can be enabled on the project level and -compile(nowarn_deprecated_catch). added to individual files that still contain old catches.

      Own Id: OTP-19425 Aux Id: PR-9154

    • Defining a fun in terms of an imported function is not allowed. Before this release, the compiler would not catch this kind of error if the name of the imported function happened to be a BIF. Consider this example:

      -module(fun_example).
      +-export([foo/0, bar/0]).
      +-import(m, [max/2, not_a_bif/0]).
       
      -foo() ->
      +foo() ->
           fun max/2.
       
      -bar() ->
      +bar() ->
           fun not_a_bif/0.

      The compiler in Erlang/OTP 27 would generate the following messages:

      fun_example.erl:9:5: function not_a_bif/0 undefined
       %    9|     fun not_a_bif/0.
       %     |     ^
      @@ -77,60 +77,60 @@
       fun_example.erl:3:2: Warning: import directive overrides auto-imported BIF max/2 --
       use "-compile({no_auto_import,[max/2]})." to resolve name clash
       %    3| -import(m, [max/2, not_a_bif/0]).
      -%     |  ^

      Also, attempting to call a local function having the same name as auto-imported BIF would result in an error if the BIF was added to Erlang/OTP before R14, and a warning for newer BIFs. This has been changed to always emit a warning. For example:

      -module(bif_example).
      --export([bar/1]).
      +%     |  ^

      Also, attempting to call a local function having the same name as auto-imported BIF would result in an error if the BIF was added to Erlang/OTP before R14, and a warning for newer BIFs. This has been changed to always emit a warning. For example:

      -module(bif_example).
      +-export([bar/1]).
       
      -bar(B) ->
      -    is_boolean(B).
      +bar(B) ->
      +    is_boolean(B).
       
      -is_boolean(B) ->
      +is_boolean(B) ->
               B =:= true orelse B =:= false.

      will now result in the following warning instead of an error:

      if_example.erl:5:5: Warning: ambiguous call of overridden auto-imported BIF is_boolean/1 --
       use erlang:is_boolean/1 or "-compile({no_auto_import,[is_boolean/1]})." to resolve name clash
       %    5|     is_boolean(B).
      -%     |     ^

      Own Id: OTP-19432 Aux Id: PR-9246

    • The compiler’s alias analysis pass is now both faster and less conservative, allowing optimizations of records and binary construction to be applied in more cases.

      Own Id: OTP-19502 Aux Id: PR-8695

    • BEAM files no longer include a Meta chunk if there are no features used. That slightly decreases the size of BEAM files, and it also ensures that m(Module) and beam_lib:md5(Beam) will match for preloaded modules.

      Own Id: OTP-19524 Aux Id: PR-9517

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    • An experimental API for a native debugger has been added. The main components are the following:

      • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

      • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

      • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

      • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

      Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

    Compiler 8.6.1.3

    Fixed Bugs and Malfunctions

    • Fixed broken type inference for lists:mapfoldl/r.

      Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

    • Fix a compiler alias analysis bug that can generate unsafe code for repeated binary segments.

      Own Id: OTP-19951 Aux Id: PR-10588

    Compiler 8.6.1.2

    Fixed Bugs and Malfunctions

    • In rare circumstances, the compiler could crash when compiling code using bit syntax construction.

      Own Id: OTP-19722 Aux Id: GH-10077, PR-10090

    Compiler 8.6.1.1

    Fixed Bugs and Malfunctions

    • Fixed a bug that could cause empty bitstring matches to always succeed, even when they should not.

      Own Id: OTP-19711 Aux Id: GH-10047, PR-10048

    Compiler 8.6.1

    Fixed Bugs and Malfunctions

    • Fix the compiler crash when the inner-most tuple in a nested tuple with 3 layers is updated.

      Own Id: OTP-19561 Aux Id: ERIERL-1208, ERIERL-1210, PR-9650

    Compiler 8.6

    Improvements and New Features

    • The beam_validator pass in the compiler that validates generated BEAM now does stronger checks for binary syntax matching.

      Own Id: OTP-19449 Aux Id: PR-9338

    Compiler 8.5.5

    Fixed Bugs and Malfunctions

    • Eliminated a bug in the alias analysis pass that could potentially cause unsafe optimizations of binary construction or record updates.

      Own Id: OTP-19455 Aux Id: PR-9356

    Compiler 8.5.4

    Fixed Bugs and Malfunctions

    • 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

    Compiler 8.5.3

    Fixed Bugs and Malfunctions

    • In rare circumstances, the destructive tuple update optimization could be applied when it was unsafe.

      Own Id: OTP-19340 Aux Id: GH-9014, PR-9024

    • In rare circumstances involving appending to multiple binaries, the compile could emit unsafe code that would crash the runtime system.

      Own Id: OTP-19374 Aux Id: GH-9100, PR-9111

    Compiler 8.5.2

    Fixed Bugs and Malfunctions

    • Fixed a crash in an optimization pass relating to appending binaries.

      Own Id: OTP-19168 Aux Id: GH-8630

    • Fixed a bug in the compiler's alias analysis pass that could make it emit unsafe code.

      Own Id: OTP-19178 Aux Id: PR-8686

    Compiler 8.5.1

    Fixed Bugs and Malfunctions

    • One of the compiler's optimization passes would get very slow when compiling certain modules. The compiler will now automatically disable that pass for input that would trigger the slowdown.

      Own Id: OTP-19131 Aux Id: PR-8567

    • Fix +deterministic to work properly with documentation attributes.

      Own Id: OTP-19142 Aux Id: PR-8585, GH-8579

    Compiler 8.5

    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]).
      +%     |     ^

      Own Id: OTP-19432 Aux Id: PR-9246

    • The compiler’s alias analysis pass is now both faster and less conservative, allowing optimizations of records and binary construction to be applied in more cases.

      Own Id: OTP-19502 Aux Id: PR-8695

    • BEAM files no longer include a Meta chunk if there are no features used. That slightly decreases the size of BEAM files, and it also ensures that m(Module) and beam_lib:md5(Beam) will match for preloaded modules.

      Own Id: OTP-19524 Aux Id: PR-9517

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    • An experimental API for a native debugger has been added. The main components are the following:

      • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

      • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

      • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

      • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

      Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

    Compiler 8.6.1.3

    Fixed Bugs and Malfunctions

    • Fixed broken type inference for lists:mapfoldl/r.

      Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

    • Fix a compiler alias analysis bug that can generate unsafe code for repeated binary segments.

      Own Id: OTP-19951 Aux Id: PR-10588

    Compiler 8.6.1.2

    Fixed Bugs and Malfunctions

    • In rare circumstances, the compiler could crash when compiling code using bit syntax construction.

      Own Id: OTP-19722 Aux Id: GH-10077, PR-10090

    Compiler 8.6.1.1

    Fixed Bugs and Malfunctions

    • Fixed a bug that could cause empty bitstring matches to always succeed, even when they should not.

      Own Id: OTP-19711 Aux Id: GH-10047, PR-10048

    Compiler 8.6.1

    Fixed Bugs and Malfunctions

    • Fix the compiler crash when the inner-most tuple in a nested tuple with 3 layers is updated.

      Own Id: OTP-19561 Aux Id: ERIERL-1208, ERIERL-1210, PR-9650

    Compiler 8.6

    Improvements and New Features

    • The beam_validator pass in the compiler that validates generated BEAM now does stronger checks for binary syntax matching.

      Own Id: OTP-19449 Aux Id: PR-9338

    Compiler 8.5.5

    Fixed Bugs and Malfunctions

    • Eliminated a bug in the alias analysis pass that could potentially cause unsafe optimizations of binary construction or record updates.

      Own Id: OTP-19455 Aux Id: PR-9356

    Compiler 8.5.4

    Fixed Bugs and Malfunctions

    • 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

    Compiler 8.5.3

    Fixed Bugs and Malfunctions

    • In rare circumstances, the destructive tuple update optimization could be applied when it was unsafe.

      Own Id: OTP-19340 Aux Id: GH-9014, PR-9024

    • In rare circumstances involving appending to multiple binaries, the compile could emit unsafe code that would crash the runtime system.

      Own Id: OTP-19374 Aux Id: GH-9100, PR-9111

    Compiler 8.5.2

    Fixed Bugs and Malfunctions

    • Fixed a crash in an optimization pass relating to appending binaries.

      Own Id: OTP-19168 Aux Id: GH-8630

    • Fixed a bug in the compiler's alias analysis pass that could make it emit unsafe code.

      Own Id: OTP-19178 Aux Id: PR-8686

    Compiler 8.5.1

    Fixed Bugs and Malfunctions

    • One of the compiler's optimization passes would get very slow when compiling certain modules. The compiler will now automatically disable that pass for input that would trigger the slowdown.

      Own Id: OTP-19131 Aux Id: PR-8567

    • Fix +deterministic to work properly with documentation attributes.

      Own Id: OTP-19142 Aux Id: PR-8585, GH-8579

    Compiler 8.5

    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]).
       
      -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().
      -<<>>

      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

    Improvements and New Features

    • The compiler now emits nicer error message for function head mismatches. -For example, given:

      a() -> ok;
      -a(_) -> error.

      Erlang/OTP 26 and earlier would emit a diagnostic similar to:

      t.erl:6:1: head mismatch
      +     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

    Improvements and New Features

    • The compiler now emits nicer error message for function head mismatches. +For example, given:

      a() -> ok;
      +a(_) -> error.

      Erlang/OTP 26 and earlier would emit a diagnostic similar to:

      t.erl:6:1: head mismatch
       %    6| a(_) -> error.
       %     | ^

      while in Erlang/OTP 27 the diagnostic is similar to:

      t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted?
       %    6| a(_) -> error.
      -%     | ^

      Own Id: OTP-18648 Aux Id: PR-7383

    • The compiler now optimizes creation of binaries that are known to be constant.

      Consider this example:

      bin() ->
      -    C = char(),
      -    <<C>>.
      -
      -char() -> $*.

      Essentially, the compiler rewrites the example to the slightly more efficient:

      bin() ->
      -    _ = char(),
      -    <<$*>>.
      -
      -char() -> $*.

      Own Id: OTP-18673 Aux Id: PR-7474, ERIERL-964

    • The compiler will now merge consecutive updates of the same record.

      As an example, the body of the following function will be combined into a single tuple creation instruction:

      -record(r, {a,b,c,d}).
      -
      -update(Value) ->
      -    R0 = #r{},
      -    R1 = R0#r{a=Value},
      -    R2 = R1#r{b=2},
      -    R2#r{c=3}.

      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. +% | ^

  • Own Id: OTP-18648 Aux Id: PR-7383

  • The compiler now optimizes creation of binaries that are known to be constant.

    Consider this example:

    bin() ->
    +    C = char(),
    +    <<C>>.
    +
    +char() -> $*.

    Essentially, the compiler rewrites the example to the slightly more efficient:

    bin() ->
    +    _ = char(),
    +    <<$*>>.
    +
    +char() -> $*.

    Own Id: OTP-18673 Aux Id: PR-7474, ERIERL-964

  • The compiler will now merge consecutive updates of the same record.

    As an example, the body of the following function will be combined into a single tuple creation instruction:

    -record(r, {a,b,c,d}).
    +
    +update(Value) ->
    +    R0 = #r{},
    +    R1 = R0#r{a=Value},
    +    R2 = R1#r{b=2},
    +    R2#r{c=3}.

    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

  • Compiler 8.4.3.4

    Fixed Bugs and Malfunctions

    • Fixed broken type inference for lists:mapfoldl/r.

      Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

    Compiler 8.4.3.3

    Fixed Bugs and Malfunctions

    • Fix a bug where unloaded nifs can crash the compiler.

      Own Id: OTP-19600 Aux Id: PR-9737, GH-9715

    Compiler 8.4.3.2

    Fixed Bugs and Malfunctions

    • Fixed a bug where bogus code was generated for consecutive calls to erlang:setelement/2, potentially crashing the emulator.

      Own Id: OTP-19270 Aux Id: GH-8783 PR-8898

    Compiler 8.4.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash in an optimization pass relating to appending binaries.

      Own Id: OTP-19168 Aux Id: GH-8630

    • Fixed a bug in the compiler's alias analysis pass that could make it emit unsafe code.

      Own Id: OTP-19178 Aux Id: PR-8686

    Compiler 8.4.3

    Fixed Bugs and Malfunctions

    • In rare circumstances, the compiler code generate unsafe code for a bit syntax match.

      Own Id: OTP-19019

    • In rare circumstances, binary matches that were supposed to succeed failed.

      Own Id: OTP-19035 Aux Id: GH-8280, PR-8284

    • Fixed a bug where a fun's environment could be overridden by an argument if all of the following conditions were met:

      • The fun was declared in the module that called it.
      • The fun's target was statically known.
      • The fun was called with a number of extra arguments equal to the number of environment variables.

      Own Id: OTP-19045 Aux Id: GH-8316

    Compiler 8.4.2

    Fixed Bugs and Malfunctions

    • In rare circumstances, an unsafe optimization could cause the compiler to generate incorrect code for list matching.

      Own Id: OTP-19003 Aux Id: GH-8187, PR-8189

    Improvements and New Features

    • Fix the compilation server to restart if the applications in its lib dir changes inbetween erlc invokations.

      Own Id: OTP-18936

    Compiler 8.4.1

    Fixed Bugs and Malfunctions

    • The compiler could become extremely slow for modules containing huge functions.

      Own Id: OTP-18770 Aux Id: GH-7667, PR-7672

    Compiler 8.4

    Fixed Bugs and Malfunctions

    • The compiler could run forever when compiling a call to is_record/3 with a huge positive tuple size. The call /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2026-04-20 15:17:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2042-05-23 04:36:25.000000000 +0000 @@ -28,32 +28,32 @@ functionality.

      Syntax

      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} },
      @@ -61,9 +61,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}.

      Semantics

      When an SSA assertion is matched against the BEAM SSA for a function, + X = return_int(), + Y = return_tuple(), + {X, Y}.

      Semantics

      When an SSA assertion is matched against the BEAM SSA for a function, patterns are applied sequentially. If the current pattern doesn't match, the checker tries with the next instruction. If the checker reaches the end of the SSA representation without having matched all /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/notes.html 2026-04-20 17:48:31.301625048 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/notes.html 2026-04-20 17:48:31.305625073 +0000 @@ -89,48 +89,48 @@ -

      This document describes the changes made to the Compiler application.

      Compiler 9.0.5

      Fixed Bugs and Malfunctions

      • Fixed a compiler alias analysis bug that could generate unsafe code for repeated binary segments.

        Own Id: OTP-19951 Aux Id: PR-10588

      Compiler 9.0.4

      Fixed Bugs and Malfunctions

      • For some function heads or case expressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code.

        Own Id: OTP-19797 Aux Id: PR-10252

      • Passing a type for a fun as a macro argument would result in a "badly formed argument" error message from the compiler. Example:

        -module(test).
        --define(FOO(X), X).
        --type foo() :: ?FOO(fun(() -> ok)).

        Compiling this module would result in the following error message:

        test.erl:3:17: badly formed argument for macro &#href_anchor"w">
        +

        This document describes the changes made to the Compiler application.

        Compiler 9.0.5

        Fixed Bugs and Malfunctions

        • Fixed a compiler alias analysis bug that could generate unsafe code for repeated binary segments.

          Own Id: OTP-19951 Aux Id: PR-10588

        Compiler 9.0.4

        Fixed Bugs and Malfunctions

        • For some function heads or case expressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code.

          Own Id: OTP-19797 Aux Id: PR-10252

        • Passing a type for a fun as a macro argument would result in a "badly formed argument" error message from the compiler. Example:

          -module(test).
          +-define(FOO(X), X).
          +-type foo() :: ?FOO(fun(() -> ok)).

          Compiling this module would result in the following error message:

          test.erl:3:17: badly formed argument for macro &#href_anchor"w">
           %    5| -type foo() :: ?FOO(fun(() -> ok)).
          -%

          Own Id: OTP-19821 Aux Id: GH-10280, PR-10309

        • In certain edge cases, the compiler could emit code that would do an unsafe destructive update of a tuple. This has been corrected.

          Own Id: OTP-19879 Aux Id: GH-10367, PR-10435

        Improvements and New Features

        • The compiler option beam_debug_stack combined with beam_debug_info will attempt to make as many variables as possible visible in the debugger. The option has no effect if given without beam_debug_info.

          Own Id: OTP-19854 Aux Id: PR-10374

        Compiler 9.0.3

        Fixed Bugs and Malfunctions

        • Fixed broken type inference for lists:mapfoldl/r.

          Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

        Compiler 9.0.2

        Fixed Bugs and Malfunctions

        • Fixed a compiler crash caused by patch order in destructive update.

          Own Id: OTP-19660 Aux Id: GH-9903, PR-9909

        • Fixed a compiler crash in beam_ssa_pre_codegen caused by wrong handling of multiple phi patches in the destructive update pass.

          Own Id: OTP-19689 Aux Id: GH-9987, PR-9990

        • Fixed a crash when a zip generator contains a map pattern.

          Own Id: OTP-19693 Aux Id: PR-10009, GH-10002

        • In rare circumstances, the compiler could crash when compiling code using bit syntax construction.

          Own Id: OTP-19722 Aux Id: GH-10077, PR-10090

        • A few minor bugs that could affect the beam_debug_info option were fixed.

          Own Id: OTP-19758 Aux Id: PR-10153

        Compiler 9.0.1

        Fixed Bugs and Malfunctions

        • Fixed a bug that could cause empty bitstring matches to always succeed, even when they should not.

          Own Id: OTP-19711 Aux Id: GH-10047, PR-10048

        Compiler 9.0

        Fixed Bugs and Malfunctions

        • The compiler will now emit warnings when some map patterns cannot possibly match because a previous clauses matches the same pattern. For example:

          mm_1(#{}) -> a;
          -mm_1(#{b := B}) -> {b,B}.
          +%

          Own Id: OTP-19821 Aux Id: GH-10280, PR-10309

        • In certain edge cases, the compiler could emit code that would do an unsafe destructive update of a tuple. This has been corrected.

          Own Id: OTP-19879 Aux Id: GH-10367, PR-10435

        Improvements and New Features

        • The compiler option beam_debug_stack combined with beam_debug_info will attempt to make as many variables as possible visible in the debugger. The option has no effect if given without beam_debug_info.

          Own Id: OTP-19854 Aux Id: PR-10374

        Compiler 9.0.3

        Fixed Bugs and Malfunctions

        • Fixed broken type inference for lists:mapfoldl/r.

          Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

        Compiler 9.0.2

        Fixed Bugs and Malfunctions

        • Fixed a compiler crash caused by patch order in destructive update.

          Own Id: OTP-19660 Aux Id: GH-9903, PR-9909

        • Fixed a compiler crash in beam_ssa_pre_codegen caused by wrong handling of multiple phi patches in the destructive update pass.

          Own Id: OTP-19689 Aux Id: GH-9987, PR-9990

        • Fixed a crash when a zip generator contains a map pattern.

          Own Id: OTP-19693 Aux Id: PR-10009, GH-10002

        • In rare circumstances, the compiler could crash when compiling code using bit syntax construction.

          Own Id: OTP-19722 Aux Id: GH-10077, PR-10090

        • A few minor bugs that could affect the beam_debug_info option were fixed.

          Own Id: OTP-19758 Aux Id: PR-10153

        Compiler 9.0.1

        Fixed Bugs and Malfunctions

        • Fixed a bug that could cause empty bitstring matches to always succeed, even when they should not.

          Own Id: OTP-19711 Aux Id: GH-10047, PR-10048

        Compiler 9.0

        Fixed Bugs and Malfunctions

        • The compiler will now emit warnings when some map patterns cannot possibly match because a previous clauses matches the same pattern. For example:

          mm_1(#{}) -> a;
          +mm_1(#{b := B}) -> {b,B}.
           
          -mm_2(#{a := A}) -> {a,A};
          -mm_2(#{a := A, b := B}) -> {b,A,B}.

          The second clause of these function can never match and the compiler will now emit a warning for both of them.

          Note that the compiler is not guaranteed to emit warnings for every possible map pattern that cannot match.

          Own Id: OTP-19141 Aux Id: GH-8558, PR-8600

        • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

          While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

          External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

          POTENTIAL INCOMPATIBILITY

          Own Id: OTP-19285 Aux Id: PR-8913

        • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

          This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

          POTENTIAL INCOMPATIBILITY

          Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

        • The final validation step in the compiler will now reject modules containing functions with more than 255 arguments. No impact is expected as the emulator has always refused to load these modules.

          Own Id: OTP-19376 Aux Id: GH-9113, PR-9121

        • Replaced calls to deprecated crypto:start() with application:start(crypto).

          Own Id: OTP-19485 Aux Id: PR-8592

        • Refactor code to not rely on +nowarn_shadow_vars.

          Own Id: OTP-19574 Aux Id: PR-9678

        Improvements and New Features

        • The EEP-48 doc chunk embedded into .beam files by the compiler is now compressed and deterministic.

          Own Id: OTP-19096 Aux Id: PR-8494

        • Provided that the map argument for a maps:put/3 call is known to the compiler to be a map, the compiler will replace such calls with the corresponding update using the map syntax.

          Own Id: OTP-19115 Aux Id: PR-8540

        • For various error types, the compiler now tries to suggest potential fixes by adding "did you mean ...?" at the end of error messages.

          When a function is used with wrong arity, the compiler will try to suggest a defined function with the same name but a different arity. For example, given the following module:

          -module(typos).
          --export([t/0]).
          -bar(A) -> A.
          -bar(A,A,A) -> A.
          -bar(A,A,A,A) -> A.
          -t() -> bar(0, 0).

          The compiler will emit the following message:

          typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
          +mm_2(#{a := A}) -> {a,A};
          +mm_2(#{a := A, b := B}) -> {b,A,B}.

          The second clause of these function can never match and the compiler will now emit a warning for both of them.

          Note that the compiler is not guaranteed to emit warnings for every possible map pattern that cannot match.

          Own Id: OTP-19141 Aux Id: GH-8558, PR-8600

        • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

          While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

          External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

          POTENTIAL INCOMPATIBILITY

          Own Id: OTP-19285 Aux Id: PR-8913

        • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

          This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

          POTENTIAL INCOMPATIBILITY

          Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

        • The final validation step in the compiler will now reject modules containing functions with more than 255 arguments. No impact is expected as the emulator has always refused to load these modules.

          Own Id: OTP-19376 Aux Id: GH-9113, PR-9121

        • Replaced calls to deprecated crypto:start() with application:start(crypto).

          Own Id: OTP-19485 Aux Id: PR-8592

        • Refactor code to not rely on +nowarn_shadow_vars.

          Own Id: OTP-19574 Aux Id: PR-9678

        Improvements and New Features

        • The EEP-48 doc chunk embedded into .beam files by the compiler is now compressed and deterministic.

          Own Id: OTP-19096 Aux Id: PR-8494

        • Provided that the map argument for a maps:put/3 call is known to the compiler to be a map, the compiler will replace such calls with the corresponding update using the map syntax.

          Own Id: OTP-19115 Aux Id: PR-8540

        • For various error types, the compiler now tries to suggest potential fixes by adding "did you mean ...?" at the end of error messages.

          When a function is used with wrong arity, the compiler will try to suggest a defined function with the same name but a different arity. For example, given the following module:

          -module(typos).
          +-export([t/0]).
          +bar(A) -> A.
          +bar(A,A,A) -> A.
          +bar(A,A,A,A) -> A.
          +t() -> bar(0, 0).

          The compiler will emit the following message:

          typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
           %   6|     t() -> bar(0, 0).
          -%    |            ^

          For compiler errors that can easily be caused by typos, the compiler will try to suggest what the correct variable or function name, could be. For example, given the following module:

          -module(typos).
          --export([bar/2]).
          +%    |            ^

          For compiler errors that can easily be caused by typos, the compiler will try to suggest what the correct variable or function name, could be. For example, given the following module:

          -module(typos).
          +-export([bar/2]).
           
          -bar(A0, B0) ->
          +bar(A0, B0) ->
               A + B.

          the compiler will emit the following error messages:

          typos.erl:5:5: variable &#href_anchor"w"> is unbound, did you mean 'A0'?
           %    5|     A + B.
           %     |     ^
           
           typos.erl:5:9: variable 'B' is unbound, did you mean 'B0'?
           %    5|     A + B.
          -%     |         ^

          Error types that now suggest correct arities: bad_inline, undefined_nif, bad_nowarn_unused_function, bad_nowarn_bif_clash, undefined_function.

          Error types that now suggest correct names: bad_inline, undefined_nif, bad_nowarn_unused_function, undefined_on_load, undefined_function, undefined_record, undefined_field, unbound_var.

          Using a function with wrong arity has higher precedence than having a typo in the function name. If the compiler can find a defined function with the same name but a different arity, it will not suggest a defined function with a close-enough name, regardless of arity.

          Own Id: OTP-19180 Aux Id: PR-8699, PR-9094

        • Comprehensions have been extended with zip generators according to EEP 73.

          Example:

          1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
          -[5,7,9]

          Own Id: OTP-19184 Aux Id: PR-8926

        • Documentation chunks (EEP-48) has been updated to include the following reserved metadata fields: behaviours, group, source_path, and source_annos. The compiler has also been updated to emit this metadata. See the EEP-48 documentation for more details.

          Own Id: OTP-19306 Aux Id: PR-8945, PR-8975

        • New strict generators have been added for comprehensions.

          The currently existing generators are "relaxed": they ignore terms in the +% | ^

        Error types that now suggest correct arities: bad_inline, undefined_nif, bad_nowarn_unused_function, bad_nowarn_bif_clash, undefined_function.

        Error types that now suggest correct names: bad_inline, undefined_nif, bad_nowarn_unused_function, undefined_on_load, undefined_function, undefined_record, undefined_field, unbound_var.

        Using a function with wrong arity has higher precedence than having a typo in the function name. If the compiler can find a defined function with the same name but a different arity, it will not suggest a defined function with a close-enough name, regardless of arity.

        Own Id: OTP-19180 Aux Id: PR-8699, PR-9094

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        +[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • Documentation chunks (EEP-48) has been updated to include the following reserved metadata fields: behaviours, group, source_path, and source_annos. The compiler has also been updated to emit this metadata. See the EEP-48 documentation for more details.

        Own Id: OTP-19306 Aux Id: PR-8945, PR-8975

      • New strict generators have been added for comprehensions.

        The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

        The new strict generators fail with exception badmatch if a pattern doesn't match.

        Examples:

        Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        -[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        +[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
        +that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
         ** exception error: no match of right hand side value ok

        Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

        The strict version for bitstring generators is <:=.

        Own Id: OTP-19317 Aux Id: PR-8625

      • New options for suppressing behaviour warnings have been added:

        • nowarn_conflicting_behaviours
        • nowarn_undefined_behaviour_func
        • nowarn_undefined_behaviour
        • nowarn_undefined_behaviour_callbacks
        • nowarn_ill_defined_behaviour_callbacks
        • nowarn_ill_defined_optional_callbacks

        Own Id: OTP-19334 Aux Id: GH-8985, PR-9020

      • Some BIFs with side-effects are optimized in try/catch in the same way as guard BIFs in order to gain performance.

        The following BIFs that are optimized in this way: binary_to_atom/1, binary_to_atom/2, binary_to_existing_atom/1, list_to_atom/1, and -list_to_existing_atom/1.

        Own Id: OTP-19339 Aux Id: PR-9042, PR-9122

      • The compiler now converts known documentation attribute metadata entries from unicode:chardata/0 to unicode:unicode_binary/0.

        Own Id: OTP-19394 Aux Id: PR-9192

      • The warn_deprecated_catch option enables warnings for use of old-style catch expressions on the form catch Expr instead of the modern try ... catch ... end. To prevent new uses of uses of old catches to be added, this compiler option can be enabled on the project level and -compile(nowarn_deprecated_catch). added to individual files that still contain old catches.

        Own Id: OTP-19425 Aux Id: PR-9154

      • Defining a fun in terms of an imported function is not allowed. Before this release, the compiler would not catch this kind of error if the name of the imported function happened to be a BIF. Consider this example:

        -module(fun_example).
        --export([foo/0, bar/0]).
        --import(m, [max/2, not_a_bif/0]).
        +list_to_existing_atom/1.

        Own Id: OTP-19339 Aux Id: PR-9042, PR-9122

      • The compiler now converts known documentation attribute metadata entries from unicode:chardata/0 to unicode:unicode_binary/0.

        Own Id: OTP-19394 Aux Id: PR-9192

      • The warn_deprecated_catch option enables warnings for use of old-style catch expressions on the form catch Expr instead of the modern try ... catch ... end. To prevent new uses of uses of old catches to be added, this compiler option can be enabled on the project level and -compile(nowarn_deprecated_catch). added to individual files that still contain old catches.

        Own Id: OTP-19425 Aux Id: PR-9154

      • Defining a fun in terms of an imported function is not allowed. Before this release, the compiler would not catch this kind of error if the name of the imported function happened to be a BIF. Consider this example:

        -module(fun_example).
        +-export([foo/0, bar/0]).
        +-import(m, [max/2, not_a_bif/0]).
         
        -foo() ->
        +foo() ->
             fun max/2.
         
        -bar() ->
        +bar() ->
             fun not_a_bif/0.

        The compiler in Erlang/OTP 27 would generate the following messages:

        fun_example.erl:9:5: function not_a_bif/0 undefined
         %    9|     fun not_a_bif/0.
         %     |     ^
        @@ -149,60 +149,60 @@
         fun_example.erl:3:2: Warning: import directive overrides auto-imported BIF max/2 --
         use "-compile({no_auto_import,[max/2]})." to resolve name clash
         %    3| -import(m, [max/2, not_a_bif/0]).
        -%     |  ^

        Also, attempting to call a local function having the same name as auto-imported BIF would result in an error if the BIF was added to Erlang/OTP before R14, and a warning for newer BIFs. This has been changed to always emit a warning. For example:

        -module(bif_example).
        --export([bar/1]).
        +%     |  ^

        Also, attempting to call a local function having the same name as auto-imported BIF would result in an error if the BIF was added to Erlang/OTP before R14, and a warning for newer BIFs. This has been changed to always emit a warning. For example:

        -module(bif_example).
        +-export([bar/1]).
         
        -bar(B) ->
        -    is_boolean(B).
        +bar(B) ->
        +    is_boolean(B).
         
        -is_boolean(B) ->
        +is_boolean(B) ->
                 B =:= true orelse B =:= false.

        will now result in the following warning instead of an error:

        if_example.erl:5:5: Warning: ambiguous call of overridden auto-imported BIF is_boolean/1 --
         use erlang:is_boolean/1 or "-compile({no_auto_import,[is_boolean/1]})." to resolve name clash
         %    5|     is_boolean(B).
        -%     |     ^

        Own Id: OTP-19432 Aux Id: PR-9246

      • The compiler’s alias analysis pass is now both faster and less conservative, allowing optimizations of records and binary construction to be applied in more cases.

        Own Id: OTP-19502 Aux Id: PR-8695

      • BEAM files no longer include a Meta chunk if there are no features used. That slightly decreases the size of BEAM files, and it also ensures that m(Module) and beam_lib:md5(Beam) will match for preloaded modules.

        Own Id: OTP-19524 Aux Id: PR-9517

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      • An experimental API for a native debugger has been added. The main components are the following:

        • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

        • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

        • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

        • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

        Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

      Compiler 8.6.1.3

      Fixed Bugs and Malfunctions

      • Fixed broken type inference for lists:mapfoldl/r.

        Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

      • Fix a compiler alias analysis bug that can generate unsafe code for repeated binary segments.

        Own Id: OTP-19951 Aux Id: PR-10588

      Compiler 8.6.1.2

      Fixed Bugs and Malfunctions

      • In rare circumstances, the compiler could crash when compiling code using bit syntax construction.

        Own Id: OTP-19722 Aux Id: GH-10077, PR-10090

      Compiler 8.6.1.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that could cause empty bitstring matches to always succeed, even when they should not.

        Own Id: OTP-19711 Aux Id: GH-10047, PR-10048

      Compiler 8.6.1

      Fixed Bugs and Malfunctions

      • Fix the compiler crash when the inner-most tuple in a nested tuple with 3 layers is updated.

        Own Id: OTP-19561 Aux Id: ERIERL-1208, ERIERL-1210, PR-9650

      Compiler 8.6

      Improvements and New Features

      • The beam_validator pass in the compiler that validates generated BEAM now does stronger checks for binary syntax matching.

        Own Id: OTP-19449 Aux Id: PR-9338

      Compiler 8.5.5

      Fixed Bugs and Malfunctions

      • Eliminated a bug in the alias analysis pass that could potentially cause unsafe optimizations of binary construction or record updates.

        Own Id: OTP-19455 Aux Id: PR-9356

      Compiler 8.5.4

      Fixed Bugs and Malfunctions

      • 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

      Compiler 8.5.3

      Fixed Bugs and Malfunctions

      • In rare circumstances, the destructive tuple update optimization could be applied when it was unsafe.

        Own Id: OTP-19340 Aux Id: GH-9014, PR-9024

      • In rare circumstances involving appending to multiple binaries, the compile could emit unsafe code that would crash the runtime system.

        Own Id: OTP-19374 Aux Id: GH-9100, PR-9111

      Compiler 8.5.2

      Fixed Bugs and Malfunctions

      • Fixed a crash in an optimization pass relating to appending binaries.

        Own Id: OTP-19168 Aux Id: GH-8630

      • Fixed a bug in the compiler's alias analysis pass that could make it emit unsafe code.

        Own Id: OTP-19178 Aux Id: PR-8686

      Compiler 8.5.1

      Fixed Bugs and Malfunctions

      • One of the compiler's optimization passes would get very slow when compiling certain modules. The compiler will now automatically disable that pass for input that would trigger the slowdown.

        Own Id: OTP-19131 Aux Id: PR-8567

      • Fix +deterministic to work properly with documentation attributes.

        Own Id: OTP-19142 Aux Id: PR-8585, GH-8579

      Compiler 8.5

      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]).
        +%     |     ^

        Own Id: OTP-19432 Aux Id: PR-9246

      • The compiler’s alias analysis pass is now both faster and less conservative, allowing optimizations of records and binary construction to be applied in more cases.

        Own Id: OTP-19502 Aux Id: PR-8695

      • BEAM files no longer include a Meta chunk if there are no features used. That slightly decreases the size of BEAM files, and it also ensures that m(Module) and beam_lib:md5(Beam) will match for preloaded modules.

        Own Id: OTP-19524 Aux Id: PR-9517

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      • An experimental API for a native debugger has been added. The main components are the following:

        • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

        • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

        • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

        • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

        Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

      Compiler 8.6.1.3

      Fixed Bugs and Malfunctions

      • Fixed broken type inference for lists:mapfoldl/r.

        Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

      • Fix a compiler alias analysis bug that can generate unsafe code for repeated binary segments.

        Own Id: OTP-19951 Aux Id: PR-10588

      Compiler 8.6.1.2

      Fixed Bugs and Malfunctions

      • In rare circumstances, the compiler could crash when compiling code using bit syntax construction.

        Own Id: OTP-19722 Aux Id: GH-10077, PR-10090

      Compiler 8.6.1.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that could cause empty bitstring matches to always succeed, even when they should not.

        Own Id: OTP-19711 Aux Id: GH-10047, PR-10048

      Compiler 8.6.1

      Fixed Bugs and Malfunctions

      • Fix the compiler crash when the inner-most tuple in a nested tuple with 3 layers is updated.

        Own Id: OTP-19561 Aux Id: ERIERL-1208, ERIERL-1210, PR-9650

      Compiler 8.6

      Improvements and New Features

      • The beam_validator pass in the compiler that validates generated BEAM now does stronger checks for binary syntax matching.

        Own Id: OTP-19449 Aux Id: PR-9338

      Compiler 8.5.5

      Fixed Bugs and Malfunctions

      • Eliminated a bug in the alias analysis pass that could potentially cause unsafe optimizations of binary construction or record updates.

        Own Id: OTP-19455 Aux Id: PR-9356

      Compiler 8.5.4

      Fixed Bugs and Malfunctions

      • 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

      Compiler 8.5.3

      Fixed Bugs and Malfunctions

      • In rare circumstances, the destructive tuple update optimization could be applied when it was unsafe.

        Own Id: OTP-19340 Aux Id: GH-9014, PR-9024

      • In rare circumstances involving appending to multiple binaries, the compile could emit unsafe code that would crash the runtime system.

        Own Id: OTP-19374 Aux Id: GH-9100, PR-9111

      Compiler 8.5.2

      Fixed Bugs and Malfunctions

      • Fixed a crash in an optimization pass relating to appending binaries.

        Own Id: OTP-19168 Aux Id: GH-8630

      • Fixed a bug in the compiler's alias analysis pass that could make it emit unsafe code.

        Own Id: OTP-19178 Aux Id: PR-8686

      Compiler 8.5.1

      Fixed Bugs and Malfunctions

      • One of the compiler's optimization passes would get very slow when compiling certain modules. The compiler will now automatically disable that pass for input that would trigger the slowdown.

        Own Id: OTP-19131 Aux Id: PR-8567

      • Fix +deterministic to work properly with documentation attributes.

        Own Id: OTP-19142 Aux Id: PR-8585, GH-8579

      Compiler 8.5

      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]).
         
        -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().
        -<<>>

        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

      Improvements and New Features

      • The compiler now emits nicer error message for function head mismatches. -For example, given:

        a() -> ok;
        -a(_) -> error.

        Erlang/OTP 26 and earlier would emit a diagnostic similar to:

        t.erl:6:1: head mismatch
        +     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

      Improvements and New Features

      • The compiler now emits nicer error message for function head mismatches. +For example, given:

        a() -> ok;
        +a(_) -> error.

        Erlang/OTP 26 and earlier would emit a diagnostic similar to:

        t.erl:6:1: head mismatch
         %    6| a(_) -> error.
         %     | ^

        while in Erlang/OTP 27 the diagnostic is similar to:

        t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted?
         %    6| a(_) -> error.
        -%     | ^

        Own Id: OTP-18648 Aux Id: PR-7383

      • The compiler now optimizes creation of binaries that are known to be constant.

        Consider this example:

        bin() ->
        -    C = char(),
        -    <<C>>.
        -
        -char() -> $*.

        Essentially, the compiler rewrites the example to the slightly more efficient:

        bin() ->
        -    _ = char(),
        -    <<$*>>.
        -
        -char() -> $*.

        Own Id: OTP-18673 Aux Id: PR-7474, ERIERL-964

      • The compiler will now merge consecutive updates of the same record.

        As an example, the body of the following function will be combined into a single tuple creation instruction:

        -record(r, {a,b,c,d}).
        -
        -update(Value) ->
        -    R0 = #href_anchor"ss">r{},
        -    R1 = R0#r{a=Value},
        -    R2 = R1#r{b=2},
        -    R2#r{c=3}.

        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. +% | ^

      Own Id: OTP-18648 Aux Id: PR-7383

    • The compiler now optimizes creation of binaries that are known to be constant.

      Consider this example:

      bin() ->
      +    C = char(),
      +    <<C>>.
      +
      +char() -> $*.

      Essentially, the compiler rewrites the example to the slightly more efficient:

      bin() ->
      +    _ = char(),
      +    <<$*>>.
      +
      +char() -> $*.

      Own Id: OTP-18673 Aux Id: PR-7474, ERIERL-964

    • The compiler will now merge consecutive updates of the same record.

      As an example, the body of the following function will be combined into a single tuple creation instruction:

      -record(r, {a,b,c,d}).
      +
      +update(Value) ->
      +    R0 = #href_anchor"ss">r{},
      +    R1 = R0#r{a=Value},
      +    R2 = R1#r{b=2},
      +    R2#r{c=3}.

      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(#href_anchor"ss">rec{a=needs_update,b=N}=R0) ->
    -    R = R0#rec{a=up_to_date},
    +update(#href_anchor"ss">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

  • Compiler 8.4.3.4

    Fixed Bugs and Malfunctions

    • Fixed broken type inference for lists:mapfoldl/r.

      Own Id: OTP-19845 Aux Id: GH-10354, PR-10358

    Compiler 8.4.3.3

    Fixed Bugs and Malfunctions

    • Fix a bug where unloaded nifs can crash the compiler.

      Own Id: OTP-19600 Aux Id: PR-9737, GH-9715

    Compiler 8.4.3.2

    Fixed Bugs and Malfunctions

    • Fixed a bug where bogus code was generated for consecutive calls to erlang:setelement/2, potentially crashing the emulator.

      Own Id: OTP-19270 Aux Id: GH-8783 PR-8898

    Compiler 8.4.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash in an optimization pass relating to appending binaries.

      Own Id: OTP-19168 Aux Id: GH-8630

    • Fixed a bug in the compiler's alias analysis pass that could make it emit unsafe code.

      Own Id: OTP-19178 Aux Id: PR-8686

    Compiler 8.4.3

    Fixed Bugs and Malfunctions

    • In rare circumstances, the compiler code generate unsafe code for a bit syntax match.

      Own Id: OTP-19019

    • In rare circumstances, binary matches that were supposed to succeed failed.

      Own Id: OTP-19035 Aux Id: GH-8280, PR-8284

    • Fixed a bug where a fun's environment could be overridden by an argument if all of the following conditions were met:

      • The fun was declared in the module that called it.
      • The fun's target was statically known.
      • The fun was called with a number of extra arguments equal to the number of environment variables.

      Own Id: OTP-19045 Aux Id: GH-8316

    Compiler 8.4.2

    Fixed Bugs and Malfunctions

    • In rare circumstances, an unsafe optimization could cause the compiler to generate incorrect code for list matching.

      Own Id: OTP-19003 Aux Id: GH-8187, PR-8189

    Improvements and New Features

    • Fix the compilation server to restart if the applications in its lib dir changes inbetween erlc invokations.

      Own Id: OTP-18936

    Compiler 8.4.1

    Fixed Bugs and Malfunctions

    • The compiler could become extremely slow for modules containing huge functions.

      Own Id: OTP-18770 Aux Id: GH-7667, PR-7672

    Compiler 8.4

    Fixed Bugs and Malfunctions

    • The compiler could run forever when compiling a call to is_record/3 with a huge positive tuple size. The call @@ -1127,7 +1127,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/search.html 2026-04-20 17:48:31.345625328 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/search.html 2026-04-20 17:48:31.345625328 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/ssa_checks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/ssa_checks.html 2026-04-20 17:48:31.377625533 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.5/doc/html/ssa_checks.html 2026-04-20 17:48:31.377625533 +0000 @@ -100,32 +100,32 @@ functionality.

      Syntax

      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} },
      @@ -133,9 +133,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}.

      Semantics

      When an SSA assertion is matched against the BEAM SSA for a function, + X = return_int(), + Y = return_tuple(), + {X, Y}.

      Semantics

      When an SSA assertion is matched against the BEAM SSA for a function, patterns are applied sequentially. If the current pattern doesn't match, the checker tries with the next instruction. If the checker reaches the end of the SSA representation without having matched all @@ -191,7 +191,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/404.html 2026-04-20 17:48:31.405625713 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/404.html 2026-04-20 17:48:31.405625713 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/algorithm_details.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/algorithm_details.html 2026-04-20 17:48:31.433625891 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/algorithm_details.html 2026-04-20 17:48:31.433625891 +0000 @@ -188,7 +188,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/api-reference.html 2026-04-20 17:48:31.465626097 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/api-reference.html 2026-04-20 17:48:31.465626097 +0000 @@ -118,7 +118,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/content.opf 2026-04-20 15:19:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/content.opf 2042-05-23 04:38:39.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> crypto - 5.8.3 - urn:uuid:96d88082-0113-7fe2-cbbd-9dda1d9ae853 + urn:uuid:b5241fc3-e7c8-cd60-7941-856a9e1d33d6 en - 2026-04-20T15:19:50Z + 2042-05-23T04:38:39Z /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/crypto.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/crypto.xhtml 2026-04-20 15:19:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/crypto.xhtml 2042-05-23 04:38:39.000000000 +0000 @@ -3686,7 +3686,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 @@ -6510,9 +6510,9 @@

      Create a generator for rand and save it in the process dictionary.

      Equivalent to rand_seed_s/0 but also saves the returned state object (generator) in the process dictionary. That is, -it is equivalent to rand:seed(rand_seed_s()).

      See rand:seed/1 and rand_seed_s/0.

      Example

      _ = crypto:rand_seed(),
      -IntegerValue = rand:uniform(42), % 1 .. 42
      -FloatValue = rand:uniform().     % [0.0; 1.0)

      Note

      Note that when using the process dictionary for cryptographically +it is equivalent to rand:seed(rand_seed_s()).

      See rand:seed/1 and rand_seed_s/0.

      Example

      _ = crypto:rand_seed(),
      +IntegerValue = rand:uniform(42), % 1 .. 42
      +FloatValue = rand:uniform().     % [0.0; 1.0)

      Note

      Note that when using the process dictionary for cryptographically secure random numbers one has to ensure that no code called between initializing the generator and between generating numbers accidentally alters the generator state in the process dictionary.

      The safe approach is to use the rand functions that @@ -6552,9 +6552,9 @@ and save it in the process dictionary.

      Equivalent rand_seed_alg_s/1 but also saves the returned state object (generator) in the process dictionary. That is, it is equivalent to rand:seed(rand_seed_alg_s(Alg)).

      See rand:seed/1 and rand_seed_alg_s/1. -Note the warning about the usage of the process dictionary in rand_seed/0.

      Example

      _ = crypto:rand_seed_alg(crypto_cache),
      -IntegerValue = rand:uniform(42), % 1 .. 42
      -FloatValue = rand:uniform().     % [0.0; 1.0)
      +Note the warning about the usage of the process dictionary in rand_seed/0.

      Example

      _ = crypto:rand_seed_alg(crypto_cache),
      +IntegerValue = rand:uniform(42), % 1 .. 42
      +FloatValue = rand:uniform().     % [0.0; 1.0)
      @@ -6589,12 +6589,12 @@ and save it in the process dictionary.

      Equivalent to rand_seed_alg_s/2 but also saves the returned state object (generator) in the process dictionary. That is, it is equivalent to rand:seed(rand_seed_alg_s(Alg, Seed)).

      See rand:seed/1 and rand_seed_alg_s/2. -Note the warning about the usage of the process dictionary in rand_seed/0.

      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
      +Note the warning about the usage of the process dictionary in rand_seed/0.

      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
      @@ -6628,9 +6628,9 @@ which when used by the rand functions produce cryptographically strong random number.

      See also rand:seed_s/1 and for example rand:uniform_s/2.

      If Alg is crypto this function is equivalent to rand_seed_s/0.

      If Alg is crypto_cache the returned generator fetches random data with OpenSSL's RAND_bytes and caches it as 56 bit numbers -which makes calculations fast on 64 bit machines.

      Example

      S0 = crypto:rand_seed_alg_s(crypto_cache),
      -{IntegerValue, S1} = rand:uniform(42, S0), % 1 .. 42
      -{FloatValue, S2} = rand:uniform(S1).       % [0.0; 1.0)

      May cause the rand functions using this state object +which makes calculations fast on 64 bit machines.

      Example

      S0 = crypto:rand_seed_alg_s(crypto_cache),
      +{IntegerValue, S1} = rand:uniform(42, S0), % 1 .. 42
      +{FloatValue, S2} = rand:uniform(S1).       % [0.0; 1.0)

      May cause the rand functions using this state object to raise the exception error:low_entropy in case the random generator failed due to lack of secure "randomness".

      The cache size can be changed from its default value using the crypto app's configuration parameter rand_cache_size.

      Note

      The state returned from this function cannot be used to get a reproducible @@ -6679,12 +6679,12 @@ for the same seed.

      • If you need cryptographically strong random numbers use rand_seed_alg_s/1 with Alg =:= crypto or Alg =:= crypto_cache.
      • If you need to be able to repeat the sequence use this function with Alg =:= crypto_aes.
      • If you do not need the statistical quality of this function, there are faster -algorithms in the rand module.

      Example

      S0 = crypto:rand_seed_alg_s(crypto_aes, "my seed"),
      -{IntegerValue, S1} = rand:uniform(42, S0), % 1 .. 42
      -{FloatValue, S2 = rand:uniform(S1),        % [0.0; 1.0)
      -S3 = crypto:rand_seed_alg_s(crypto_aes, "my seed"),
      -{IntegerValue, S4} = rand:uniform(42, S3), % Same values
      -{FloatValue, S5} = rand:uniform(S4).       % again

      Thanks to the used generator the state object supports the +algorithms in the rand module.

    Example

    S0 = crypto:rand_seed_alg_s(crypto_aes, "my seed"),
    +{IntegerValue, S1} = rand:uniform(42, S0), % 1 .. 42
    +{FloatValue, S2 = rand:uniform(S1),        % [0.0; 1.0)
    +S3 = crypto:rand_seed_alg_s(crypto_aes, "my seed"),
    +{IntegerValue, S4} = rand:uniform(42, S3), % Same values
    +{FloatValue, S5} = rand:uniform(S4).       % again

    Thanks to the used generator the state object supports the rand:jump/0,1 function with distance 2^512.

    Numbers are generated in batches and cached for speed reasons. The cache size can be changed from its default value using the crypto app's configuration parameter rand_cache_size.

    @@ -6721,8 +6721,8 @@ which when used by the rand functions produce cryptographically strong random numbers (based on OpenSSL's BN_rand_range function). See also rand:seed_s/1, and for example -rand:uniform_s/2.

    Example

    S0 = crypto:rand_seed_s(),
    -{RandomInteger, S1} = rand:uniform_s(1000, S0).

    May cause the rand functions using this state object +rand:uniform_s/2.

    Example

    S0 = crypto:rand_seed_s(),
    +{RandomInteger, S1} = rand:uniform_s(1000, S0).

    May cause the rand functions using this state object to raise the exception error:low_entropy in case the random generator failed due to lack of secure "randomness".

    Note

    The state returned from this function cannot be used to get a reproducible random sequence as from the other rand functions, since that would @@ -7335,14 +7335,14 @@ -

    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",
       fips_provider_available => true,
    -  fips_provider_buildinfo => "3.0.0"}
    +  fips_provider_buildinfo => "3.0.0"}
     2>

    More association types than documented may be present in the map. Some of the associations (like fips) may be absent if not supported.

    @@ -7411,8 +7411,8 @@

    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.

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/engine_keys.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2026-04-20 15:19:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2042-05-23 04:38:39.000000000 +0000 @@ -35,30 +35,30 @@ string or binary and depends on the Engine loaded
  • an Erlang map is constructed with the Engine reference, the key reference and possibly a key passphrase if needed by the Engine. See the Reference Manual for details of the map.
  • Use Cases

    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).
    -<<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,...>>

    Verify with an engine stored public key

    Here the signature and message in the last example is verifyed using the public +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,...>>

    Verify with an engine stored public key

    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>

    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).
    -<<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
    +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,...>>
    +  223,...>>
     8>
    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/engine_load.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/engine_load.xhtml 2026-04-20 15:19:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/engine_load.xhtml 2042-05-23 04:38:39.000000000 +0000 @@ -26,32 +26,32 @@ performance over its software-based counterpart, which is known as cryptographic acceleration.

    Note

    The file name requirement on the engine dynamic library can differ between SSL versions.

    Use Cases

    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}

    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}

    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]).
    +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}

    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]).
     ok

    Load with the ensure loaded function

    This function makes sure the engine is loaded just once and the ID is added to the internal engine list of OpenSSL. The following calls to the function will -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).
    +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).
    - ok

    List all engines currently loaded

     8> crypto:engine_list().
    -[<<"dynamic">>, <<"MD5">>]
    +engine.

     6> crypto:engine_unload(Engine).
    + ok

    List all engines currently loaded

     8> crypto:engine_list().
    +[<<"dynamic">>, <<"MD5">>]
    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/new_api.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/new_api.xhtml 2026-04-20 15:19:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.epub/OEBPS/new_api.xhtml 2042-05-23 04:38:39.000000000 +0000 @@ -42,85 +42,85 @@ 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> application:start(crypto).
    +to divide the plain text and cipher text differently for some ciphers:

    	1> application:start(crypto).
     	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
    +	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
     	#Ref<0.3768901617.1128660993.124047>
    -	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">>).
    -	<<16,79,94,115,234,197,94,253,16,144,151,41>>
    +	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">>).
    +	<<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>>).
    -	<<"First b">>
    -	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>>).
    -	<<"s">>
    +	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>>).
    +	<<"ytesSecond byte">>
    +	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.

    Example of crypto_one_time/5

    The same example as in the previous section, -but now with one call to crypto_one_time/5:

    	1> Key = <<1:128>>.
    -	<<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).
    -	<<67,44,216,166,25,130,203,5,66,6,162,16,79,94,115,234,
    -	197,94,253,16,144,151,41>>
    +but now with one call to crypto_one_time/5:

    	1> Key = <<1:128>>.
    +	<<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).
    +	<<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 single binary: <<"First bytesSecond bytes">>.

    Example of crypto_one_time_aead/6

    The same example as in the previous section, but now with one -call to crypto_one_time_aead/6:

    	1> Key = <<1:128>>.
    -	<<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> 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,
    -	192,103,176,90,104,15,71,158>>,
    -	<<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>}
    +call to crypto_one_time_aead/6:

    	1> Key = <<1:128>>.
    +	<<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> 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,
    +	192,103,176,90,104,15,71,158>>,
    +	<<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">>.

    Example of mac_init mac_update and mac_final

    	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).
    +single binary: <<"First bytesSecond bytes">>.

    Example of mac_init mac_update and mac_final

    	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).
     	#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).
    -	<<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").
    -	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
    -	249>>
    -	8> v(7) == v(6).
    +	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").
    +	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
    +	249>>
    +	8> v(7) == v(6).
     	true
     	9>

    Retired cipher names

    This table lists the retired cipher names in the first column and suggests names to replace them with in the second column.

    The new names follows the OpenSSL libcrypto names. The format is /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.html 2026-04-20 17:48:31.705627635 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto.html 2026-04-20 17:48:31.709627660 +0000 @@ -3813,7 +3813,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 @@ -6687,9 +6687,9 @@

    Create a generator for rand and save it in the process dictionary.

    Equivalent to rand_seed_s/0 but also saves the returned state object (generator) in the process dictionary. That is, -it is equivalent to rand:seed(rand_seed_s()).

    See rand:seed/1 and rand_seed_s/0.

    Example

    _ = crypto:rand_seed(),
    -IntegerValue = rand:uniform(42), % 1 .. 42
    -FloatValue = rand:uniform().     % [0.0; 1.0)

    Note

    Note that when using the process dictionary for cryptographically +it is equivalent to rand:seed(rand_seed_s()).

    See rand:seed/1 and rand_seed_s/0.

    Example

    _ = crypto:rand_seed(),
    +IntegerValue = rand:uniform(42), % 1 .. 42
    +FloatValue = rand:uniform().     % [0.0; 1.0)

    Note

    Note that when using the process dictionary for cryptographically secure random numbers one has to ensure that no code called between initializing the generator and between generating numbers accidentally alters the generator state in the process dictionary.

    The safe approach is to use the rand functions that @@ -6729,9 +6729,9 @@ and save it in the process dictionary.

    Equivalent rand_seed_alg_s/1 but also saves the returned state object (generator) in the process dictionary. That is, it is equivalent to rand:seed(rand_seed_alg_s(Alg)).

    See rand:seed/1 and rand_seed_alg_s/1. -Note the warning about the usage of the process dictionary in rand_seed/0.

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    -IntegerValue = rand:uniform(42), % 1 .. 42
    -FloatValue = rand:uniform().     % [0.0; 1.0)
    +Note the warning about the usage of the process dictionary in rand_seed/0.

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    +IntegerValue = rand:uniform(42), % 1 .. 42
    +FloatValue = rand:uniform().     % [0.0; 1.0)
    @@ -6766,12 +6766,12 @@ and save it in the process dictionary.

    Equivalent to rand_seed_alg_s/2 but also saves the returned state object (generator) in the process dictionary. That is, it is equivalent to rand:seed(rand_seed_alg_s(Alg, Seed)).

    See rand:seed/1 and rand_seed_alg_s/2. -Note the warning about the usage of the process dictionary in rand_seed/0.

    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
    +Note the warning about the usage of the process dictionary in rand_seed/0.

    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
    @@ -6805,9 +6805,9 @@ which when used by the rand functions produce cryptographically strong random number.

    See also rand:seed_s/1 and for example rand:uniform_s/2.

    If Alg is crypto this function is equivalent to rand_seed_s/0.

    If Alg is crypto_cache the returned generator fetches random data with OpenSSL's RAND_bytes and caches it as 56 bit numbers -which makes calculations fast on 64 bit machines.

    Example

    S0 = crypto:rand_seed_alg_s(crypto_cache),
    -{IntegerValue, S1} = rand:uniform(42, S0), % 1 .. 42
    -{FloatValue, S2} = rand:uniform(S1).       % [0.0; 1.0)

    May cause the rand functions using this state object +which makes calculations fast on 64 bit machines.

    Example

    S0 = crypto:rand_seed_alg_s(crypto_cache),
    +{IntegerValue, S1} = rand:uniform(42, S0), % 1 .. 42
    +{FloatValue, S2} = rand:uniform(S1).       % [0.0; 1.0)

    May cause the rand functions using this state object to raise the exception error:low_entropy in case the random generator failed due to lack of secure "randomness".

    The cache size can be changed from its default value using the crypto app's configuration parameter rand_cache_size.

    Note

    The state returned from this function cannot be used to get a reproducible @@ -6856,12 +6856,12 @@ for the same seed.

    • If you need cryptographically strong random numbers use rand_seed_alg_s/1 with Alg =:= crypto or Alg =:= crypto_cache.
    • If you need to be able to repeat the sequence use this function with Alg =:= crypto_aes.
    • If you do not need the statistical quality of this function, there are faster -algorithms in the rand module.

    Example

    S0 = crypto:rand_seed_alg_s(crypto_aes, "my seed"),
    -{IntegerValue, S1} = rand:uniform(42, S0), % 1 .. 42
    -{FloatValue, S2 = rand:uniform(S1),        % [0.0; 1.0)
    -S3 = crypto:rand_seed_alg_s(crypto_aes, "my seed"),
    -{IntegerValue, S4} = rand:uniform(42, S3), % Same values
    -{FloatValue, S5} = rand:uniform(S4).       % again

    Thanks to the used generator the state object supports the +algorithms in the rand module.

    Example

    S0 = crypto:rand_seed_alg_s(crypto_aes, "my seed"),
    +{IntegerValue, S1} = rand:uniform(42, S0), % 1 .. 42
    +{FloatValue, S2 = rand:uniform(S1),        % [0.0; 1.0)
    +S3 = crypto:rand_seed_alg_s(crypto_aes, "my seed"),
    +{IntegerValue, S4} = rand:uniform(42, S3), % Same values
    +{FloatValue, S5} = rand:uniform(S4).       % again

    Thanks to the used generator the state object supports the rand:jump/0,1 function with distance 2^512.

    Numbers are generated in batches and cached for speed reasons. The cache size can be changed from its default value using the crypto app's configuration parameter rand_cache_size.

    @@ -6898,8 +6898,8 @@ which when used by the rand functions produce cryptographically strong random numbers (based on OpenSSL's BN_rand_range function). See also rand:seed_s/1, and for example -rand:uniform_s/2.

    Example

    S0 = crypto:rand_seed_s(),
    -{RandomInteger, S1} = rand:uniform_s(1000, S0).

    May cause the rand functions using this state object +rand:uniform_s/2.

    Example

    S0 = crypto:rand_seed_s(),
    +{RandomInteger, S1} = rand:uniform_s(1000, S0).

    May cause the rand functions using this state object to raise the exception error:low_entropy in case the random generator failed due to lack of secure "randomness".

    Note

    The state returned from this function cannot be used to get a reproducible random sequence as from the other rand functions, since that would @@ -7527,14 +7527,14 @@ -

    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",
       fips_provider_available => true,
    -  fips_provider_buildinfo => "3.0.0"}
    +  fips_provider_buildinfo => "3.0.0"}
     2>

    More association types than documented may be present in the map. Some of the associations (like fips) may be absent if not supported.

    @@ -7603,8 +7603,8 @@

    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.

    @@ -7720,7 +7720,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto_app.html 2026-04-20 17:48:31.741627865 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/crypto_app.html 2026-04-20 17:48:31.741627865 +0000 @@ -157,7 +157,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_keys.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_keys.html 2026-04-20 17:48:31.781628121 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_keys.html 2026-04-20 17:48:31.781628121 +0000 @@ -107,30 +107,30 @@ string or binary and depends on the Engine loaded
  • an Erlang map is constructed with the Engine reference, the key reference and possibly a key passphrase if needed by the Engine. See the Reference Manual for details of the map.
  • Use Cases

    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).
    -<<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,...>>

    Verify with an engine stored public key

    Here the signature and message in the last example is verifyed using the public +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,...>>

    Verify with an engine stored public key

    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>

    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).
    -<<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
    +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,...>>
    +  223,...>>
     8>
    @@ -183,7 +183,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_load.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_load.html 2026-04-20 17:48:31.809628301 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/engine_load.html 2026-04-20 17:48:31.805628274 +0000 @@ -98,32 +98,32 @@ performance over its software-based counterpart, which is known as cryptographic acceleration.

    Note

    The file name requirement on the engine dynamic library can differ between SSL versions.

    Use Cases

    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}

    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}

    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]).
    +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}

    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]).
     ok

    Load with the ensure loaded function

    This function makes sure the engine is loaded just once and the ID is added to the internal engine list of OpenSSL. The following calls to the function will -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).
    +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).
    - ok

    List all engines currently loaded

     8> crypto:engine_list().
    -[<<"dynamic">>, <<"MD5">>]
    +engine.

     6> crypto:engine_unload(Engine).
    + ok

    List all engines currently loaded

     8> crypto:engine_list().
    +[<<"dynamic">>, <<"MD5">>]
    @@ -175,7 +175,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/fips.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/fips.html 2026-04-20 17:48:31.841628505 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/fips.html 2026-04-20 17:48:31.845628531 +0000 @@ -198,7 +198,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/new_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/new_api.html 2026-04-20 17:48:31.881628762 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/new_api.html 2026-04-20 17:48:31.877628735 +0000 @@ -114,85 +114,85 @@ 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> application:start(crypto).
    +to divide the plain text and cipher text differently for some ciphers:

    	1> application:start(crypto).
     	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
    +	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
     	#Ref<0.3768901617.1128660993.124047>
    -	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">>).
    -	<<16,79,94,115,234,197,94,253,16,144,151,41>>
    +	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">>).
    +	<<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>>).
    -	<<"First b">>
    -	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>>).
    -	<<"s">>
    +	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>>).
    +	<<"ytesSecond byte">>
    +	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.

    Example of crypto_one_time/5

    The same example as in the previous section, -but now with one call to crypto_one_time/5:

    	1> Key = <<1:128>>.
    -	<<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).
    -	<<67,44,216,166,25,130,203,5,66,6,162,16,79,94,115,234,
    -	197,94,253,16,144,151,41>>
    +but now with one call to crypto_one_time/5:

    	1> Key = <<1:128>>.
    +	<<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).
    +	<<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 single binary: <<"First bytesSecond bytes">>.

    Example of crypto_one_time_aead/6

    The same example as in the previous section, but now with one -call to crypto_one_time_aead/6:

    	1> Key = <<1:128>>.
    -	<<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> 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,
    -	192,103,176,90,104,15,71,158>>,
    -	<<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>}
    +call to crypto_one_time_aead/6:

    	1> Key = <<1:128>>.
    +	<<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> 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,
    +	192,103,176,90,104,15,71,158>>,
    +	<<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">>.

    Example of mac_init mac_update and mac_final

    	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).
    +single binary: <<"First bytesSecond bytes">>.

    Example of mac_init mac_update and mac_final

    	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).
     	#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).
    -	<<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").
    -	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
    -	249>>
    -	8> v(7) == v(6).
    +	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").
    +	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
    +	249>>
    +	8> v(7) == v(6).
     	true
     	9>

    Retired cipher names

    This table lists the retired cipher names in the first column and suggests names to replace them with in the second column.

    The new names follows the OpenSSL libcrypto names. The format is @@ -244,7 +244,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/notes.html 2026-04-20 17:48:31.929629068 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/notes.html 2026-04-20 17:48:31.929629068 +0000 @@ -549,7 +549,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/search.html 2026-04-20 17:48:31.965629299 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.8.3/doc/html/search.html 2026-04-20 17:48:31.965629299 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 2026-04-20 17:48:31.993629479 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 2026-04-20 17:48:31.993629479 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 2026-04-20 17:48:32.021629658 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 2026-04-20 17:48:32.021629658 +0000 @@ -136,7 +136,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/content.opf 2026-04-20 15:19:43.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/content.opf 2042-05-23 04:38:31.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> debugger - 6.0.3 - urn:uuid:aa8a54e7-5ae7-4e91-5d91-835aae1b1b7b + urn:uuid:bca6047b-1689-7308-066b-48a7dc34a597 en - 2026-04-20T15:19:43Z + 2042-05-23T04:38:31Z /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml 2026-04-20 15:19:43.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml 2042-05-23 04:38:31.000000000 +0000 @@ -38,12 +38,12 @@ window, View Module window, or Attach Process window.

    Executable Lines

    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;
    @@ -64,13 +64,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
    @@ -79,12 +79,12 @@
     right-click the Module entry.

    To bring up all functions of the module in the listbox, click the OK button (or press the Return or Tab key) when a module name has been specified,.

    Stack Trace

    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 /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/int.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/int.xhtml 2026-04-20 15:19:43.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/int.xhtml 2042-05-23 04:38:31.000000000 +0000 @@ -563,7 +563,7 @@

    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.

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/i.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/i.xhtml 2026-04-20 15:19:43.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/i.xhtml 2042-05-23 04:38:31.000000000 +0000 @@ -28,9 +28,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
    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/notes.xhtml 2026-04-20 15:19:43.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/notes.xhtml 2042-05-23 04:38:31.000000000 +0000 @@ -17,24 +17,24 @@

    Debugger Release Notes

    -

    This document describes the changes made to the Debugger application.

    Debugger 6.0.3

    Fixed Bugs and Malfunctions

    • Fixed unbound error in interpreted modules

      Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

    Debugger 6.0.2

    Fixed Bugs and Malfunctions

    • Fixed debugger priv dir, which was removed and caused crashes when the icons could not be found.

      Own Id: OTP-19687 Aux Id: PR-9994, GH-9858

    Debugger 6.0.1

    Fixed Bugs and Malfunctions

    • Restore deleted icon so that debugger does not crash on startup.

      Own Id: OTP-19641 Aux Id: GH-9858, PR-9861

    Debugger 6.0

    Fixed Bugs and Malfunctions

    • Error handling has been improved when modules fail to load.

      Own Id: OTP-19484 Aux Id: GH-7819, PR-9399

    Improvements and New Features

    • Comprehensions have been extended with zip generators according to EEP 73.

      Example:

      1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
      -[5,7,9]

      Own Id: OTP-19184 Aux Id: PR-8926

    • New strict generators have been added for comprehensions.

      The currently existing generators are "relaxed": they ignore terms in the +

      This document describes the changes made to the Debugger application.

      Debugger 6.0.3

      Fixed Bugs and Malfunctions

      • Fixed unbound error in interpreted modules

        Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

      Debugger 6.0.2

      Fixed Bugs and Malfunctions

      • Fixed debugger priv dir, which was removed and caused crashes when the icons could not be found.

        Own Id: OTP-19687 Aux Id: PR-9994, GH-9858

      Debugger 6.0.1

      Fixed Bugs and Malfunctions

      • Restore deleted icon so that debugger does not crash on startup.

        Own Id: OTP-19641 Aux Id: GH-9858, PR-9861

      Debugger 6.0

      Fixed Bugs and Malfunctions

      • Error handling has been improved when modules fail to load.

        Own Id: OTP-19484 Aux Id: GH-7819, PR-9399

      Improvements and New Features

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        +[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • New strict generators have been added for comprehensions.

        The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

        The new strict generators fail with exception badmatch if a pattern doesn't match.

        Examples:

        Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        -[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        +[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
        +that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
         ** exception error: no match of right hand side value ok

        Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

        The strict version for bitstring generators is <:=.

        Own Id: OTP-19317 Aux Id: PR-8625

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Debugger 5.5.0.1

      Fixed Bugs and Malfunctions

      • Fix unbound error in interpreted modules

        Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

      Debugger 5.5

      Fixed Bugs and Malfunctions

      • 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

      Improvements and New Features

      • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

        Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

      Debugger 5.4

      Fixed Bugs and Malfunctions

      • The dependencies for this application are now listed in the app file.

        Own Id: OTP-18831 Aux Id: PR-7441

      Improvements and New Features

      • Type specs have been added to all API functions.

        Own Id: OTP-18819 Aux Id: PR-7781

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • The Debugger now use a trace session for its internal use of tracing to avoid interfering with the user's use of tracing.

        Own Id: OTP-19074 Aux Id: PR-8389

      Debugger 5.3.4

      Fixed Bugs and Malfunctions

      • Guards with nested record expression could wrongly evaluate to false.

        Own Id: OTP-18958 Aux Id: GH-8120, PR-8275

      Debugger 5.3.3

      Fixed Bugs and Malfunctions

      • Map comprehensions now work in the Debugger.

        Own Id: OTP-18888 Aux Id: GH-7914

      Debugger 5.3.2

      Fixed Bugs and Malfunctions

      • The call int:no_break(Module) did not remove any breakpoints.

        Own Id: OTP-18644 Aux Id: GH-7336

      • The maybe expression is now supported in the Debugger.

        Own Id: OTP-18740 Aux Id: GH-7410, PR-7599

      Debugger 5.3.1.3

      Fixed Bugs and Malfunctions

      • Guards with nested record expression could wrongly evaluate to false.

        Own Id: OTP-18958 Aux Id: GH-8120, PR-8275

      Debugger 5.3.1.2

      Fixed Bugs and Malfunctions

      • The maybe expression is now supported in the Debugger.

        Own Id: OTP-18740 Aux Id: GH-7410, PR-7599

      Debugger 5.3.1.1

      Fixed Bugs and Malfunctions

      • The call int:no_break(Module) did not remove any breakpoints.

        Own Id: OTP-18644 Aux Id: GH-7336

      Debugger 5.3.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that would cause analysis to crash.

        Own Id: OTP-18372 Aux Id: GH-6580

      Debugger 5.3

      Improvements and New Features

      • The configuration files .erlang, .erlang.cookie and .erlang.crypt can now be located in the XDG /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html 2026-04-20 17:48:32.233631015 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html 2026-04-20 17:48:32.233631015 +0000 @@ -312,7 +312,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 2026-04-20 17:48:32.261631194 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 2026-04-20 17:48:32.265631220 +0000 @@ -110,12 +110,12 @@ window, View Module window, or Attach Process window.

        Executable Lines

        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;
        @@ -136,13 +136,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]).
        -
        -c_break(Bindings) ->
        -    case int:get_binding('N', Bindings) of
        -        {value, 3} ->
        +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} ->
                     true;
                 _ ->
                     false
        @@ -151,12 +151,12 @@
         right-click the Module entry.

        To bring up all functions of the module in the listbox, click the OK button (or press the Return or Tab key) when a module name has been specified,.

        Stack Trace

        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 @@ -326,7 +326,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html 2026-04-20 17:48:32.309631502 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html 2026-04-20 17:48:32.317631553 +0000 @@ -99,9 +99,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
    @@ -1315,7 +1315,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 2026-04-20 17:48:32.353631784 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 2026-04-20 17:48:32.353631784 +0000 @@ -645,7 +645,7 @@

    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.

    @@ -1420,7 +1420,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html 2026-04-20 17:48:32.381631963 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html 2026-04-20 17:48:32.381631963 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html 2026-04-20 17:48:32.425632245 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html 2026-04-20 17:48:32.425632245 +0000 @@ -89,24 +89,24 @@ -

    This document describes the changes made to the Debugger application.

    Debugger 6.0.3

    Fixed Bugs and Malfunctions

    • Fixed unbound error in interpreted modules

      Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

    Debugger 6.0.2

    Fixed Bugs and Malfunctions

    • Fixed debugger priv dir, which was removed and caused crashes when the icons could not be found.

      Own Id: OTP-19687 Aux Id: PR-9994, GH-9858

    Debugger 6.0.1

    Fixed Bugs and Malfunctions

    • Restore deleted icon so that debugger does not crash on startup.

      Own Id: OTP-19641 Aux Id: GH-9858, PR-9861

    Debugger 6.0

    Fixed Bugs and Malfunctions

    • Error handling has been improved when modules fail to load.

      Own Id: OTP-19484 Aux Id: GH-7819, PR-9399

    Improvements and New Features

    • Comprehensions have been extended with zip generators according to EEP 73.

      Example:

      1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
      -[5,7,9]

      Own Id: OTP-19184 Aux Id: PR-8926

    • New strict generators have been added for comprehensions.

      The currently existing generators are "relaxed": they ignore terms in the +

      This document describes the changes made to the Debugger application.

      Debugger 6.0.3

      Fixed Bugs and Malfunctions

      • Fixed unbound error in interpreted modules

        Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

      Debugger 6.0.2

      Fixed Bugs and Malfunctions

      • Fixed debugger priv dir, which was removed and caused crashes when the icons could not be found.

        Own Id: OTP-19687 Aux Id: PR-9994, GH-9858

      Debugger 6.0.1

      Fixed Bugs and Malfunctions

      • Restore deleted icon so that debugger does not crash on startup.

        Own Id: OTP-19641 Aux Id: GH-9858, PR-9861

      Debugger 6.0

      Fixed Bugs and Malfunctions

      • Error handling has been improved when modules fail to load.

        Own Id: OTP-19484 Aux Id: GH-7819, PR-9399

      Improvements and New Features

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        +[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • New strict generators have been added for comprehensions.

        The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

        The new strict generators fail with exception badmatch if a pattern doesn't match.

        Examples:

        Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        -[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        +[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
        +that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
         ** exception error: no match of right hand side value ok

        Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

        The strict version for bitstring generators is <:=.

        Own Id: OTP-19317 Aux Id: PR-8625

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Debugger 5.5.0.1

      Fixed Bugs and Malfunctions

      • Fix unbound error in interpreted modules

        Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

      Debugger 5.5

      Fixed Bugs and Malfunctions

      • 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

      Improvements and New Features

      • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

        Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

      Debugger 5.4

      Fixed Bugs and Malfunctions

      • The dependencies for this application are now listed in the app file.

        Own Id: OTP-18831 Aux Id: PR-7441

      Improvements and New Features

      • Type specs have been added to all API functions.

        Own Id: OTP-18819 Aux Id: PR-7781

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • The Debugger now use a trace session for its internal use of tracing to avoid interfering with the user's use of tracing.

        Own Id: OTP-19074 Aux Id: PR-8389

      Debugger 5.3.4

      Fixed Bugs and Malfunctions

      • Guards with nested record expression could wrongly evaluate to false.

        Own Id: OTP-18958 Aux Id: GH-8120, PR-8275

      Debugger 5.3.3

      Fixed Bugs and Malfunctions

      • Map comprehensions now work in the Debugger.

        Own Id: OTP-18888 Aux Id: GH-7914

      Debugger 5.3.2

      Fixed Bugs and Malfunctions

      • The call int:no_break(Module) did not remove any breakpoints.

        Own Id: OTP-18644 Aux Id: GH-7336

      • The maybe expression is now supported in the Debugger.

        Own Id: OTP-18740 Aux Id: GH-7410, PR-7599

      Debugger 5.3.1.3

      Fixed Bugs and Malfunctions

      • Guards with nested record expression could wrongly evaluate to false.

        Own Id: OTP-18958 Aux Id: GH-8120, PR-8275

      Debugger 5.3.1.2

      Fixed Bugs and Malfunctions

      • The maybe expression is now supported in the Debugger.

        Own Id: OTP-18740 Aux Id: GH-7410, PR-7599

      Debugger 5.3.1.1

      Fixed Bugs and Malfunctions

      • The call int:no_break(Module) did not remove any breakpoints.

        Own Id: OTP-18644 Aux Id: GH-7336

      Debugger 5.3.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that would cause analysis to crash.

        Own Id: OTP-18372 Aux Id: GH-6580

      Debugger 5.3

      Improvements and New Features

      • The configuration files .erlang, .erlang.cookie and .erlang.crypt can now be located in the XDG @@ -235,7 +235,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html 2026-04-20 17:48:32.449632399 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html 2026-04-20 17:48:32.449632399 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html 2026-04-20 17:48:32.473632552 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html 2026-04-20 17:48:32.477632578 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 2026-04-20 17:48:32.509632783 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 2026-04-20 17:48:32.509632783 +0000 @@ -118,7 +118,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/content.opf 2026-04-20 15:20:20.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/content.opf 2042-05-23 04:39:11.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> dialyzer - 5.4 - urn:uuid:9a4b4883-c8d8-f4eb-84e6-50aeb19202fe + urn:uuid:84f87e1e-4518-2f9c-3da4-d3e3dac79029 en - 2026-04-20T15:20:20Z + 2042-05-23T04:39:11Z /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml 2026-04-20 15:20:20.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml 2042-05-23 04:39:11.000000000 +0000 @@ -59,29 +59,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) ->
    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml	2026-04-20 15:20:20.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml	2042-05-23 04:39:11.000000000 +0000
    @@ -146,21 +146,21 @@
     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"]}.

    Requesting or Suppressing Warnings in Source Files

    Attribute -dialyzer() can be used for turning off warnings in a module by +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"]}.

    Requesting or Suppressing Warnings in Source Files

    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).
    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/notes.xhtml 2026-04-20 15:20:20.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/notes.xhtml 2042-05-23 04:39:11.000000000 +0000 @@ -17,9 +17,9 @@

    Dialyzer Release Notes

    -

    This document describes the changes made to the Dialyzer application.

    Dialyzer 5.4

    Fixed Bugs and Malfunctions

    • The -Wno_unknown option will now prevent a warning being printed to standard output when the command line interface is used.

      Own Id: OTP-19262 Aux Id: GH-8822, PR-8885

    Improvements and New Features

    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

      -type meter() :: integer().
      --type foot() :: integer().

      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

      -nominal meter() :: integer().
      --nominal foot() :: integer().

      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

      Own Id: OTP-19364 Aux Id: PR-9079

    • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

      Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    Dialyzer 5.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash caused by the use of opaque types.

      Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

    Dialyzer 5.3

    Fixed Bugs and Malfunctions

    • Fixed type inference for erlang:system_info(logical_processors).

      Own Id: OTP-19307 Aux Id: PR-8954, GH-8948

    • Dialyzer would crash when attempting to analyze a module compiled with the line_coverage option.

      Own Id: OTP-19344 Aux Id: GH-9027, PR-9034

    Improvements and New Features

    • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

      Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

    Dialyzer 5.2.1

    Fixed Bugs and Malfunctions

    • 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

    Dialyzer 5.2

    Improvements and New Features

    • The --gui option for Dialyzer has been removed.

      Own Id: OTP-18667 Aux Id: PR-7443

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    Dialyzer 5.1.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash caused by the use of opaque types.

      Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

    Dialyzer 5.1.3

    Fixed Bugs and Malfunctions

    • Fixed an issue with bitstring type inference on segments following UTF-8/16/32 segments.

      Own Id: OTP-19068 Aux Id: GH-8383

    Dialyzer 5.1.2

    Fixed Bugs and Malfunctions

    • Fix dialyzer --output flag to work. This option was accidentally removed in +

      This document describes the changes made to the Dialyzer application.

      Dialyzer 5.4

      Fixed Bugs and Malfunctions

      • The -Wno_unknown option will now prevent a warning being printed to standard output when the command line interface is used.

        Own Id: OTP-19262 Aux Id: GH-8822, PR-8885

      Improvements and New Features

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        +-type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        +-nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

        Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Dialyzer 5.3.1

      Fixed Bugs and Malfunctions

      • Fixed a crash caused by the use of opaque types.

        Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

      Dialyzer 5.3

      Fixed Bugs and Malfunctions

      • Fixed type inference for erlang:system_info(logical_processors).

        Own Id: OTP-19307 Aux Id: PR-8954, GH-8948

      • Dialyzer would crash when attempting to analyze a module compiled with the line_coverage option.

        Own Id: OTP-19344 Aux Id: GH-9027, PR-9034

      Improvements and New Features

      • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

        Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

      Dialyzer 5.2.1

      Fixed Bugs and Malfunctions

      • 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

      Dialyzer 5.2

      Improvements and New Features

      • The --gui option for Dialyzer has been removed.

        Own Id: OTP-18667 Aux Id: PR-7443

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      Dialyzer 5.1.3.1

      Fixed Bugs and Malfunctions

      • Fixed a crash caused by the use of opaque types.

        Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

      Dialyzer 5.1.3

      Fixed Bugs and Malfunctions

      • Fixed an issue with bitstring type inference on segments following UTF-8/16/32 segments.

        Own Id: OTP-19068 Aux Id: GH-8383

      Dialyzer 5.1.2

      Fixed Bugs and Malfunctions

      • Fix dialyzer --output flag to work. This option was accidentally removed in OTP 26.0.

        Own Id: OTP-18767 Aux Id: PR-7657

      • Fixed a crash in contract checking relating to opaque types.

        Own Id: OTP-18772 Aux Id: GH-7676

      Dialyzer 5.1.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that caused dialyzer to crash when analyzing bogus code that contained the literal atom undefined in segment sizes.

        Own Id: OTP-18629 Aux Id: GH-7325

      • Dialyzer could crash when attempting to analyze a module that defined a type called product/.

        Own Id: OTP-18738 Aux Id: GH-7584

      Dialyzer 5.1

      Fixed Bugs and Malfunctions

      • When checking behaviors, Dialyzer could generate false warning that a callback /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 2026-04-20 17:48:32.685633912 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 2026-04-20 17:48:32.685633912 +0000 @@ -217,21 +217,21 @@ 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"]}.

        Requesting or Suppressing Warnings in Source Files

        Attribute -dialyzer() can be used for turning off warnings in a module by +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"]}.

        Requesting or Suppressing Warnings in Source Files

        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).
        @@ -823,7 +823,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 2026-04-20 17:48:32.725634168 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 2026-04-20 17:48:32.725634168 +0000 @@ -131,29 +131,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) ->
    @@ -223,7 +223,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 2026-04-20 17:48:32.769634450 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 2026-04-20 17:48:32.769634450 +0000 @@ -89,9 +89,9 @@ -

    This document describes the changes made to the Dialyzer application.

    Dialyzer 5.4

    Fixed Bugs and Malfunctions

    • The -Wno_unknown option will now prevent a warning being printed to standard output when the command line interface is used.

      Own Id: OTP-19262 Aux Id: GH-8822, PR-8885

    Improvements and New Features

    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

      -type meter() :: integer().
      --type foot() :: integer().

      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

      -nominal meter() :: integer().
      --nominal foot() :: integer().

      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

      Own Id: OTP-19364 Aux Id: PR-9079

    • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

      Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    Dialyzer 5.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash caused by the use of opaque types.

      Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

    Dialyzer 5.3

    Fixed Bugs and Malfunctions

    • Fixed type inference for erlang:system_info(logical_processors).

      Own Id: OTP-19307 Aux Id: PR-8954, GH-8948

    • Dialyzer would crash when attempting to analyze a module compiled with the line_coverage option.

      Own Id: OTP-19344 Aux Id: GH-9027, PR-9034

    Improvements and New Features

    • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

      Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

    Dialyzer 5.2.1

    Fixed Bugs and Malfunctions

    • 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

    Dialyzer 5.2

    Improvements and New Features

    • The --gui option for Dialyzer has been removed.

      Own Id: OTP-18667 Aux Id: PR-7443

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    Dialyzer 5.1.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash caused by the use of opaque types.

      Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

    Dialyzer 5.1.3

    Fixed Bugs and Malfunctions

    • Fixed an issue with bitstring type inference on segments following UTF-8/16/32 segments.

      Own Id: OTP-19068 Aux Id: GH-8383

    Dialyzer 5.1.2

    Fixed Bugs and Malfunctions

    • Fix dialyzer --output flag to work. This option was accidentally removed in +

      This document describes the changes made to the Dialyzer application.

      Dialyzer 5.4

      Fixed Bugs and Malfunctions

      • The -Wno_unknown option will now prevent a warning being printed to standard output when the command line interface is used.

        Own Id: OTP-19262 Aux Id: GH-8822, PR-8885

      Improvements and New Features

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        +-type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        +-nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

        Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Dialyzer 5.3.1

      Fixed Bugs and Malfunctions

      • Fixed a crash caused by the use of opaque types.

        Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

      Dialyzer 5.3

      Fixed Bugs and Malfunctions

      • Fixed type inference for erlang:system_info(logical_processors).

        Own Id: OTP-19307 Aux Id: PR-8954, GH-8948

      • Dialyzer would crash when attempting to analyze a module compiled with the line_coverage option.

        Own Id: OTP-19344 Aux Id: GH-9027, PR-9034

      Improvements and New Features

      • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

        Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

      Dialyzer 5.2.1

      Fixed Bugs and Malfunctions

      • 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

      Dialyzer 5.2

      Improvements and New Features

      • The --gui option for Dialyzer has been removed.

        Own Id: OTP-18667 Aux Id: PR-7443

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      Dialyzer 5.1.3.1

      Fixed Bugs and Malfunctions

      • Fixed a crash caused by the use of opaque types.

        Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

      Dialyzer 5.1.3

      Fixed Bugs and Malfunctions

      • Fixed an issue with bitstring type inference on segments following UTF-8/16/32 segments.

        Own Id: OTP-19068 Aux Id: GH-8383

      Dialyzer 5.1.2

      Fixed Bugs and Malfunctions

      • Fix dialyzer --output flag to work. This option was accidentally removed in OTP 26.0.

        Own Id: OTP-18767 Aux Id: PR-7657

      • Fixed a crash in contract checking relating to opaque types.

        Own Id: OTP-18772 Aux Id: GH-7676

      Dialyzer 5.1.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that caused dialyzer to crash when analyzing bogus code that contained the literal atom undefined in segment sizes.

        Own Id: OTP-18629 Aux Id: GH-7325

      • Dialyzer could crash when attempting to analyze a module that defined a type called product/.

        Own Id: OTP-18738 Aux Id: GH-7584

      Dialyzer 5.1

      Fixed Bugs and Malfunctions

      • When checking behaviors, Dialyzer could generate false warning that a callback @@ -547,7 +547,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html 2026-04-20 17:48:32.801634654 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html 2026-04-20 17:48:32.801634654 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 2026-04-20 17:48:32.829634834 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 2026-04-20 17:48:32.833634860 +0000 @@ -153,7 +153,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/404.html 2026-04-20 17:48:32.861635039 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/404.html 2026-04-20 17:48:32.861635039 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/api-reference.html 2026-04-20 17:48:32.893635244 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/api-reference.html 2026-04-20 17:48:32.893635244 +0000 @@ -179,7 +179,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/content.opf 2026-04-20 15:20:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/content.opf 2042-05-23 04:38:58.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> diameter - 2.6.1 - urn:uuid:0f819954-145a-5789-d066-573f341a9c59 + urn:uuid:9aa14658-3c0b-de6b-8b7d-5e999487006e en - 2026-04-20T15:20:08Z + 2042-05-23T04:38:58Z /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_app.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_app.xhtml 2026-04-20 15:20:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_app.xhtml 2042-05-23 04:38:58.000000000 +0000 @@ -597,12 +597,12 @@ 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 /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml 2026-04-20 15:20:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml 2042-05-23 04:38:58.000000000 +0000 @@ -17,7 +17,7 @@

        diameterc

        -

        Compile a diameter dictionary to Erlang source.

        Synopsis

        diameterc [<options>] <file>

        Description

        The diameterc utility is used to compile a diameter +

        Compile a diameter dictionary to Erlang source.

        Synopsis

        diameterc [<options>] <file>

        Description

        The diameterc utility is used to compile a diameter dictionary file into Erlang source. The resulting source implements the interface diameter required to encode and decode the dictionary's messages and AVPs.

        The module diameter_make provides an alternate compilation interface.

        USAGE

        Compile a single dictionary file to Erlang /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml 2026-04-20 15:20:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml 2042-05-23 04:38:58.000000000 +0000 @@ -33,7 +33,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.

        DATA TYPES

        • uint8()  = 0..255

        • uint24() = 0..16777215

        • uint32() = 0..4294967295 - 8-bit, 24-bit and 32-bit integers occurring in Diameter and AVP headers.

        • avp() = #diameter_avp{} - The application-neutral representation of an AVP. Primarily intended for use by relay applications /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml 2026-04-20 15:20:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml 2042-05-23 04:38:58.000000000 +0000 @@ -208,14 +208,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()
          @@ -223,14 +223,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
          @@ -258,8 +258,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.

          SEE ALSO

          diameterc(1), diameter, diameter_app, +hrl file.

          IPFilterRule()  = OctetString()
          +QoSFilterRule() = OctetString()

          Values of these types are not currently parsed by diameter.

          SEE ALSO

          diameterc(1), diameter, diameter_app, diameter_codec, diameter_make

          /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter.xhtml 2026-04-20 15:20:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/diameter.xhtml 2042-05-23 04:38:58.000000000 +0000 @@ -117,14 +117,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. @@ -167,10 +167,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 @@ -196,20 +196,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 @@ -457,10 +457,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 @@ -2425,13 +2425,13 @@

    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.

    @@ -2475,52 +2475,52 @@ 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 /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/notes.xhtml 2026-04-20 15:20:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.epub/OEBPS/notes.xhtml 2042-05-23 04:38:58.000000000 +0000 @@ -17,9 +17,9 @@

    Release Notes

    -

    Releases are listed in reverse chronological order, most recent first.

    diameter 2.6.1

    Improvements and New Features

    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

      make release_docs places the documentation in the released code under the doc folder.

      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

      Improves the source Software-Bill-of-Materials

      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

      Own Id: OTP-19886 Aux Id: PR-10434

    diameter 2.6

    Improvements and New Features

    • Add new option 'indirect_inherits' to diameter_make:codec/2

      Own Id: OTP-19626 Aux Id: GH-8235, PR-10149

    diameter 2.5.2

    Fixed Bugs and Malfunctions

    • Added documentation about 'proxy' and 'resend' options in diameter:handle_request/3

      Own Id: OTP-19768 Aux Id: GH-10150, PR-10182

    diameter 2.5.1

    Fixed Bugs and Malfunctions

    • With this change message_cb callback will be called with updated state for processing 'ack' after 'send'.

      Own Id: OTP-19753 Aux Id: PR-9815

    diameter 2.5

    Fixed Bugs and Malfunctions

    • With this change diameter will not crash when decoding a DiameterURI without port number.

      Own Id: OTP-19620 Aux Id: PR-9321

    Improvements and New Features

    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

      -type meter() :: integer().
      --type foot() :: integer().

      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

      -nominal meter() :: integer().
      --nominal foot() :: integer().

      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

      Own Id: OTP-19364 Aux Id: PR-9079

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    • With this change diameter will not use slave terminology

      Own Id: OTP-19621 Aux Id: PR-9786

    diameter 2.4.1.1

    Fixed Bugs and Malfunctions

    • Added documentation about 'proxy' and 'resend' options in diameter:handle_request/3

      Own Id: OTP-19768 Aux Id: GH-10150, PR-10182

    diameter 2.4.1

    Fixed Bugs and Malfunctions

    • Function specs for the main API module has been updated.

      Own Id: OTP-19126 Aux Id: #8399

    • 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

    • diameter:stop_service/1 has been made more synchronous.

      Own Id: OTP-19206 Aux Id: ERIERL-1102

    diameter 2.4

    Improvements and New Features

    • -callback attributes have been added to diameter_app and diameter_transport.

      Own Id: OTP-18783 Aux Id: PR-7699

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • Pick peer can now also handle request of type #diameter_packet{}.

      Own Id: OTP-19090 Aux Id: PR-8399

    diameter 2.3.2.2

    Fixed Bugs and Malfunctions

    • Stop service has been made more synchronous.

      Own Id: OTP-19206 Aux Id: ERIERL-1102

    diameter 2.3.2.1

    Improvements and New Features

    • Pick peer can now also handle request of type #diameter_packet{}.

      Own Id: OTP-19090 Aux Id: PR-8399

    diameter 2.3.2

    Fixed Bugs and Malfunctions

    • 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.

      Own Id: OTP-19040 Aux Id: ERIERL-1060

    diameter 2.3.1

    Fixed Bugs and Malfunctions

    • Replaced unintentional Erlang Public License 1.1 headers in some files with +

      Releases are listed in reverse chronological order, most recent first.

      diameter 2.6.1

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      diameter 2.6

      Improvements and New Features

      • Add new option 'indirect_inherits' to diameter_make:codec/2

        Own Id: OTP-19626 Aux Id: GH-8235, PR-10149

      diameter 2.5.2

      Fixed Bugs and Malfunctions

      • Added documentation about 'proxy' and 'resend' options in diameter:handle_request/3

        Own Id: OTP-19768 Aux Id: GH-10150, PR-10182

      diameter 2.5.1

      Fixed Bugs and Malfunctions

      • With this change message_cb callback will be called with updated state for processing 'ack' after 'send'.

        Own Id: OTP-19753 Aux Id: PR-9815

      diameter 2.5

      Fixed Bugs and Malfunctions

      • With this change diameter will not crash when decoding a DiameterURI without port number.

        Own Id: OTP-19620 Aux Id: PR-9321

      Improvements and New Features

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        +-type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        +-nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      • With this change diameter will not use slave terminology

        Own Id: OTP-19621 Aux Id: PR-9786

      diameter 2.4.1.1

      Fixed Bugs and Malfunctions

      • Added documentation about 'proxy' and 'resend' options in diameter:handle_request/3

        Own Id: OTP-19768 Aux Id: GH-10150, PR-10182

      diameter 2.4.1

      Fixed Bugs and Malfunctions

      • Function specs for the main API module has been updated.

        Own Id: OTP-19126 Aux Id: #8399

      • 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

      • diameter:stop_service/1 has been made more synchronous.

        Own Id: OTP-19206 Aux Id: ERIERL-1102

      diameter 2.4

      Improvements and New Features

      • -callback attributes have been added to diameter_app and diameter_transport.

        Own Id: OTP-18783 Aux Id: PR-7699

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • Pick peer can now also handle request of type #diameter_packet{}.

        Own Id: OTP-19090 Aux Id: PR-8399

      diameter 2.3.2.2

      Fixed Bugs and Malfunctions

      • Stop service has been made more synchronous.

        Own Id: OTP-19206 Aux Id: ERIERL-1102

      diameter 2.3.2.1

      Improvements and New Features

      • Pick peer can now also handle request of type #diameter_packet{}.

        Own Id: OTP-19090 Aux Id: PR-8399

      diameter 2.3.2

      Fixed Bugs and Malfunctions

      • 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.

        Own Id: OTP-19040 Aux Id: ERIERL-1060

      diameter 2.3.1

      Fixed Bugs and Malfunctions

      • Replaced unintentional Erlang Public License 1.1 headers in some files with the intended Apache License 2.0 header.

        Own Id: OTP-18815 Aux Id: PR-7780

      diameter 2.3

      Improvements and New Features

      • Replace size/1 with either tuple_size/1 or byte_size/1

        The size/1 BIF is not optimized by the JIT, and its use can result in worse types for Dialyzer.

        When one knows that the value being tested must be a tuple, tuple_size/1 should always be preferred.

        When one knows that the value being tested must be a binary, /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.html 2026-04-20 17:48:33.189637138 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter.html 2026-04-20 17:48:33.181637087 +0000 @@ -188,14 +188,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. @@ -238,10 +238,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 @@ -267,20 +267,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 @@ -528,10 +528,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 @@ -2512,13 +2512,13 @@

    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.

    @@ -2562,52 +2562,52 @@ 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 /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_app.html 2026-04-20 17:48:33.225637368 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_app.html 2026-04-20 17:48:33.229637393 +0000 @@ -684,12 +684,12 @@ 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 @@ -1010,7 +1010,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_codec.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_codec.html 2026-04-20 17:48:33.269637651 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_codec.html 2026-04-20 17:48:33.265637624 +0000 @@ -104,7 +104,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.

    DATA TYPES

    • uint8()  = 0..255

    • uint24() = 0..16777215

    • uint32() = 0..4294967295 - 8-bit, 24-bit and 32-bit integers occurring in Diameter and AVP headers.

    • avp() = #diameter_avp{} - The application-neutral representation of an AVP. Primarily intended for use by relay applications @@ -514,7 +514,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_dict.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_dict.html 2026-04-20 17:48:33.309637907 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_dict.html 2026-04-20 17:48:33.309637907 +0000 @@ -280,14 +280,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()
      @@ -295,14 +295,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
      @@ -315,8 +315,8 @@
       UTF8String() can be specified as a binary, or as a nested list of binaries and
       codepoints.

      DiameterIdentity() = OctetString()

      A value must have length at least 1.

      DiameterURI() = OctetString()
                     | #href_anchor"" id="Enumerated">

      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.

      SEE ALSO

      diameterc(1), diameter, diameter_app, +hrl file.

      IPFilterRule()  = OctetString()
      +QoSFilterRule() = OctetString()

      Values of these types are not currently parsed by diameter.

      SEE ALSO

      diameterc(1), diameter, diameter_app, diameter_codec, diameter_make

      @@ -360,7 +360,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_examples.html 2026-04-20 17:48:33.337638085 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_examples.html 2026-04-20 17:48:33.341638112 +0000 @@ -141,7 +141,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_intro.html 2026-04-20 17:48:33.369638290 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_intro.html 2026-04-20 17:48:33.369638290 +0000 @@ -169,7 +169,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_make.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_make.html 2026-04-20 17:48:33.405638520 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_make.html 2026-04-20 17:48:33.405638520 +0000 @@ -498,7 +498,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_sctp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_sctp.html 2026-04-20 17:48:33.445638776 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_sctp.html 2026-04-20 17:48:33.445638776 +0000 @@ -410,7 +410,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_service.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_service.html 2026-04-20 17:48:33.477638981 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_service.html 2026-04-20 17:48:33.477638981 +0000 @@ -185,7 +185,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_soc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_soc.html 2026-04-20 17:48:33.517639238 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_soc.html 2026-04-20 17:48:33.517639238 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_tcp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_tcp.html 2026-04-20 17:48:33.553639468 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_tcp.html 2026-04-20 17:48:33.553639468 +0000 @@ -445,7 +445,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_transport.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_transport.html 2026-04-20 17:48:33.593639724 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_transport.html 2026-04-20 17:48:33.589639699 +0000 @@ -270,7 +270,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_using.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_using.html 2026-04-20 17:48:33.625639929 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameter_using.html 2026-04-20 17:48:33.625639929 +0000 @@ -141,7 +141,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameterc_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameterc_cmd.html 2026-04-20 17:48:33.653640108 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/diameterc_cmd.html 2026-04-20 17:48:33.657640133 +0000 @@ -89,7 +89,7 @@ -

      Compile a diameter dictionary to Erlang source.

      Synopsis

      diameterc [<options>] <file>

      Description

      The diameterc utility is used to compile a diameter +

      Compile a diameter dictionary to Erlang source.

      Synopsis

      diameterc [<options>] <file>

      Description

      The diameterc utility is used to compile a diameter dictionary file into Erlang source. The resulting source implements the interface diameter required to encode and decode the dictionary's messages and AVPs.

      The module diameter_make provides an alternate compilation interface.

      USAGE

      Compile a single dictionary file to Erlang @@ -157,7 +157,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/notes.html 2026-04-20 17:48:33.701640416 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/notes.html 2026-04-20 17:48:33.701640416 +0000 @@ -89,9 +89,9 @@ -

      Releases are listed in reverse chronological order, most recent first.

      diameter 2.6.1

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      diameter 2.6

      Improvements and New Features

      • Add new option 'indirect_inherits' to diameter_make:codec/2

        Own Id: OTP-19626 Aux Id: GH-8235, PR-10149

      diameter 2.5.2

      Fixed Bugs and Malfunctions

      • Added documentation about 'proxy' and 'resend' options in diameter:handle_request/3

        Own Id: OTP-19768 Aux Id: GH-10150, PR-10182

      diameter 2.5.1

      Fixed Bugs and Malfunctions

      • With this change message_cb callback will be called with updated state for processing 'ack' after 'send'.

        Own Id: OTP-19753 Aux Id: PR-9815

      diameter 2.5

      Fixed Bugs and Malfunctions

      • With this change diameter will not crash when decoding a DiameterURI without port number.

        Own Id: OTP-19620 Aux Id: PR-9321

      Improvements and New Features

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        --type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        --nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      • With this change diameter will not use slave terminology

        Own Id: OTP-19621 Aux Id: PR-9786

      diameter 2.4.1.1

      Fixed Bugs and Malfunctions

      • Added documentation about 'proxy' and 'resend' options in diameter:handle_request/3

        Own Id: OTP-19768 Aux Id: GH-10150, PR-10182

      diameter 2.4.1

      Fixed Bugs and Malfunctions

      diameter 2.4

      Improvements and New Features

      • -callback attributes have been added to diameter_app and diameter_transport.

        Own Id: OTP-18783 Aux Id: PR-7699

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • Pick peer can now also handle request of type #href_anchor"https://github.com/erlang/otp/pull/8399" title="">PR-8399

      diameter 2.3.2.2

      Fixed Bugs and Malfunctions

      • Stop service has been made more synchronous.

        Own Id: OTP-19206 Aux Id: ERIERL-1102

      diameter 2.3.2.1

      Improvements and New Features

      • Pick peer can now also handle request of type #diameter_packet{}.

        Own Id: OTP-19090 Aux Id: PR-8399

      diameter 2.3.2

      Fixed Bugs and Malfunctions

      • 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.

        Own Id: OTP-19040 Aux Id: ERIERL-1060

      diameter 2.3.1

      Fixed Bugs and Malfunctions

      • Replaced unintentional Erlang Public License 1.1 headers in some files with +

        Releases are listed in reverse chronological order, most recent first.

        diameter 2.6.1

        Improvements and New Features

        • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

          A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

          make release_docs places the documentation in the released code under the doc folder.

          make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

          The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

          Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

          Improves the source Software-Bill-of-Materials

          • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
          • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
          • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

          Own Id: OTP-19886 Aux Id: PR-10434

        diameter 2.6

        Improvements and New Features

        • Add new option 'indirect_inherits' to diameter_make:codec/2

          Own Id: OTP-19626 Aux Id: GH-8235, PR-10149

        diameter 2.5.2

        Fixed Bugs and Malfunctions

        • Added documentation about 'proxy' and 'resend' options in diameter:handle_request/3

          Own Id: OTP-19768 Aux Id: GH-10150, PR-10182

        diameter 2.5.1

        Fixed Bugs and Malfunctions

        • With this change message_cb callback will be called with updated state for processing 'ack' after 'send'.

          Own Id: OTP-19753 Aux Id: PR-9815

        diameter 2.5

        Fixed Bugs and Malfunctions

        • With this change diameter will not crash when decoding a DiameterURI without port number.

          Own Id: OTP-19620 Aux Id: PR-9321

        Improvements and New Features

        • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

          All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

          -type meter() :: integer().
          +-type foot() :: integer().

          Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

          -nominal meter() :: integer().
          +-nominal foot() :: integer().

          More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

          Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

          Own Id: OTP-19364 Aux Id: PR-9079

        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

          Own Id: OTP-19575 Aux Id: PR-9670

        • With this change diameter will not use slave terminology

          Own Id: OTP-19621 Aux Id: PR-9786

        diameter 2.4.1.1

        Fixed Bugs and Malfunctions

        • Added documentation about 'proxy' and 'resend' options in diameter:handle_request/3

          Own Id: OTP-19768 Aux Id: GH-10150, PR-10182

        diameter 2.4.1

        Fixed Bugs and Malfunctions

        diameter 2.4

        Improvements and New Features

        • -callback attributes have been added to diameter_app and diameter_transport.

          Own Id: OTP-18783 Aux Id: PR-7699

        • The documentation has been migrated to use Markdown and ExDoc.

          Own Id: OTP-18955 Aux Id: PR-8026

        • Pick peer can now also handle request of type #href_anchor"https://github.com/erlang/otp/pull/8399" title="">PR-8399

        diameter 2.3.2.2

        Fixed Bugs and Malfunctions

        • Stop service has been made more synchronous.

          Own Id: OTP-19206 Aux Id: ERIERL-1102

        diameter 2.3.2.1

        Improvements and New Features

        • Pick peer can now also handle request of type #diameter_packet{}.

          Own Id: OTP-19090 Aux Id: PR-8399

        diameter 2.3.2

        Fixed Bugs and Malfunctions

        • 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.

          Own Id: OTP-19040 Aux Id: ERIERL-1060

        diameter 2.3.1

        Fixed Bugs and Malfunctions

        • Replaced unintentional Erlang Public License 1.1 headers in some files with the intended Apache License 2.0 header.

          Own Id: OTP-18815 Aux Id: PR-7780

        diameter 2.3

        Improvements and New Features

        • Replace size/1 with either tuple_size/1 or byte_size/1

          The size/1 BIF is not optimized by the JIT, and its use can result in worse types for Dialyzer.

          When one knows that the value being tested must be a tuple, tuple_size/1 should always be preferred.

          When one knows that the value being tested must be a binary, @@ -588,7 +588,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/search.html 2026-04-20 17:48:33.733640621 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.6.1/doc/html/search.html 2026-04-20 17:48:33.733640621 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html 2026-04-20 17:48:33.761640800 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html 2026-04-20 17:48:33.761640800 +0000 @@ -106,7 +106,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html 2026-04-20 17:48:33.789640979 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html 2026-04-20 17:48:33.785640954 +0000 @@ -195,7 +195,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 2026-04-20 17:48:33.833641261 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 2026-04-20 17:48:33.833641261 +0000 @@ -601,7 +601,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          Missing in old package: /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-D25CF93C.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-D25CF93C.js /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 2026-04-20 17:48:33.877641543 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 2026-04-20 17:48:33.873641516 +0000 @@ -177,7 +177,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 2026-04-20 17:48:33.917641799 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 2026-04-20 17:48:33.921641824 +0000 @@ -1372,7 +1372,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 2026-04-20 17:48:33.949642004 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 2026-04-20 17:48:33.953642029 +0000 @@ -134,7 +134,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html 2026-04-20 17:48:33.989642260 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html 2026-04-20 17:48:33.989642260 +0000 @@ -409,7 +409,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html 2026-04-20 17:48:34.017642440 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html 2026-04-20 17:48:34.021642465 +0000 @@ -183,7 +183,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 2026-04-20 17:48:34.053642670 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 2026-04-20 17:48:34.053642670 +0000 @@ -93,8 +93,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.

          @@ -184,7 +184,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 2026-04-20 17:48:34.089642901 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 2026-04-20 17:48:34.081642849 +0000 @@ -618,7 +618,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html 2026-04-20 17:48:34.113643054 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html 2026-04-20 17:48:34.113643054 +0000 @@ -184,7 +184,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 2026-04-20 17:48:34.149643285 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 2026-04-20 17:48:34.145643259 +0000 @@ -370,7 +370,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 2026-04-20 17:48:34.181643490 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 2026-04-20 17:48:34.181643490 +0000 @@ -713,7 +713,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 2026-04-20 17:48:34.217643720 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 2026-04-20 17:48:34.217643720 +0000 @@ -414,7 +414,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 2026-04-20 17:48:34.245643898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 2026-04-20 17:48:34.245643898 +0000 @@ -323,7 +323,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 2026-04-20 17:48:34.285644156 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 2026-04-20 17:48:34.281644129 +0000 @@ -89,9 +89,9 @@ -

          This document describes the changes made to the EDoc application.

          Edoc 1.4.1

          Fixed Bugs and Malfunctions

          • Rendering of some tables in the documentation has been improved.

            Own Id: OTP-19752 Aux Id: PR-10142

          Edoc 1.4

          Fixed Bugs and Malfunctions

          • Refactor code to not rely on +nowarn_shadow_vars.

            Own Id: OTP-19574 Aux Id: PR-9678

          Improvements and New Features

          • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

            All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

            -type meter() :: integer().
            --type foot() :: integer().

            Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

            -nominal meter() :: integer().
            --nominal foot() :: integer().

            More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

            Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

            Own Id: OTP-19364 Aux Id: PR-9079

          • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

            Own Id: OTP-19575 Aux Id: PR-9670

          Edoc 1.3.2

          Fixed Bugs and Malfunctions

          • Broken links in release notes have been mended.

            Own Id: OTP-19139 Aux Id: PR-8584

          Edoc 1.3.1

          Fixed Bugs and Malfunctions

          • Fix broken makefile dependency when building HTML documentation.

            Own Id: OTP-19116 Aux Id: PR-8534

          Edoc 1.3

          Fixed Bugs and Malfunctions

          • EEP 48 doc chunks now properly include links within {@type } macros.

            Own Id: OTP-18945 Aux Id: PR-8063

          • @hidden now means hidden in EEP 48 doc chunks instead of none.

            Own Id: OTP-18946 Aux Id: PR-8063

          Improvements and New Features

          Edoc 1.2.1

          Fixed Bugs and Malfunctions

          • Emit <code> instead of <tt>.

            Own Id: OTP-18782 Aux Id: PR-7643

          Edoc 1.2

          Fixed Bugs and Malfunctions

          • Fix unused types warnings in internal edoc module.

            Own Id: OTP-17550 Aux Id: GH-5094 PR-5106

          Improvements and New Features

          • Add source file to the warning on skipped tags when generating EEP-48 style +

            This document describes the changes made to the EDoc application.

            Edoc 1.4.1

            Fixed Bugs and Malfunctions

            • Rendering of some tables in the documentation has been improved.

              Own Id: OTP-19752 Aux Id: PR-10142

            Edoc 1.4

            Fixed Bugs and Malfunctions

            • Refactor code to not rely on +nowarn_shadow_vars.

              Own Id: OTP-19574 Aux Id: PR-9678

            Improvements and New Features

            • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

              All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

              -type meter() :: integer().
              +-type foot() :: integer().

              Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

              -nominal meter() :: integer().
              +-nominal foot() :: integer().

              More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

              Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

              Own Id: OTP-19364 Aux Id: PR-9079

            • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

              Own Id: OTP-19575 Aux Id: PR-9670

            Edoc 1.3.2

            Fixed Bugs and Malfunctions

            • Broken links in release notes have been mended.

              Own Id: OTP-19139 Aux Id: PR-8584

            Edoc 1.3.1

            Fixed Bugs and Malfunctions

            • Fix broken makefile dependency when building HTML documentation.

              Own Id: OTP-19116 Aux Id: PR-8534

            Edoc 1.3

            Fixed Bugs and Malfunctions

            • EEP 48 doc chunks now properly include links within {@type } macros.

              Own Id: OTP-18945 Aux Id: PR-8063

            • @hidden now means hidden in EEP 48 doc chunks instead of none.

              Own Id: OTP-18946 Aux Id: PR-8063

            Improvements and New Features

            Edoc 1.2.1

            Fixed Bugs and Malfunctions

            • Emit <code> instead of <tt>.

              Own Id: OTP-18782 Aux Id: PR-7643

            Edoc 1.2

            Fixed Bugs and Malfunctions

            • Fix unused types warnings in internal edoc module.

              Own Id: OTP-17550 Aux Id: GH-5094 PR-5106

            Improvements and New Features

            • Add source file to the warning on skipped tags when generating EEP-48 style docs.

              Own Id: OTP-17556 Aux Id: PR-5023

            • Fix the doc chunks generators to emit documentation even if there is not module level documentation.

              Fix the doc chunks generators to respect the @hidden and @private tags properly for both modules and functions.

              Own Id: OTP-17733 Aux Id: PR-5205

            Edoc 1.1

            Improvements and New Features

            • Add option link_predefined_types that is used to create links to erlang @@ -208,7 +208,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 2026-04-20 17:48:34.317644359 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 2026-04-20 17:48:34.317644359 +0000 @@ -85,7 +85,7 @@
              - + /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 2026-04-20 17:48:34.345644540 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 2026-04-20 17:48:34.349644566 +0000 @@ -110,7 +110,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 2026-04-20 17:48:34.373644718 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 2026-04-20 17:48:34.373644718 +0000 @@ -118,7 +118,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/content.opf 2026-04-20 15:20:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/content.opf 2042-05-23 04:39:10.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> eldap - 1.2.16 - urn:uuid:f9a6a46f-7820-5834-6a69-95bc338b6c21 + urn:uuid:0c19402e-38ac-214e-65ae-25d8818b1daa en - 2026-04-20T15:20:18Z + 2042-05-23T04:39:10Z /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/eldap.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/eldap.xhtml 2026-04-20 15:20:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/eldap.xhtml 2042-05-23 04:39:10.000000000 +0000 @@ -853,13 +853,13 @@ -

              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"]}] + )
              @@ -1171,7 +1171,7 @@ -

              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.

              @@ -1389,9 +1389,9 @@ -

              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"]) ])
              @@ -1711,8 +1711,8 @@

              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]),
              @@ -1745,12 +1745,12 @@

              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
              @@ -1870,8 +1870,8 @@

              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.

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html 2026-04-20 17:48:34.509645590 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html 2026-04-20 17:48:34.509645590 +0000 @@ -940,13 +940,13 @@ -

              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"]}] + )
              @@ -1258,7 +1258,7 @@ -

              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.

              @@ -1476,9 +1476,9 @@ -

              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"]) ])
              @@ -1798,8 +1798,8 @@

              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]),
              @@ -1832,12 +1832,12 @@

              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
              @@ -1957,8 +1957,8 @@

              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.

              @@ -2198,7 +2198,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 2026-04-20 17:48:34.549645847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 2026-04-20 17:48:34.549645847 +0000 @@ -147,7 +147,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 2026-04-20 17:48:34.577646026 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 2026-04-20 17:48:34.577646026 +0000 @@ -108,7 +108,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/404.html 2026-04-20 17:48:34.609646231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/404.html 2026-04-20 17:48:34.609646231 +0000 @@ -108,7 +108,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei.html 2026-04-20 17:48:34.649646487 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/ei.html 2026-04-20 17:48:34.649646487 +0000 @@ -113,30 +113,30 @@ is not of the expected type, or the data to decode is an invalid Erlang term).

              Some of the decode functions need a pre-allocated buffer. This buffer must be allocated large enough, and for non-compound types the ei_get_type() function returns the size required (notice -that for strings an extra byte is needed for the NULL-terminator).

              Data Types

              • ei_term

                typedef struct {
                +that for strings an extra byte is needed for the NULL-terminator).

                Data Types

                • 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 @@ -146,17 +146,17 @@ process identifier.

    • erlang_port - Opaque data type representing an Erlang port identifier.

    • erlang_ref - Opaque data type representing an Erlang reference.

    • erlang_trace - Opaque data type representing an Erlang -sequential trace token.

    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 +sequential trace token.

  • 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 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

    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 +larger than b.

    Available since OTP 23.0

    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 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

    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 +larger than b.

    Available since OTP 23.0

    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 compares as less than b. Returns a value larger than 0 if a compares as -larger than b.

    Available since OTP 23.0

    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 -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 +larger than b.

    Available since OTP 23.0

    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 +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 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, @@ -165,13 +165,13 @@ combination like ERLANG_LATIN1|ERLANG_UTF8 or if *result turns out to be pure 7-bit ASCII (compatible with both Latin-1 and UTF-8).

    This function fails if the atom is too long for the buffer or if it cannot be represented with encoding want.

    This function was introduced in Erlang/OTP R16 as part of a first step to -support UTF-8 atoms.

    Available since OTP R16B

    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 +support UTF-8 atoms.

    Available since OTP R16B

    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 function, the ei library must be configured and compiled to use the GMP -library.

    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 +library.

    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 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().

    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.

    Data Types

    ei_gethostbyaddr()

    ei_gethostbyaddr_r()

    ei_gethostbyname()

    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.

    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.

    ei_gethostbyaddr()

    ei_gethostbyaddr_r()

    ei_gethostbyname()

    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.

    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.

    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.

    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 -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

    ei_connect()

    ei_xconnect()

    ei_connect_host_port()

    Available since OTP 23.0

    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 +and erl_errno is set to EIO.

    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 +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

    ei_connect()

    ei_xconnect()

    ei_connect_host_port()

    Available since OTP 23.0

    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 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 @@ -171,16 +171,16 @@ #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

    ei_connect_init()

    ei_connect_init_ussi()

    Available since OTP 21.3

    ei_connect_xinit()

    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,
    +addr.s_addr = inet_addr(IP_ADDR);
    +fd = ei_xconnect(&ec, &addr, ALIVE);

    Available since OTP 23.0

    ei_connect_init()

    ei_connect_init_ussi()

    Available since OTP 21.3

    ei_connect_xinit()

    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,
       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.

    The return value is the same as for ei_receive.

    ei_receive_msg_tmo()

    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 +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 +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.

    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");
    /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei_global.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei_global.xhtml	2026-04-20 15:18:34.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei_global.xhtml	2042-05-23 04:37:09.000000000 +0000
    @@ -22,14 +22,14 @@
     kernel:global.

    Notice that the functions below perform an RPC using an open file descriptor provided by the caller. This file descriptor must not be used for other traffic during the global operation, as the function can then receive unexpected data -and fail.

    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 +and fail.

      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 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 and count is not modified.

      Note

      It is the caller's responsibility to free the array afterwards. It has been allocated by the function with a single call to malloc(), so a single -free() is all that is necessary.

      Available since OTP 23.0

      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 -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

      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 +free() is all that is necessary.

      Available since OTP 23.0

      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 +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

      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 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 /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei_users_guide.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei_users_guide.xhtml 2026-04-20 15:18:34.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei_users_guide.xhtml 2042-05-23 04:37:09.000000000 +0000 @@ -46,25 +46,25 @@ 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.

      Building Terms

      The previous example can be simplified by using the +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.

    Building Terms

    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.

    Connecting to a Distributed Erlang Node

    To connect to a distributed Erlang node, you must first initialize the connection routine with one of the @@ -74,18 +74,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");

    Using EPMD

    erts:epmd is the Erlang Port Mapper Daemon. +if ((sockfd = ei_connect(&ec, nodename)) < 0) + fprintf(stderr, "ERROR: ei_connect failed");

    Using EPMD

    erts:epmd is the Erlang Port Mapper Daemon. Distributed Erlang nodes register with epmd on the local host to indicate to other nodes that they exist and can accept connections. epmd maintains a register of node and port number information, and when a node wishes to connect @@ -94,7 +94,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 @@ -105,13 +105,13 @@ easier to send a message to a registered name, as it avoids the problem of finding a suitable pid.

    Use one of the following two functions to receive messages:

    Example of Sending Messages

    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.

    Example of Receiving Messages

    In this example, {Pid, Something} is received.

    erlang_msg msg;
     int index = 0;
    @@ -119,24 +119,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, @@ -148,19 +148,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);
    -
    -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 +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_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.

    Using Global Names

    A C node has access to names registered through the global module in Kernel. Names can be looked up, allowing the C node to send messages to named Erlang services. C nodes can also register global names, allowing them to provide named @@ -171,32 +171,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 /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei.xhtml 2026-04-20 15:18:34.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.4/doc/html/erl_interface.epub/OEBPS/ei.xhtml 2042-05-23 04:37:09.000000000 +0000 @@ -41,30 +41,30 @@ is not of the expected type, or the data to decode is an invalid Erlang term).

    Some of the decode functions need a pre-allocated buffer. This buffer must be allocated large enough, and for non-compound types the ei_get_type() function returns the size required (notice -that for strings an extra byte is needed for the NULL-terminator).

    Data Types

    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 +sequential trace token.

    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 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

    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 +larger than b.

    Available since OTP 23.0

    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 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

    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 +larger than b.

    Available since OTP 23.0

    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 compares as less than b. Returns a value larger than 0 if a compares as -larger than b.

    Available since OTP 23.0

    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 -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 +larger than b.

    Available since OTP 23.0

    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 +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 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, @@ -93,13 +93,13 @@ combination like ERLANG_LATIN1|ERLANG_UTF8 or if *result turns out to be pure 7-bit ASCII (compatible with both Latin-1 and UTF-8).

    This function fails if the atom is too long for the buffer or if it cannot be represented with encoding want.

    This function was introduced in Erlang/OTP R16 as part of a first step to -support UTF-8 atoms.

    Available since OTP R16B

    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 +support UTF-8 atoms.

    Available since OTP R16B

    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 function, the ei library must be configured and compiled to use the GMP -library.

    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 +library.

    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 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().

    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.

    @@ -1568,7 +1568,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd.html 2026-04-20 17:48:36.589658910 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd.html 2026-04-20 17:48:36.593658935 +0000 @@ -153,36 +153,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 @@ -192,18 +192,18 @@ 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.

    URL Aliasing Properties - Requires mod_alias

    • {alias, {Alias, RealName}}
      Alias = string() and RealName = string(). alias allows documents to be +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.

    URL Aliasing Properties - Requires mod_alias

    • {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.

    CGI Properties - Requires mod_cgi

    • {script_alias, {Alias, RealName}}
      Alias = string() and RealName = string(). Have the same behavior as property alias, except that they also mark the target directory as @@ -225,9 +225,9 @@ 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"}}

    ESI Properties - Requires mod_esi

    • {erl_script_alias, {URLPath, [AllowedModule]}}
      URLPath = string() and AllowedModule = atom(). erl_script_alias marks +PATH_TRANSLATED environment variables.

      Example:

      {script, {"PUT", "/cgi-bin/put"}}

    ESI Properties - Requires mod_esi

    • {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 @@ -259,7 +259,7 @@ relative to the server_root.

    • {transfer_disk_log_size, {MaxBytes, MaxFiles}}
      MaxBytes = integer() and MaxFiles = integer(). Defines the properties of the disk_log access log file. This file is of type wrap log and max bytes is written to each file and max files is used before the first file is -truncated and reused.

    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 +truncated and reused.

    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 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 @@ -288,7 +288,7 @@ If the password is set to "DummyPassword", the password must be changed before any other API calls. To secure the authenticating data, the password must be changed after the web server is started. Otherwise it is written in clear text -in the configuration file.

    • {require_user, [string()]}
      Defines users to grant access to a given directory using a secret password.

    • {require_group, [string()]}
      Defines users to grant access to a given directory using a secret password.

    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 +in the configuration file.

    • {require_user, [string()]}
      Defines users to grant access to a given directory using a secret password.

    • {require_group, [string()]}
      Defines users to grant access to a given directory using a secret password.

    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 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 @@ -299,10 +299,10 @@ a user authenticates after this time has passed, the previous failed authentications are forgotten. Default is 30.

    • {auth_timeout, integer()}
      Specifies the number of seconds a successful user authentication is remembered. After this time has passed, the authentication is no longer -reported. Default is 30.

    Web server API data types

    The Erlang web server API data types are as follows:

    ModData = #mod{}
    +reported. Default is 30.

  • Web server API data types

    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,
    @@ -311,10 +311,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 @@ -1245,7 +1245,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_custom_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_custom_api.html 2026-04-20 17:48:36.625659140 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_custom_api.html 2026-04-20 17:48:36.629659166 +0000 @@ -284,7 +284,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_socket.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_socket.html 2026-04-20 17:48:36.661659371 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_socket.html 2026-04-20 17:48:36.657659345 +0000 @@ -280,7 +280,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_util.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_util.html 2026-04-20 17:48:36.697659601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/httpd_util.html 2026-04-20 17:48:36.701659627 +0000 @@ -948,7 +948,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/content.opf 2026-04-20 15:18:11.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/content.opf 2042-05-23 04:36:40.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> inets - 9.6.1 - urn:uuid:e551c615-c4e5-959b-341e-ff3c026a7288 + urn:uuid:f9d1a5ba-ec90-3938-567d-748b3bd4d075 en - 2026-04-20T15:18:11Z + 2042-05-23T04:36:40Z /usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/http_client.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/http_client.xhtml 2026-04-20 15:18:11.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/http_client.xhtml 2042-05-23 04:36:40.000000000 +0000 @@ -24,26 +24,26 @@ 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.

        Getting Started

        Start Inets:

        1> inets:start().
        +start a profile at application startup:

        [{inets, [{services, [{httpc, PropertyList}]}]}]

        For valid properties, see httpc.

        Getting Started

        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
        /usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/httpc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/httpc.xhtml 2026-04-20 15:18:11.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/httpc.xhtml 2042-05-23 04:36:40.000000000 +0000 @@ -938,13 +938,13 @@ {http, ReplyInfo}.

      • function/1 - Information is delivered to the receiver through calls to the provided fun Receiver(ReplyInfo).

      • {Module, Function, Args} - Information is delivered to the receiver through calls to the callback function -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 +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.

  • /usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/httpd.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/httpd.xhtml 2026-04-20 15:18:11.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.6.1/doc/html/inets.epub/OEBPS/httpd.xhtml 2042-05-23 04:36:40.000000000 +0000 @@ -82,36 +82,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 @@ -121,18 +121,18 @@ 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.

    URL Aliasing Properties - Requires mod_alias

    • {alias, {Alias, RealName}}
      Alias = string() and RealName = string(). alias allows documents to be +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.

    URL Aliasing Properties - Requires mod_alias

    • {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.

    CGI Properties - Requires mod_cgi

    • {script_alias, {Alias, RealName}}
      Alias = string() and RealName = string(). Have the same behavior as property alias, except that they also mark the target directory as @@ -154,9 +154,9 @@ 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"}}

    ESI Properties - Requires mod_esi

    • {erl_script_alias, {URLPath, [AllowedModule]}}
      URLPath = string() and AllowedModule = atom(). erl_script_alias marks +PATH_TRANSLATED environment variables.

      Example:

      {script, {"PUT", "/cgi-bin/put"}}

    ESI Properties - Requires mod_esi

    • {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 @@ -188,7 +188,7 @@ relative to the server_root.

    • {transfer_disk_log_size, {MaxBytes, MaxFiles}}
      MaxBytes = integer() and MaxFiles = integer(). Defines the properties of the disk_log access log file. This file is of type wrap log and max bytes is written to each file and max files is used before the first file is -truncated and reused.

    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 +truncated and reused.

    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 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 @@ -217,7 +217,7 @@ If the password is set to "DummyPassword", the password must be changed before any other API calls. To secure the authenticating data, the password must be changed after the web server is started. Otherwise it is written in clear text -in the configuration file.

    • {require_user, [string()]}
      Defines users to grant access to a given directory using a secret password.

    • {require_group, [string()]}
      Defines users to grant access to a given directory using a secret password.

    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 +in the configuration file.

    • {require_user, [string()]}
      Defines users to grant access to a given directory using a secret password.

    • {require_group, [string()]}
      Defines users to grant access to a given directory using a secret password.

    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 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 @@ -228,10 +228,10 @@ a user authenticates after this time has passed, the previous failed authentications are forgotten. Default is 30.

    • {auth_timeout, integer()}
      Specifies the number of seconds a successful user authentication is remembered. After this time has passed, the authentication is no longer -reported. Default is 30.

    Web server API data types

    The Erlang web server API data types are as follows:

    ModData = #mod{}
    +reported. Default is 30.

  • Web server API data types

    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,
    @@ -240,10 +240,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:

  • {sctp_events, #href_anchor"" id="option-sctp_events">

    #sctp_event_subscribe{
    +Sockets API Extensions for SCTP.

  • {sctp_events, #href_anchor"" id="option-sctp_events">

    #sctp_event_subscribe{
             data_io_event          = true | false,
             association_event      = true | false,
             address_event          = true | false,
    @@ -247,42 +247,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(),
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_tcp.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_tcp.html	2026-04-20 17:48:40.857686236 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_tcp.html	2026-04-20 17:48:40.857686236 +0000
    @@ -95,27 +95,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 @@ -148,48 +148,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 @@ -199,32 +199,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 @@ -1243,7 +1243,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_udp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_udp.html 2026-04-20 17:48:40.901686517 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/gen_udp.html 2026-04-20 17:48:40.897686492 +0000 @@ -919,8 +919,8 @@ 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 @@ -928,8 +928,8 @@ 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, 9216}.

    @@ -1214,7 +1214,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global.html 2026-04-20 17:48:40.941686774 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global.html 2026-04-20 17:48:40.941686774 +0000 @@ -1257,7 +1257,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global_group.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global_group.html 2026-04-20 17:48:40.977687005 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/global_group.html 2026-04-20 17:48:40.977687005 +0000 @@ -97,7 +97,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:

    completion_sendv(Sock, IOV) ->
    -    case socket:sendv(Sock, IOV, nowait) of
    +socket:sendv(Sock, IOV, infinity).

    completion_sendv(Sock, IOV) ->
    +    case socket:sendv(Sock, IOV, nowait) of
             ok -> % Complete success - We are done
                 ok;
    -        {completion, {CompletionInfo, RestIOV0}} ->
    +        {completion, {CompletionInfo, RestIOV0}} ->
                 %% Some of IOV was sent, but the rest, RestIOV0, was scheduled
    -            case completion_sendv_await_result(Sock,
    -                                               CompletionInfo, RestIOV0) of
    +            case completion_sendv_await_result(Sock,
    +                                               CompletionInfo, RestIOV0) of
                     ok -> % We done
                         ok;
    -                {ok, RestIOV} ->
    -                    completion_sendv(Sock, RestIOV);
    -                {error, Reason} ->
    -                    {error, {Reason, RestIOV0}}
    +                {ok, RestIOV} ->
    +                    completion_sendv(Sock, RestIOV);
    +                {error, Reason} ->
    +                    {error, {Reason, RestIOV0}}
                 end;
    -        {completion, CompletionInfo} ->
    +        {completion, CompletionInfo} ->
                 %% Nothing was sent, IOV was scheduled
    -            case completion_sendv_await_result(Sock,
    -                                               CompletionInfo, IOV) of
    +            case completion_sendv_await_result(Sock,
    +                                               CompletionInfo, IOV) of
                     ok -> % We done
                         ok;
    -                {ok, RestIOV} ->
    -                    completion_sendv(Sock, RestIOV);
    -                {error, _} = ERROR ->
    +                {ok, RestIOV} ->
    +                    completion_sendv(Sock, RestIOV);
    +                {error, _} = ERROR ->
                         ERROR
                 end;
    -        {error, {_Reason, _RestIOV}} = ERROR ->
    +        {error, {_Reason, _RestIOV}} = ERROR ->
                 %% Some part of the I/O vector was sent before an error occured
                 ERROR;
    -        {error, _} = ERROR ->
    +        {error, _} = ERROR ->
                 %% Note that 
                 ERROR
         end.
     
    -completion_sendv_await_result(Sock,
    -                              {completion_info, _, Handle},
    -                              IOV) ->
    +completion_sendv_await_result(Sock,
    +                              {completion_info, _, Handle},
    +                              IOV) ->
       receive
    -      {'$socket', Sock, abort, {Handle, Reason}} ->
    -          ?P("unexpected abort: "
    -             "~n   Reason: ~p", [Reason]),
    -          {error, {abort, Reason}};
    +      {'$socket', Sock, abort, {Handle, Reason}} ->
    +          ?P("unexpected abort: "
    +             "~n   Reason: ~p", [Reason]),
    +          {error, {abort, Reason}};
     
    -      {'$socket', Sock, completion, {Handle, {ok, Written}}} ->
    +      {'$socket', Sock, completion, {Handle, {ok, Written}}} ->
               %% Partial send; calculate rest I/O vector
    -          case socket:rest_iov(Written, IOV) of
    -              [] -> % We are done
    +          case socket:rest_iov(Written, IOV) of
    +              [] -> % We are done
                       ok;
                   RestIOV ->
    -                  {ok, RestIOV}
    +                  {ok, RestIOV}
               end;
     
    -      {'$socket', Sock, completion, {Handle, CompletionStatus}} ->
    +      {'$socket', Sock, completion, {Handle, CompletionStatus}} ->
               CompletionStatus
     
       end.

    Completion asynchronous recv

    This is a simple example function that illustrates how to use @@ -117,95 +117,95 @@ Observe that this is not an illustration how to write a asynchronous read function. Its just an example of what kind of messages and results that can be expected. The example below basically (re-) implements: -socket:recv(Sock, Sz).

    completion_recv(Sock, Sz) when (Sz > 0) ->
    -    completion_recv(Sock, Sz, []).
    +socket:recv(Sock, Sz).

    completion_recv(Sock, Sz) when (Sz > 0) ->
    +    completion_recv(Sock, Sz, []).
     
    -completion_recv(_Sock, 0, [Bin] = _Acc) ->
    -    {ok, Bin};
    -completion_recv(_Sock, 0, Acc) ->
    -    {ok, erlang:iolist_to_binary(lists:reverse(Acc))};
    -completion_recv(Sock, Sz, Acc) ->
    -    case socket:recv(Sock, Sz, nowait) of
    -        {ok, Bin} when (byte_size(Bin) =:= Sz) ->
    -            completion_recv(Sock, 0, [Bin|Acc]);
    -        {ok, Bin} ->
    -            completion_recv(Sock, Sz-byte_size(Bin), [Bin|Acc]);
    -
    -	{completion, CompletionInfo} ->
    -            case completion_recv_await_result(Sock, CompletionInfo) of
    -                {ok, Bin} ->
    -                    completion_recv(Sock, Sz-byte_size(Bin), [Bin|Acc]);
    -                {error, {_Reason, _Data}} = ERROR ->
    +completion_recv(_Sock, 0, [Bin] = _Acc) ->
    +    {ok, Bin};
    +completion_recv(_Sock, 0, Acc) ->
    +    {ok, erlang:iolist_to_binary(lists:reverse(Acc))};
    +completion_recv(Sock, Sz, Acc) ->
    +    case socket:recv(Sock, Sz, nowait) of
    +        {ok, Bin} when (byte_size(Bin) =:= Sz) ->
    +            completion_recv(Sock, 0, [Bin|Acc]);
    +        {ok, Bin} ->
    +            completion_recv(Sock, Sz-byte_size(Bin), [Bin|Acc]);
    +
    +	{completion, CompletionInfo} ->
    +            case completion_recv_await_result(Sock, CompletionInfo) of
    +                {ok, Bin} ->
    +                    completion_recv(Sock, Sz-byte_size(Bin), [Bin|Acc]);
    +                {error, {_Reason, _Data}} = ERROR ->
                         ERROR;
    -                {error, _Reason} = ERROR ->
    +                {error, _Reason} = ERROR ->
                         ERROR
     	    end;
     
    -	{error, {_Reason, _Data}} = ERROR ->
    +	{error, {_Reason, _Data}} = ERROR ->
     	    ERROR;
    -	{error, _Reason} = ERROR ->
    +	{error, _Reason} = ERROR ->
     	    ERROR
     
         end.
     
    -completion_recv_await_result(Sock,
    -                             {completion_info, _, Handle}) ->
    +completion_recv_await_result(Sock,
    +                             {completion_info, _, Handle}) ->
         receive
    -	{'$socket', Sock, abort, {Handle, Reason}} ->
    -	    {error, {abort, Reason}};
    +	{'$socket', Sock, abort, {Handle, Reason}} ->
    +	    {error, {abort, Reason}};
     
    -	{'$socket', Sock, completion, {Handle, {ok, _Bin} = OK}} ->
    +	{'$socket', Sock, completion, {Handle, {ok, _Bin} = OK}} ->
                 %% We "should" be done
     	    OK;
    -	{'$socket', Sock, completion, {Handle, {more, Bin}}} ->
    +	{'$socket', Sock, completion, {Handle, {more, Bin}}} ->
                 %% There is more to read
    -	    {ok, Bin};
    +	    {ok, Bin};
     
    -	{'$socket', Sock, completion, {Handle, CompletionStatus}} ->
    +	{'$socket', Sock, completion, {Handle, CompletionStatus}} ->
     	    CompletionStatus
     
         end.

    Echo server (and client)

    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) ->
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/socket.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/socket.xhtml	2026-04-20 15:17:53.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/socket.xhtml	2042-05-23 04:36:20.000000000 +0000
    @@ -82,8 +82,8 @@
     to only scan the messages that arrive after the reference/0
     is created.  If the message queue is large this is a big optimization.

    It is not possible to have more than one operation in progress with the same reference/0.

    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 operation in progress:

        {select, {select_info, Handle}} = socket:accept(LSock, nowait),
    -    {ok, Socket} = socket:accept(LSock, 1000),
    +message has been received it replaces the operation in progress:

        {select, {select_info, Handle}} = socket:accept(LSock, nowait),
    +    {ok, Socket} = socket:accept(LSock, 1000),
         :

    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, the accept operation @@ -110,28 +110,28 @@ (select handle) API features could be considered no longer experimental.

  • In OTP 27.0, the Windows flavored (completion handle) -API features could be considered no longer experimental.
  • Examples

    client(SAddr, SPort) ->
    -   {ok, Sock} = socket:open(inet, stream, tcp),
    -   ok = socket:connect(Sock, #{family => inet,
    +API features could be considered no longer experimental.

    Examples

    client(SAddr, SPort) ->
    +   {ok, Sock} = socket:open(inet, stream, tcp),
    +   ok = socket:connect(Sock, #{family => inet,
                                    addr   => SAddr,
    -                               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,
    +                               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,
                                  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).
    @@ -4762,7 +4762,7 @@ (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),
           :
    @@ -4926,7 +4926,7 @@

    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),
    @@ -4957,7 +4957,7 @@

    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),
    @@ -5054,7 +5054,7 @@

    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.

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/trace.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/trace.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/trace.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -34,23 +34,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

    Node Local Tracing Only

    The functions in this module only operates on the local node. That is, both the traced processes/ports as well as the tracer process/port/module must all reside on the same local node as the call is made. To trace remote nodes use dbg or @@ -1328,9 +1328,9 @@ 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 @@ -1381,10 +1381,10 @@ 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 /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel_app.html 2026-04-20 17:48:41.861692664 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel_app.html 2026-04-20 17:48:41.861692664 +0000 @@ -363,7 +363,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger.html 2026-04-20 17:48:41.925693074 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger.html 2026-04-20 17:48:41.925693074 +0000 @@ -95,20 +95,20 @@

      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,
      -      #href_anchor"ss">config => #{file => "path/to/file.log"}}}]}]}].

      For more information about:

      • the Logger facility in general, see the User's Guide.
      • how to configure Logger, see the +following in your sys.config:

        [{kernel,
        +  [{logger,
        +    [{handler, default, logger_std_h,
        +      #href_anchor"ss">config => #{file => "path/to/file.log"}}}]}]}].

        For more information about:

        Macros

        The following macros are defined in logger.hrl, which is included in a module -with the directive

            -include_lib("kernel/include/logger.hrl").
        • ?LOG_EMERGENCY(StringOrReport[,Metadata])
        • ?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])
        • ?LOG_ALERT(StringOrReport[,Metadata])
        • ?LOG_ALERT(FunOrFormat,Args[,Metadata])
        • ?LOG_CRITICAL(StringOrReport[,Metadata])
        • ?LOG_CRITICAL(FunOrFormat,Args[,Metadata])
        • ?LOG_ERROR(StringOrReport[,Metadata])
        • ?LOG_ERROR(FunOrFormat,Args[,Metadata])
        • ?LOG_WARNING(StringOrReport[,Metadata])
        • ?LOG_WARNING(FunOrFormat,Args[,Metadata])
        • ?LOG_NOTICE(StringOrReport[,Metadata])
        • ?LOG_NOTICE(FunOrFormat,Args[,Metadata])
        • ?LOG_INFO(StringOrReport[,Metadata])
        • ?LOG_INFO(FunOrFormat,Args[,Metadata])
        • ?LOG_DEBUG(StringOrReport[,Metadata])
        • ?LOG_DEBUG(FunOrFormat,Args[,Metadata])
        • ?LOG(Level,StringOrReport[,Metadata])
        • ?LOG(Level,FunOrFormat,Args[,Metadata])

        All macros expand to a call to Logger, where Level is taken from the macro +with the directive

            -include_lib("kernel/include/logger.hrl").
        • ?LOG_EMERGENCY(StringOrReport[,Metadata])
        • ?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])
        • ?LOG_ALERT(StringOrReport[,Metadata])
        • ?LOG_ALERT(FunOrFormat,Args[,Metadata])
        • ?LOG_CRITICAL(StringOrReport[,Metadata])
        • ?LOG_CRITICAL(FunOrFormat,Args[,Metadata])
        • ?LOG_ERROR(StringOrReport[,Metadata])
        • ?LOG_ERROR(FunOrFormat,Args[,Metadata])
        • ?LOG_WARNING(StringOrReport[,Metadata])
        • ?LOG_WARNING(FunOrFormat,Args[,Metadata])
        • ?LOG_NOTICE(StringOrReport[,Metadata])
        • ?LOG_NOTICE(FunOrFormat,Args[,Metadata])
        • ?LOG_INFO(StringOrReport[,Metadata])
        • ?LOG_INFO(FunOrFormat,Args[,Metadata])
        • ?LOG_DEBUG(StringOrReport[,Metadata])
        • ?LOG_DEBUG(FunOrFormat,Args[,Metadata])
        • ?LOG(Level,StringOrReport[,Metadata])
        • ?LOG(Level,FunOrFormat,Args[,Metadata])

        All macros expand to a call to Logger, where Level is taken from the macro name, or from the first argument in the case of the ?LOG macro. Location data is added to the metadata as described under the metadata/0 type definition.

        The call is wrapped in a case statement and will be evaluated only if Level is equal to or below the configured log level.

        See Also

        config, erlang, io, logger_disk_log_h, @@ -1805,26 +1805,26 @@ 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, #{}}]}]}].
      @@ -2779,8 +2779,8 @@ -

      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}).
      @@ -2843,8 +2843,8 @@

      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 .

      @@ -2937,8 +2937,8 @@

      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 .

      @@ -2970,7 +2970,7 @@

      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 .

      @@ -3002,8 +3002,8 @@

      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.

      @@ -3666,13 +3666,13 @@

      Create a log event at the given log level, with the given message to be logged and metadata.

      Example:

      %% A plain string
      -1> logger:log(info, "Hello World").
      +1> logger:log(info, "Hello World").
       %% A plain string with metadata
      -2> logger:log(debug, "Hello World", #{ meta => data }).
      +2> logger:log(debug, "Hello World", #{ meta => data }).
       %% A format string with arguments
      -3> logger:log(warning, "The roof is on ~ts",[Cause]).
      +3> logger:log(warning, "The roof is on ~ts",[Cause]).
       %% A report
      -4> logger:log(warning, #{ what => roof, cause => Cause }).

      Equivalent to log(Level, FormatOrFun, Args, #{}) if called as +4> logger:log(warning, #{ what => roof, cause => Cause }).

    Equivalent to log(Level, FormatOrFun, Args, #{}) if called as log(Level, FormatOrFun, Args).

    @@ -3711,12 +3711,12 @@ useful in scenarios when the message/metadata is very expensive to compute. This is because the fun is only evaluated when the message/metadata is actually needed, which may be not at all if the log event is not to be logged. Examples:

    %% 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.

    @@ -4093,7 +4093,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_chapter.html 2026-04-20 17:48:41.973693381 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_chapter.html 2026-04-20 17:48:41.973693381 +0000 @@ -142,7 +142,7 @@ up to the handler implementation if other processes are involved or not.

    The handlers are called in sequence, and the order is not defined.

    Logger API

    The API for logging consists of a set of macros, and a set of functions of 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.

    Log Level

    The log level indicates the severity of a event. In accordance with the Syslog @@ -152,23 +152,23 @@ must always use the atom. To compare the severity of two log levels, use logger:compare_levels/2.

    Log Message

    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.

    Metadata

    Metadata contains additional data associated with a log message. Logger inserts @@ -307,12 +307,12 @@ proxy configuration.

    Config is any (zero or more) of the following:

    • {handler, default, undefined} - Disables the default handler. This 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)

      For all other values of HandlerId, this entry adds a new handler, -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})

      for each Filter.

      FilterDefault specifies the behaviour if all primary filters return +calling

      logger:remove_handler(default)

      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)

      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})

      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 -calling

      logger:set_proxy_config(ProxyConfig)

      Only one entry of this type is allowed.

    See section Configuration Examples for +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 metadata. See the kernel(6) manual page for more information about this parameter.

  • logger_level = Level - Specifies the primary log @@ -327,31 +327,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"}}}
    -    ]}]}].

    Backwards Compatibility with error_logger

    Logger provides backwards compatibility with error_logger in the following +"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"}}}
    +    ]}]}].

    Backwards Compatibility with error_logger

    Logger provides backwards compatibility with error_logger in the following ways:

    • API for Logging - The error_logger API still exists, but should only be used by legacy code. It will be removed in a later release.

      Calls to error_logger:error_report/1,2, error_logger:error_msg/1,2, and corresponding @@ -387,9 +387,9 @@ 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:

      #href_anchor"ss">level => info,
      +error_logger as a handler to Logger, with the following configuration:

      #href_anchor"ss">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.

    Error Handling

    Logger does, to a certain extent, check its input data before forwarding a log event to filters and handlers. It does, however, not evaluate report callbacks, @@ -402,20 +402,20 @@ about report callbacks and valid forms of log messages.

    Example: Add a handler to log info events to file

    When starting an Erlang node, the default behaviour is that all log events on 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).
    +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

    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 = #href_anchor"ss">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 = #href_anchor"ss">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.

    Example: Implement a handler

    logger_handler describes the callback functions that can be implemented for a Logger handler.

    A handler callback module must export:

    • log(Log, Config)

    It can optionally also export some, or all, of the following:

    • adding_handler(Config)
    • removing_handler(Config)
    • changing_config(SetOrUpdate, OldConfig, NewConfig)
    • filter_config(Config)

    When a handler is added, by for example a call to @@ -434,48 +434,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]).
    -
    -adding_handler(Config) ->
    -    MyConfig = maps:get(config,Config,#href_anchor"ss">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).
    -
    -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}}.
    -
    -handle_call(_, _, State) ->
    -    {reply, {error, bad_request}, State}.
    -
    -handle_cast({log, LogEvent, Config}, #{fd := Fd} = State) ->
    -    do_log(Fd, LogEvent, Config),
    -    {noreply, State}.
    +single process:

    -module(myhandler2).
    +-export([adding_handler/1, removing_handler/1, log/2]).
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_cookbook.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_cookbook.html	2026-04-20 17:48:42.013693637 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_cookbook.html	2026-04-20 17:48:42.021693688 +0000
    @@ -96,13 +96,13 @@
     post
     Erlang/OTP 21's new logger is
     a great starting point.

    Note

    If you find that some common Logger usage is missing from this guide, please -open a pull request on github with the suggested addition

    Get Logger information

    1> logger:i(primary).
    +open a pull request on github with the suggested addition

    Get Logger information

    1> logger:i(primary).
     Primary configuration:
         Level: notice
         Filter Default: log
         Filters:
    -        (none)

    It is also possible to fetch the configuration using -logger:get_primary_config().

    See also

    2> logger:i(handlers).
    +        (none)

    It is also possible to fetch the configuration using +logger:get_primary_config().

    See also

    2> logger:i(handlers).
     Handler configuration:
         Id: default
             Module: logger_std_h
    @@ -119,10 +119,10 @@
                     Arg: stop
                 Id: domain
                     Fun: fun logger_filters:domain/2
    -                Arg: {log,super,[otp,sasl]}
    +                Arg: {log,super,[otp,sasl]}
                 Id: no_domain
                     Fun: fun logger_filters:domain/2
    -                Arg: {log,undefined,[]}
    +                Arg: {log,undefined,[]}
             Handler Config:
                 burst_limit_enable: true
                 burst_limit_max_count: 500
    @@ -149,69 +149,69 @@
     =PROGRESS REPORT==== 4-Nov-2019::16:33:11.746546 ===
         application: stdlib
         started_at: nonode@nohost
    -Eshell V10.5.3  (abort with ^G)
    +Eshell V10.5.3  (abort with ^G)
     1>

    Configure Logger formatter

    In order to fit better into your existing logging infrastructure Logger can format its logging messages any way you want to. Either you can use the built-in formatter, or you can build your own.

    Single line configuration

    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

    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 in kernel/include/logger.hrl.

    See also

    Configuring handlers

    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

    Debug only handler

    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 @@ -219,30 +219,30 @@ is all. Then the debug handler is configured with a filter to stop any log message that is not a debug level message.

    It is also possible to do the same changes in an already running system using the logger module. Then you do like this:

    $ erl
    -1> logger:set_handler_config(default, level, notice).
    +1> logger:set_handler_config(default, level, notice).
     ok
    -2> logger:add_handler(debug, logger_std_h, #{
    -  filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    -  config => #{ file => "log/debug.log" } }).
    +2> logger:add_handler(debug, logger_std_h, #{
    +  filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    +  config => #{ file => "log/debug.log" } }).
     ok
    -3> logger:set_primary_config(level, all).
    +3> logger:set_primary_config(level, all).
     ok

    It is important that you do not raise the primary log level before adjusting the default handler's level as otherwise your standard out may be flooded by debug log messages.

    See also

    Logging

    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
         what: http_error

    or the below if you use a single line formatter:

    2019-10-10T12:14:11.921843+02:00 error: dst: {8,8,4,4}, src: {8,8,8,8}, status: 418, what: http_error

    See also

    Report call-backs and printing of events

    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)
    @@ -251,22 +251,22 @@
     single line formatter, however you can also use a report_cb fun with 2 arguments
     where the second argument is the formatting options.

    See also

    Filters

    Filters are used to remove or change log events before they reach the handlers.

    Process filters

    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
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_disk_log_h.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_disk_log_h.html	2026-04-20 17:48:42.053693894 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_disk_log_h.html	2026-04-20 17:48:42.053693894 +0000
    @@ -129,12 +129,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"}}}]'

    See Also

    logger, logger_std_h, disk_log

    @@ -234,7 +234,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_filters.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_filters.html 2026-04-20 17:48:42.085694099 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_filters.html 2026-04-20 17:48:42.085694099 +0000 @@ -210,8 +210,8 @@ 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 @@ -226,11 +226,11 @@ 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
    @@ -275,9 +275,9 @@ 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
    @@ -373,7 +373,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_formatter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_formatter.html 2026-04-20 17:48:42.121694328 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_formatter.html 2026-04-20 17:48:42.121694328 +0000 @@ -584,7 +584,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_handler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_handler.html 2026-04-20 17:48:42.153694534 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_handler.html 2026-04-20 17:48:42.149694508 +0000 @@ -559,7 +559,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_std_h.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_std_h.html 2026-04-20 17:48:42.181694713 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/logger_std_h.html 2026-04-20 17:48:42.181694713 +0000 @@ -150,9 +150,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 @@ -253,7 +253,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net.html 2026-04-20 17:48:42.221694969 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net.html 2026-04-20 17:48:42.229695020 +0000 @@ -530,13 +530,13 @@

    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).
    @@ -1375,7 +1375,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_adm.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_adm.html 2026-04-20 17:48:42.261695225 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_adm.html 2026-04-20 17:48:42.265695250 +0000 @@ -450,8 +450,8 @@

    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}]}
    @@ -627,7 +627,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_kernel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_kernel.html 2026-04-20 17:48:42.313695558 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/net_kernel.html 2026-04-20 17:48:42.305695507 +0000 @@ -97,9 +97,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 @@ -679,13 +679,13 @@ 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 @@ -719,23 +719,23 @@ {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>
    @@ -1025,7 +1025,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/notes.html 2026-04-20 17:48:42.393696070 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/notes.html 2026-04-20 17:48:42.389696045 +0000 @@ -90,9 +90,9 @@

    This document describes the changes made to the Kernel application.

    Kernel 10.6.1

    Fixed Bugs and Malfunctions

    • A vulnerability has been resolved in the (undocumented, unsupported and unused in OTP) inet_dns_tsig module that leads to a validation bypass.

      If a request contained an error code (forbidden by spec), it was treated as a response and skipped the verification of the MAC. The user of the module would then receive an "all ok" response, depending on the use case, this could lead to such things as AXFR or UPDATE being allowed.

      The code has also been tightening up of the client side to make sure too large (bad) MAC sizes cannot be selected and the limit is the output size of the algorithm chosen.

      Own Id: OTP-20012 Aux Id: PR-10825

    Kernel 10.6

    Fixed Bugs and Malfunctions

    • The built in DNS resolver inet_res has been fixed to do a final request assuming that the request name is absolute, as customary for many DNS resolver client libraries.

      Own Id: OTP-19937 Aux Id: GH-10494, PR-10576

    Improvements and New Features

    • Added support for zstd compression in the file module.

      Own Id: OTP-19860 Aux Id: PR-10385

    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

      make release_docs places the documentation in the released code under the doc folder.

      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

      Improves the source Software-Bill-of-Materials

      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

      Own Id: OTP-19886 Aux Id: PR-10434

    Kernel 10.5

    Fixed Bugs and Malfunctions

    • Fixed a shell crash when calling io:getopts() when user_drv process is not responding/terminating

      Own Id: OTP-19812 Aux Id: PR-10283

    • logger:get_handler_config/0 will no longer crash if a logger handler is removed concurrently with that call.

      Own Id: OTP-19837 Aux Id: PR-10308, GH-9997

    • Fixed a bug in the shell that made it incorrectly output a newline after the output already containing a newline but followed by an asci escape sequence.

      Own Id: OTP-19847 Aux Id: GH-10299

    Improvements and New Features

    • Receive buffer allocation has been optimized for socket socket in that an underutilized buffers' content is copied to a freshly allocated binary of the right size instead of being reallocated.

      This optimization was already implemented for the socket:recv/1 functions, but now the same buffer stragegy is shared between all socket receive operations.

      Own Id: OTP-19794 Aux Id: PR-10231

    • Option(s) to create gen_tcp and socket sockets with protocol IPPROTO_MPTCP has been implemented.

      See functions gen_tcp:listen/2, gen_tcp:connect/4 and the type socket:protocol/0.

      Own Id: OTP-19814

    • Support for the socket options TCP_KEEPCNT, TCP_KEEPIDLE, and TCP_KEEPINTVL have been implemented for gen_tcp, as well as TCP_USER_TIMEOUT for both gen_tcp and socket.

      Own Id: OTP-19857 Aux Id: OTP-19814, PR-10390

    • Limit size of sctp_event_subscribe on Linux

      Own Id: OTP-19863 Aux Id: PR-10321

    Kernel 10.4.2

    Fixed Bugs and Malfunctions

    • Fixed a race condition when registering the standard error process.

      Own Id: OTP-19832 Aux Id: PR-10290

    Kernel 10.4.1

    Fixed Bugs and Malfunctions

    • With this change group.erl will not crash when receiving unknown message.

      Own Id: OTP-19796 Aux Id: ERIERL-1264, PR-10248

    Kernel 10.4

    Fixed Bugs and Malfunctions

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    • The internal inet_dns_tsig and inet_res modules have been fixed to TSIG verify the correct timestamp.

      In the process two undocumented error code atoms have been corrected to notauth and notzone to adhere to the DNS RFCs. Code that relied on the previous incorrect values may have to be corrected.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19756 Aux Id: PR-10146

    Improvements and New Features

    • The rudimentary DNS resolver inet_res has aqcuired 3 new functions inet_res:gethostbyname/4, inet_res;getbyname/4 and inet_res:gethostbyaddr/3, that all take an option list argument.

      This option list can be used to override the Kernel application's resolver options when calling the inet_res function directly.

      Own Id: OTP-19737 Aux Id: ERIERL-1209, PR-10112

    Kernel 10.3.2

    Fixed Bugs and Malfunctions

    • socket:sendv/3 with 'nowait' sometimes return 'completion' without 'CompletionInfo' (Windows only).

      Own Id: OTP-19661

    • prim_net nif used incorrect encoding for family resulting in non-functional address selection.

      Own Id: OTP-19674

    • socket:accept can return unexpected 'select_sent'.

      Own Id: OTP-19684 Aux Id: ERIERL-1242

    • net_kernel could be blocked for a very long time when selecting distribution module for a connection if the DNS service was slow. This prevented any new connections to be set up during that time.

      Own Id: OTP-19702 Aux Id: ERIERL-1241, PR-10029

    Improvements and New Features

    • Improved documentation of CompletionStatus for asynchronous (nowait) socket operations.

      Own Id: OTP-19670 Aux Id: PR-9930

    Kernel 10.3.1

    Fixed Bugs and Malfunctions

    • Fix bug where calling io:setopts/1 in a shell without the line_history option would always disable line_history. This bug was introduced in Erlang/OTP 28.0.

      Own Id: OTP-19645 Aux Id: GH-9863, PR-9870

    Kernel 10.3

    Fixed Bugs and Malfunctions

    • Fixed an issue where output to the shell would not print the prompt on a new line.

      Own Id: OTP-19228 Aux Id: PR-8820

    • When in shell is in -noshell mode, and in latin1 encoding mode, io requests in latin1 encoding will not be translated to unicode and back to latin1.

      Own Id: OTP-19296 Aux Id: PR-9013

    • Fixed a bug where a composing unicode character would bind to a character not available to the user and deleting that character would cause a crash.

      Own Id: OTP-19297 Aux Id: PR-9005

    • The -noshell mode has been updated to read data lazily from standard input. Before this fix any data would be read greedily which meant that Erlang could consume data not meant for it. It also meant that in order for shell:start_interactive/0 to work on Windows an API that did not support reading of Unicode characters had to be used.

      Own Id: OTP-19313 Aux Id: PR-8962, GH-8113

    • The Erlang shell no longer crashes when a shell prompt ends with an escape sequence.

      Own Id: OTP-19414 Aux Id: PR-9272

    • code:get_doc/1 now works for cover-compiled modules.

      Own Id: OTP-19513 Aux Id: PR-9433

    • An infinite loop in CNAME loop detection that can cause Out Of Memory has been fixed. This affected CNAME lookup with the internal DNS resolver.

      Own Id: OTP-19544 Aux Id: PR-9587, OTP-19545

    • The internal resolver framework has been fixed to wait with the first resolver lookup until the ERL_INETRC environment variable has been applied.

      Previously, on some platform(s) (Linux) a first lookup when figuring out the domain name was always placed on the native resolver even if ERL_INETRC was used to disable it.

      Own Id: OTP-19555 Aux Id: PR-9543

    • Fix logger:add_handler(default, ...) to correctly replay events generated during startup when the default logger is set to undefined in logger's configuration parameters.

      Own Id: OTP-19588 Aux Id: PR-9595, GH-9436

    • Enhance specs of timeout for improving documentation and dialyzer analysis.

      Own Id: OTP-19604 Aux Id: PR-9574

    • Removed the default values for SCTP send (sndbuf) and receive (recbuf) buffers.

      Own Id: OTP-19627 Aux Id: OTP-19576, GH-9722

    Improvements and New Features

    • application:load/1 slows down as the number of directories in the code path increases because the call to code:where_is_file/1 for the '.app' file must scan each directory for the app.

      code_server maintains a cache of the contents of directories in the path. Re-using that cache when searching for '.app' files in application:load/1 may improve its runtime, especially when loading multiple applications.

      Own Id: OTP-19194 Aux Id: PR-8078

    • The Erlang SSH daemon now uses the same backend to handle multiline functionality as the Erlang shell.

      Own Id: OTP-19226 Aux Id: PR-8805

    • Added support for SIGWINCH, SIGCONT, and SIGINFO signals to os:set_signal/2 where available.

      Own Id: OTP-19278 Aux Id: PR-8887, PR-8938

    • Add net_kernel:allowed/0, it returns a list of nodes that are explicitly allowed to connect to the node by calling -net_kernel:allow/1

      Own Id: OTP-19287 Aux Id: PR-8207

    • Documentation chunks (EEP-48) has been updated to include the following reserved metadata fields: behaviours, group, source_path, and source_annos. The compiler has also been updated to emit this metadata. See the EEP-48 documentation for more details.

      Own Id: OTP-19306 Aux Id: PR-8945, PR-8975

    • The erpc:call/3, erpc:call/5, erpc:multicall/3, and erpc:multicall/5 functions now also accept an option map as last argument containing the timeout and always_spawn options. The always_spawn option can be used in order to ensure that the call operation will use a newly spawned process when executing the remote call.

      Own Id: OTP-19343 Aux Id: PR-8642

    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

      -type meter() :: integer().
      --type foot() :: integer().

      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

      -nominal meter() :: integer().
      --nominal foot() :: integer().

      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

      Own Id: OTP-19364 Aux Id: PR-9079

    • Improved open debug for gen_tcp_socket (connect and listen) and gen_udp_socket (open).

      Own Id: OTP-19386

    • io:standard_error/0 has been updated to write via a NIF API instead of a port. This allows it to access the dirty-scheduler pool and make sure that writes have been written to the OSs stderr when io:format/3 and equivalent return.

      Own Id: OTP-19401 Aux Id: PR-9116

    • Added the option exception_on_failure to os:cmd/2 to make os:cmd/2 raise an exception if the command fails to execute.

      Own Id: OTP-19404 Aux Id: PR-9082

    • A socket option {otp,select_read} has been added that enables keeping a socket in the VM select/poll set between calls to recv functions.

      This increases throughput by reducing the number of calls to said functions.

      Own Id: OTP-19451 Aux Id: PR-9344

    • Add a configure chapter to the socket usage guide

      Own Id: OTP-19522 Aux Id: PR-9508

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    • Increase the default inet-driver buffer size(s). Also introduce kernel parameters for UDP and SCTP to change the sizes when creating (those) sockets.

      Own Id: OTP-19576

    • An experimental API for a native debugger has been added. The main components are the following:

      • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

      • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

      • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

      • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

      Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

    Kernel 10.2.7.3

    Improvements and New Features

    Kernel 10.2.7.2

    Fixed Bugs and Malfunctions

    • socket:sendv/3 with 'nowait' sometimes return 'completion' without 'CompletionInfo' (Windows only).

      Own Id: OTP-19661

    • socket:accept can return unexpected 'select_sent'.

      Own Id: OTP-19684 Aux Id: ERIERL-1242

    • net_kernel could be blocked for a very long time when selecting distribution module for a connection if the DNS service was slow. This prevented any new connections to be set up during that time.

      Own Id: OTP-19702 Aux Id: ERIERL-1241, PR-10029

    Improvements and New Features

    • Improved documentation of CompletionStatus for asynchronous (nowait) socket operations.

      Own Id: OTP-19670 Aux Id: PR-9930

    Kernel 10.2.7.1

    Fixed Bugs and Malfunctions

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    Improvements and New Features

    • Document default buffer sizes

      Own Id: OTP-19640 Aux Id: GH-9722

    Kernel 10.2.7

    Fixed Bugs and Malfunctions

    • With this change, disk_log will not crash when using chunk_step/3 after log size was decreased.

      Own Id: OTP-19605 Aux Id: GH-9720, PR-9765

    • With this change, disk_log will not run into infinite loop when using chunk/2,3 after log size was decreased.

      Own Id: OTP-19608 Aux Id: GH-9707, PR-9767

    Kernel 10.2.6

    Fixed Bugs and Malfunctions

    • Fixed bug in call_memory tracing that could cause wildly incorrect reported memory values. Bug exists since OTP 27.1.

      Also fixed return type spec of trace:info/3.

      Own Id: OTP-19581 Aux Id: ERIERL-1219, PR-9706

    Kernel 10.2.5

    Fixed Bugs and Malfunctions

    • On Windows, using socket:sendv, a large IOV (size > MAX), the tail was not sent.

      Own Id: OTP-19482

    • gen_tcp connect with a sockaddr with loopback address failed.

      Own Id: OTP-19560 Aux Id: GH-9541

    • Remove debug printouts from gen_tcp_socket

      Own Id: OTP-19564

    Kernel 10.2.4

    Fixed Bugs and Malfunctions

    Kernel 10.2.3

    Fixed Bugs and Malfunctions

    • Clarify inet:setopts documentation

      Own Id: OTP-19416 Aux Id: PR-9248

    • Fix bug where log printouts would go missing when application_controller is stopping while log messages are being sent.

      This bug was introduced by OTP-19078 in Erlang/OTP 26.2.5.

      Own Id: OTP-19418 Aux Id: GH-9163, PR-9274

    • Fixes a bug in the socket type spec, which caused Dialyzer to reject some valid programs.

      Own Id: OTP-19429 Aux Id: PR-9295, PR-9379

    Kernel 10.2.2

    Fixed Bugs and Malfunctions

    • Fixed a couple of bugs that could make global's internal state inconsistent when a connection was reconnected.

      Own Id: OTP-19381 Aux Id: PR-9377, GH-9112, GH-9117

    Kernel 10.2.1

    Fixed Bugs and Malfunctions

    • Fix the default group_leader to reply {error,request} on invalid I/O requests instead of crashing.

      This bug was introduced in Erlang/OTP 27.2.

      Own Id: OTP-19444 Aux Id: GH-9237, PR-9318

    Kernel 10.2

    Fixed Bugs and Malfunctions

    • 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.

      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.

      Own Id: OTP-19225 Aux Id: PR-8789

    • Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.

      Own Id: OTP-19260 Aux Id: PR-8884

    • inet:getifaddrs/0,1 is improved when using +net_kernel:allow/1

      Own Id: OTP-19287 Aux Id: PR-8207

    • Documentation chunks (EEP-48) has been updated to include the following reserved metadata fields: behaviours, group, source_path, and source_annos. The compiler has also been updated to emit this metadata. See the EEP-48 documentation for more details.

      Own Id: OTP-19306 Aux Id: PR-8945, PR-8975

    • The erpc:call/3, erpc:call/5, erpc:multicall/3, and erpc:multicall/5 functions now also accept an option map as last argument containing the timeout and always_spawn options. The always_spawn option can be used in order to ensure that the call operation will use a newly spawned process when executing the remote call.

      Own Id: OTP-19343 Aux Id: PR-8642

    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

      -type meter() :: integer().
      +-type foot() :: integer().

      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

      -nominal meter() :: integer().
      +-nominal foot() :: integer().

      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

      Own Id: OTP-19364 Aux Id: PR-9079

    • Improved open debug for gen_tcp_socket (connect and listen) and gen_udp_socket (open).

      Own Id: OTP-19386

    • io:standard_error/0 has been updated to write via a NIF API instead of a port. This allows it to access the dirty-scheduler pool and make sure that writes have been written to the OSs stderr when io:format/3 and equivalent return.

      Own Id: OTP-19401 Aux Id: PR-9116

    • Added the option exception_on_failure to os:cmd/2 to make os:cmd/2 raise an exception if the command fails to execute.

      Own Id: OTP-19404 Aux Id: PR-9082

    • A socket option {otp,select_read} has been added that enables keeping a socket in the VM select/poll set between calls to recv functions.

      This increases throughput by reducing the number of calls to said functions.

      Own Id: OTP-19451 Aux Id: PR-9344

    • Add a configure chapter to the socket usage guide

      Own Id: OTP-19522 Aux Id: PR-9508

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    • Increase the default inet-driver buffer size(s). Also introduce kernel parameters for UDP and SCTP to change the sizes when creating (those) sockets.

      Own Id: OTP-19576

    • An experimental API for a native debugger has been added. The main components are the following:

      • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

      • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

      • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

      • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

      Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

    Kernel 10.2.7.3

    Improvements and New Features

    Kernel 10.2.7.2

    Fixed Bugs and Malfunctions

    • socket:sendv/3 with 'nowait' sometimes return 'completion' without 'CompletionInfo' (Windows only).

      Own Id: OTP-19661

    • socket:accept can return unexpected 'select_sent'.

      Own Id: OTP-19684 Aux Id: ERIERL-1242

    • net_kernel could be blocked for a very long time when selecting distribution module for a connection if the DNS service was slow. This prevented any new connections to be set up during that time.

      Own Id: OTP-19702 Aux Id: ERIERL-1241, PR-10029

    Improvements and New Features

    • Improved documentation of CompletionStatus for asynchronous (nowait) socket operations.

      Own Id: OTP-19670 Aux Id: PR-9930

    Kernel 10.2.7.1

    Fixed Bugs and Malfunctions

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    Improvements and New Features

    • Document default buffer sizes

      Own Id: OTP-19640 Aux Id: GH-9722

    Kernel 10.2.7

    Fixed Bugs and Malfunctions

    • With this change, disk_log will not crash when using chunk_step/3 after log size was decreased.

      Own Id: OTP-19605 Aux Id: GH-9720, PR-9765

    • With this change, disk_log will not run into infinite loop when using chunk/2,3 after log size was decreased.

      Own Id: OTP-19608 Aux Id: GH-9707, PR-9767

    Kernel 10.2.6

    Fixed Bugs and Malfunctions

    • Fixed bug in call_memory tracing that could cause wildly incorrect reported memory values. Bug exists since OTP 27.1.

      Also fixed return type spec of trace:info/3.

      Own Id: OTP-19581 Aux Id: ERIERL-1219, PR-9706

    Kernel 10.2.5

    Fixed Bugs and Malfunctions

    • On Windows, using socket:sendv, a large IOV (size > MAX), the tail was not sent.

      Own Id: OTP-19482

    • gen_tcp connect with a sockaddr with loopback address failed.

      Own Id: OTP-19560 Aux Id: GH-9541

    • Remove debug printouts from gen_tcp_socket

      Own Id: OTP-19564

    Kernel 10.2.4

    Fixed Bugs and Malfunctions

    Kernel 10.2.3

    Fixed Bugs and Malfunctions

    • Clarify inet:setopts documentation

      Own Id: OTP-19416 Aux Id: PR-9248

    • Fix bug where log printouts would go missing when application_controller is stopping while log messages are being sent.

      This bug was introduced by OTP-19078 in Erlang/OTP 26.2.5.

      Own Id: OTP-19418 Aux Id: GH-9163, PR-9274

    • Fixes a bug in the socket type spec, which caused Dialyzer to reject some valid programs.

      Own Id: OTP-19429 Aux Id: PR-9295, PR-9379

    Kernel 10.2.2

    Fixed Bugs and Malfunctions

    • Fixed a couple of bugs that could make global's internal state inconsistent when a connection was reconnected.

      Own Id: OTP-19381 Aux Id: PR-9377, GH-9112, GH-9117

    Kernel 10.2.1

    Fixed Bugs and Malfunctions

    • Fix the default group_leader to reply {error,request} on invalid I/O requests instead of crashing.

      This bug was introduced in Erlang/OTP 27.2.

      Own Id: OTP-19444 Aux Id: GH-9237, PR-9318

    Kernel 10.2

    Fixed Bugs and Malfunctions

    • 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.

      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.

      Own Id: OTP-19225 Aux Id: PR-8789

    • Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.

      Own Id: OTP-19260 Aux Id: PR-8884

    • inet:getifaddrs/0,1 is improved when using inet_backend = socket.

      Own Id: OTP-19264

    • Fixed logger:report/0 to mandate at least one element in the report. This fixes an issue with overlapping spec domains in all logger functions that use logger:report/0.

      Own Id: OTP-19302 Aux Id: PR-8959

    • Fixed deadlock on code_server. Multiple calls loading the same module with an on_load function loading call would create a deadlock.

      Own Id: OTP-19305 Aux Id: PR-8744, GH-7466, GH-8510

    Improvements and New Features

    • The Kernel application now recognizes the epmd_module and erl_epmd_listen_port parameters, similar to -kernel:connect_all.

      Own Id: OTP-19253 Aux Id: PR-8671

    • The inetrc kernel argument will now tolerate atoms again to improve compatibility with old configurations that relied on atoms working by accident.

      The expected type always was, and still remains, a string.

      Own Id: OTP-19280 Aux Id: GH-8899, PR-8902

    • The file:io_device/0 type has been updated to clearly show the difference between a raw and cooked IoDevice.

      Own Id: OTP-19301 Aux Id: PR-8956

    • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

      Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

    • Added the kernel parameter os_cmd_shell that controls which shell should be used by os:cmd/1.

      Own Id: OTP-19342 Aux Id: PR-8972

    • Added logging support to io:user/0, io:standard_io/0 and io:standard_error/0. See io:setopts/2 for more details.

      Own Id: OTP-19372 Aux Id: PR-8947

    Kernel 10.1.2

    Fixed Bugs and Malfunctions

    • On windows the socket:recv could return with success ({ok, Data}) even though not all data had been read.

      Own Id: OTP-19328

    • gen_udp:send on domain local can leak inet_reply messages.

      Own Id: OTP-19332 Aux Id: #href_anchor"kernel-10-1-1" class="section-heading">Kernel 10.1.1

      Fixed Bugs and Malfunctions

      • 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.

        This happened with low probability when the OS signaled that the socket was ready for reading in combination with an internal time-out retry.

        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.

        Own Id: OTP-19235 Aux Id: ERIERL-1133, PR-8837

      • 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.

        Own Id: OTP-19258 Aux Id: OTP-19061, ERIERL-1134

      Kernel 10.1

      Fixed Bugs and Malfunctions

      • 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.

        Own Id: OTP-19097 Aux Id: PR-8503

      • Opening a disk_log file and combining head_func with rotate options did not work.

        Own Id: OTP-19104 Aux Id: ERIERL-870

      • Fixed an error info printout for erlang:is_process_alive/1 on non-local pids.

        Own Id: OTP-19134 Aux Id: PR-8560

      • 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 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.

        Own Id: OTP-19205

      • 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.

        Own Id: OTP-19208 Aux Id: PR-8672

      • Corrected socket:ioctl for genaddr (SIOCGENADDR).

        Own Id: OTP-19216

      Improvements and New Features

      • Added functions getservbyname and getservbyport to the net module.

        Own Id: OTP-19101 Aux Id: OTP-18835

      • Introduced enet | esock variants of inet functions, either when called with sockets, with explicit inet_backend config or with the e inet_backend kernel config option.

        Own Id: OTP-19132 Aux Id: OTP-19101

      • The function socket:i/0 now uses the net module (instead of the inet module) for service translation.

        Own Id: OTP-19138 Aux Id: OTP-19101

      • 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.

        Own Id: OTP-19199 Aux Id: OTP-19175, GH-8561, GH-8690, GH-8785

      Kernel 10.0.1

      Improvements and New Features

      • Polish the logger documentation.

        Own Id: OTP-19118 Aux Id: PR-8534

      Kernel 10.0

      Fixed Bugs and Malfunctions

      • Fixed a crash when calling file:delete/2 with an empty option list.

        Own Id: OTP-18590 Aux Id: PR-7220

      • 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.

        Own Id: OTP-18878 Aux Id: GH-7718, OTP-17734

      • The error information for erlang:phash/2 has been corrected.

        Own Id: OTP-18904 Aux Id: PR-7960

      • 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.

        Own Id: OTP-18930 Aux Id: PR-7993, GH-4992

      • Calling logger:add_handlers/1 with config option now works.

        Own Id: OTP-18954 Aux Id: GH-8061, PR-8076

      • The code:del_path/1 function now also works on paths added through -pa, -pz , -path and the boot script.

        Own Id: OTP-18959 Aux Id: GH-6692, PR-7697

      • A call to socket:[recv|recvfrom|recvmsg]/* with Timeout = 0 on Windows could cause a (case clause) crash if data is immediately available.

        Own Id: OTP-19063 Aux Id: OTP-18835

      • Improve heuristic for when a characters is wide in the shell for systems with old libc versions.

        Own Id: OTP-19087 Aux Id: PR-8382

      • Fix reading a line when reading from io:user/0 to not consider \r without \n to be a new line when erl is started with -noshell.

        Own Id: OTP-19088 Aux Id: PR-8396, GH-8360

      Improvements and New Features

      • Added file:read_file/2 with a raw option for reading files without going through the file server.

        Own Id: OTP-18589 Aux Id: PR-7220

      • 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.

        Kudos to Alexander Clouter that did almost all the work!

        Own Id: OTP-18713 Aux Id: PR-6985, GH-6985

      • The ebin directories for escripts are now cached.

        Own Id: OTP-18778 Aux Id: PR-7556

      • -callback attributes haven been added to application, logger_handler, and logger_formatter.

        Own Id: OTP-18795 Aux Id: PR-7703

      • Progress reports from before logger is started are now logged when log level is set to debug.

        Own Id: OTP-18807 Aux Id: PR-7732 ERIERL-985

      • The code:where_is_file/2 and code:which/1 functions now check for existence of the file directly instead of listing the content of each directory in the code path.

        Own Id: OTP-18816 Aux Id: PR-7711

      • Type specs has been added to the logger:Level/1,2,3 functions.

        Own Id: OTP-18820 Aux Id: PR-7779

      • 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

      • The shell now pages long output from the documentation help command (h(Module)), auto completions and the search command.

        Own Id: OTP-18846 Aux Id: PR-7845

      • 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

      • Optimized code loading by moving certain operations from the code server to the caller.

        Own Id: OTP-18941 Aux Id: PR-7981

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • Application startup has been optimized by removing an intermediary process.

        Own Id: OTP-18963 Aux Id: PR-8042

      • 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.

        As of Erlang/OTP 27, the function code:lib_dir/2, the -code_path_choice flag, and using erl_prim_loader for reading members of an archive are deprecated.

        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.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18966 Aux Id: PR-8091

      • The undocumented and deprecated file:pid2name function has been removed.

        Own Id: OTP-18967 Aux Id: PR-8092

      • There is a new module 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.

        Own Id: OTP-18980

      • Error logging has been improved when the io:standard_io/0 reader and/or writer terminates with an error.

        Own Id: OTP-18989 Aux Id: PR-8103

      • inet_backend = socket has been optimized and reworked to be more compatible with the original inet_backend = inet.

        Own Id: OTP-19004 Aux Id: OTP-18835

      • Add an simple example (echo server) )to the socket users guide.

        Own Id: OTP-19042

      • inet:i/0,1,2 has been improved to allow port numbers to be shown explicitly.

        Own Id: OTP-19053 Aux Id: #href_anchor"inline">socket documentation has been reworked, and due to @@ -1751,12 +1751,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:
        @@ -1956,7 +1956,7 @@
                   Erlang programming language
         
               

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/os.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/os.html 2026-04-20 17:48:42.437696353 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/os.html 2026-04-20 17:48:42.441696378 +0000 @@ -623,19 +623,19 @@

        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.

        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 +output and standard error of the command, and returns this result as a string.

        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/2 call. This option is a safety feature that should be used when the command executed -can return a very large, possibly infinite, result.

          Example:

          > 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]
        • exception_on_failure - If set to true, os:cmd/2 will throw an error +can return a very large, possibly infinite, result.

          Example:

          > 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]
        • exception_on_failure - If set to true, os:cmd/2 will throw an error exception if the command exits with a non-zero exit code. The exception reason looks like this: {command_failed, ResultBeforeFailure, ExitCode} where ResultBeforeFailure is the result written to stdout by the command before -the error happened and ExitCode is the exit code from the command.

          Example:

          > catch os:cmd("echo hello && exit 123", #{ exception_on_failure => true }).
          -{'EXIT',{{command_failed,"hello\n",123},
          -         [{os,cmd,2,[{file,"os.erl"},{line,579}]},
          +the error happened and ExitCode is the exit code from the command.

          Example:

          > catch os:cmd("echo hello && exit 123", #{ exception_on_failure => true }).
          +{'EXIT',{{command_failed,"hello\n",123},
          +         [{os,cmd,2,[{file,"os.erl"},{line,579}]},
           ...

        The command shell can be set using the kernel configuration parameter, by default the shell is detected upon system startup.

        @@ -928,7 +928,7 @@ 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
        @@ -1099,16 +1099,16 @@ 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.

    @@ -1236,7 +1236,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/pg.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/pg.html 2026-04-20 17:48:42.485696659 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/pg.html 2026-04-20 17:48:42.481696634 +0000 @@ -829,7 +829,7 @@

    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]}
    @@ -1010,7 +1010,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/rpc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/rpc.html 2026-04-20 17:48:42.529696942 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/rpc.html 2026-04-20 17:48:42.525696917 +0000 @@ -1043,10 +1043,10 @@ 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 @@ -1416,7 +1416,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/search.html 2026-04-20 17:48:42.557697120 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/search.html 2026-04-20 17:48:42.561697147 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/seq_trace.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/seq_trace.html 2026-04-20 17:48:42.597697378 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/seq_trace.html 2026-04-20 17:48:42.601697403 +0000 @@ -100,9 +100,9 @@ how it can be used, see section Sequential Tracing.

    seq_trace provides functions that control all aspects of sequential tracing. There are functions for activation, deactivation, inspection, and for collection of the trace output.

    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 @@ -198,68 +198,68 @@ C-nodes built with Erl_Interface too. A C-node built with Erl_Interface only maintains one trace token, which means that the C-node appears as one process from the sequential tracing point of view.

        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().
        +    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}.
        +
        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}.
    @@ -848,11 +848,11 @@ 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.

    @@ -944,7 +944,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket.html 2026-04-20 17:48:42.693697992 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket.html 2026-04-20 17:48:42.701698043 +0000 @@ -153,8 +153,8 @@ to only scan the messages that arrive after the reference/0 is created. If the message queue is large this is a big optimization.

    It is not possible to have more than one operation in progress with the same reference/0.

    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 operation in progress:

        {select, {select_info, Handle}} = socket:accept(LSock, nowait),
    -    {ok, Socket} = socket:accept(LSock, 1000),
    +message has been received it replaces the operation in progress:

        {select, {select_info, Handle}} = socket:accept(LSock, nowait),
    +    {ok, Socket} = socket:accept(LSock, 1000),
         :

    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, the accept operation @@ -181,28 +181,28 @@ (select handle) API features could be considered no longer experimental.

  • In OTP 27.0, the Windows flavored (completion handle) -API features could be considered no longer experimental.
  • Examples

    client(SAddr, SPort) ->
    -   {ok, Sock} = socket:open(inet, stream, tcp),
    -   ok = socket:connect(Sock, #{family => inet,
    +API features could be considered no longer experimental.

    Examples

    client(SAddr, SPort) ->
    +   {ok, Sock} = socket:open(inet, stream, tcp),
    +   ok = socket:connect(Sock, #{family => inet,
                                    addr   => SAddr,
    -                               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,
    +                               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,
                                  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).
    @@ -4849,7 +4849,7 @@ (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),
           :
    @@ -5013,7 +5013,7 @@

    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),
    @@ -5044,7 +5044,7 @@

    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),
    @@ -5141,7 +5141,7 @@

    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.

    @@ -7406,7 +7406,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket_usage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket_usage.html 2026-04-20 17:48:42.757698401 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/socket_usage.html 2026-04-20 17:48:42.761698428 +0000 @@ -129,59 +129,59 @@ socket:sendv/3 with asynchronous (nowait) on completion systems (Windows).
    Observe that this is not an illustration how to write a asynchronous sendv function. Its just an example of what kind of messages and results that can be expected. The example below basically (re-) implements: -socket:sendv(Sock, IOV, infinity).

    completion_sendv(Sock, IOV) ->
    -    case socket:sendv(Sock, IOV, nowait) of
    +socket:sendv(Sock, IOV, infinity).

    completion_sendv(Sock, IOV) ->
    +    case socket:sendv(Sock, IOV, nowait) of
             ok -> % Complete success - We are done
                 ok;
    -        {completion, {CompletionInfo, RestIOV0}} ->
    +        {completion, {CompletionInfo, RestIOV0}} ->
                 %% Some of IOV was sent, but the rest, RestIOV0, was scheduled
    -            case completion_sendv_await_result(Sock,
    -                                               CompletionInfo, RestIOV0) of
    +            case completion_sendv_await_result(Sock,
    +                                               CompletionInfo, RestIOV0) of
                     ok -> % We done
                         ok;
    -                {ok, RestIOV} ->
    -                    completion_sendv(Sock, RestIOV);
    -                {error, Reason} ->
    -                    {error, {Reason, RestIOV0}}
    +                {ok, RestIOV} ->
    +                    completion_sendv(Sock, RestIOV);
    +                {error, Reason} ->
    +                    {error, {Reason, RestIOV0}}
                 end;
    -        {completion, CompletionInfo} ->
    +        {completion, CompletionInfo} ->
                 %% Nothing was sent, IOV was scheduled
    -            case completion_sendv_await_result(Sock,
    -                                               CompletionInfo, IOV) of
    +            case completion_sendv_await_result(Sock,
    +                                               CompletionInfo, IOV) of
                     ok -> % We done
                         ok;
    -                {ok, RestIOV} ->
    -                    completion_sendv(Sock, RestIOV);
    -                {error, _} = ERROR ->
    +                {ok, RestIOV} ->
    +                    completion_sendv(Sock, RestIOV);
    +                {error, _} = ERROR ->
                         ERROR
                 end;
    -        {error, {_Reason, _RestIOV}} = ERROR ->
    +        {error, {_Reason, _RestIOV}} = ERROR ->
                 %% Some part of the I/O vector was sent before an error occured
                 ERROR;
    -        {error, _} = ERROR ->
    +        {error, _} = ERROR ->
                 %% Note that 
                 ERROR
         end.
     
    -completion_sendv_await_result(Sock,
    -                              {completion_info, _, Handle},
    -                              IOV) ->
    +completion_sendv_await_result(Sock,
    +                              {completion_info, _, Handle},
    +                              IOV) ->
       receive
    -      {'$socket', Sock, abort, {Handle, Reason}} ->
    -          ?P("unexpected abort: "
    -             "~n   Reason: ~p", [Reason]),
    -          {error, {abort, Reason}};
    +      {'$socket', Sock, abort, {Handle, Reason}} ->
    +          ?P("unexpected abort: "
    +             "~n   Reason: ~p", [Reason]),
    +          {error, {abort, Reason}};
     
    -      {'$socket', Sock, completion, {Handle, {ok, Written}}} ->
    +      {'$socket', Sock, completion, {Handle, {ok, Written}}} ->
               %% Partial send; calculate rest I/O vector
    -          case socket:rest_iov(Written, IOV) of
    -              [] -> % We are done
    +          case socket:rest_iov(Written, IOV) of
    +              [] -> % We are done
                       ok;
                   RestIOV ->
    -                  {ok, RestIOV}
    +                  {ok, RestIOV}
               end;
     
    -      {'$socket', Sock, completion, {Handle, CompletionStatus}} ->
    +      {'$socket', Sock, completion, {Handle, CompletionStatus}} ->
               CompletionStatus
     
       end.

    Completion asynchronous recv

    This is a simple example function that illustrates how to use @@ -189,95 +189,95 @@ Observe that this is not an illustration how to write a asynchronous read function. Its just an example of what kind of messages and results that can be expected. The example below basically (re-) implements: -socket:recv(Sock, Sz).

    completion_recv(Sock, Sz) when (Sz > 0) ->
    -    completion_recv(Sock, Sz, []).
    +socket:recv(Sock, Sz).

    completion_recv(Sock, Sz) when (Sz > 0) ->
    +    completion_recv(Sock, Sz, []).
     
    -completion_recv(_Sock, 0, [Bin] = _Acc) ->
    -    {ok, Bin};
    -completion_recv(_Sock, 0, Acc) ->
    -    {ok, erlang:iolist_to_binary(lists:reverse(Acc))};
    -completion_recv(Sock, Sz, Acc) ->
    -    case socket:recv(Sock, Sz, nowait) of
    -        {ok, Bin} when (byte_size(Bin) =:= Sz) ->
    -            completion_recv(Sock, 0, [Bin|Acc]);
    -        {ok, Bin} ->
    -            completion_recv(Sock, Sz-byte_size(Bin), [Bin|Acc]);
    -
    -	{completion, CompletionInfo} ->
    -            case completion_recv_await_result(Sock, CompletionInfo) of
    -                {ok, Bin} ->
    -                    completion_recv(Sock, Sz-byte_size(Bin), [Bin|Acc]);
    -                {error, {_Reason, _Data}} = ERROR ->
    +completion_recv(_Sock, 0, [Bin] = _Acc) ->
    +    {ok, Bin};
    +completion_recv(_Sock, 0, Acc) ->
    +    {ok, erlang:iolist_to_binary(lists:reverse(Acc))};
    +completion_recv(Sock, Sz, Acc) ->
    +    case socket:recv(Sock, Sz, nowait) of
    +        {ok, Bin} when (byte_size(Bin) =:= Sz) ->
    +            completion_recv(Sock, 0, [Bin|Acc]);
    +        {ok, Bin} ->
    +            completion_recv(Sock, Sz-byte_size(Bin), [Bin|Acc]);
    +
    +	{completion, CompletionInfo} ->
    +            case completion_recv_await_result(Sock, CompletionInfo) of
    +                {ok, Bin} ->
    +                    completion_recv(Sock, Sz-byte_size(Bin), [Bin|Acc]);
    +                {error, {_Reason, _Data}} = ERROR ->
                         ERROR;
    -                {error, _Reason} = ERROR ->
    +                {error, _Reason} = ERROR ->
                         ERROR
     	    end;
     
    -	{error, {_Reason, _Data}} = ERROR ->
    +	{error, {_Reason, _Data}} = ERROR ->
     	    ERROR;
    -	{error, _Reason} = ERROR ->
    +	{error, _Reason} = ERROR ->
     	    ERROR
     
         end.
     
    -completion_recv_await_result(Sock,
    -                             {completion_info, _, Handle}) ->
    +completion_recv_await_result(Sock,
    +                             {completion_info, _, Handle}) ->
         receive
    -	{'$socket', Sock, abort, {Handle, Reason}} ->
    -	    {error, {abort, Reason}};
    +	{'$socket', Sock, abort, {Handle, Reason}} ->
    +	    {error, {abort, Reason}};
     
    -	{'$socket', Sock, completion, {Handle, {ok, _Bin} = OK}} ->
    +	{'$socket', Sock, completion, {Handle, {ok, _Bin} = OK}} ->
                 %% We "should" be done
     	    OK;
    -	{'$socket', Sock, completion, {Handle, {more, Bin}}} ->
    +	{'$socket', Sock, completion, {Handle, {more, Bin}}} ->
                 %% There is more to read
    -	    {ok, Bin};
    +	    {ok, Bin};
     
    -	{'$socket', Sock, completion, {Handle, CompletionStatus}} ->
    +	{'$socket', Sock, completion, {Handle, CompletionStatus}} ->
     	    CompletionStatus
     
         end.

    Echo server (and client)

    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) ->
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/trace.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/trace.html	2026-04-20 17:48:42.813698759 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/trace.html	2026-04-20 17:48:42.817698786 +0000
    @@ -105,23 +105,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

    Node Local Tracing Only

    The functions in this module only operates on the local node. That is, both the traced processes/ports as well as the tracer process/port/module must all reside on the same local node as the call is made. To trace remote nodes use dbg or @@ -1415,9 +1415,9 @@ 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, [{[&#href_anchor"p">,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, [{[&#href_anchor"p">,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 @@ -1468,10 +1468,10 @@ 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, &#href_anchor"p" data-group-id="8064653842-4">],[],[]}], []).
    -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, &#href_anchor"p" data-group-id="3262343168-4">],[],[]}], []).
    +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 @@ -1720,7 +1720,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/wrap_log_reader.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/wrap_log_reader.html 2026-04-20 17:48:42.849698990 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/wrap_log_reader.html 2026-04-20 17:48:42.849698990 +0000 @@ -509,7 +509,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/404.html 2026-04-20 17:48:42.881699195 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/404.html 2026-04-20 17:48:42.881699195 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/api-reference.html 2026-04-20 17:48:42.913699400 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/api-reference.html 2026-04-20 17:48:42.917699426 +0000 @@ -235,7 +235,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/content.opf 2026-04-20 15:20:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/content.opf 2042-05-23 04:39:03.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> megaco - 4.8.3 - urn:uuid:71c681ef-435c-e9e3-76d4-477645d91fbb + urn:uuid:0290cca8-24c2-d90d-75ce-1aa049a802a4 en - 2026-04-20T15:20:12Z + 2042-05-23T04:39:03Z /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2026-04-20 15:20:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2042-05-23 04:39:03.000000000 +0000 @@ -34,12 +34,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 @@ -61,10 +61,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 /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2026-04-20 15:20:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2042-05-23 04:39:03.000000000 +0000 @@ -38,75 +38,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 /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2026-04-20 15:20:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2042-05-23 04:39:03.000000000 +0000 @@ -39,10 +39,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 /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2026-04-20 15:20:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2042-05-23 04:39:03.000000000 +0000 @@ -42,19 +42,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"}}}}

    Setup

    The measurements has been performed on a Dell Precision 5550 Laptop with a Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz, with 40 GB memory and running Ubuntu 20.04 x86_64, kernel 5.4.0-91-generic. Software versions was open source OTP /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_user.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2026-04-20 15:20:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2042-05-23 04:39:03.000000000 +0000 @@ -25,17 +25,17 @@

    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 process_received_message/5 was called -with the Extra argument different than ignore_extra.

    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" +with the Extra argument different than ignore_extra.

    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" 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 /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco.xhtml 2026-04-20 15:20:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.epub/OEBPS/megaco.xhtml 2042-05-23 04:39:03.000000000 +0000 @@ -3071,7 +3071,7 @@

    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).
    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.html 2026-04-20 17:48:43.201701245 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco.html 2026-04-20 17:48:43.201701245 +0000 @@ -3154,7 +3154,7 @@

    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).
    @@ -4064,7 +4064,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_architecture.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_architecture.html 2026-04-20 17:48:43.233701449 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_architecture.html 2026-04-20 17:48:43.233701449 +0000 @@ -326,7 +326,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_meas.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_meas.html 2026-04-20 17:48:43.257701604 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_meas.html 2026-04-20 17:48:43.257701604 +0000 @@ -225,7 +225,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone1.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone1.html 2026-04-20 17:48:43.297701861 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone1.html 2026-04-20 17:48:43.297701861 +0000 @@ -608,7 +608,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone2.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone2.html 2026-04-20 17:48:43.329702067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_mstone2.html 2026-04-20 17:48:43.329702067 +0000 @@ -226,7 +226,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_transform.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_transform.html 2026-04-20 17:48:43.349702195 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_codec_transform.html 2026-04-20 17:48:43.357702246 +0000 @@ -226,7 +226,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_debug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_debug.html 2026-04-20 17:48:43.381702398 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_debug.html 2026-04-20 17:48:43.385702425 +0000 @@ -106,12 +106,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 @@ -133,10 +133,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 @@ -195,7 +195,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_digit_map.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_digit_map.html 2026-04-20 17:48:43.413702604 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_digit_map.html 2026-04-20 17:48:43.417702629 +0000 @@ -467,7 +467,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_edist_compress.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_edist_compress.html 2026-04-20 17:48:43.449702834 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_edist_compress.html 2026-04-20 17:48:43.449702834 +0000 @@ -246,7 +246,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encode.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encode.html 2026-04-20 17:48:43.477703014 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encode.html 2026-04-20 17:48:43.477703014 +0000 @@ -110,75 +110,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 @@ -281,7 +281,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encoder.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encoder.html 2026-04-20 17:48:43.517703270 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_encoder.html 2026-04-20 17:48:43.517703270 +0000 @@ -1363,7 +1363,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_examples.html 2026-04-20 17:48:43.549703475 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_examples.html 2026-04-20 17:48:43.549703475 +0000 @@ -111,10 +111,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 @@ -171,7 +171,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_flex_scanner.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_flex_scanner.html 2026-04-20 17:48:43.581703679 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_flex_scanner.html 2026-04-20 17:48:43.585703706 +0000 @@ -416,7 +416,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_intro.html 2026-04-20 17:48:43.617703909 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_intro.html 2026-04-20 17:48:43.617703909 +0000 @@ -155,7 +155,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_mib.html 2026-04-20 17:48:43.649704115 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_mib.html 2026-04-20 17:48:43.649704115 +0000 @@ -153,7 +153,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_performance.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_performance.html 2026-04-20 17:48:43.681704320 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_performance.html 2026-04-20 17:48:43.681704320 +0000 @@ -114,19 +114,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"}}}}

    Setup

    The measurements has been performed on a Dell Precision 5550 Laptop with a Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz, with 40 GB memory and running Ubuntu 20.04 x86_64, kernel 5.4.0-91-generic. Software versions was open source OTP @@ -198,7 +198,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_run.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_run.html 2026-04-20 17:48:43.713704525 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_run.html 2026-04-20 17:48:43.713704525 +0000 @@ -322,7 +322,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_sdp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_sdp.html 2026-04-20 17:48:43.749704756 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_sdp.html 2026-04-20 17:48:43.749704756 +0000 @@ -1199,7 +1199,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_tcp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_tcp.html 2026-04-20 17:48:43.781704959 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_tcp.html 2026-04-20 17:48:43.789705011 +0000 @@ -826,7 +826,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport.html 2026-04-20 17:48:43.821705217 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport.html 2026-04-20 17:48:43.821705217 +0000 @@ -299,7 +299,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport_mechanisms.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport_mechanisms.html 2026-04-20 17:48:43.849705395 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_transport_mechanisms.html 2026-04-20 17:48:43.845705370 +0000 @@ -144,7 +144,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_udp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_udp.html 2026-04-20 17:48:43.885705626 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_udp.html 2026-04-20 17:48:43.881705600 +0000 @@ -862,7 +862,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_user.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_user.html 2026-04-20 17:48:43.929705907 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/megaco_user.html 2026-04-20 17:48:43.933705933 +0000 @@ -96,17 +96,17 @@

    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 process_received_message/5 was called -with the Extra argument different than ignore_extra.

    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" +with the Extra argument different than ignore_extra.

    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" 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 @@ -1514,7 +1514,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/notes.html 2026-04-20 17:48:43.977706216 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/notes.html 2026-04-20 17:48:43.977706216 +0000 @@ -214,7 +214,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/search.html 2026-04-20 17:48:44.005706395 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.3/doc/html/search.html 2026-04-20 17:48:44.005706395 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/404.html 2026-04-20 17:48:44.033706574 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/404.html 2026-04-20 17:48:44.033706574 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/api-reference.html 2026-04-20 17:48:44.065706779 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/api-reference.html 2026-04-20 17:48:44.065706779 +0000 @@ -136,7 +136,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/content.opf 2026-04-20 15:19:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/content.opf 2042-05-23 04:38:36.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> mnesia - 4.25.2 - urn:uuid:9c5bfdc6-7287-9bc2-f698-88706cf72f68 + urn:uuid:1f2d1fa2-d965-f099-9543-e456307d793d en - 2026-04-20T15:19:47Z + 2042-05-23T04:38:36Z /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2026-04-20 15:19:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2042-05-23 04:38:36.000000000 +0000 @@ -45,11 +45,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, @@ -60,105 +60,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. @@ -167,30 +167,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} /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2026-04-20 15:19:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2042-05-23 04:38:36.000000000 +0000 @@ -17,10 +17,10 @@

    Appendix B: Activity Access Callback Interface

    -

    mnesia_access Callback Behavior

    -module(mnesia_frag).
    +

    mnesia_access Callback Behavior

    -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,
    @@ -29,242 +29,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).
    -
    -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).
    -
    -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).
    -
    -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_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).
    +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_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).
    +
    +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, 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).
    +
    +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).
    -
    -foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
    -    Fun2 = fun(Frag, A) ->
    -                   mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
    +        [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)
                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 ->
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2026-04-20 15:19:47.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2042-05-23 04:38:36.000000000 +0000
    @@ -17,140 +17,140 @@
       
     
         

    Appendix C: Fragmented Table Hashing Callback Interface

    -

    mnesia_frag_hash Callback Behavior

    -module(mnesia_frag_hash).
    --compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
    +

    mnesia_frag_hash Callback Behavior

    -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;
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2026-04-20 15:19:47.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2042-05-23 04:38:36.000000000 +0000
    @@ -23,16 +23,16 @@
     mandatory procedures through examples:

    • Starting the Erlang session.
    • Specifying the Mnesia directory where the database is to be stored.
    • Initializing a new database schema with an attribute that specifies on which node, or nodes, that database is to operate.
    • Starting Mnesia.
    • Creating and populating the database tables.

    Starting Mnesia for the First Time

    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 <--- 
    @@ -44,18 +44,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 @@ -97,28 +97,28 @@ Employee }|--|| Dept: At_dep Employee }|--|{ Project: in_proj

    The database model is as follows:

    • There are three entities: department, employee, and project.
    • There are three relationships between these entities:
      1. A department is managed by an employee, hence the manager relationship.
      2. An employee works at a department, hence the at_dep relationship.
      3. Each employee works on a number of projects, hence the in_proj relationship.

    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 @@ -129,28 +129,28 @@ preprocessor and evaluates to a list containing the names of the different fields for a record.

    Program

    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)}]).

    Program Explained

    The following commands and functions are used to initiate the Company +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)}]).

    Program Explained

    The following commands and functions are used to initiate the Company database:

    • % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'. This is a UNIX command-line entry that starts the Erlang system. The flag -mnesia dir Dir specifies the location of the database directory. The system responds and @@ -158,9 +158,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 <--- 
    @@ -177,18 +177,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 @@ -202,32 +202,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() ->
    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml	2026-04-20 15:19:47.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml	2042-05-23 04:38:36.000000000 +0000
    @@ -55,18 +55,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) @@ -100,29 +100,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, @@ -133,7 +133,7 @@ Code that manipulate Mnesia data behaves identically regardless of where the data resides.

    The function mnesia:stop() stops Mnesia on the node where the function is executed. The functions mnesia:start/0 and mnesia:stop/0 -work on the "local" Mnesia system. No functions start or stop a set of nodes.

    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. +work on the "local" Mnesia system. No functions start or stop a set of nodes.

    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. 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, @@ -156,9 +156,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 @@ -178,13 +178,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 @@ -228,11 +228,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, [])
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2026-04-20 15:19:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2042-05-23 04:38:36.000000000 +0000 @@ -31,14 +31,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 @@ -102,15 +102,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 @@ -151,13 +151,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 @@ -177,8 +177,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).

      Global Locks

      Write locks are normally acquired on all nodes where a replica of the table resides (and is active). Read locks are acquired on one node (the local one if a local replica exists).

      The function mnesia:lock/2 is intended to support table locks (as mentioned @@ -251,78 +251,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),
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2026-04-20 15:19:47.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2042-05-23 04:38:36.000000000 +0000
      @@ -47,9 +47,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.

    5. The database can be reconfigured, and tables can be moved between nodes. These operations do not affect the user programs.

    6. 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, @@ -90,52 +90,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>

        Fragmentation Properties

        The table property frag_properties can be read with the function +(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>

        Fragmentation Properties

        The table property frag_properties can be read with the function mnesia:table_info(Tab, frag_properties). The fragmentation properties are a list of tagged tuples with arity 2. By default the list is empty, but when it is non-empty it triggers Mnesia to regard the @@ -171,64 +171,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>

      Management of Fragmented Tables

      The function mnesia:change_table_frag(Tab, Change) is intended to be used for +(a@sam)15> mnesia:activity(sync_dirty, Info, + [prim_dict, frag_size], mnesia_frag). +[{prim_dict,0}, + {prim_dict_frag2,0}, /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2026-04-20 15:19:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2042-05-23 04:38:36.000000000 +0000 @@ -89,26 +89,26 @@ for starting Mnesia:

      • An Erlang session must be started and a Mnesia directory must be specified for the database.
      • A database schema must be initiated, using the function mnesia:create_schema/1.

      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 @@ -140,11 +140,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 @@ -348,38 +348,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).

      Restore

      Tables can be restored online from a backup without restarting Mnesia. A + mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

      Restore

      Tables can be restored online from a backup without restarting Mnesia. A restore is performed with the function mnesia:restore(Opaque, Args), where Args can contain the following tuples:

      • {module, Mod}. The backup module Mod is used to access the backup media. If /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2026-04-20 15:19:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2042-05-23 04:38:36.000000000 +0000 @@ -135,8 +135,8 @@

        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)
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2026-04-20 15:19:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2042-05-23 04:38:36.000000000 +0000 @@ -60,11 +60,11 @@ specifies the types of the SNMP keys.

    7. attributes. The names of the attributes for the records that are inserted in the table.

    8. 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, @@ -2731,7 +2731,7 @@ -

      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 @@ -2982,22 +2982,22 @@ 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}]} ]}])
    9. {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}]} ]}])
    10. {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.

    11. {local_content, Bool}, where Bool is true or false. Default is false.

    12. 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 @@ -5247,10 +5247,10 @@ 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]}]),
      @@ -5545,9 +5545,9 @@ 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 @@ -6150,17 +6150,17 @@ 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 @@ -6168,17 +6168,17 @@ 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 /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/notes.xhtml 2026-04-20 15:19:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.epub/OEBPS/notes.xhtml 2042-05-23 04:38:36.000000000 +0000 @@ -21,9 +21,9 @@ version. The intention of this document is to list all incompatibilities as well as all enhancements and bugfixes for every release of Mnesia. Each release of Mnesia thus constitutes one section in this document. The title of each section -is the version number of Mnesia.

      Mnesia 4.25.2

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      Mnesia 4.25.1

      Fixed Bugs and Malfunctions

      • Fixed bug where mnesia:del_table_copy/3 could fail when deleting a node that had tables which was not active anywhere.

        Own Id: OTP-19890 Aux Id: ERIERL-1268, PR-10482

      Mnesia 4.25

      Fixed Bugs and Malfunctions

      • Add missing documentation about mnesia:activity/4

        Own Id: OTP-19769 Aux Id: PR-10186

      • With this change mnesia will try to not leak internal messages to user processes.

        Own Id: OTP-19855 Aux Id: GH-10347, PR-10379

      Improvements and New Features

      • The mnesia_registry module will be removed in Erlang/OTP 29.

        Own Id: OTP-19808 Aux Id: PR-10275

      Mnesia 4.24.1

      Fixed Bugs and Malfunctions

      • Mnesia no longer crashes when the node name is used as a table name.

        Own Id: OTP-19745 Aux Id: PR-10147

      Mnesia 4.24

      Improvements and New Features

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        --type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        --nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Mnesia 4.23.5.1

      Fixed Bugs and Malfunctions

      • Fixed bug where mnesia:del_table_copy/3 could fail when deleting a node that had tables which was not active anywhere.

        Own Id: OTP-19890 Aux Id: ERIERL-1268, PR-10482

      Mnesia 4.23.5

      Fixed Bugs and Malfunctions

      • With this change mnesia will merge schema of tables using external backends.

        Own Id: OTP-19437 Aux Id: PR-9534

      Mnesia 4.23.4

      Fixed Bugs and Malfunctions

      • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

        Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

      Mnesia 4.23.3

      Fixed Bugs and Malfunctions

      • Mnesia table converted from ext_copies to disc_copies will now be properly saved to disk.

        Own Id: OTP-19292 Aux Id: PR-8921, GH-8706

      • Mnesia could crash if table was deleted during checkpoint initialization.

        Own Id: OTP-19368 Aux Id: ERIERL-1154, PR-9093

      Mnesia 4.23.2

      Fixed Bugs and Malfunctions

      • The mnesia_registry module have been deprecated.

        Own Id: OTP-18994

      Improvements and New Features

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      Mnesia 4.23.1.2

      Fixed Bugs and Malfunctions

      • With this change mnesia will merge schema of tables using external backends.

        Own Id: OTP-19437 Aux Id: PR-9534

      • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

        Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

      Mnesia 4.23.1.1

      Fixed Bugs and Malfunctions

      • Mnesia could crash if table was deleted during checkpoint initialization.

        Own Id: OTP-19368 Aux Id: ERIERL-1154, PR-9093

      Mnesia 4.23.1

      Fixed Bugs and Malfunctions

      • Mnesia could crash during startup if del_table_copy/2 and add_table_copy/3 was invoked when the table was loading.

        Own Id: OTP-19076 Aux Id: ERIERL-1073

      Mnesia 4.23

      Fixed Bugs and Malfunctions

      • Document mnesia:foldl/4 and mnesia:foldr/4.

        Own Id: OTP-18798

      • mnesia:add_table_copy/3 no longer fails with reason system_limit when the +is the version number of Mnesia.

        Mnesia 4.25.2

        Improvements and New Features

        • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

          A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

          make release_docs places the documentation in the released code under the doc folder.

          make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

          The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

          Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

          Improves the source Software-Bill-of-Materials

          • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
          • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
          • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

          Own Id: OTP-19886 Aux Id: PR-10434

        Mnesia 4.25.1

        Fixed Bugs and Malfunctions

        • Fixed bug where mnesia:del_table_copy/3 could fail when deleting a node that had tables which was not active anywhere.

          Own Id: OTP-19890 Aux Id: ERIERL-1268, PR-10482

        Mnesia 4.25

        Fixed Bugs and Malfunctions

        • Add missing documentation about mnesia:activity/4

          Own Id: OTP-19769 Aux Id: PR-10186

        • With this change mnesia will try to not leak internal messages to user processes.

          Own Id: OTP-19855 Aux Id: GH-10347, PR-10379

        Improvements and New Features

        • The mnesia_registry module will be removed in Erlang/OTP 29.

          Own Id: OTP-19808 Aux Id: PR-10275

        Mnesia 4.24.1

        Fixed Bugs and Malfunctions

        • Mnesia no longer crashes when the node name is used as a table name.

          Own Id: OTP-19745 Aux Id: PR-10147

        Mnesia 4.24

        Improvements and New Features

        • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

          All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

          -type meter() :: integer().
          +-type foot() :: integer().

          Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

          -nominal meter() :: integer().
          +-nominal foot() :: integer().

          More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

          Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

          Own Id: OTP-19364 Aux Id: PR-9079

        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

          Own Id: OTP-19575 Aux Id: PR-9670

        Mnesia 4.23.5.1

        Fixed Bugs and Malfunctions

        • Fixed bug where mnesia:del_table_copy/3 could fail when deleting a node that had tables which was not active anywhere.

          Own Id: OTP-19890 Aux Id: ERIERL-1268, PR-10482

        Mnesia 4.23.5

        Fixed Bugs and Malfunctions

        • With this change mnesia will merge schema of tables using external backends.

          Own Id: OTP-19437 Aux Id: PR-9534

        Mnesia 4.23.4

        Fixed Bugs and Malfunctions

        • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

          Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

        Mnesia 4.23.3

        Fixed Bugs and Malfunctions

        • Mnesia table converted from ext_copies to disc_copies will now be properly saved to disk.

          Own Id: OTP-19292 Aux Id: PR-8921, GH-8706

        • Mnesia could crash if table was deleted during checkpoint initialization.

          Own Id: OTP-19368 Aux Id: ERIERL-1154, PR-9093

        Mnesia 4.23.2

        Fixed Bugs and Malfunctions

        • The mnesia_registry module have been deprecated.

          Own Id: OTP-18994

        Improvements and New Features

        • The documentation has been migrated to use Markdown and ExDoc.

          Own Id: OTP-18955 Aux Id: PR-8026

        Mnesia 4.23.1.2

        Fixed Bugs and Malfunctions

        • With this change mnesia will merge schema of tables using external backends.

          Own Id: OTP-19437 Aux Id: PR-9534

        • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

          Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

        Mnesia 4.23.1.1

        Fixed Bugs and Malfunctions

        • Mnesia could crash if table was deleted during checkpoint initialization.

          Own Id: OTP-19368 Aux Id: ERIERL-1154, PR-9093

        Mnesia 4.23.1

        Fixed Bugs and Malfunctions

        • Mnesia could crash during startup if del_table_copy/2 and add_table_copy/3 was invoked when the table was loading.

          Own Id: OTP-19076 Aux Id: ERIERL-1073

        Mnesia 4.23

        Fixed Bugs and Malfunctions

        Improvements and New Features

        • Restore recreate of disc_only tables could crash if they had an index.

          Own Id: OTP-18843 Aux Id: GH-7766

        Mnesia 4.22.1

        Fixed Bugs and Malfunctions

        • Do not delete old backup file if the new backup fails.

          Own Id: OTP-18711 Aux Id: ERIERL-963

        Mnesia 4.22

        Improvements and New Features

        • Added debug statistics for active transactions.

          Own Id: OTP-18309 Aux Id: PR-6377

        • The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

          * POTENTIAL INCOMPATIBILITY *

          Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843

        Mnesia 4.21.4.4

        Fixed Bugs and Malfunctions

        • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

          Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

        Mnesia 4.21.4.3

        Fixed Bugs and Malfunctions

        • Mnesia could crash during startup if del_table_copy/2 and add_table_copy/3 was invoked when the table was loading.

          Own Id: OTP-19076 Aux Id: ERIERL-1073

        Mnesia 4.21.4.2

        Fixed Bugs and Malfunctions

        Mnesia 4.21.4.1

        Fixed Bugs and Malfunctions

        • Do not delete old backup file if the new backup fails.

          Own Id: OTP-18711 Aux Id: ERIERL-963

        Mnesia 4.21.4

        Fixed Bugs and Malfunctions

        • Improved consistency for dirty writes when a table was added with /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.html 2026-04-20 17:48:44.449709238 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia.html 2026-04-20 17:48:44.445709212 +0000 @@ -131,11 +131,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, @@ -2818,7 +2818,7 @@ -

        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 @@ -3069,22 +3069,22 @@ 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 @@ -5334,10 +5334,10 @@ 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 = #href_anchor"ss">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 = #href_anchor"ss">person{name='$1', sex=male, age='$2', _='_'},
      +Guard = {'>', '$2', 30},
       Result = '$1',
      -mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
      +
      mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
      @@ -5632,9 +5632,9 @@ 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 @@ -6237,17 +6237,17 @@ 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 @@ -6255,17 +6255,17 @@ 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 @@ -6674,7 +6674,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_a.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_a.html 2026-04-20 17:48:44.485709468 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_a.html 2026-04-20 17:48:44.485709468 +0000 @@ -117,11 +117,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, @@ -132,105 +132,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. @@ -239,30 +239,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} /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_b.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_b.html 2026-04-20 17:48:44.529709749 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_b.html 2026-04-20 17:48:44.529709749 +0000 @@ -89,10 +89,10 @@ -

      mnesia_access Callback Behavior

      -module(mnesia_frag).
      +

      mnesia_access Callback Behavior

      -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,
      @@ -101,242 +101,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).
      -
      -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).
      -
      -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).
      -
      -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_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).
      +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_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).
      +
      +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, 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).
      +
      +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).
      -
      -foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
      -    Fun2 = fun(Frag, A) ->
      -                   mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
      +        [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)
                  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 ->
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_c.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_c.html	2026-04-20 17:48:44.561709955 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_app_c.html	2026-04-20 17:48:44.561709955 +0000
      @@ -89,140 +89,140 @@
         
       
       
      -

      mnesia_frag_hash Callback Behavior

      -module(mnesia_frag_hash).
      --compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
      +

      mnesia_frag_hash Callback Behavior

      -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;
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap1.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap1.html	2026-04-20 17:48:44.593710160 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap1.html	2026-04-20 17:48:44.589710133 +0000
      @@ -166,7 +166,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap2.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap2.html 2026-04-20 17:48:44.641710466 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap2.html 2026-04-20 17:48:44.637710441 +0000 @@ -95,16 +95,16 @@ mandatory procedures through examples:

      • Starting the Erlang session.
      • Specifying the Mnesia directory where the database is to be stored.
      • Initializing a new database schema with an attribute that specifies on which node, or nodes, that database is to operate.
      • Starting Mnesia.
      • Creating and populating the database tables.

      Starting Mnesia for the First Time

      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 <--- 
      @@ -116,18 +116,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 @@ -169,28 +169,28 @@ Employee }|--|| Dept: At_dep Employee }|--|{ Project: in_proj

      The database model is as follows:

      • There are three entities: department, employee, and project.
      • There are three relationships between these entities:
        1. A department is managed by an employee, hence the manager relationship.
        2. An employee works at a department, hence the at_dep relationship.
        3. Each employee works on a number of projects, hence the in_proj relationship.

      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 @@ -201,28 +201,28 @@ preprocessor and evaluates to a list containing the names of the different fields for a record.

      Program

      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)}]).

      Program Explained

      The following commands and functions are used to initiate the Company +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)}]).

      Program Explained

      The following commands and functions are used to initiate the Company database:

      • % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'. This is a UNIX command-line entry that starts the Erlang system. The flag -mnesia dir Dir specifies the location of the database directory. The system responds and @@ -230,9 +230,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 <--- 
      @@ -249,18 +249,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 @@ -274,32 +274,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() ->
      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap3.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap3.html	2026-04-20 17:48:44.673710671 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap3.html	2026-04-20 17:48:44.673710671 +0000
      @@ -127,18 +127,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.

    13. mnesia:change_table_copy_type(Tab, Node, ToType) @@ -172,29 +172,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"'
    14. If no command-line flag is entered, the Mnesia directory becomes the current working directory on the node where the Erlang shell is started.

    15. 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, @@ -205,7 +205,7 @@ Code that manipulate Mnesia data behaves identically regardless of where the data resides.

      The function mnesia:stop() stops Mnesia on the node where the function is executed. The functions mnesia:start/0 and mnesia:stop/0 -work on the "local" Mnesia system. No functions start or stop a set of nodes.

      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. +work on the "local" Mnesia system. No functions start or stop a set of nodes.

      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. 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, @@ -228,9 +228,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 @@ -250,13 +250,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 @@ -300,11 +300,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, [])
        @@ -356,7 +356,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap4.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap4.html 2026-04-20 17:48:44.721710979 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap4.html 2026-04-20 17:48:44.721710979 +0000 @@ -103,14 +103,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 @@ -174,15 +174,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 @@ -223,13 +223,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 @@ -249,8 +249,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).

        Global Locks

        Write locks are normally acquired on all nodes where a replica of the table resides (and is active). Read locks are acquired on one node (the local one if a local replica exists).

        The function mnesia:lock/2 is intended to support table locks (as mentioned @@ -323,78 +323,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),
        /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap5.html differs (HTML document, UTF-8 Unicode text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap5.html	2026-04-20 17:48:44.769711286 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap5.html	2026-04-20 17:48:44.773711311 +0000
        @@ -119,9 +119,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.

      5. The database can be reconfigured, and tables can be moved between nodes. These operations do not affect the user programs.

      6. 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, @@ -162,52 +162,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>

          Fragmentation Properties

          The table property frag_properties can be read with the function +(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>

          Fragmentation Properties

          The table property frag_properties can be read with the function mnesia:table_info(Tab, frag_properties). The fragmentation properties are a list of tagged tuples with arity 2. By default the list is empty, but when it is non-empty it triggers Mnesia to regard the @@ -243,64 +243,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.
           #href_anchor"n">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>

        Management of Fragmented Tables

        The function mnesia:change_table_frag(Tab, Change) is intended to be used for +(a@sam)15> mnesia:activity(sync_dirty, Info, + [prim_dict, frag_size], mnesia_frag). +[{prim_dict,0}, + {prim_dict_frag2,0}, /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap7.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap7.html 2026-04-20 17:48:44.817711594 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap7.html 2026-04-20 17:48:44.817711594 +0000 @@ -161,26 +161,26 @@ for starting Mnesia:

        • An Erlang session must be started and a Mnesia directory must be specified for the database.
        • A database schema must be initiated, using the function mnesia:create_schema/1.

        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 @@ -212,11 +212,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 @@ -420,38 +420,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).

        Restore

        Tables can be restored online from a backup without restarting Mnesia. A + mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

        Restore

        Tables can be restored online from a backup without restarting Mnesia. A restore is performed with the function mnesia:restore(Opaque, Args), where Args can contain the following tuples:

        • {module, Mod}. The backup module Mod is used to access the backup media. If @@ -578,7 +578,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap8.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap8.html 2026-04-20 17:48:44.849711799 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_chap8.html 2026-04-20 17:48:44.849711799 +0000 @@ -150,7 +150,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_frag_hash.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_frag_hash.html 2026-04-20 17:48:44.881712002 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_frag_hash.html 2026-04-20 17:48:44.881712002 +0000 @@ -378,7 +378,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_overview.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_overview.html 2026-04-20 17:48:44.913712208 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_overview.html 2026-04-20 17:48:44.913712208 +0000 @@ -184,7 +184,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_registry.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_registry.html 2026-04-20 17:48:44.941712388 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/mnesia_registry.html 2026-04-20 17:48:44.941712388 +0000 @@ -217,8 +217,8 @@

          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)
        @@ -247,7 +247,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/notes.html 2026-04-20 17:48:44.985712669 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/notes.html 2026-04-20 17:48:44.989712694 +0000 @@ -93,9 +93,9 @@ version. The intention of this document is to list all incompatibilities as well as all enhancements and bugfixes for every release of Mnesia. Each release of Mnesia thus constitutes one section in this document. The title of each section -is the version number of Mnesia.

        Mnesia 4.25.2

        Improvements and New Features

        • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

          A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

          make release_docs places the documentation in the released code under the doc folder.

          make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

          The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

          Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

          Improves the source Software-Bill-of-Materials

          • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
          • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
          • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

          Own Id: OTP-19886 Aux Id: PR-10434

        Mnesia 4.25.1

        Fixed Bugs and Malfunctions

        • Fixed bug where mnesia:del_table_copy/3 could fail when deleting a node that had tables which was not active anywhere.

          Own Id: OTP-19890 Aux Id: ERIERL-1268, PR-10482

        Mnesia 4.25

        Fixed Bugs and Malfunctions

        • Add missing documentation about mnesia:activity/4

          Own Id: OTP-19769 Aux Id: PR-10186

        • With this change mnesia will try to not leak internal messages to user processes.

          Own Id: OTP-19855 Aux Id: GH-10347, PR-10379

        Improvements and New Features

        • The mnesia_registry module will be removed in Erlang/OTP 29.

          Own Id: OTP-19808 Aux Id: PR-10275

        Mnesia 4.24.1

        Fixed Bugs and Malfunctions

        • Mnesia no longer crashes when the node name is used as a table name.

          Own Id: OTP-19745 Aux Id: PR-10147

        Mnesia 4.24

        Improvements and New Features

        • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

          All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

          -type meter() :: integer().
          --type foot() :: integer().

          Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

          -nominal meter() :: integer().
          --nominal foot() :: integer().

          More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

          Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

          Own Id: OTP-19364 Aux Id: PR-9079

        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

          Own Id: OTP-19575 Aux Id: PR-9670

        Mnesia 4.23.5.1

        Fixed Bugs and Malfunctions

        • Fixed bug where mnesia:del_table_copy/3 could fail when deleting a node that had tables which was not active anywhere.

          Own Id: OTP-19890 Aux Id: ERIERL-1268, PR-10482

        Mnesia 4.23.5

        Fixed Bugs and Malfunctions

        • With this change mnesia will merge schema of tables using external backends.

          Own Id: OTP-19437 Aux Id: PR-9534

        Mnesia 4.23.4

        Fixed Bugs and Malfunctions

        • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

          Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

        Mnesia 4.23.3

        Fixed Bugs and Malfunctions

        • Mnesia table converted from ext_copies to disc_copies will now be properly saved to disk.

          Own Id: OTP-19292 Aux Id: PR-8921, GH-8706

        • Mnesia could crash if table was deleted during checkpoint initialization.

          Own Id: OTP-19368 Aux Id: ERIERL-1154, PR-9093

        Mnesia 4.23.2

        Fixed Bugs and Malfunctions

        • The mnesia_registry module have been deprecated.

          Own Id: OTP-18994

        Improvements and New Features

        • The documentation has been migrated to use Markdown and ExDoc.

          Own Id: OTP-18955 Aux Id: PR-8026

        Mnesia 4.23.1.2

        Fixed Bugs and Malfunctions

        • With this change mnesia will merge schema of tables using external backends.

          Own Id: OTP-19437 Aux Id: PR-9534

        • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

          Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

        Mnesia 4.23.1.1

        Fixed Bugs and Malfunctions

        • Mnesia could crash if table was deleted during checkpoint initialization.

          Own Id: OTP-19368 Aux Id: ERIERL-1154, PR-9093

        Mnesia 4.23.1

        Fixed Bugs and Malfunctions

        • Mnesia could crash during startup if del_table_copy/2 and add_table_copy/3 was invoked when the table was loading.

          Own Id: OTP-19076 Aux Id: ERIERL-1073

        Mnesia 4.23

        Fixed Bugs and Malfunctions

        • Document mnesia:foldl/4 and mnesia:foldr/4.

          Own Id: OTP-18798

        • mnesia:add_table_copy/3 no longer fails with reason system_limit when the +is the version number of Mnesia.

          Mnesia 4.25.2

          Improvements and New Features

          • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

            A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

            make release_docs places the documentation in the released code under the doc folder.

            make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

            The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

            Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

            Improves the source Software-Bill-of-Materials

            • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
            • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
            • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

            Own Id: OTP-19886 Aux Id: PR-10434

          Mnesia 4.25.1

          Fixed Bugs and Malfunctions

          • Fixed bug where mnesia:del_table_copy/3 could fail when deleting a node that had tables which was not active anywhere.

            Own Id: OTP-19890 Aux Id: ERIERL-1268, PR-10482

          Mnesia 4.25

          Fixed Bugs and Malfunctions

          • Add missing documentation about mnesia:activity/4

            Own Id: OTP-19769 Aux Id: PR-10186

          • With this change mnesia will try to not leak internal messages to user processes.

            Own Id: OTP-19855 Aux Id: GH-10347, PR-10379

          Improvements and New Features

          • The mnesia_registry module will be removed in Erlang/OTP 29.

            Own Id: OTP-19808 Aux Id: PR-10275

          Mnesia 4.24.1

          Fixed Bugs and Malfunctions

          • Mnesia no longer crashes when the node name is used as a table name.

            Own Id: OTP-19745 Aux Id: PR-10147

          Mnesia 4.24

          Improvements and New Features

          • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

            All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

            -type meter() :: integer().
            +-type foot() :: integer().

            Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

            -nominal meter() :: integer().
            +-nominal foot() :: integer().

            More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

            Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

            Own Id: OTP-19364 Aux Id: PR-9079

          • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

            Own Id: OTP-19575 Aux Id: PR-9670

          Mnesia 4.23.5.1

          Fixed Bugs and Malfunctions

          • Fixed bug where mnesia:del_table_copy/3 could fail when deleting a node that had tables which was not active anywhere.

            Own Id: OTP-19890 Aux Id: ERIERL-1268, PR-10482

          Mnesia 4.23.5

          Fixed Bugs and Malfunctions

          • With this change mnesia will merge schema of tables using external backends.

            Own Id: OTP-19437 Aux Id: PR-9534

          Mnesia 4.23.4

          Fixed Bugs and Malfunctions

          • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

            Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

          Mnesia 4.23.3

          Fixed Bugs and Malfunctions

          • Mnesia table converted from ext_copies to disc_copies will now be properly saved to disk.

            Own Id: OTP-19292 Aux Id: PR-8921, GH-8706

          • Mnesia could crash if table was deleted during checkpoint initialization.

            Own Id: OTP-19368 Aux Id: ERIERL-1154, PR-9093

          Mnesia 4.23.2

          Fixed Bugs and Malfunctions

          • The mnesia_registry module have been deprecated.

            Own Id: OTP-18994

          Improvements and New Features

          • The documentation has been migrated to use Markdown and ExDoc.

            Own Id: OTP-18955 Aux Id: PR-8026

          Mnesia 4.23.1.2

          Fixed Bugs and Malfunctions

          • With this change mnesia will merge schema of tables using external backends.

            Own Id: OTP-19437 Aux Id: PR-9534

          • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

            Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

          Mnesia 4.23.1.1

          Fixed Bugs and Malfunctions

          • Mnesia could crash if table was deleted during checkpoint initialization.

            Own Id: OTP-19368 Aux Id: ERIERL-1154, PR-9093

          Mnesia 4.23.1

          Fixed Bugs and Malfunctions

          • Mnesia could crash during startup if del_table_copy/2 and add_table_copy/3 was invoked when the table was loading.

            Own Id: OTP-19076 Aux Id: ERIERL-1073

          Mnesia 4.23

          Fixed Bugs and Malfunctions

          Improvements and New Features

          • Restore recreate of disc_only tables could crash if they had an index.

            Own Id: OTP-18843 Aux Id: GH-7766

          Mnesia 4.22.1

          Fixed Bugs and Malfunctions

          • Do not delete old backup file if the new backup fails.

            Own Id: OTP-18711 Aux Id: ERIERL-963

          Mnesia 4.22

          Improvements and New Features

          • Added debug statistics for active transactions.

            Own Id: OTP-18309 Aux Id: PR-6377

          • The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

            * POTENTIAL INCOMPATIBILITY *

            Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843

          Mnesia 4.21.4.4

          Fixed Bugs and Malfunctions

          • Mnesia could fail to load a table, if one of the copy holders was moved during startup.

            Own Id: OTP-19501 Aux Id: ERIERL-1195, PR-9499

          Mnesia 4.21.4.3

          Fixed Bugs and Malfunctions

          • Mnesia could crash during startup if del_table_copy/2 and add_table_copy/3 was invoked when the table was loading.

            Own Id: OTP-19076 Aux Id: ERIERL-1073

          Mnesia 4.21.4.2

          Fixed Bugs and Malfunctions

          Mnesia 4.21.4.1

          Fixed Bugs and Malfunctions

          • Do not delete old backup file if the new backup fails.

            Own Id: OTP-18711 Aux Id: ERIERL-963

          Mnesia 4.21.4

          Fixed Bugs and Malfunctions

          • Improved consistency for dirty writes when a table was added with @@ -279,7 +279,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/search.html 2026-04-20 17:48:45.013712849 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.25.2/doc/html/search.html 2026-04-20 17:48:45.013712849 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/404.html 2026-04-20 17:48:45.045713053 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/404.html 2026-04-20 17:48:45.041713027 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/api-reference.html 2026-04-20 17:48:45.069713207 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/api-reference.html 2026-04-20 17:48:45.069713207 +0000 @@ -146,7 +146,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/cdv_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/cdv_cmd.html 2026-04-20 17:48:45.101713411 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/cdv_cmd.html 2026-04-20 17:48:45.101713411 +0000 @@ -135,7 +135,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_ug.html 2026-04-20 17:48:45.137713642 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_ug.html 2026-04-20 17:48:45.133713616 +0000 @@ -240,7 +240,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_viewer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_viewer.html 2026-04-20 17:48:45.169713847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/crashdump_viewer.html 2026-04-20 17:48:45.169713847 +0000 @@ -268,7 +268,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop.html 2026-04-20 17:48:45.197714027 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop.html 2026-04-20 17:48:45.193714000 +0000 @@ -400,7 +400,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop_ug.html 2026-04-20 17:48:45.229714231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/etop_ug.html 2026-04-20 17:48:45.229714231 +0000 @@ -202,7 +202,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/introduction_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/introduction_ug.html 2026-04-20 17:48:45.257714410 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/introduction_ug.html 2026-04-20 17:48:45.253714385 +0000 @@ -142,7 +142,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/notes.html 2026-04-20 17:48:45.293714641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/notes.html 2026-04-20 17:48:45.297714666 +0000 @@ -323,7 +323,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/content.opf 2026-04-20 15:20:03.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/content.opf 2042-05-23 04:38:53.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> observer - 2.18.2 - urn:uuid:ab14dd47-0fc0-db49-6f87-4b2ddd58db12 + urn:uuid:6debee33-02b9-93cb-4b9f-beb0023875fe en - 2026-04-20T15:20:03Z + 2042-05-23T04:38:53Z /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/ttb_ug.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/ttb_ug.xhtml 2026-04-20 15:20:03.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/ttb_ug.xhtml 2042-05-23 04:38:53.000000000 +0000 @@ -46,116 +46,116 @@ text, but you can also write your own handler to make more complex interpretations of the trace information. A trace log can also be presented graphically with application Event Tracer (ET).

            If option format is specified to ttb:stop/1, the formatting is -automatically done when stopping ttb.

          Tracing Local Node from Erlang Shell

          The following small module is used in the subsequent example:

          -module(m).
          --export([f/0]).
          -f() ->
          +automatically done when stopping ttb.

        Tracing Local Node from Erlang Shell

        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

        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 @@ -175,9 +175,9 @@ called on the traced node, the trace control node does not show. To start a hidden node, add option -hidden to the erl command, for example:

        % erl -sname trace_control -hidden

        Diskless Node

        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]}

        More Tracing Options

        When setting up a trace, the following features can also be activated:

        • Time-constrained tracing
        • Overload protection
        • Autoresume
        • dbg mode

        Time-Constrained Tracing

        It can sometimes be helpful to enable trace for a specified period of time (for +with value {local, File}, for example:

        (trace_control@durin)1> ttb:tracer(mynode@diskless,
        +                                   {file,{local,{wrap,"mytrace"}}}).
        +{ok,[mynode@diskless]}

        More Tracing Options

        When setting up a trace, the following features can also be activated:

        • Time-constrained tracing
        • Overload protection
        • Autoresume
        • dbg mode

        Time-Constrained Tracing

        It can sometimes be helpful to enable trace for a specified period of time (for example, to monitor a system for 24 hours or half a second). This can be done with option {timer, TimerSpec}. If TimerSpec has the form of MSec, the trace is stopped after MSec milliseconds using ttb:stop/0. If more options @@ -185,10 +185,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.

        Overload Protection

        When tracing live systems, always take special care to not overload a node with /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/ttb.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/ttb.xhtml 2026-04-20 15:20:03.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.epub/OEBPS/ttb.xhtml 2042-05-23 04:38:53.000000000 +0000 @@ -1808,13 +1808,13 @@ 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.

      @@ -1853,14 +1853,14 @@

      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).
      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.html 2026-04-20 17:48:45.473715793 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer.html 2026-04-20 17:48:45.473715793 +0000 @@ -356,7 +356,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_app.html 2026-04-20 17:48:45.505715998 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_app.html 2026-04-20 17:48:45.505715998 +0000 @@ -133,7 +133,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_ug.html 2026-04-20 17:48:45.545716253 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/observer_ug.html 2026-04-20 17:48:45.541716228 +0000 @@ -234,7 +234,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/search.html 2026-04-20 17:48:45.573716433 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/search.html 2026-04-20 17:48:45.573716433 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb.html 2026-04-20 17:48:45.625716766 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb.html 2026-04-20 17:48:45.629716792 +0000 @@ -1895,13 +1895,13 @@ 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.

      @@ -1940,14 +1940,14 @@

      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).
      @@ -2519,7 +2519,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb_ug.html 2026-04-20 17:48:45.689717176 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.2/doc/html/ttb_ug.html 2026-04-20 17:48:45.689717176 +0000 @@ -118,116 +118,116 @@ text, but you can also write your own handler to make more complex interpretations of the trace information. A trace log can also be presented graphically with application Event Tracer (ET).

      If option format is specified to ttb:stop/1, the formatting is -automatically done when stopping ttb.

      Tracing Local Node from Erlang Shell

      The following small module is used in the subsequent example:

      -module(m).
      --export([f/0]).
      -f() ->
      +automatically done when stopping ttb.

      Tracing Local Node from Erlang Shell

      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

      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 @@ -247,9 +247,9 @@ called on the traced node, the trace control node does not show. To start a hidden node, add option -hidden to the erl command, for example:

      % erl -sname trace_control -hidden

      Diskless Node

      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]}

      More Tracing Options

      When setting up a trace, the following features can also be activated:

      • Time-constrained tracing
      • Overload protection
      • Autoresume
      • dbg mode

      Time-Constrained Tracing

      It can sometimes be helpful to enable trace for a specified period of time (for +with value {local, File}, for example:

      (trace_control@durin)1> ttb:tracer(mynode@diskless,
      +                                   {file,{local,{wrap,"mytrace"}}}).
      +{ok,[mynode@diskless]}

      More Tracing Options

      When setting up a trace, the following features can also be activated:

      • Time-constrained tracing
      • Overload protection
      • Autoresume
      • dbg mode

      Time-Constrained Tracing

      It can sometimes be helpful to enable trace for a specified period of time (for example, to monitor a system for 24 hours or half a second). This can be done with option {timer, TimerSpec}. If TimerSpec has the form of MSec, the trace is stopped after MSec milliseconds using ttb:stop/0. If more options @@ -257,10 +257,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.

      Overload Protection

      When tracing live systems, always take special care to not overload a node with /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/404.html 2026-04-20 17:48:45.717717356 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/404.html 2026-04-20 17:48:45.717717356 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/api-reference.html 2026-04-20 17:48:45.745717534 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/api-reference.html 2026-04-20 17:48:45.745717534 +0000 @@ -118,7 +118,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/databases.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/databases.html 2026-04-20 17:48:45.777717740 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/databases.html 2026-04-20 17:48:45.777717740 +0000 @@ -195,7 +195,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/error_handling.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/error_handling.html 2026-04-20 17:48:45.809717945 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/error_handling.html 2026-04-20 17:48:45.809717945 +0000 @@ -200,7 +200,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/getting_started.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/getting_started.html 2026-04-20 17:48:45.845718176 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/getting_started.html 2026-04-20 17:48:45.853718226 +0000 @@ -109,77 +109,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 = &#href_anchor"p" data-group-id="6462264490-1">).
      -     {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 = &#href_anchor"p" data-group-id="2784793463-1">).
      +     {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
      @@ -238,7 +238,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/introduction.html 2026-04-20 17:48:45.885718432 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/introduction.html 2026-04-20 17:48:45.885718432 +0000 @@ -154,7 +154,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/notes.html 2026-04-20 17:48:45.929718712 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/notes.html 2026-04-20 17:48:45.925718687 +0000 @@ -256,7 +256,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.epub/OEBPS/content.opf 2026-04-20 15:20:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.epub/OEBPS/content.opf 2042-05-23 04:38:55.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> odbc - 2.16.1 - urn:uuid:512cc029-acf8-7b0b-af87-9640c407ea59 + urn:uuid:a5a8c81c-f337-2952-e807-987b4818d315 en - 2026-04-20T15:20:05Z + 2042-05-23T04:38:55Z /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.epub/OEBPS/getting_started.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.epub/OEBPS/getting_started.xhtml 2026-04-20 15:20:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.epub/OEBPS/getting_started.xhtml 2042-05-23 04:38:55.000000000 +0000 @@ -37,77 +37,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
      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.html	2026-04-20 17:48:46.081719671 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/odbc.html	2026-04-20 17:48:46.089719721 +0000
      @@ -1801,7 +1801,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/search.html 2026-04-20 17:48:46.121719919 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16.1/doc/html/search.html 2026-04-20 17:48:46.121719919 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/404.html 2026-04-20 17:48:46.145720068 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/404.html 2026-04-20 17:48:46.145720068 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/api-reference.html 2026-04-20 17:48:46.173720242 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/api-reference.html 2026-04-20 17:48:46.169720216 +0000 @@ -154,7 +154,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/cpu_sup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/cpu_sup.html 2026-04-20 17:48:46.205720440 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/cpu_sup.html 2026-04-20 17:48:46.209720465 +0000 @@ -604,7 +604,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/disksup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/disksup.html 2026-04-20 17:48:46.241720664 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/disksup.html 2026-04-20 17:48:46.245720688 +0000 @@ -528,7 +528,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/memsup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/memsup.html 2026-04-20 17:48:46.277720887 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/memsup.html 2026-04-20 17:48:46.277720887 +0000 @@ -652,7 +652,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/notes.html 2026-04-20 17:48:46.317721135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/notes.html 2026-04-20 17:48:46.317721135 +0000 @@ -248,7 +248,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/nteventlog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/nteventlog.html 2026-04-20 17:48:46.353721359 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/nteventlog.html 2026-04-20 17:48:46.353721359 +0000 @@ -300,7 +300,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon.epub/OEBPS/content.opf 2026-04-20 15:19:51.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon.epub/OEBPS/content.opf 2042-05-23 04:38:40.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> os_mon - 2.11.2 - urn:uuid:0d87a4f1-4777-9cd9-86a4-a0b05d310643 + urn:uuid:0b939d49-68c5-311c-2c59-56125c8773c1 en - 2026-04-20T15:19:51Z + 2042-05-23T04:38:40Z /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon_app.html 2026-04-20 17:48:46.481722151 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_mon_app.html 2026-04-20 17:48:46.481722151 +0000 @@ -145,7 +145,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_sup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_sup.html 2026-04-20 17:48:46.509722326 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/os_sup.html 2026-04-20 17:48:46.513722351 +0000 @@ -363,7 +363,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/search.html 2026-04-20 17:48:46.541722525 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.2/doc/html/search.html 2026-04-20 17:48:46.541722525 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/404.html 2026-04-20 17:48:46.565722673 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/404.html 2026-04-20 17:48:46.565722673 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/api-reference.html 2026-04-20 17:48:46.593722847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/api-reference.html 2026-04-20 17:48:46.589722822 +0000 @@ -127,7 +127,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/leex.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/leex.html 2026-04-20 17:48:46.633723094 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/leex.html 2026-04-20 17:48:46.637723120 +0000 @@ -126,13 +126,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.

      Regular Expressions

      The regular expressions allowed here is a subset of the set found in egrep and @@ -678,7 +678,7 @@ 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
      @@ -767,7 +767,7 @@ 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
      @@ -943,7 +943,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/notes.html 2026-04-20 17:48:46.677723368 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/notes.html 2026-04-20 17:48:46.677723368 +0000 @@ -89,9 +89,9 @@ -

      This document describes the changes made to the Parsetools application.

      Parsetools 2.7.1

      Fixed Bugs and Malfunctions

      • The documentation for the token/3 and tokens/3 functions was corrected. The return value when there were too few characters is {more,Cont}.

        Own Id: OTP-19901 Aux Id: PR-10484

      Parsetools 2.7

      Improvements and New Features

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        --type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        --nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

        Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Parsetools 2.6

      Improvements and New Features

      • The leex documentation has been updated to use specs for documenting the generated interface.

        Own Id: OTP-18796 Aux Id: PR-7703

      • yecc now wraps the -module attribute with -file to indicate the .yrl source file.

        Own Id: OTP-18912 Aux Id: PR-7963

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      Parsetools 2.5

      Improvements and New Features

      • Leex has been extended with optional column number support.

        Own Id: OTP-18491 Aux Id: PR-6882

      Parsetools 2.4.1

      Improvements and New Features

      • There is a new configure option, --enable-deterministic-build, which will +

        This document describes the changes made to the Parsetools application.

        Parsetools 2.7.1

        Fixed Bugs and Malfunctions

        • The documentation for the token/3 and tokens/3 functions was corrected. The return value when there were too few characters is {more,Cont}.

          Own Id: OTP-19901 Aux Id: PR-10484

        Parsetools 2.7

        Improvements and New Features

        • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

          All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

          -type meter() :: integer().
          +-type foot() :: integer().

          Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

          -nominal meter() :: integer().
          +-nominal foot() :: integer().

          More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

          Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

          Own Id: OTP-19364 Aux Id: PR-9079

        • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

          Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

          Own Id: OTP-19575 Aux Id: PR-9670

        Parsetools 2.6

        Improvements and New Features

        • The leex documentation has been updated to use specs for documenting the generated interface.

          Own Id: OTP-18796 Aux Id: PR-7703

        • yecc now wraps the -module attribute with -file to indicate the .yrl source file.

          Own Id: OTP-18912 Aux Id: PR-7963

        • The documentation has been migrated to use Markdown and ExDoc.

          Own Id: OTP-18955 Aux Id: PR-8026

        Parsetools 2.5

        Improvements and New Features

        • Leex has been extended with optional column number support.

          Own Id: OTP-18491 Aux Id: PR-6882

        Parsetools 2.4.1

        Improvements and New Features

        • There is a new configure option, --enable-deterministic-build, which will apply the deterministic compiler option when building Erlang/OTP. The deterministic option has been improved to eliminate more sources of non-determinism in several applications.

          Own Id: OTP-18165 Aux Id: PR-5965

        Parsetools 2.4

        Improvements and New Features

        • In the generated code, yecc will now quote all atoms coming from terminals @@ -176,7 +176,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/content.opf 2026-04-20 15:18:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/content.opf 2042-05-23 04:36:42.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> parsetools - 2.7.1 - urn:uuid:a3b8be7e-12d9-9cd9-6e28-a9eb7dc15f2f + urn:uuid:c81e4b2b-c70f-22ae-2d2c-b5e988206956 en - 2026-04-20T15:18:12Z + 2042-05-23T04:36:42Z /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/leex.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/leex.xhtml 2026-04-20 15:18:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/leex.xhtml 2042-05-23 04:36:42.000000000 +0000 @@ -55,13 +55,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.

          Regular Expressions

          The regular expressions allowed here is a subset of the set found in egrep and @@ -591,7 +591,7 @@ 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
          @@ -680,7 +680,7 @@ 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
          /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/notes.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/notes.xhtml 2026-04-20 15:18:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/notes.xhtml 2042-05-23 04:36:42.000000000 +0000 @@ -17,9 +17,9 @@

          Parsetools Release Notes

          -

          This document describes the changes made to the Parsetools application.

          Parsetools 2.7.1

          Fixed Bugs and Malfunctions

          • The documentation for the token/3 and tokens/3 functions was corrected. The return value when there were too few characters is {more,Cont}.

            Own Id: OTP-19901 Aux Id: PR-10484

          Parsetools 2.7

          Improvements and New Features

          • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

            All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

            -type meter() :: integer().
            --type foot() :: integer().

            Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

            -nominal meter() :: integer().
            --nominal foot() :: integer().

            More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

            Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

            Own Id: OTP-19364 Aux Id: PR-9079

          • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

            Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

          • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

            Own Id: OTP-19575 Aux Id: PR-9670

          Parsetools 2.6

          Improvements and New Features

          • The leex documentation has been updated to use specs for documenting the generated interface.

            Own Id: OTP-18796 Aux Id: PR-7703

          • yecc now wraps the -module attribute with -file to indicate the .yrl source file.

            Own Id: OTP-18912 Aux Id: PR-7963

          • The documentation has been migrated to use Markdown and ExDoc.

            Own Id: OTP-18955 Aux Id: PR-8026

          Parsetools 2.5

          Improvements and New Features

          • Leex has been extended with optional column number support.

            Own Id: OTP-18491 Aux Id: PR-6882

          Parsetools 2.4.1

          Improvements and New Features

          • There is a new configure option, --enable-deterministic-build, which will +

            This document describes the changes made to the Parsetools application.

            Parsetools 2.7.1

            Fixed Bugs and Malfunctions

            • The documentation for the token/3 and tokens/3 functions was corrected. The return value when there were too few characters is {more,Cont}.

              Own Id: OTP-19901 Aux Id: PR-10484

            Parsetools 2.7

            Improvements and New Features

            • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

              All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

              -type meter() :: integer().
              +-type foot() :: integer().

              Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

              -nominal meter() :: integer().
              +-nominal foot() :: integer().

              More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

              Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

              Own Id: OTP-19364 Aux Id: PR-9079

            • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

              Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

            • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

              Own Id: OTP-19575 Aux Id: PR-9670

            Parsetools 2.6

            Improvements and New Features

            • The leex documentation has been updated to use specs for documenting the generated interface.

              Own Id: OTP-18796 Aux Id: PR-7703

            • yecc now wraps the -module attribute with -file to indicate the .yrl source file.

              Own Id: OTP-18912 Aux Id: PR-7963

            • The documentation has been migrated to use Markdown and ExDoc.

              Own Id: OTP-18955 Aux Id: PR-8026

            Parsetools 2.5

            Improvements and New Features

            • Leex has been extended with optional column number support.

              Own Id: OTP-18491 Aux Id: PR-6882

            Parsetools 2.4.1

            Improvements and New Features

            • There is a new configure option, --enable-deterministic-build, which will apply the deterministic compiler option when building Erlang/OTP. The deterministic option has been improved to eliminate more sources of non-determinism in several applications.

              Own Id: OTP-18165 Aux Id: PR-5965

            Parsetools 2.4

            Improvements and New Features

            • In the generated code, yecc will now quote all atoms coming from terminals /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/yecc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/yecc.xhtml 2026-04-20 15:18:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/parsetools.epub/OEBPS/yecc.xhtml 2042-05-23 04:36:42.000000000 +0000 @@ -44,8 +44,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 @@ -103,8 +103,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 @@ -116,8 +116,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 @@ -134,12 +134,12 @@ elements -> element elements : {cons, '$1', '$2'}. elements -> '$empty' : nil. element -> atom : '$1'. -element -> list : '$1'.

      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 +element -> list : '$1'.

      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 (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 @@ -148,15 +148,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 @@ -200,36 +200,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 /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/search.html 2026-04-20 17:48:46.829724311 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/search.html 2026-04-20 17:48:46.829724311 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/yecc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/yecc.html 2026-04-20 17:48:46.865724534 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7.1/doc/html/yecc.html 2026-04-20 17:48:46.873724584 +0000 @@ -115,8 +115,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 @@ -174,8 +174,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 @@ -187,8 +187,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 @@ -205,12 +205,12 @@ elements -> element elements : {cons, '$1', '$2'}. elements -> '$empty' : nil. element -> atom : '$1'. -element -> list : '$1'.

    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 +element -> list : '$1'.

    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 (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 @@ -219,15 +219,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 @@ -271,36 +271,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 @@ -806,7 +806,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/404.html 2026-04-20 17:48:46.901724758 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/404.html 2026-04-20 17:48:46.901724758 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/api-reference.html 2026-04-20 17:48:46.925724906 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/api-reference.html 2026-04-20 17:48:46.929724931 +0000 @@ -118,7 +118,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/notes.html 2026-04-20 17:48:46.973725205 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/notes.html 2026-04-20 17:48:46.977725229 +0000 @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/content.opf 2026-04-20 15:19:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/content.opf 2042-05-23 04:38:47.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> public_key - 1.20.2 - urn:uuid:bc331410-cc01-f946-f4d8-7c0003274ad7 + urn:uuid:13d37fed-6e5c-4e64-7da7-f501e1518654 en - 2026-04-20T15:19:57Z + 2042-05-23T04:38:47Z /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/public_key_records.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/public_key_records.xhtml 2026-04-20 15:19:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/public_key_records.xhtml 2042-05-23 04:38:47.000000000 +0000 @@ -21,57 +21,57 @@ 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").

    Data Types

    Common non-standard Erlang data types used to describe the record fields in the +macros described in the following sections:

     -include_lib("public_key/include/public_key.hrl").

    Data Types

    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()

    RSA

    Erlang representation of +OID_name() = atom()

    RSA

    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()
    @@ -82,89 +82,89 @@
        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'{
    +  }.

    DSA

    Erlang representation of +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()
    -  }.

    ECDSA and EDDSA

    Erlang representation of + }.

    ECDSA and EDDSA

    Erlang representation of Elliptic Curve Digital Signature Algorithm (ECDSA) 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() |  ecPrivkeyVer1 (enumeration value, decode returns atom, encode accepts both)
        privateKey,    % binary()
        parameters,    % {ecParameters, #'ECParameters'{}} | - Legacy
                       % {namedCurve, Oid::tuple()} |
                       % {implicitlyCA, 'NULL'}
        publicKey      % bitstring()
    -  }.
    +  }.
     
     %% Legacy no longer defined in current PKIX standard
    -#'ECParameters'{
    +#'ECParameters'{
        version,    % pos_integer() | v1 (enumeration value)
        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
    -  }.

    PKIX Certificates

    Erlang representation of PKIX certificates derived from ASN.1 specifications see + }.

    PKIX Certificates

    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()
    /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/public_key.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/public_key.xhtml	2026-04-20 15:19:57.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/public_key.xhtml	2042-05-23 04:38:47.000000000 +0000
    @@ -2799,22 +2799,22 @@
     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 @@ -2987,9 +2987,9 @@ 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 @@ -3184,14 +3184,14 @@

          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.

    @@ -4382,18 +4382,18 @@ 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.

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/using_public_key.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/using_public_key.xhtml 2026-04-20 15:19:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.epub/OEBPS/using_public_key.xhtml 2042-05-23 04:38:47.000000000 +0000 @@ -28,24 +28,24 @@ -----END <SOMETHING>----- <text>

    A file can contain several BEGIN/END blocks. Text lines between blocks are ignored. Attributes, if present, are ignored except for Proc-Type and -DEK-Info, which are used when DER data is encrypted.

    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,
    +DEK-Info, which are used when DER data is encrypted.

    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,
                         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,
    +                    162,207,61,246,...>>,
    +                    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}

    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,
    +                 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,
                         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',
    +                    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',
                      modulus = 1112355156729921663373...2737107,
                      publicExponent = 65537,
                      privateExponent = 58064406231183...2239766033,
    @@ -54,226 +54,226 @@
                      exponent1 = 77928819327425934607...22152984217,
                      exponent2 = 36287623121853605733...20588523793,
                      coefficient = 924840412626098444...41820968343,
    -                 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,
    +                 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,
                       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,
    -                  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},
    + {'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'{
         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,
    /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.html	2026-04-20 17:48:47.177726470 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key.html	2026-04-20 17:48:47.177726470 +0000
    @@ -2921,22 +2921,22 @@
     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 @@ -3109,9 +3109,9 @@ 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 @@ -3311,14 +3311,14 @@

          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.

            @@ -4534,18 +4534,18 @@ 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.

          @@ -4613,7 +4613,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_app.html 2026-04-20 17:48:47.213726693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_app.html 2026-04-20 17:48:47.213726693 +0000 @@ -156,7 +156,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_records.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_records.html 2026-04-20 17:48:47.253726940 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/public_key_records.html 2026-04-20 17:48:47.257726966 +0000 @@ -93,57 +93,57 @@ 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").

          Data Types

          Common non-standard Erlang data types used to describe the record fields in the +macros described in the following sections:

           -include_lib("public_key/include/public_key.hrl").

          Data Types

          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, [#href_anchor"ss">'AttributeTypeAndValue'{}]}} |
          +                 {directoryName, {rdnSequence, [#href_anchor"ss">'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()

          RSA

          Erlang representation of +OID_name() = atom()

          RSA

          Erlang representation of Rivest-Shamir-Adleman cryptosystem (RSA) -keys follows:

          #href_anchor"ss">'RSAPublicKey'{
          +keys follows:

          #href_anchor"ss">'RSAPublicKey'{
              modulus,       % pos_integer()
              publicExponent % pos_integer()
          -  }.
          +  }.
           
          -#'RSAPrivateKey'{
          +#'RSAPrivateKey'{
              version,         % two-prime | multi
              modulus,         % pos_integer()
              publicExponent,  % pos_integer()
          @@ -154,89 +154,89 @@
              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

          #href_anchor"ss">'DSAPrivateKey'{
          +  }.

          DSA

          Erlang representation of +Digital Signature Algorithm (DSA) keys

          #href_anchor"ss">'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()
          -  }.

          ECDSA and EDDSA

          Erlang representation of + }.

          ECDSA and EDDSA

          Erlang representation of Elliptic Curve Digital Signature Algorithm (ECDSA) and Edwards-Curve Digital Signature Algorithm (EDDSA) where parameters in the private key will be -{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

          #href_anchor"ss">'ECPrivateKey'{
          +{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

          #href_anchor"ss">'ECPrivateKey'{
              version,       % pos_integer() |  ecPrivkeyVer1 (enumeration value, decode returns atom, encode accepts both)
              privateKey,    % binary()
              parameters,    % {ecParameters, #'ECParameters'{}} | - Legacy
                             % {namedCurve, Oid::tuple()} |
                             % {implicitlyCA, 'NULL'}
              publicKey      % bitstring()
          -  }.
          +  }.
           
           %% Legacy no longer defined in current PKIX standard
          -#'ECParameters'{
          +#'ECParameters'{
              version,    % pos_integer() | v1 (enumeration value)
              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
          -  }.

          PKIX Certificates

          Erlang representation of PKIX certificates derived from ASN.1 specifications see + }.

          PKIX Certificates

          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:

          #href_anchor"ss">'Certificate'{
          +referred to as plain type, are as follows:

          #href_anchor"ss">'Certificate'{
              tbsCertificate,        % #'TBSCertificate'{}
              signatureAlgorithm,    % #'AlgorithmIdentifier'{}
              signature              % bitstring()
          -  }.
          +  }.
           
          -#'TBSCertificate'{
          +#'TBSCertificate'{
              version,              % v1 | v2 | v3
              serialNumber,         % pos_integer()
          /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/search.html	2026-04-20 17:48:47.289727165 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/search.html	2026-04-20 17:48:47.289727165 +0000
          @@ -108,7 +108,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/using_public_key.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/using_public_key.html 2026-04-20 17:48:47.333727438 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.20.2/doc/html/using_public_key.html 2026-04-20 17:48:47.341727487 +0000 @@ -100,24 +100,24 @@ -----END <SOMETHING>----- <text>

          A file can contain several BEGIN/END blocks. Text lines between blocks are ignored. Attributes, if present, are ignored except for Proc-Type and -DEK-Info, which are used when DER data is encrypted.

          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,
          +DEK-Info, which are used when DER data is encrypted.

          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,
                               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,
          +                    162,207,61,246,...>>,
          +                    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}

          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,
          +                 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,
                               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',
          +                    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',
                            modulus = 1112355156729921663373...2737107,
                            publicExponent = 65537,
                            privateExponent = 58064406231183...2239766033,
          @@ -126,226 +126,226 @@
                            exponent1 = 77928819327425934607...22152984217,
                            exponent2 = 36287623121853605733...20588523793,
                            coefficient = 924840412626098444...41820968343,
          -                 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,
          +                 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,
                             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,
          -                  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},
          + {'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'{
               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,
          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/404.html	2026-04-20 17:48:47.373727685 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/404.html	2026-04-20 17:48:47.373727685 +0000
          @@ -110,7 +110,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/api-reference.html 2026-04-20 17:48:47.401727859 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/api-reference.html 2026-04-20 17:48:47.401727859 +0000 @@ -118,7 +118,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/notes.html 2026-04-20 17:48:47.433728058 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/notes.html 2026-04-20 17:48:47.437728083 +0000 @@ -282,7 +282,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.epub/OEBPS/content.opf 2026-04-20 15:19:44.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.epub/OEBPS/content.opf 2042-05-23 04:38:33.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> reltool - 1.0.3 - urn:uuid:d2040b94-b0a5-3c2c-3a5b-cd2dc9e155df + urn:uuid:650e00c8-cd34-a906-1b34-f8ff8e0e60ad en - 2026-04-20T15:19:44Z + 2042-05-23T04:38:33Z /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml 2026-04-20 15:19:44.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml 2042-05-23 04:38:33.000000000 +0000 @@ -21,482 +21,482 @@ 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).
          -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)
          +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)
           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,[]}]},
          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.html differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.html	2026-04-20 17:48:47.585729001 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool.html	2026-04-20 17:48:47.593729051 +0000
          @@ -2846,7 +2846,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_examples.html 2026-04-20 17:48:47.637729323 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_examples.html 2026-04-20 17:48:47.637729323 +0000 @@ -93,482 +93,482 @@ 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).
          -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)
          +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)
           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,[]}]},
          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_intro.html	2026-04-20 17:48:47.669729522 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_intro.html	2026-04-20 17:48:47.673729546 +0000
          @@ -153,7 +153,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_usage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_usage.html 2026-04-20 17:48:47.705729745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/reltool_usage.html 2026-04-20 17:48:47.705729745 +0000 @@ -251,7 +251,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/search.html 2026-04-20 17:48:47.733729919 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.3/doc/html/search.html 2026-04-20 17:48:47.733729919 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/404.html 2026-04-20 17:48:47.765730117 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/404.html 2026-04-20 17:48:47.765730117 +0000 @@ -110,7 +110,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/api-reference.html 2026-04-20 17:48:47.789730266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/api-reference.html 2026-04-20 17:48:47.789730266 +0000 @@ -163,7 +163,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg.html 2026-04-20 17:48:47.849730638 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg.html 2026-04-20 17:48:47.849730638 +0000 @@ -1896,40 +1896,40 @@ as the argument of the function call; it cannot be held in a variable which in turn is passed to the function. Furthermore, the parse transform module ms_transform must be enabled. The easiest way to -enable it is by adding the following line to the source file:

          -include_lib("stdlib/include/ms_transform.hrl").

          Failing to include ms_transform.hrl in the source will result in a runtime +enable it is by adding the following line to the source file:

          -include_lib("stdlib/include/ms_transform.hrl").

          Failing to include ms_transform.hrl in the source will result in a runtime error, not a compile-time error.

          This function can also be invoked directly from the Erlang shell, as shown in the examples that follow.

          The head of the fun must be a single pattern that matches a list. That pattern -will be used to match the arguments for the call:

          Examples:

          1> dbg:fun2ms(fun([_,_]) -> true end).
          -[{[&#href_anchor"p">,'_'],[],[true]}]
          -2> dbg:fun2ms(fun(Args) when length(Args) > 6 -> true end).
          -[{'$1',[{'>',{length,'$1'},6}],[true]}]

          The first match specification matches when a function having two +will be used to match the arguments for the call:

          Examples:

          1> dbg:fun2ms(fun([_,_]) -> true end).
          +[{[&#href_anchor"p">,'_'],[],[true]}]
          +2> dbg:fun2ms(fun(Args) when length(Args) > 6 -> true end).
          +[{'$1',[{'>',{length,'$1'},6}],[true]}]

          The first match specification matches when a function having two arguments is called. The second matches when a function with more than -6 arguments is called.

          Examples:

          1> dbg:fun2ms(fun(42) -> true end).
          +6 arguments is called.

          Examples:

          1> dbg:fun2ms(fun(42) -> true end).
           Error: dbg:fun2ms requires fun with single variable or list parameter
          -{error,transform_error}
          -2> dbg:fun2ms(fun([<<H,T/binary>>]) -> true end).
          +{error,transform_error}
          +2> dbg:fun2ms(fun([<<H,T/binary>>]) -> true end).
           Error: fun head contains bit syntax matching of variable 'H', which cannot be translated into match_spec
          -{error,transform_error}

          The preceding two examples show what happens when a fun cannot be +{error,transform_error}

          The preceding two examples show what happens when a fun cannot be translated into a match specification. In the first example, the fun head connot possibly match a list. In the second example, an attempt is made to take apart a binary using the bit syntax, which is currently not -supported in match specifications.

          However, note that literal binaries can be matched:

          1> dbg:fun2ms(fun([<<"abc">>]) -> true end).
          -[{[<<"abc">>],[],[true]}]

          Match specifications support a large subset of the +supported in match specifications.

          However, note that literal binaries can be matched:

          1> dbg:fun2ms(fun([<<"abc">>]) -> true end).
          +[{[<<"abc">>],[],[true]}]

          Match specifications support a large subset of the guard expressions supported -by Erlang, but not all. For example, updating a map is currently not supported:

          1> dbg:fun2ms(fun([M]) when map_size(M#{a => b}) > 2 -> true end).
          -Error: the language element map (in guard) cannot be translated into match_spec
          -{error,transform_error}

          However, creating a map in a guard is allowed:

          1> dbg:fun2ms(fun([M]) when map_size(#{a => b}) > 2 -> true end).
          -[{['$1'],[{'>',{map_size,#{a => b}},2}],[true]}]

          Variables from the environment can be imported, so this works:

          1> X = 3.
          +by Erlang, but not all. For example, updating a map is currently not supported:

          1> dbg:fun2ms(fun([M]) when map_size(M#{a => b}) > 2 -> true end).
          +Error: the language element map (in guard) cannot be translated into match_spec
          +{error,transform_error}

          However, creating a map in a guard is allowed:

          1> dbg:fun2ms(fun([M]) when map_size(#{a => b}) > 2 -> true end).
          +[{['$1'],[{'>',{map_size,#{a => b}},2}],[true]}]

          Variables from the environment can be imported, so this works:

          1> X = 3.
           3
          -2> dbg:fun2ms(fun([M,N]) when N > X  -> return_trace() end).
          -[{['$1','$2'],[{'>','$2',{const,3}}],[{return_trace}]}]

          The imported variables will be replaced by const expressions, which +2> dbg:fun2ms(fun([M,N]) when N > X -> return_trace() end). +[{['$1','$2'],[{'>','$2',{const,3}}],[{return_trace}]}]

          The imported variables will be replaced by const expressions, which is consistent with the static scoping for Erlang funs.

          In the body of the fun, only guard expressions and calls to the special functions for tracing -are allowed.

          Examples:

          1> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
          -[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]
          -2> dbg:fun2ms(fun(_) -> erlang:garbage_collect() end).
          -Error: fun containing the remote function call 'erlang:garbage_collect/0' (called in body) cannot be translated into match_spec
          -{error,transform_error}

          Warning

          If the parse transform is not applied to a module which calls dbg:fun2ms/1, +are allowed.

          Examples:

          1> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
          +[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]
          +2> dbg:fun2ms(fun(_) -> erlang:garbage_collect() end).
          +Error: fun containing the remote function call 'erlang:garbage_collect/0' (called in body) cannot be translated into match_spec
          +{error,transform_error}

          Warning

          If the parse transform is not applied to a module which calls dbg:fun2ms/1, the call will fail in runtime with a badarg exception.

          More information is available in the documentation for module ms_transform in STDLIB.

          @@ -2137,16 +2137,16 @@ names, parameters, return values, and exceptions raised from functions

        • caller_trace, c - sets a trace that displays function names, parameters, and information about which function called it

        • caller_exception_trace, cx - combines exception_trace and -caller_trace

        Here is an example that shows how to use a built-in match specification:

        1> dbg:tracer().
        -{ok,<0.90.0>}
        -2> dbg:tp(lists, seq, 2, cx).
        -{ok,[{matched,nonode@nohost,1},{saved,cx}]}
        -3> dbg:p(self(), call).
        -{ok,[{matched,nonode@nohost,1}]}
        -4> lists:seq(1, 5).
        -(<0.88.0>) call lists:seq(1,5) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
        -[1,2,3,4,5]
        -(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5]
        +caller_trace

      Here is an example that shows how to use a built-in match specification:

      1> dbg:tracer().
      +{ok,<0.90.0>}
      +2> dbg:tp(lists, seq, 2, cx).
      +{ok,[{matched,nonode@nohost,1},{saved,cx}]}
      +3> dbg:p(self(), call).
      +{ok,[{matched,nonode@nohost,1}]}
      +4> lists:seq(1, 5).
      +(<0.88.0>) call lists:seq(1,5) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
      +[1,2,3,4,5]
      +(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5]
      @@ -2344,37 +2344,37 @@ is provided.

      Any dbg function that is called with in the provided fun will use the session/0 provided instead of the default dbg session. This means that the tracing will be isolated -from other tracing users on the system.

      The function returns the term that the fun returns.

      Example:

      1> S = dbg:session_create(my_session).
      +from other tracing users on the system.

      The function returns the term that the fun returns.

      Example:

      1> S = dbg:session_create(my_session).
       <0.91.0>
      -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
      -{ok,[{matched,nonode@nohost,2},{saved,x}]}
      -3> lists:seq(1, 10).
      -(<0.89.0>) call lists:seq(1,10)
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
      -[1,2,3,4,5,6,7,8,9,10]
      -4> dbg:session_destroy(S).
      +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
      +{ok,[{matched,nonode@nohost,2},{saved,x}]}
      +3> lists:seq(1, 10).
      +(<0.89.0>) call lists:seq(1,10)
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
      +[1,2,3,4,5,6,7,8,9,10]
      +4> dbg:session_destroy(S).
       ok

      The state of the session/0 is preserved in between session/2 calls, so -you can call session/2 multiple when debugging you application.

      Example:

      1> S = dbg:session_create(my_session).
      +you can call session/2 multiple when debugging you application.

      Example:

      1> S = dbg:session_create(my_session).
       <0.91.0>
       %% Setup the initial traces
      -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
      -{ok,[{matched,nonode@nohost,2},{saved,x}]}
      -3> lists:seq(1, 3).
      -(<0.89.0>) call lists:seq(1,3)
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      -[1,2,3]
      +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
      +{ok,[{matched,nonode@nohost,2},{saved,x}]}
      +3> lists:seq(1, 3).
      +(<0.89.0>) call lists:seq(1,3)
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      +[1,2,3]
       %% Add an additional trace pattern
      -4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
      +4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
       ok
      -5> lists:seq(1, 3).
      -(<0.89.0>) call lists:seq(1,3)
      -(<0.89.0>) call lists:seq_loop(3,3,[])
      -(<0.89.0>) call lists:seq_loop(1,1,[2,3])
      -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      -[1,2,3]
      -6> dbg:session_destroy(S).
      +5> lists:seq(1, 3).
      +(<0.89.0>) call lists:seq(1,3)
      +(<0.89.0>) call lists:seq_loop(3,3,[])
      +(<0.89.0>) call lists:seq_loop(1,1,[2,3])
      +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      +[1,2,3]
      +6> dbg:session_destroy(S).
       ok

      Note

      The session functionality is experimental in Erlang/OTP 27 and may change in future releases without notice.

      @@ -2548,11 +2548,11 @@ and will stand as an "alias" for the given expression.

      If the match specification is invalid, an {error, Errors} tuple is returned. Errors is as a list of tuples {error, string()}, where the string is a textual explanation of the compilation error. For -example:

      1> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]).
      -{error,
      - [{error,"Special form 'message' called with wrong number of
      -          arguments in {message,two,arguments}."},
      -  {error,"Function noexist/1 does_not_exist."}]}
      +example:

      1> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]).
      +{error,
      + [{error,"Special form 'message' called with wrong number of
      +          arguments in {message,two,arguments}."},
      +  {error,"Function noexist/1 does_not_exist."}]}
      @@ -2803,17 +2803,17 @@ host Hostname, from where it reads trace messages until the TCP/IP connection is closed. If no Hostname is specified, the local host is assumed.

      As an example, one can let trace messages be sent over the network to another Erlang node (preferably not distributed), where the formatting occurs.

      On the node stack there exists an Erlang node ant@stack. In the -shell, type the following:

      ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
      +shell, type the following:

      ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
       <0.17.0>
      -ant@stack> dbg:p(self(), send).
      -{ok,1}

      All trace messages are now sent to the trace port driver, which in turn listens +ant@stack> dbg:p(self(), send). +{ok,1}

      All trace messages are now sent to the trace port driver, which in turn listens for connections on the TCP/IP port 4711. If we want to see the messages on -another node, preferably on another host, we do like this:

      1> dbg:trace_client(ip, {"stack", 4711}).
      +another node, preferably on another host, we do like this:

      1> dbg:trace_client(ip, {"stack", 4711}).
       <0.42.0>

      If we now send a message from the shell on the node ant@stack, where all sends -from the shell are traced:

      ant@stack> self() ! hello.
      +from the shell are traced:

      ant@stack> self() ! hello.
       hello

      The following will appear at the console on the node that started the trace -client:

      (<0.23.0>) <0.23.0> ! hello
      -(<0.23.0>) <0.22.0> ! {shell_rep,<0.23.0>,{value,hello,[],[]}}

      The last line is generated due to internal message passing in the Erlang shell. +client:

      (<0.23.0>) <0.23.0> ! hello
      +(<0.23.0>) <0.22.0> ! {shell_rep,<0.23.0>,{value,hello,[],[]}}

      The last line is generated due to internal message passing in the Erlang shell. The pids will vary.

      @@ -2897,7 +2897,7 @@ /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg_guide.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg_guide.html 2026-04-20 17:48:47.901730961 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dbg_guide.html 2026-04-20 17:48:47.901730961 +0000 @@ -92,22 +92,22 @@

      The dbg module in Erlang provides a text-based interface for tracing function calls, processes, ports, and messages. It simplifies the use of the underlying trace:process/4, trace:port/4, and trace:function/4 BIFs (Built-In Functions). This guide will walk you through the basics of using dbg for your Erlang applications.

      This facility is useful for both quick debugging sessions in the shell and for more structured system testing, especially where other tools might have too much performance impact.

      Quick Start

      To trace a call to a function with minimal fuss, call dbg:c(Module, Name, Arguments). It starts a temporary trace receiver, enables all trace flags, and calls the designated function from a temporary process. For example, here is how to trace a call -to application:which_applications/0:

      1> dbg:c(application, which_applications, []).
      -(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
      -                                    [alias|
      -                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
      -                                   which_applications} (Timestamp: {1710,
      +to application:which_applications/0:

      1> dbg:c(application, which_applications, []).
      +(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
      +                                    [alias|
      +                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
      +                                   which_applications} (Timestamp: {1710,
                                                                           847802,
      -                                                                    479222})
      -(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
      -(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
      -(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
      -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
      -                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
      +                                                                    479222})
      +(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
      +(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
      +(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
      +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
      +                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
                                                                          847802,
      -                                                                   479274})
      -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
      - {kernel,"ERTS  CXC 138 10","9.2.2"}]

      In this example, four trace events are generated:

      • A send event (!) for the sending of a request from the current process + 479274}) +[{stdlib,"ERTS CXC 138 10","5.2.1"}, + {kernel,"ERTS CXC 138 10","9.2.2"}]

      In this example, four trace events are generated:

      • A send event (!) for the sending of a request from the current process to the application_controller process.
      • A schedule-out event (out) when the current process schedules out while waiting in a receive for the reply to arrive.
      • A schedule-in event (in) when the current process is scheduled in when reply has arrived.
      • A receive event (<<) when the current process retrieves the reply from @@ -116,8 +116,8 @@ tracer and set the trace flags of your choice on the processes you want to trace. This is useful, when there is a complex system of processes, ports or nodes interacting where dbg:c/3 is to blunt.

        Starting a Tracer (dbg:tracer/0,2)

        First, you need to start a tracer process that will receive and display trace -messages.

        1> dbg:tracer().  % Start the default trace message receiver
        -{ok,<0.90.0>}     % <0.90.0> is the PID of the tracer process

        This starts a server on the local node that will be the recipient of all trace +messages.

        1> dbg:tracer().  % Start the default trace message receiver
        +{ok,<0.90.0>}     % <0.90.0> is the PID of the tracer process

        This starts a server on the local node that will be the recipient of all trace messages. It uses a default handler that prints formatted trace messages to the Erlang shell.

        If you need a custom tracer other than the default, you can create a tracer using dbg:tracer(Type, Data):

        • Type = process: Data is {HandlerFun, InitialState}. HandlerFun is @@ -148,18 +148,18 @@ case of a single pid exactly 1). The specification of matched processes is {matched, Node, N}. If the remote processor call (using rpc) to a remote node fails, the rpc error message is returned as the fourth element in the -tuple and the number of matched processes is 0.

          Example: Trace messages and process events for a specific process

          1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
          +tuple and the number of matched processes is 0.

          Example: Trace messages and process events for a specific process

          1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
           <0.90.0>
          -2> dbg:tracer().
          -{ok,<0.92.0>}
          -3> dbg:p(Pid, [m,procs]). % Trace messages and process events for Pid
          -{ok,[{matched,nonode@nohost,1}]}
          -4> Pid ! {self(),hello}.
          -(<0.90.0>) << {<0.88.0>,hello} % Received by Pid
          -{<0.88.0>,hello}
          -(<0.90.0>) <0.88.0> ! hello    % Sent by Pid
          -(<0.90.0>) exit normal         % Process event: Pid exited
          -5> flush().
          +2> dbg:tracer().
          +{ok,<0.92.0>}
          +3> dbg:p(Pid, [m,procs]). % Trace messages and process events for Pid
          +{ok,[{matched,nonode@nohost,1}]}
          +4> Pid ! {self(),hello}.
          +(<0.90.0>) << {<0.88.0>,hello} % Received by Pid
          +{<0.88.0>,hello}
          +(<0.90.0>) <0.88.0> ! hello    % Sent by Pid
          +(<0.90.0>) exit normal         % Process event: Pid exited
          +5> flush().
           Shell got hello
           ok

          Tracing Function Calls (dbg:tp/2,3,4, dbg:tpl/2,3,4)

          To trace function calls, you need to:

          1. Enable the c/call flag for the process(es) that will make the calls (using dbg:p/2).
          2. Set a trace pattern for the function(s) you want to trace using dbg:tp/2 @@ -174,16 +174,16 @@ values, and exceptions. [{'_',[],[{exception_trace}]}]
          3. c or caller_trace: Shows function names, parameters, and caller information. [{'_',[],[{message,{caller_line}}]}]
          4. cx or caller_exception_trace: Combines x and c. -[{'_',[],[{exception_trace},{message,{caller_line}}]}]

      Example using built-in aliases:

      1> dbg:tracer().
      -{ok,<0.90.0>}
      -2> dbg:p(all, c). % Short for dbg:p(all, call)
      -{ok,[{matched,nonode@nohost,49}]}
      -3> dbg:tp(lists, seq, cx). % cx: call and exception tracing with caller info
      -{ok,[{matched,nonode@nohost,2},{saved,cx}]}
      -4> lists:seq(1, 3).
      -(<0.88.0>) call lists:seq(1,3) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
      -[1,2,3]
      -(<0.88.0>) returned from lists:seq/2 -> [1,2,3]

      Note that the caller info is the function that called lists:seq with file and +[{'_',[],[{exception_trace},{message,{caller_line}}]}]

    Example using built-in aliases:

    1> dbg:tracer().
    +{ok,<0.90.0>}
    +2> dbg:p(all, c). % Short for dbg:p(all, call)
    +{ok,[{matched,nonode@nohost,49}]}
    +3> dbg:tp(lists, seq, cx). % cx: call and exception tracing with caller info
    +{ok,[{matched,nonode@nohost,2},{saved,cx}]}
    +4> lists:seq(1, 3).
    +(<0.88.0>) call lists:seq(1,3) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    +[1,2,3]
    +(<0.88.0>) returned from lists:seq/2 -> [1,2,3]

    Note that the caller info is the function that called lists:seq with file and line number.

    Tracing Message Events (dbg:tpe/2)

    By default, if send or receive tracing is enabled for a process, all such events are traced. dbg:tpe(Event, MatchSpec) allows you to filter these events.

    • Event: send or 'receive'.
    • MatchSpec: A match specifications.
      • For send: Matches on [Receiver, Msg].
      • For 'receive': Matches on [Node, Sender, Msg].

    Managing Trace Patterns

    You can display, remove, save and load trace pattern matchspecifications, if @@ -207,10 +207,10 @@ enable it is by adding the following line to the source file: -include_lib("stdlib/include/ms_transform.hrl"). In the shell its already enabled.

    The head of the fun must be a single pattern that matches a list. That pattern -will be used to match the arguments for the call:

    1> dbg:fun2ms(fun([_,_]) -> true end). % Matches a function with two arguments
    -[{[&#href_anchor"p">,'_'],[],[true]}]
    -2> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
    -[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]

    The first match specification matches when a function having two +will be used to match the arguments for the call:

    1> dbg:fun2ms(fun([_,_]) -> true end). % Matches a function with two arguments
    +[{[&#href_anchor"p">,'_'],[],[true]}]
    +2> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
    +[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]

    The first match specification matches when a function having two arguments is called. The second matches when a function, taking one atom as an argument, is called.

    Trace Sessions

    To avoid interference between different tracing activities, you can create isolated dbg sessions.

    First you create a session with dbg:session_create(Name) @@ -219,37 +219,37 @@ This function runs dbg commands within Fun using the specified session.

    Any dbg function that is called with in the provided fun will use the session/0 provided instead of the default dbg session. This means that the tracing will be isolated -from other tracing users on the system.

    When you no longer need the session, use dbg:session_destroy(Session).

    Example:

    1> S = dbg:session_create(my_session).
    +from other tracing users on the system.

    When you no longer need the session, use dbg:session_destroy(Session).

    Example:

    1> S = dbg:session_create(my_session).
     <0.91.0>
    -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
    -{ok,[{matched,nonode@nohost,2},{saved,x}]}
    -3> lists:seq(1, 10).
    -(<0.89.0>) call lists:seq(1,10)
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
    -[1,2,3,4,5,6,7,8,9,10]
    -4> dbg:session_destroy(S).
    +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
    +{ok,[{matched,nonode@nohost,2},{saved,x}]}
    +3> lists:seq(1, 10).
    +(<0.89.0>) call lists:seq(1,10)
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
    +[1,2,3,4,5,6,7,8,9,10]
    +4> dbg:session_destroy(S).
     ok

    The state of the session/0 is preserved in between dbg:session/2 calls, so -you can call dbg:session/2 multiple times when debugging you application.

    Example:

    1> S = dbg:session_create(my_session).
    +you can call dbg:session/2 multiple times when debugging you application.

    Example:

    1> S = dbg:session_create(my_session).
     <0.91.0>
     %% Setup the initial traces
    -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
    -{ok,[{matched,nonode@nohost,2},{saved,x}]}
    -3> lists:seq(1, 3).
    -(<0.89.0>) call lists:seq(1,3)
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    -[1,2,3]
    +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
    +{ok,[{matched,nonode@nohost,2},{saved,x}]}
    +3> lists:seq(1, 3).
    +(<0.89.0>) call lists:seq(1,3)
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    +[1,2,3]
     %% Add an additional trace pattern
    -4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
    +4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
     ok
    -5> lists:seq(1, 3).
    -(<0.89.0>) call lists:seq(1,3)
    -(<0.89.0>) call lists:seq_loop(3,3,[])
    -(<0.89.0>) call lists:seq_loop(1,1,[2,3])
    -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    -[1,2,3]
    -6> dbg:session_destroy(S).
    +5> lists:seq(1, 3).
    +(<0.89.0>) call lists:seq(1,3)
    +(<0.89.0>) call lists:seq_loop(3,3,[])
    +(<0.89.0>) call lists:seq_loop(1,1,[2,3])
    +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    +[1,2,3]
    +6> dbg:session_destroy(S).
     ok

    Trace on Remote Nodes

    The dbg server keeps a list of nodes where tracing should be performed. Whenever a dbg:tp/2 call or a dbg:p/2 call is made, it is executed for all nodes in this list including the local node (except @@ -326,17 +326,17 @@ ignored.

    Example: Using an IP trace port and connecting to it from another node As an example, one can let trace messages be sent over the network to another Erlang node (preferably not distributed), where the formatting occurs.

    On the node stack there exists an Erlang node ant@stack. In the -shell, type the following:

    ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
    +shell, type the following:

    ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
     <0.17.0>
    -ant@stack> dbg:p(self(), send).
    -{ok,1}

    All trace messages are now sent to the trace port driver, which in turn listens +ant@stack> dbg:p(self(), send). +{ok,1}

    All trace messages are now sent to the trace port driver, which in turn listens for connections on the TCP/IP port 4711. If we want to see the messages on -another node, preferably on another host, we do like this:

    1> dbg:trace_client(ip, {"stack", 4711}).
    +another node, preferably on another host, we do like this:

    1> dbg:trace_client(ip, {"stack", 4711}).
     <0.42.0>

    If we now send a message from the shell on the node ant@stack, where all sends /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dtrace.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dtrace.html 2026-04-20 17:48:47.937731184 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dtrace.html 2026-04-20 17:48:47.937731184 +0000 @@ -156,7 +156,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dyntrace.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dyntrace.html 2026-04-20 17:48:47.973731407 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/dyntrace.html 2026-04-20 17:48:47.977731432 +0000 @@ -822,14 +822,14 @@

    Restores the previous state of user tags and their spreading as it was before a call to spread_tag/1.

    Note that the restoring is not limited to the same process; one can utilize this to turn off spreding in one process and restore it in a -newly created process that is is actually going to send messages:

    f() ->
    -    TagData = dyntrace:spread_tag(false),
    -    spawn(fun() ->
    -             dyntrace:restore_tag(TagData),
    -             do_something()
    -          end),
    -    do_something_else(),
    -    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as +newly created process that is is actually going to send messages:

    f() ->
    +    TagData = dyntrace:spread_tag(false),
    +    spawn(fun() ->
    +             dyntrace:restore_tag(TagData),
    +             do_something()
    +          end),
    +    do_something_else(),
    +    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as Erlang programs tend to send and receive messages so that sometimes the user tag gets lost due to various things, like double receives or communication with a port (ports do not handle user tags, in the same way as they do not handle @@ -876,12 +876,12 @@ later call to restore_tag/1.

    The file module already spreads tags, so there is no need to manually call this function to get user tags spread to the efile driver through that module.

    The most use of this function would be if one, for example, uses the io module to communicate with an I/O-server for a regular file, such as in the following -example:

    f() ->
    -   {ok, F} = file:open("test.tst", [write]),
    -   Saved = dyntrace:spread_tag(true),
    -   io:format(F, "Hello world!", []),
    -   dyntrace:restore_tag(Saved),
    -   file:close(F).

    In this example, any user tag set in the calling process will be spread to the +example:

    f() ->
    +   {ok, F} = file:open("test.tst", [write]),
    +   Saved = dyntrace:spread_tag(true),
    +   io:format(F, "Hello world!", []),
    +   dyntrace:restore_tag(Saved),
    +   file:close(F).

    In this example, any user tag set in the calling process will be spread to the I/O-server when the io:format/3 call is done.

    @@ -911,7 +911,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/instrument.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/instrument.html 2026-04-20 17:48:48.009731631 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/instrument.html 2026-04-20 17:48:48.009731631 +0000 @@ -314,8 +314,8 @@ the one before it.

    The upper bound of the first interval is provided by the function that returned the histogram, and the last interval has no upper bound.

    For example, the histogram below has 40 (message) blocks between 128-256 bytes in size, 78 blocks between 256-512 bytes,2 blocks between 512-1024 bytes, and 2 -blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    +blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    @@ -455,30 +455,30 @@ block size histograms. Defaults to 128.

  • histogram_width - The number of intervals in the allocated block size histograms. Defaults to 18.

  • flags - Controls how to group the output, for example showing allocations on a per-process basis (when possible) rather than only a -NIF/driver-basis. Defaults to [].

  • Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok,{128,0,
    -     #{udp_inet =>
    -           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
    +NIF/driver-basis. Defaults to [].

    Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok,{128,0,
    +     #{udp_inet =>
    +           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
            system =>
    -           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    -             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    -             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    -             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    -             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    -             ... }
    +           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    +             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    +             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    +             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    +             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    +             ... }
            spawn_forker =>
    -           #{driver_select_data_state =>
    -                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    -       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
    +           #{driver_select_data_state =>
    +                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
            prim_file =>
    -           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    +             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            prim_buffer =>
    -           #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    +
    #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}, + binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    @@ -555,15 +555,15 @@ tied to any particular scheduler. Defaults to all schedulers and the global instance.

  • histogram_start - The upper bound of the first interval in the free block size histograms. Defaults to 512.

  • histogram_width - The number of intervals in the free block size -histograms. Defaults to 14.

  • Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    -{ok,{512,
    -     [{driver_alloc,false,262144,0,
    -                    [{driver_alloc,1,32784}],
    -                    {0,0,0,0,0,0,0,1}},
    -      {binary_alloc,false,32768,0,
    -                    [{binary_alloc,15,4304}],
    -                    {3,0,0,0,1,0,0,0}},
    -      {...}|...]}}
    +histograms. Defaults to 14.

    Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    +{ok,{512,
    +     [{driver_alloc,false,262144,0,
    +                    [{driver_alloc,1,32784}],
    +                    {0,0,0,0,0,0,0,1}},
    +      {binary_alloc,false,32768,0,
    +                    [{binary_alloc,15,4304}],
    +                    {3,0,0,0,1,0,0,0}},
    +      {...}|...]}}
    @@ -592,7 +592,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/lttng.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/lttng.html 2026-04-20 17:48:48.045731854 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/lttng.html 2026-04-20 17:48:48.049731879 +0000 @@ -96,46 +96,46 @@ information on how to install LTTng on your system.

    After LTTng is properly installed on the system Erlang/OTP can be built with LTTng support.

    $ ./configure --with-dynamic-trace=lttng
     $ make

    Dyntrace Tracepoints

    All tracepoints are in the domain of org_erlang_dyntrace

    All Erlang types are the string equivalent in LTTng.

    process_spawn

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • parent : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and +{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and {tracer,dyntrace,[]} as tracer module.

    Example:

    process_link: { cpu_id = 3 }, { from = "<0.130.0>", to = "<0.131.0>", type = "link" }

    process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reason : string :: Exit reason. Ex. "normal"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

    process_register

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • name : string :: Registered name. Ex. "logger"
    • type : string :: "register" | "unregister"

    Example:

    process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

    process_scheduled

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • type : string :: +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

      process_register

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • name : string :: Registered name. Ex. "logger"
      • type : string :: "register" | "unregister"

      Example:

      process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

      process_scheduled

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • type : string :: "in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Available through erlang:trace/3 with trace flag running and -{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_open: { cpu_id = 5 }, { pid = "<0.131.0>", driver = "'/bin/sh -s unix:cmd'", port = "#Port<0.1887>" }

      port_exit

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • reason : string :: Exit reason. Ex. "normal"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_exit: { cpu_id = 5 }, { port = "#Port<0.1887>", reason = "normal" }

      port_link

      • to : string :: Process ID. Ex. "<0.131.0>"
      • from : string :: Process ID. Ex. "<0.131.0>"
      • type : string :: "link" | "unlink"

      Available through erlang:trace/3 with trace flag ports and -{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and +{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • entry : string :: Callback. Ex. "open"
      • type : string :: -"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Example:

      port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

      Available through erlang:trace/3 with trace flag running and +"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

    Example:

    port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

    Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

    function_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_send: { cpu_id = 3 }, { from = "#Port<0.1938>", to = "<0.160.0>", message = "{#Port<0.1938>,eof}" }

    message_receive

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message received. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag 'receive' and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_receive: { cpu_id = 7 }, { to = "<0.167.0>", message = "{<0.165.0>,ok}" }

    gc_minor_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

    gc_minor_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

    gc_major_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

    gc_major_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

    BEAM Tracepoints

    All tracepoints are in the domain of org_erlang_otp

    All Erlang types are the string equivalent in LTTng.

    driver_init

    • driver : string :: Driver name. Ex. "tcp_inet"
    • major : integer :: Major version. Ex. 3
    • minor : integer :: Minor version. Ex. 1
    • flags : integer :: Flags. Ex. 1

    Example:

    driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

    driver_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • port : string :: Port ID. Ex. "#Port<0.1031>"

    Example:

    driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

    driver_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

    driver_outputv

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

    driver_ready_input

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

    driver_ready_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

    driver_timeout

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

    driver_stop_select

    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

    driver_flush

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

    driver_stop

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

    driver_process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    driver_ready_async

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

    driver_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

    driver_control

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

    carrier_create

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144
    • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
    • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

      gc_minor_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

      gc_major_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • need : integer :: Heap need. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

      gc_major_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

      BEAM Tracepoints

      All tracepoints are in the domain of org_erlang_otp

      All Erlang types are the string equivalent in LTTng.

      driver_init

      • driver : string :: Driver name. Ex. "tcp_inet"
      • major : integer :: Major version. Ex. 3
      • minor : integer :: Minor version. Ex. 1
      • flags : integer :: Flags. Ex. 1

      Example:

      driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

      driver_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Example:

      driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

      driver_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

      driver_outputv

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

      driver_ready_input

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

      driver_ready_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

      driver_timeout

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

      driver_stop_select

      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

      driver_flush

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

      driver_stop

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

      driver_process_exit

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      driver_ready_async

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

      driver_call

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

      driver_control

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

      carrier_create

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_pool_put

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

      carrier_pool_get

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

      Example of process tracing

      An example of process tracing of os_mon and friends.

      Clean start of lttng in a bash shell.

      $ lttng create erlang-demo
      +instance. Ex. 285296

    Example:

    carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

    carrier_pool_put

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

    carrier_pool_get

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

    Example of process tracing

    An example of process tracing of os_mon and friends.

    Clean start of lttng in a bash shell.

    $ lttng create erlang-demo
     Spawning a session daemon
     Session erlang-demo created.
     Traces will be written in /home/egil/lttng-traces/erlang-demo-20160526-165920

    Start an Erlang node with lttng enabled.

    $ erl
     Erlang/OTP 19 [erts-8.0] [source-4d7b24d] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [lttng]
     
     Eshell V8.0  (abort with ^G)
    -1>

    Load the dyntrace module.

    1> l(dyntrace).
    -{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through +1>

    Load the dyntrace module.

    1> l(dyntrace).
    +{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through lttng list -u.

    Enable the process_register LTTng tracepoint for Erlang.

    $ lttng enable-event -u org_erlang_dyntrace:process_register
    -UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
    +UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
     0

    Start LTTng tracing.

    $ lttng start
     Tracing started for session erlang-demo

    Start the os_mon application in Erlang.

    3> application:ensure_all_started(os_mon).
     {ok,[sasl,os_mon]}

    Stop LTTng tracing and view the result.

    $ lttng stop
    @@ -210,7 +210,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/msacc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/msacc.html 2026-04-20 17:48:48.097732177 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/msacc.html 2026-04-20 17:48:48.093732152 +0000 @@ -96,9 +96,9 @@

    Convenience functions for microstate accounting

    This module implements some convenience functions for analyzing microstate accounting data. For details about how to use the basic API and what the different states represent, see -erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
    +erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
     ok
    -2> msacc:print().
    +2> msacc:print().
     Average thread real-time    : 1000513 us
     Accumulated system run-time :    2213 us
     Average scheduler run-time  :    1076 us
    @@ -106,11 +106,11 @@
             Thread      aux check_io emulator       gc    other     port    sleep
     
     Stats per thread:
    -     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    - scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    - scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
    +     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    + scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    + scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
     
     Stats per type:
              async    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    @@ -910,7 +910,7 @@
     this can be verbose. See the top of this reference manual for a brief
     description of what the fields mean.

    It is possible to print more specific types of statistics by first manipulating the DataOrStats using stats/2. For instance if you want to print the -percentage of run-time for each thread you can do:

    msacc:print(msacc:stats(runtime, msacc:stats())).

    If you want to only print run-time per thread type you can do:

    msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

    Options

    • system - Print percentage of time spent in each state out of system time +percentage of run-time for each thread you can do:

      msacc:print(msacc:stats(runtime, msacc:stats())).

      If you want to only print run-time per thread type you can do:

      msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

      Options

      • system - Print percentage of time spent in each state out of system time as well as thread time. Default: false.
      @@ -1201,7 +1201,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/notes.html 2026-04-20 17:48:48.141732450 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/notes.html 2026-04-20 17:48:48.141732450 +0000 @@ -89,9 +89,9 @@ -

      This document describes the changes made to the Runtime_Tools application.

      Runtime_Tools 2.3.1

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      Runtime_Tools 2.3

      Fixed Bugs and Malfunctions

      • NIFs and linked-in drivers are now loadable when running in an Erlang source tree on Windows.

        Own Id: OTP-19686 Aux Id: PR-9969

      Improvements and New Features

      • The default tracer is now aware that it is started by a remote shell (-remsh), in which case the traces will be sent to the remote group_leader to make the traces visible in the remote shell.

        Own Id: OTP-19648 Aux Id: PR-9589

      • A User's Guide to dbg is now available in the documentation.

        Own Id: OTP-19655 Aux Id: PR-9853

      Runtime_Tools 2.2

      Improvements and New Features

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        --type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        --nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

        Own Id: OTP-19519 Aux Id: PR-9441

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      • With this change observer will use cheaper iterators to avoid locking when not necessary.

        Own Id: OTP-19584 Aux Id: PR-9711

      Runtime_Tools 2.1.1

      Fixed Bugs and Malfunctions

      • Fixed a bug where dbg sessions on remote nodes were terminated prematurely.

        Own Id: OTP-19188 Aux Id: PR-8692

      Runtime_Tools 2.1

      Improvements and New Features

      • The instrument module can now track allocations on a per-process or per-port basis.

        Own Id: OTP-18577 Aux Id: PR-7236

      • The new function proc_lib:set_label/1 can be used to add a descriptive term to any process that does not have a registered name. The name will be shown by tools such as c:i/0, observer, and it will be included in crash reports produced by processes using gen_server, gen_statem, gen_event, and gen_fsm.

        The label for a process can be retrieved by calling proc_lib:get_label/1.

        Note that those functions work on any process, not only processes that use proc_lib.

        Example:

        1> self().
        +

        This document describes the changes made to the Runtime_Tools application.

        Runtime_Tools 2.3.1

        Improvements and New Features

        • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

          A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

          make release_docs places the documentation in the released code under the doc folder.

          make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

          The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

          Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

          Improves the source Software-Bill-of-Materials

          • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
          • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
          • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

          Own Id: OTP-19886 Aux Id: PR-10434

        Runtime_Tools 2.3

        Fixed Bugs and Malfunctions

        • NIFs and linked-in drivers are now loadable when running in an Erlang source tree on Windows.

          Own Id: OTP-19686 Aux Id: PR-9969

        Improvements and New Features

        • The default tracer is now aware that it is started by a remote shell (-remsh), in which case the traces will be sent to the remote group_leader to make the traces visible in the remote shell.

          Own Id: OTP-19648 Aux Id: PR-9589

        • A User's Guide to dbg is now available in the documentation.

          Own Id: OTP-19655 Aux Id: PR-9853

        Runtime_Tools 2.2

        Improvements and New Features

        • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

          All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

          -type meter() :: integer().
          +-type foot() :: integer().

          Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

          -nominal meter() :: integer().
          +-nominal foot() :: integer().

          More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

          Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

          Own Id: OTP-19364 Aux Id: PR-9079

        • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

          Own Id: OTP-19519 Aux Id: PR-9441

        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

          Own Id: OTP-19575 Aux Id: PR-9670

        • With this change observer will use cheaper iterators to avoid locking when not necessary.

          Own Id: OTP-19584 Aux Id: PR-9711

        Runtime_Tools 2.1.1

        Fixed Bugs and Malfunctions

        • Fixed a bug where dbg sessions on remote nodes were terminated prematurely.

          Own Id: OTP-19188 Aux Id: PR-8692

        Runtime_Tools 2.1

        Improvements and New Features

        • The instrument module can now track allocations on a per-process or per-port basis.

          Own Id: OTP-18577 Aux Id: PR-7236

        • The new function proc_lib:set_label/1 can be used to add a descriptive term to any process that does not have a registered name. The name will be shown by tools such as c:i/0, observer, and it will be included in crash reports produced by processes using gen_server, gen_statem, gen_event, and gen_fsm.

          The label for a process can be retrieved by calling proc_lib:get_label/1.

          Note that those functions work on any process, not only processes that use proc_lib.

          Example:

          1> self().
           <0.90.0>
           2> proc_lib:set_label(my_label).
           ok
          @@ -388,7 +388,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/content.opf 2026-04-20 15:18:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/content.opf 2042-05-23 04:36:37.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> runtime_tools - 2.3.1 - urn:uuid:a00b2958-cc54-4f74-d58c-d5372449c31f + urn:uuid:d1fe2064-8d28-34c4-fd16-e793f61f339f en - 2026-04-20T15:18:08Z + 2042-05-23T04:36:37Z /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dbg_guide.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dbg_guide.xhtml 2026-04-20 15:18:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dbg_guide.xhtml 2042-05-23 04:36:37.000000000 +0000 @@ -20,22 +20,22 @@

          The dbg module in Erlang provides a text-based interface for tracing function calls, processes, ports, and messages. It simplifies the use of the underlying trace:process/4, trace:port/4, and trace:function/4 BIFs (Built-In Functions). This guide will walk you through the basics of using dbg for your Erlang applications.

          This facility is useful for both quick debugging sessions in the shell and for more structured system testing, especially where other tools might have too much performance impact.

          Quick Start

          To trace a call to a function with minimal fuss, call dbg:c(Module, Name, Arguments). It starts a temporary trace receiver, enables all trace flags, and calls the designated function from a temporary process. For example, here is how to trace a call -to application:which_applications/0:

          1> dbg:c(application, which_applications, []).
          -(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
          -                                    [alias|
          -                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
          -                                   which_applications} (Timestamp: {1710,
          +to application:which_applications/0:

          1> dbg:c(application, which_applications, []).
          +(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
          +                                    [alias|
          +                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
          +                                   which_applications} (Timestamp: {1710,
                                                                               847802,
          -                                                                    479222})
          -(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
          -(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
          -(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
          -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
          -                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
          +                                                                    479222})
          +(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
          +(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
          +(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
          +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
          +                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
                                                                              847802,
          -                                                                   479274})
          -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
          - {kernel,"ERTS  CXC 138 10","9.2.2"}]

          In this example, four trace events are generated:

          • A send event (!) for the sending of a request from the current process + 479274}) +[{stdlib,"ERTS CXC 138 10","5.2.1"}, + {kernel,"ERTS CXC 138 10","9.2.2"}]

          In this example, four trace events are generated:

          • A send event (!) for the sending of a request from the current process to the application_controller process.
          • A schedule-out event (out) when the current process schedules out while waiting in a receive for the reply to arrive.
          • A schedule-in event (in) when the current process is scheduled in when reply has arrived.
          • A receive event (<<) when the current process retrieves the reply from @@ -44,8 +44,8 @@ tracer and set the trace flags of your choice on the processes you want to trace. This is useful, when there is a complex system of processes, ports or nodes interacting where dbg:c/3 is to blunt.

            Starting a Tracer (dbg:tracer/0,2)

            First, you need to start a tracer process that will receive and display trace -messages.

            1> dbg:tracer().  % Start the default trace message receiver
            -{ok,<0.90.0>}     % <0.90.0> is the PID of the tracer process

            This starts a server on the local node that will be the recipient of all trace +messages.

            1> dbg:tracer().  % Start the default trace message receiver
            +{ok,<0.90.0>}     % <0.90.0> is the PID of the tracer process

            This starts a server on the local node that will be the recipient of all trace messages. It uses a default handler that prints formatted trace messages to the Erlang shell.

            If you need a custom tracer other than the default, you can create a tracer using dbg:tracer(Type, Data):

            • Type = process: Data is {HandlerFun, InitialState}. HandlerFun is @@ -76,18 +76,18 @@ case of a single pid exactly 1). The specification of matched processes is {matched, Node, N}. If the remote processor call (using rpc) to a remote node fails, the rpc error message is returned as the fourth element in the -tuple and the number of matched processes is 0.

              Example: Trace messages and process events for a specific process

              1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
              +tuple and the number of matched processes is 0.

              Example: Trace messages and process events for a specific process

              1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
               <0.90.0>
              -2> dbg:tracer().
              -{ok,<0.92.0>}
              -3> dbg:p(Pid, [m,procs]). % Trace messages and process events for Pid
              -{ok,[{matched,nonode@nohost,1}]}
              -4> Pid ! {self(),hello}.
              -(<0.90.0>) << {<0.88.0>,hello} % Received by Pid
              -{<0.88.0>,hello}
              -(<0.90.0>) <0.88.0> ! hello    % Sent by Pid
              -(<0.90.0>) exit normal         % Process event: Pid exited
              -5> flush().
              +2> dbg:tracer().
              +{ok,<0.92.0>}
              +3> dbg:p(Pid, [m,procs]). % Trace messages and process events for Pid
              +{ok,[{matched,nonode@nohost,1}]}
              +4> Pid ! {self(),hello}.
              +(<0.90.0>) << {<0.88.0>,hello} % Received by Pid
              +{<0.88.0>,hello}
              +(<0.90.0>) <0.88.0> ! hello    % Sent by Pid
              +(<0.90.0>) exit normal         % Process event: Pid exited
              +5> flush().
               Shell got hello
               ok

              Tracing Function Calls (dbg:tp/2,3,4, dbg:tpl/2,3,4)

              To trace function calls, you need to:

              1. Enable the c/call flag for the process(es) that will make the calls (using dbg:p/2).
              2. Set a trace pattern for the function(s) you want to trace using dbg:tp/2 @@ -102,16 +102,16 @@ values, and exceptions. [{'_',[],[{exception_trace}]}]
              3. c or caller_trace: Shows function names, parameters, and caller information. [{'_',[],[{message,{caller_line}}]}]
              4. cx or caller_exception_trace: Combines x and c. -[{'_',[],[{exception_trace},{message,{caller_line}}]}]

          Example using built-in aliases:

          1> dbg:tracer().
          -{ok,<0.90.0>}
          -2> dbg:p(all, c). % Short for dbg:p(all, call)
          -{ok,[{matched,nonode@nohost,49}]}
          -3> dbg:tp(lists, seq, cx). % cx: call and exception tracing with caller info
          -{ok,[{matched,nonode@nohost,2},{saved,cx}]}
          -4> lists:seq(1, 3).
          -(<0.88.0>) call lists:seq(1,3) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
          -[1,2,3]
          -(<0.88.0>) returned from lists:seq/2 -> [1,2,3]

          Note that the caller info is the function that called lists:seq with file and +[{'_',[],[{exception_trace},{message,{caller_line}}]}]

      Example using built-in aliases:

      1> dbg:tracer().
      +{ok,<0.90.0>}
      +2> dbg:p(all, c). % Short for dbg:p(all, call)
      +{ok,[{matched,nonode@nohost,49}]}
      +3> dbg:tp(lists, seq, cx). % cx: call and exception tracing with caller info
      +{ok,[{matched,nonode@nohost,2},{saved,cx}]}
      +4> lists:seq(1, 3).
      +(<0.88.0>) call lists:seq(1,3) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
      +[1,2,3]
      +(<0.88.0>) returned from lists:seq/2 -> [1,2,3]

      Note that the caller info is the function that called lists:seq with file and line number.

      Tracing Message Events (dbg:tpe/2)

      By default, if send or receive tracing is enabled for a process, all such events are traced. dbg:tpe(Event, MatchSpec) allows you to filter these events.

      • Event: send or 'receive'.
      • MatchSpec: A match specifications.
        • For send: Matches on [Receiver, Msg].
        • For 'receive': Matches on [Node, Sender, Msg].

      Managing Trace Patterns

      You can display, remove, save and load trace pattern matchspecifications, if @@ -135,10 +135,10 @@ enable it is by adding the following line to the source file: -include_lib("stdlib/include/ms_transform.hrl"). In the shell its already enabled.

      The head of the fun must be a single pattern that matches a list. That pattern -will be used to match the arguments for the call:

      1> dbg:fun2ms(fun([_,_]) -> true end). % Matches a function with two arguments
      -[{['_','_'],[],[true]}]
      -2> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
      -[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]

      The first match specification matches when a function having two +will be used to match the arguments for the call:

      1> dbg:fun2ms(fun([_,_]) -> true end). % Matches a function with two arguments
      +[{['_','_'],[],[true]}]
      +2> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
      +[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]

      The first match specification matches when a function having two arguments is called. The second matches when a function, taking one atom as an argument, is called.

      Trace Sessions

      To avoid interference between different tracing activities, you can create isolated dbg sessions.

      First you create a session with dbg:session_create(Name) @@ -147,37 +147,37 @@ This function runs dbg commands within Fun using the specified session.

      Any dbg function that is called with in the provided fun will use the session/0 provided instead of the default dbg session. This means that the tracing will be isolated -from other tracing users on the system.

      When you no longer need the session, use dbg:session_destroy(Session).

      Example:

      1> S = dbg:session_create(my_session).
      +from other tracing users on the system.

      When you no longer need the session, use dbg:session_destroy(Session).

      Example:

      1> S = dbg:session_create(my_session).
       <0.91.0>
      -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
      -{ok,[{matched,nonode@nohost,2},{saved,x}]}
      -3> lists:seq(1, 10).
      -(<0.89.0>) call lists:seq(1,10)
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
      -[1,2,3,4,5,6,7,8,9,10]
      -4> dbg:session_destroy(S).
      +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
      +{ok,[{matched,nonode@nohost,2},{saved,x}]}
      +3> lists:seq(1, 10).
      +(<0.89.0>) call lists:seq(1,10)
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
      +[1,2,3,4,5,6,7,8,9,10]
      +4> dbg:session_destroy(S).
       ok

      The state of the session/0 is preserved in between dbg:session/2 calls, so -you can call dbg:session/2 multiple times when debugging you application.

      Example:

      1> S = dbg:session_create(my_session).
      +you can call dbg:session/2 multiple times when debugging you application.

      Example:

      1> S = dbg:session_create(my_session).
       <0.91.0>
       %% Setup the initial traces
      -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
      -{ok,[{matched,nonode@nohost,2},{saved,x}]}
      -3> lists:seq(1, 3).
      -(<0.89.0>) call lists:seq(1,3)
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      -[1,2,3]
      +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
      +{ok,[{matched,nonode@nohost,2},{saved,x}]}
      +3> lists:seq(1, 3).
      +(<0.89.0>) call lists:seq(1,3)
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      +[1,2,3]
       %% Add an additional trace pattern
      -4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
      +4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
       ok
      -5> lists:seq(1, 3).
      -(<0.89.0>) call lists:seq(1,3)
      -(<0.89.0>) call lists:seq_loop(3,3,[])
      -(<0.89.0>) call lists:seq_loop(1,1,[2,3])
      -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      -[1,2,3]
      -6> dbg:session_destroy(S).
      +5> lists:seq(1, 3).
      +(<0.89.0>) call lists:seq(1,3)
      +(<0.89.0>) call lists:seq_loop(3,3,[])
      +(<0.89.0>) call lists:seq_loop(1,1,[2,3])
      +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      +[1,2,3]
      +6> dbg:session_destroy(S).
       ok

      Trace on Remote Nodes

      The dbg server keeps a list of nodes where tracing should be performed. Whenever a dbg:tp/2 call or a dbg:p/2 call is made, it is executed for all nodes in this list including the local node (except @@ -254,17 +254,17 @@ ignored.

      Example: Using an IP trace port and connecting to it from another node As an example, one can let trace messages be sent over the network to another Erlang node (preferably not distributed), where the formatting occurs.

      On the node stack there exists an Erlang node ant@stack. In the -shell, type the following:

      ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
      +shell, type the following:

      ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
       <0.17.0>
      -ant@stack> dbg:p(self(), send).
      -{ok,1}

      All trace messages are now sent to the trace port driver, which in turn listens +ant@stack> dbg:p(self(), send). +{ok,1}

      All trace messages are now sent to the trace port driver, which in turn listens for connections on the TCP/IP port 4711. If we want to see the messages on -another node, preferably on another host, we do like this:

      1> dbg:trace_client(ip, {"stack", 4711}).
      +another node, preferably on another host, we do like this:

      1> dbg:trace_client(ip, {"stack", 4711}).
       <0.42.0>

      If we now send a message from the shell on the node ant@stack, where all sends /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml 2026-04-20 15:18:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml 2042-05-23 04:36:37.000000000 +0000 @@ -1809,40 +1809,40 @@ as the argument of the function call; it cannot be held in a variable which in turn is passed to the function. Furthermore, the parse transform module ms_transform must be enabled. The easiest way to -enable it is by adding the following line to the source file:

      -include_lib("stdlib/include/ms_transform.hrl").

      Failing to include ms_transform.hrl in the source will result in a runtime +enable it is by adding the following line to the source file:

      -include_lib("stdlib/include/ms_transform.hrl").

      Failing to include ms_transform.hrl in the source will result in a runtime error, not a compile-time error.

      This function can also be invoked directly from the Erlang shell, as shown in the examples that follow.

      The head of the fun must be a single pattern that matches a list. That pattern -will be used to match the arguments for the call:

      Examples:

      1> dbg:fun2ms(fun([_,_]) -> true end).
      -[{['_','_'],[],[true]}]
      -2> dbg:fun2ms(fun(Args) when length(Args) > 6 -> true end).
      -[{'$1',[{'>',{length,'$1'},6}],[true]}]

      The first match specification matches when a function having two +will be used to match the arguments for the call:

      Examples:

      1> dbg:fun2ms(fun([_,_]) -> true end).
      +[{['_','_'],[],[true]}]
      +2> dbg:fun2ms(fun(Args) when length(Args) > 6 -> true end).
      +[{'$1',[{'>',{length,'$1'},6}],[true]}]

      The first match specification matches when a function having two arguments is called. The second matches when a function with more than -6 arguments is called.

      Examples:

      1> dbg:fun2ms(fun(42) -> true end).
      +6 arguments is called.

      Examples:

      1> dbg:fun2ms(fun(42) -> true end).
       Error: dbg:fun2ms requires fun with single variable or list parameter
      -{error,transform_error}
      -2> dbg:fun2ms(fun([<<H,T/binary>>]) -> true end).
      +{error,transform_error}
      +2> dbg:fun2ms(fun([<<H,T/binary>>]) -> true end).
       Error: fun head contains bit syntax matching of variable 'H', which cannot be translated into match_spec
      -{error,transform_error}

      The preceding two examples show what happens when a fun cannot be +{error,transform_error}

      The preceding two examples show what happens when a fun cannot be translated into a match specification. In the first example, the fun head connot possibly match a list. In the second example, an attempt is made to take apart a binary using the bit syntax, which is currently not -supported in match specifications.

      However, note that literal binaries can be matched:

      1> dbg:fun2ms(fun([<<"abc">>]) -> true end).
      -[{[<<"abc">>],[],[true]}]

      Match specifications support a large subset of the +supported in match specifications.

      However, note that literal binaries can be matched:

      1> dbg:fun2ms(fun([<<"abc">>]) -> true end).
      +[{[<<"abc">>],[],[true]}]

      Match specifications support a large subset of the guard expressions supported -by Erlang, but not all. For example, updating a map is currently not supported:

      1> dbg:fun2ms(fun([M]) when map_size(M#{a => b}) > 2 -> true end).
      -Error: the language element map (in guard) cannot be translated into match_spec
      -{error,transform_error}

      However, creating a map in a guard is allowed:

      1> dbg:fun2ms(fun([M]) when map_size(#{a => b}) > 2 -> true end).
      -[{['$1'],[{'>',{map_size,#{a => b}},2}],[true]}]

      Variables from the environment can be imported, so this works:

      1> X = 3.
      +by Erlang, but not all. For example, updating a map is currently not supported:

      1> dbg:fun2ms(fun([M]) when map_size(M#{a => b}) > 2 -> true end).
      +Error: the language element map (in guard) cannot be translated into match_spec
      +{error,transform_error}

      However, creating a map in a guard is allowed:

      1> dbg:fun2ms(fun([M]) when map_size(#{a => b}) > 2 -> true end).
      +[{['$1'],[{'>',{map_size,#{a => b}},2}],[true]}]

      Variables from the environment can be imported, so this works:

      1> X = 3.
       3
      -2> dbg:fun2ms(fun([M,N]) when N > X  -> return_trace() end).
      -[{['$1','$2'],[{'>','$2',{const,3}}],[{return_trace}]}]

      The imported variables will be replaced by const expressions, which +2> dbg:fun2ms(fun([M,N]) when N > X -> return_trace() end). +[{['$1','$2'],[{'>','$2',{const,3}}],[{return_trace}]}]

      The imported variables will be replaced by const expressions, which is consistent with the static scoping for Erlang funs.

      In the body of the fun, only guard expressions and calls to the special functions for tracing -are allowed.

      Examples:

      1> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
      -[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]
      -2> dbg:fun2ms(fun(_) -> erlang:garbage_collect() end).
      -Error: fun containing the remote function call 'erlang:garbage_collect/0' (called in body) cannot be translated into match_spec
      -{error,transform_error}

      Warning

      If the parse transform is not applied to a module which calls dbg:fun2ms/1, +are allowed.

      Examples:

      1> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
      +[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]
      +2> dbg:fun2ms(fun(_) -> erlang:garbage_collect() end).
      +Error: fun containing the remote function call 'erlang:garbage_collect/0' (called in body) cannot be translated into match_spec
      +{error,transform_error}

      Warning

      If the parse transform is not applied to a module which calls dbg:fun2ms/1, the call will fail in runtime with a badarg exception.

      More information is available in the documentation for module ms_transform in STDLIB.

      @@ -2050,16 +2050,16 @@ names, parameters, return values, and exceptions raised from functions

    • caller_trace, c - sets a trace that displays function names, parameters, and information about which function called it

    • caller_exception_trace, cx - combines exception_trace and -caller_trace

    Here is an example that shows how to use a built-in match specification:

    1> dbg:tracer().
    -{ok,<0.90.0>}
    -2> dbg:tp(lists, seq, 2, cx).
    -{ok,[{matched,nonode@nohost,1},{saved,cx}]}
    -3> dbg:p(self(), call).
    -{ok,[{matched,nonode@nohost,1}]}
    -4> lists:seq(1, 5).
    -(<0.88.0>) call lists:seq(1,5) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    -[1,2,3,4,5]
    -(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5]
    +caller_trace

    Here is an example that shows how to use a built-in match specification:

    1> dbg:tracer().
    +{ok,<0.90.0>}
    +2> dbg:tp(lists, seq, 2, cx).
    +{ok,[{matched,nonode@nohost,1},{saved,cx}]}
    +3> dbg:p(self(), call).
    +{ok,[{matched,nonode@nohost,1}]}
    +4> lists:seq(1, 5).
    +(<0.88.0>) call lists:seq(1,5) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    +[1,2,3,4,5]
    +(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5]
    @@ -2257,37 +2257,37 @@ is provided.

    Any dbg function that is called with in the provided fun will use the session/0 provided instead of the default dbg session. This means that the tracing will be isolated -from other tracing users on the system.

    The function returns the term that the fun returns.

    Example:

    1> S = dbg:session_create(my_session).
    +from other tracing users on the system.

    The function returns the term that the fun returns.

    Example:

    1> S = dbg:session_create(my_session).
     <0.91.0>
    -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
    -{ok,[{matched,nonode@nohost,2},{saved,x}]}
    -3> lists:seq(1, 10).
    -(<0.89.0>) call lists:seq(1,10)
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
    -[1,2,3,4,5,6,7,8,9,10]
    -4> dbg:session_destroy(S).
    +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
    +{ok,[{matched,nonode@nohost,2},{saved,x}]}
    +3> lists:seq(1, 10).
    +(<0.89.0>) call lists:seq(1,10)
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
    +[1,2,3,4,5,6,7,8,9,10]
    +4> dbg:session_destroy(S).
     ok

    The state of the session/0 is preserved in between session/2 calls, so -you can call session/2 multiple when debugging you application.

    Example:

    1> S = dbg:session_create(my_session).
    +you can call session/2 multiple when debugging you application.

    Example:

    1> S = dbg:session_create(my_session).
     <0.91.0>
     %% Setup the initial traces
    -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
    -{ok,[{matched,nonode@nohost,2},{saved,x}]}
    -3> lists:seq(1, 3).
    -(<0.89.0>) call lists:seq(1,3)
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    -[1,2,3]
    +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
    +{ok,[{matched,nonode@nohost,2},{saved,x}]}
    +3> lists:seq(1, 3).
    +(<0.89.0>) call lists:seq(1,3)
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    +[1,2,3]
     %% Add an additional trace pattern
    -4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
    +4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
     ok
    -5> lists:seq(1, 3).
    -(<0.89.0>) call lists:seq(1,3)
    -(<0.89.0>) call lists:seq_loop(3,3,[])
    -(<0.89.0>) call lists:seq_loop(1,1,[2,3])
    -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    -[1,2,3]
    -6> dbg:session_destroy(S).
    +5> lists:seq(1, 3).
    +(<0.89.0>) call lists:seq(1,3)
    +(<0.89.0>) call lists:seq_loop(3,3,[])
    +(<0.89.0>) call lists:seq_loop(1,1,[2,3])
    +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    +[1,2,3]
    +6> dbg:session_destroy(S).
     ok

    Note

    The session functionality is experimental in Erlang/OTP 27 and may change in future releases without notice.

    @@ -2461,11 +2461,11 @@ and will stand as an "alias" for the given expression.

    If the match specification is invalid, an {error, Errors} tuple is returned. Errors is as a list of tuples {error, string()}, where the string is a textual explanation of the compilation error. For -example:

    1> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]).
    -{error,
    - [{error,"Special form 'message' called with wrong number of
    -          arguments in {message,two,arguments}."},
    -  {error,"Function noexist/1 does_not_exist."}]}
    +example:

    1> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]).
    +{error,
    + [{error,"Special form 'message' called with wrong number of
    +          arguments in {message,two,arguments}."},
    +  {error,"Function noexist/1 does_not_exist."}]}
    @@ -2716,17 +2716,17 @@ host Hostname, from where it reads trace messages until the TCP/IP connection is closed. If no Hostname is specified, the local host is assumed.

    As an example, one can let trace messages be sent over the network to another Erlang node (preferably not distributed), where the formatting occurs.

    On the node stack there exists an Erlang node ant@stack. In the -shell, type the following:

    ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
    +shell, type the following:

    ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
     <0.17.0>
    -ant@stack> dbg:p(self(), send).
    -{ok,1}

    All trace messages are now sent to the trace port driver, which in turn listens +ant@stack> dbg:p(self(), send). +{ok,1}

    All trace messages are now sent to the trace port driver, which in turn listens for connections on the TCP/IP port 4711. If we want to see the messages on -another node, preferably on another host, we do like this:

    1> dbg:trace_client(ip, {"stack", 4711}).
    +another node, preferably on another host, we do like this:

    1> dbg:trace_client(ip, {"stack", 4711}).
     <0.42.0>

    If we now send a message from the shell on the node ant@stack, where all sends -from the shell are traced:

    ant@stack> self() ! hello.
    +from the shell are traced:

    ant@stack> self() ! hello.
     hello

    The following will appear at the console on the node that started the trace -client:

    (<0.23.0>) <0.23.0> ! hello
    -(<0.23.0>) <0.22.0> ! {shell_rep,<0.23.0>,{value,hello,[],[]}}

    The last line is generated due to internal message passing in the Erlang shell. +client:

    (<0.23.0>) <0.23.0> ! hello
    +(<0.23.0>) <0.22.0> ! {shell_rep,<0.23.0>,{value,hello,[],[]}}

    The last line is generated due to internal message passing in the Erlang shell. The pids will vary.

    @@ -2810,7 +2810,7 @@ /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml 2026-04-20 15:18:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml 2042-05-23 04:36:37.000000000 +0000 @@ -735,14 +735,14 @@

    Restores the previous state of user tags and their spreading as it was before a call to spread_tag/1.

    Note that the restoring is not limited to the same process; one can utilize this to turn off spreding in one process and restore it in a -newly created process that is is actually going to send messages:

    f() ->
    -    TagData = dyntrace:spread_tag(false),
    -    spawn(fun() ->
    -             dyntrace:restore_tag(TagData),
    -             do_something()
    -          end),
    -    do_something_else(),
    -    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as +newly created process that is is actually going to send messages:

    f() ->
    +    TagData = dyntrace:spread_tag(false),
    +    spawn(fun() ->
    +             dyntrace:restore_tag(TagData),
    +             do_something()
    +          end),
    +    do_something_else(),
    +    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as Erlang programs tend to send and receive messages so that sometimes the user tag gets lost due to various things, like double receives or communication with a port (ports do not handle user tags, in the same way as they do not handle @@ -789,12 +789,12 @@ later call to restore_tag/1.

    The file module already spreads tags, so there is no need to manually call this function to get user tags spread to the efile driver through that module.

    The most use of this function would be if one, for example, uses the io module to communicate with an I/O-server for a regular file, such as in the following -example:

    f() ->
    -   {ok, F} = file:open("test.tst", [write]),
    -   Saved = dyntrace:spread_tag(true),
    -   io:format(F, "Hello world!", []),
    -   dyntrace:restore_tag(Saved),
    -   file:close(F).

    In this example, any user tag set in the calling process will be spread to the +example:

    f() ->
    +   {ok, F} = file:open("test.tst", [write]),
    +   Saved = dyntrace:spread_tag(true),
    +   io:format(F, "Hello world!", []),
    +   dyntrace:restore_tag(Saved),
    +   file:close(F).

    In this example, any user tag set in the calling process will be spread to the I/O-server when the io:format/3 call is done.

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml 2026-04-20 15:18:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml 2042-05-23 04:36:37.000000000 +0000 @@ -232,8 +232,8 @@ the one before it.

    The upper bound of the first interval is provided by the function that returned the histogram, and the last interval has no upper bound.

    For example, the histogram below has 40 (message) blocks between 128-256 bytes in size, 78 blocks between 256-512 bytes,2 blocks between 512-1024 bytes, and 2 -blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    +blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    @@ -368,30 +368,30 @@ block size histograms. Defaults to 128.

  • histogram_width - The number of intervals in the allocated block size histograms. Defaults to 18.

  • flags - Controls how to group the output, for example showing allocations on a per-process basis (when possible) rather than only a -NIF/driver-basis. Defaults to [].

  • Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok,{128,0,
    -     #{udp_inet =>
    -           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
    +NIF/driver-basis. Defaults to [].

    Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok,{128,0,
    +     #{udp_inet =>
    +           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
            system =>
    -           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    -             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    -             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    -             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    -             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    -             ... }
    +           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    +             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    +             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    +             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    +             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    +             ... }
            spawn_forker =>
    -           #{driver_select_data_state =>
    -                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    -       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
    +           #{driver_select_data_state =>
    +                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
            prim_file =>
    -           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    +             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            prim_buffer =>
    -           #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    +
    #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}, + binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    @@ -468,15 +468,15 @@ tied to any particular scheduler. Defaults to all schedulers and the global instance.

  • histogram_start - The upper bound of the first interval in the free block size histograms. Defaults to 512.

  • histogram_width - The number of intervals in the free block size -histograms. Defaults to 14.

  • Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    -{ok,{512,
    -     [{driver_alloc,false,262144,0,
    -                    [{driver_alloc,1,32784}],
    -                    {0,0,0,0,0,0,0,1}},
    -      {binary_alloc,false,32768,0,
    -                    [{binary_alloc,15,4304}],
    -                    {3,0,0,0,1,0,0,0}},
    -      {...}|...]}}
    +histograms. Defaults to 14.

    Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    +{ok,{512,
    +     [{driver_alloc,false,262144,0,
    +                    [{driver_alloc,1,32784}],
    +                    {0,0,0,0,0,0,0,1}},
    +      {binary_alloc,false,32768,0,
    +                    [{binary_alloc,15,4304}],
    +                    {3,0,0,0,1,0,0,0}},
    +      {...}|...]}}
    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml 2026-04-20 15:18:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml 2042-05-23 04:36:37.000000000 +0000 @@ -24,46 +24,46 @@ information on how to install LTTng on your system.

    After LTTng is properly installed on the system Erlang/OTP can be built with LTTng support.

    $ ./configure --with-dynamic-trace=lttng
     $ make

    Dyntrace Tracepoints

    All tracepoints are in the domain of org_erlang_dyntrace

    All Erlang types are the string equivalent in LTTng.

    process_spawn

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • parent : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and +{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and {tracer,dyntrace,[]} as tracer module.

    Example:

    process_link: { cpu_id = 3 }, { from = "<0.130.0>", to = "<0.131.0>", type = "link" }

    process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reason : string :: Exit reason. Ex. "normal"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

    process_register

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • name : string :: Registered name. Ex. "logger"
    • type : string :: "register" | "unregister"

    Example:

    process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

    process_scheduled

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • type : string :: +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

      process_register

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • name : string :: Registered name. Ex. "logger"
      • type : string :: "register" | "unregister"

      Example:

      process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

      process_scheduled

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • type : string :: "in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Available through erlang:trace/3 with trace flag running and -{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_open: { cpu_id = 5 }, { pid = "<0.131.0>", driver = "'/bin/sh -s unix:cmd'", port = "#Port<0.1887>" }

      port_exit

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • reason : string :: Exit reason. Ex. "normal"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_exit: { cpu_id = 5 }, { port = "#Port<0.1887>", reason = "normal" }

      port_link

      • to : string :: Process ID. Ex. "<0.131.0>"
      • from : string :: Process ID. Ex. "<0.131.0>"
      • type : string :: "link" | "unlink"

      Available through erlang:trace/3 with trace flag ports and -{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and +{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • entry : string :: Callback. Ex. "open"
      • type : string :: -"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Example:

      port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

      Available through erlang:trace/3 with trace flag running and +"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

    Example:

    port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

    Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

    function_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_send: { cpu_id = 3 }, { from = "#Port<0.1938>", to = "<0.160.0>", message = "{#Port<0.1938>,eof}" }

    message_receive

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message received. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag 'receive' and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_receive: { cpu_id = 7 }, { to = "<0.167.0>", message = "{<0.165.0>,ok}" }

    gc_minor_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

    gc_minor_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

    gc_major_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

    gc_major_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

    BEAM Tracepoints

    All tracepoints are in the domain of org_erlang_otp

    All Erlang types are the string equivalent in LTTng.

    driver_init

    • driver : string :: Driver name. Ex. "tcp_inet"
    • major : integer :: Major version. Ex. 3
    • minor : integer :: Minor version. Ex. 1
    • flags : integer :: Flags. Ex. 1

    Example:

    driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

    driver_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • port : string :: Port ID. Ex. "#Port<0.1031>"

    Example:

    driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

    driver_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

    driver_outputv

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

    driver_ready_input

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

    driver_ready_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

    driver_timeout

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

    driver_stop_select

    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

    driver_flush

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

    driver_stop

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

    driver_process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    driver_ready_async

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

    driver_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

    driver_control

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

    carrier_create

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144
    • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
    • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

      gc_minor_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

      gc_major_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • need : integer :: Heap need. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

      gc_major_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

      BEAM Tracepoints

      All tracepoints are in the domain of org_erlang_otp

      All Erlang types are the string equivalent in LTTng.

      driver_init

      • driver : string :: Driver name. Ex. "tcp_inet"
      • major : integer :: Major version. Ex. 3
      • minor : integer :: Minor version. Ex. 1
      • flags : integer :: Flags. Ex. 1

      Example:

      driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

      driver_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Example:

      driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

      driver_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

      driver_outputv

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

      driver_ready_input

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

      driver_ready_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

      driver_timeout

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

      driver_stop_select

      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

      driver_flush

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

      driver_stop

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

      driver_process_exit

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      driver_ready_async

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

      driver_call

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

      driver_control

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

      carrier_create

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_pool_put

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

      carrier_pool_get

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

      Example of process tracing

      An example of process tracing of os_mon and friends.

      Clean start of lttng in a bash shell.

      $ lttng create erlang-demo
      +instance. Ex. 285296

    Example:

    carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

    carrier_pool_put

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

    carrier_pool_get

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

    Example of process tracing

    An example of process tracing of os_mon and friends.

    Clean start of lttng in a bash shell.

    $ lttng create erlang-demo
     Spawning a session daemon
     Session erlang-demo created.
     Traces will be written in /home/egil/lttng-traces/erlang-demo-20160526-165920

    Start an Erlang node with lttng enabled.

    $ erl
     Erlang/OTP 19 [erts-8.0] [source-4d7b24d] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [lttng]
     
     Eshell V8.0  (abort with ^G)
    -1>

    Load the dyntrace module.

    1> l(dyntrace).
    -{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through +1>

    Load the dyntrace module.

    1> l(dyntrace).
    +{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through lttng list -u.

    Enable the process_register LTTng tracepoint for Erlang.

    $ lttng enable-event -u org_erlang_dyntrace:process_register
    -UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
    +UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
     0

    Start LTTng tracing.

    $ lttng start
     Tracing started for session erlang-demo

    Start the os_mon application in Erlang.

    3> application:ensure_all_started(os_mon).
     {ok,[sasl,os_mon]}

    Stop LTTng tracing and view the result.

    $ lttng stop
    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml	2026-04-20 15:18:08.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml	2042-05-23 04:36:37.000000000 +0000
    @@ -25,9 +25,9 @@
     

    Convenience functions for microstate accounting

    This module implements some convenience functions for analyzing microstate accounting data. For details about how to use the basic API and what the different states represent, see -erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
    +erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
     ok
    -2> msacc:print().
    +2> msacc:print().
     Average thread real-time    : 1000513 us
     Accumulated system run-time :    2213 us
     Average scheduler run-time  :    1076 us
    @@ -35,11 +35,11 @@
             Thread      aux check_io emulator       gc    other     port    sleep
     
     Stats per thread:
    -     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    - scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    - scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
    +     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    + scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    + scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
     
     Stats per type:
              async    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    @@ -823,7 +823,7 @@
     this can be verbose. See the top of this reference manual for a brief
     description of what the fields mean.

    It is possible to print more specific types of statistics by first manipulating the DataOrStats using stats/2. For instance if you want to print the -percentage of run-time for each thread you can do:

    msacc:print(msacc:stats(runtime, msacc:stats())).

    If you want to only print run-time per thread type you can do:

    msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

    Options

    • system - Print percentage of time spent in each state out of system time +percentage of run-time for each thread you can do:

      msacc:print(msacc:stats(runtime, msacc:stats())).

      If you want to only print run-time per thread type you can do:

      msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

      Options

      • system - Print percentage of time spent in each state out of system time as well as thread time. Default: false.
      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/notes.xhtml 2026-04-20 15:18:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/notes.xhtml 2042-05-23 04:36:37.000000000 +0000 @@ -17,9 +17,9 @@

      Runtime_Tools Release Notes

      -

      This document describes the changes made to the Runtime_Tools application.

      Runtime_Tools 2.3.1

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      Runtime_Tools 2.3

      Fixed Bugs and Malfunctions

      • NIFs and linked-in drivers are now loadable when running in an Erlang source tree on Windows.

        Own Id: OTP-19686 Aux Id: PR-9969

      Improvements and New Features

      • The default tracer is now aware that it is started by a remote shell (-remsh), in which case the traces will be sent to the remote group_leader to make the traces visible in the remote shell.

        Own Id: OTP-19648 Aux Id: PR-9589

      • A User's Guide to dbg is now available in the documentation.

        Own Id: OTP-19655 Aux Id: PR-9853

      Runtime_Tools 2.2

      Improvements and New Features

      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

        -type meter() :: integer().
        --type foot() :: integer().

        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

        -nominal meter() :: integer().
        --nominal foot() :: integer().

        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

        Own Id: OTP-19364 Aux Id: PR-9079

      • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

        Own Id: OTP-19519 Aux Id: PR-9441

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      • With this change observer will use cheaper iterators to avoid locking when not necessary.

        Own Id: OTP-19584 Aux Id: PR-9711

      Runtime_Tools 2.1.1

      Fixed Bugs and Malfunctions

      • Fixed a bug where dbg sessions on remote nodes were terminated prematurely.

        Own Id: OTP-19188 Aux Id: PR-8692

      Runtime_Tools 2.1

      Improvements and New Features

      • The instrument module can now track allocations on a per-process or per-port basis.

        Own Id: OTP-18577 Aux Id: PR-7236

      • The new function proc_lib:set_label/1 can be used to add a descriptive term to any process that does not have a registered name. The name will be shown by tools such as c:i/0, observer, and it will be included in crash reports produced by processes using gen_server, gen_statem, gen_event, and gen_fsm.

        The label for a process can be retrieved by calling proc_lib:get_label/1.

        Note that those functions work on any process, not only processes that use proc_lib.

        Example:

        1> self().
        +

        This document describes the changes made to the Runtime_Tools application.

        Runtime_Tools 2.3.1

        Improvements and New Features

        • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

          A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

          make release_docs places the documentation in the released code under the doc folder.

          make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

          The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

          Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

          Improves the source Software-Bill-of-Materials

          • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
          • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
          • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

          Own Id: OTP-19886 Aux Id: PR-10434

        Runtime_Tools 2.3

        Fixed Bugs and Malfunctions

        • NIFs and linked-in drivers are now loadable when running in an Erlang source tree on Windows.

          Own Id: OTP-19686 Aux Id: PR-9969

        Improvements and New Features

        • The default tracer is now aware that it is started by a remote shell (-remsh), in which case the traces will be sent to the remote group_leader to make the traces visible in the remote shell.

          Own Id: OTP-19648 Aux Id: PR-9589

        • A User's Guide to dbg is now available in the documentation.

          Own Id: OTP-19655 Aux Id: PR-9853

        Runtime_Tools 2.2

        Improvements and New Features

        • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

          All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

          -type meter() :: integer().
          +-type foot() :: integer().

          Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

          -nominal meter() :: integer().
          +-nominal foot() :: integer().

          More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

          Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

          Own Id: OTP-19364 Aux Id: PR-9079

        • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

          Own Id: OTP-19519 Aux Id: PR-9441

        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

          Own Id: OTP-19575 Aux Id: PR-9670

        • With this change observer will use cheaper iterators to avoid locking when not necessary.

          Own Id: OTP-19584 Aux Id: PR-9711

        Runtime_Tools 2.1.1

        Fixed Bugs and Malfunctions

        • Fixed a bug where dbg sessions on remote nodes were terminated prematurely.

          Own Id: OTP-19188 Aux Id: PR-8692

        Runtime_Tools 2.1

        Improvements and New Features

        • The instrument module can now track allocations on a per-process or per-port basis.

          Own Id: OTP-18577 Aux Id: PR-7236

        • The new function proc_lib:set_label/1 can be used to add a descriptive term to any process that does not have a registered name. The name will be shown by tools such as c:i/0, observer, and it will be included in crash reports produced by processes using gen_server, gen_statem, gen_event, and gen_fsm.

          The label for a process can be retrieved by calling proc_lib:get_label/1.

          Note that those functions work on any process, not only processes that use proc_lib.

          Example:

          1> self().
           <0.90.0>
           2> proc_lib:set_label(my_label).
           ok
          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml differs (HTML document, ASCII text, with very long lines)
          --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml	2026-04-20 15:18:08.000000000 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml	2042-05-23 04:36:37.000000000 +0000
          @@ -491,7 +491,7 @@
           scheduler_wall_time.

          Calculate scheduler utilizations for the time interval from when Sample was taken and "now". The same as calling scheduler:utilization(Sample, scheduler:sample_all()).

          Note

          This function is not recommended as it's so easy to get invalid results -without noticing. In particular do not do this:

          scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

          The above example takes two samples in rapid succession and calculates the +without noticing. In particular do not do this:

          scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

          The above example takes two samples in rapid succession and calculates the scheduler utilization between them. The resulting values will probably be more misleading than informative.

          Instead use scheduler:utilization/2 and call get_sample/0 to get samples with some time in between.

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools_app.html 2026-04-20 17:48:48.417734162 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/runtime_tools_app.html 2026-04-20 17:48:48.417734162 +0000 @@ -133,7 +133,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/scheduler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/scheduler.html 2026-04-20 17:48:48.453734385 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/scheduler.html 2026-04-20 17:48:48.453734385 +0000 @@ -578,7 +578,7 @@ scheduler_wall_time.

          Calculate scheduler utilizations for the time interval from when Sample was taken and "now". The same as calling scheduler:utilization(Sample, scheduler:sample_all()).

          Note

          This function is not recommended as it's so easy to get invalid results -without noticing. In particular do not do this:

          scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

          The above example takes two samples in rapid succession and calculates the +without noticing. In particular do not do this:

          scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

          The above example takes two samples in rapid succession and calculates the scheduler utilization between them. The resulting values will probably be more misleading than informative.

          Instead use scheduler:utilization/2 and call get_sample/0 to get samples with some time in between.

          @@ -646,7 +646,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/search.html 2026-04-20 17:48:48.481734559 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/search.html 2026-04-20 17:48:48.481734559 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/system_information.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/system_information.html 2026-04-20 17:48:48.517734782 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/system_information.html 2026-04-20 17:48:48.517734782 +0000 @@ -263,7 +263,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/systemtap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/systemtap.html 2026-04-20 17:48:48.549734981 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3.1/doc/html/systemtap.html 2026-04-20 17:48:48.549734981 +0000 @@ -157,7 +157,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/404.html 2026-04-20 17:48:48.577735154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/404.html 2026-04-20 17:48:48.577735154 +0000 @@ -110,7 +110,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/alarm_handler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/alarm_handler.html 2026-04-20 17:48:48.609735353 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/alarm_handler.html 2026-04-20 17:48:48.613735377 +0000 @@ -377,7 +377,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/api-reference.html 2026-04-20 17:48:48.645735576 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/api-reference.html 2026-04-20 17:48:48.645735576 +0000 @@ -145,7 +145,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/appup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/appup.html 2026-04-20 17:48:48.681735800 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/appup.html 2026-04-20 17:48:48.681735800 +0000 @@ -95,9 +95,9 @@ Application is the application name. The file is to be located in the ebin directory for the application.

          The .appup file contains one single Erlang term, which defines the instructions used to upgrade or downgrade the application. The file has the -following syntax:

          {Vsn,
          -  [{UpFromVsn, Instructions}, ...],
          -  [{DownToVsn, Instructions}, ...]}.
          • Vsn = string() - Current application version.

          • UpFromVsn = string() | binary() - An earlier application version to +following syntax:

            {Vsn,
            +  [{UpFromVsn, Instructions}, ...],
            +  [{DownToVsn, Instructions}, ...]}.
            • Vsn = string() - Current application version.

            • UpFromVsn = string() | binary() - An earlier application version to upgrade from. If it is a string, it is interpreted as a specific version number. If it is a binary, it is interpreted as a regular expression that can match multiple version numbers.

            • DownToVsn = string() | binary() - An earlier application version to @@ -160,21 +160,21 @@ version. For static modules, the new version is loaded before the process is asked to change code, both in the case of upgrading and downgrading. Callback modules are dynamic.

            update with argument supervisor is used when changing the start -specification of a supervisor.

            {load_module, Mod}
            -{load_module, Mod, DepMods}
            -{load_module, Mod, PrePurge, PostPurge, DepMods}
            -  Mod = atom()
            +specification of a supervisor.

            {load_module, Mod}
            +{load_module, Mod, DepMods}
            +{load_module, Mod, PrePurge, PostPurge, DepMods}
            +  Mod = atom()
               PrePurge = PostPurge = soft_purge | brutal_purge
            -  DepMods = [Mod]

            Simple code replacement of the module Mod.

            For a description of PrePurge and PostPurge, see update above.

            DepMods defaults to [] and defines which other modules Mod is dependent + DepMods = [Mod]

            Simple code replacement of the module Mod.

            For a description of PrePurge and PostPurge, see update above.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions for loading these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

            {add_module, Mod}
            -{add_module, Mod, DepMods}
            -  Mod = atom()
            -  DepMods = [Mod]

            Loads a new module Mod.

            DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

            {add_module, Mod}
            +{add_module, Mod, DepMods}
            +  Mod = atom()
            +  DepMods = [Mod]

            Loads a new module Mod.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

            {delete_module, Mod}
            -{delete_module, Mod, DepMods}
            -  Mod = atom()

            Deletes a module Mod using the low-level instructions remove and purge.

            DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

            {delete_module, Mod}
            +{delete_module, Mod, DepMods}
            +  Mod = atom()

            Deletes a module Mod using the low-level instructions remove and purge.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the instruction for removing Mod when upgrading, and conversely when downgrading.

            {add_application, Application}
             {add_application, Application, Type}
            @@ -195,9 +195,9 @@
             load it rather than start it, depending on the application's start type:
             If Type = load, the application is only loaded. If Type = none, the
             application is not loaded and not started, although the code for its modules is
            -loaded.

            Low-Level Instructions

            {load_object_code, {App, Vsn, [Mod]}}
            -  App = Mod = atom()
            -  Vsn = string()

            Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the +loaded.

            Low-Level Instructions

            {load_object_code, {App, Vsn, [Mod]}}
            +  App = Mod = atom()
            +  Vsn = string()

            Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the modules. The instruction is to be placed first in the script to read all new code from the file to make the suspend-load-resume cycle less time-consuming.

            point_of_no_return

            If a crash occurs after this instruction, the system cannot recover and is restarted from the old release version. The instruction must only occur once in @@ -211,38 +211,38 @@ PrePurge = PostPurge = soft_purge | brutal_purge

            Makes the current version of Mod old. PrePurge is ignored. For a description of PostPurge, see the high-level instruction update earlier.

            {purge, [Mod]}
               Mod = atom()

            Purges each module Mod, that is, removes the old code. Notice that any process -executing purged code is killed.

            {suspend, [Mod | {Mod, Timeout}]}
            -  Mod = atom()
            -  Timeout = int()>0 | default | infinity

            Tries to suspend all processes using a module Mod. If a process does not +executing purged code is killed.

            {suspend, [Mod | {Mod, Timeout}]}
            +  Mod = atom()
            +  Timeout = int()>0 | default | infinity

            Tries to suspend all processes using a module Mod. If a process does not respond, it is ignored. This can cause the process to die, either because it crashes when it spontaneously switches to new code, or as a result of a purge operation. If no Timeout is specified or default is specified, the default value for sys:suspend is used.

            {resume, [Mod]}
            -  Mod = atom()

            Resumes all suspended processes using a module Mod.

            {code_change, [{Mod, Extra}]}
            -{code_change, Mode, [{Mod, Extra}]}
            -  Mod = atom()
            +  Mod = atom()

            Resumes all suspended processes using a module Mod.

            {code_change, [{Mod, Extra}]}
            +{code_change, Mode, [{Mod, Extra}]}
            +  Mod = atom()
               Mode = up | down
            -  Extra = term()

            Mode defaults to up and specifies if it is an upgrade or downgrade. This + Extra = term()

          Mode defaults to up and specifies if it is an upgrade or downgrade. This instruction sends a code_change system message to all processes using a module Mod by calling function sys:change_code, passing term Extra as argument.

          {stop, [Mod]}
             Mod = atom()

          Stops all processes using a module Mod by calling supervisor:terminate_child/2. This instruction is useful when the simplest way -to change code is to stop and restart the processes that run the code.

          {start, [Mod]}
          -  Mod = atom()

          Starts all stopped processes using a module Mod by calling -supervisor:restart_child/2.

          {sync_nodes, Id, [Node]}
          -{sync_nodes, Id, {M, F, A}}
          -  Id = term()
          -  Node = node()
          -  M = F = atom()
          -  A = [term()]

          apply(M, F, A) must return a list of nodes.

          This instruction synchronizes the release installation with other nodes. Each +to change code is to stop and restart the processes that run the code.

          {start, [Mod]}
          +  Mod = atom()

          Starts all stopped processes using a module Mod by calling +supervisor:restart_child/2.

          {sync_nodes, Id, [Node]}
          +{sync_nodes, Id, {M, F, A}}
          +  Id = term()
          +  Node = node()
          +  M = F = atom()
          +  A = [term()]

          apply(M, F, A) must return a list of nodes.

          This instruction synchronizes the release installation with other nodes. Each Node must evaluate this command with the same Id. The local node waits for all other nodes to evaluate the instruction before execution continues. If a node goes down, it is considered to be an unrecoverable error, and the local node is restarted from the old release. There is no time-out for this -instruction, which means that it can hang forever.

          {apply, {M, F, A}}
          -  M = F = atom()
          -  A = [term()]

          Evaluates apply(M, F, A).

          If the instruction appears before instruction point_of_no_return, a failure is +instruction, which means that it can hang forever.

          {apply, {M, F, A}}
          +  M = F = atom()
          +  A = [term()]

          Evaluates apply(M, F, A).

          If the instruction appears before instruction point_of_no_return, a failure is caught. release_handler:install_release/1 then returns {error,{'EXIT',Reason}}, unless {error,Error} is thrown or returned. Then it returns {error,Error}.

          If the instruction appears after instruction point_of_no_return and the @@ -323,7 +323,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/error_logging.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/error_logging.html 2026-04-20 17:48:48.717736023 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/error_logging.html 2026-04-20 17:48:48.721736048 +0000 @@ -206,42 +206,42 @@ 2 error <0.15.0> 1996-10-16 16:17:04 1 progress <0.14.0> 1996-10-16 16:17:09 ok

        Show Reports

        Use function rb:show(Number) to show details of a specific -report:

        7> rb:show(4).
        +report:

        7> rb:show(4).
         
         PROGRESS REPORT  <0.20.0>                                   1996-10-16 16:16:36
         ===============================================================================
        -supervisor                                                     {local,sasl_sup}
        +supervisor                                                     {local,sasl_sup}
         started
        -[{pid,<0.24.0>},
        -{name,release_handler},
        -{mfa,{release_handler,start_link,[]}},
        -{restart_type,permanent},
        -{shutdown,2000},
        -{child_type,worker}]
        +[{pid,<0.24.0>},
        +{name,release_handler},
        +{mfa,{release_handler,start_link,[]}},
        +{restart_type,permanent},
        +{shutdown,2000},
        +{child_type,worker}]
         
         ok
        -8> rb:show(9).
        +8> rb:show(9).
         
         CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
         ===============================================================================
         Crashing process
         pid                                                                 <0.24.0>
         registered_name                                              release_handler
        -error_info                             {undef,{release_handler,mbj_func,[]}}
        +error_info                             {undef,{release_handler,mbj_func,[]}}
         initial_call
        -{gen,init_it,
        -[gen_server,
        +{gen,init_it,
        +[gen_server,
         <0.20.0>,
         <0.20.0>,
        -{erlang,register},
        +{erlang,register},
         release_handler,
         release_handler,
        -[],
        -[]]}
        -ancestors                                                [sasl_sup,<0.18.0>]
        -messages                                                                  []
        -links                                                    [<0.23.0>,<0.20.0>]
        -dictionary                                                                []
        +[],
        +[]]}
        +ancestors                                                [sasl_sup,<0.18.0>]
        +messages                                                                  []
        +links                                                    [<0.23.0>,<0.20.0>]
        +dictionary                                                                []
         trap_exit                                                              false
         status                                                               running
         heap_size                                                                610
        @@ -372,7 +372,7 @@
                   Erlang programming language
         
               

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/notes.html 2026-04-20 17:48:48.761736296 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/notes.html 2026-04-20 17:48:48.761736296 +0000 @@ -396,7 +396,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rb.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rb.html 2026-04-20 17:48:48.793736495 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rb.html 2026-04-20 17:48:48.797736519 +0000 @@ -1078,7 +1078,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rel.html 2026-04-20 17:48:48.837736767 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/rel.html 2026-04-20 17:48:48.837736767 +0000 @@ -92,11 +92,11 @@

        Release resource file

        Description

        The release resource file specifies which applications are included in a release (system) based on Erlang/OTP.

        This file is used by the functions in systools when generating start scripts (.script, .boot) and release upgrade files (relup).

        File Syntax

        The release resource file is to be called Name.rel.

        The .rel file contains one single Erlang term, which is called a release -specification. The file has the following syntax:

        {release, {RelName,Vsn}, {erts, EVsn},
        -  [{Application, AppVsn} |
        -   {Application, AppVsn, Type} |
        -   {Application, AppVsn, IncApps} |
        -   {Application, AppVsn, Type, IncApps}]}.
        • RelName = string() - Release name.

        • Vsn = string() - Release version.

        • EVsn = string() - ERTS version the release is intended for.

        • Application = atom() - Name of an application included in the release.

        • AppVsn = string() - Version of an application included in the release.

        • Type = permanent | transient | temporary | load | none - Start type of +specification. The file has the following syntax:

          {release, {RelName,Vsn}, {erts, EVsn},
          +  [{Application, AppVsn} |
          +   {Application, AppVsn, Type} |
          +   {Application, AppVsn, IncApps} |
          +   {Application, AppVsn, Type, IncApps}]}.
          • RelName = string() - Release name.

          • Vsn = string() - Release version.

          • EVsn = string() - ERTS version the release is intended for.

          • Application = atom() - Name of an application included in the release.

          • AppVsn = string() - Version of an application included in the release.

          • Type = permanent | transient | temporary | load | none - Start type of an application included in the release.

            If Type = permanent | transient | temporary, the application is loaded and started in the corresponding way, see application.

            If Type = load, the application is only loaded.

            If Type = none, the application is not loaded and not started, although the code for its modules is loaded.

            Defaults to permanent

          • IncApps = [atom()] - A list of applications that are included by an @@ -155,7 +155,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/release_handler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/release_handler.html 2026-04-20 17:48:48.881737040 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/release_handler.html 2026-04-20 17:48:48.889737090 +0000 @@ -1030,8 +1030,8 @@ create_RELEASES/4 or set_unpacked/2.

            Example:

            In the current version CurVsn of a release, the application directory of myapp is $ROOT/lib/myapp-1.0. A new version NewVsn is unpacked outside the release handler and the release handler is informed about this with a call -as follows:

            release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
            -=> {ok,NewVsn}

            If NewVsn is installed with option {update_paths,true}, then +as follows:

            release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
            +=> {ok,NewVsn}

            If NewVsn is installed with option {update_paths,true}, then code:lib_dir(myapp) returns /home/user/myapp-1.0.

          Note

          Installing a new release can be time consuming if there are many processes in the system. The reason is that each process must be checked for references to old code before a module can be purged. This check can lead to garbage @@ -1332,7 +1332,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/relup.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/relup.html 2026-04-20 17:48:48.917737263 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/relup.html 2026-04-20 17:48:48.925737313 +0000 @@ -95,9 +95,9 @@ file (.rel), application resource files (.app), and application upgrade files (.appup) as input.

          File Syntax

          In a target system, the release upgrade file is to be located in directory $ROOT/releases/Vsn.

          The relup file contains one single Erlang term, which defines the instructions -used to upgrade the release. The file has the following syntax:

          {Vsn,
          -  [{UpFromVsn, Descr, Instructions}, ...],
          -  [{DownToVsn, Descr, Instructions}, ...]}.
          • Vsn = string() - Current release version.

          • UpFromVsn = string() - Earlier version of the release to upgrade from.

          • Descr = term() - A user-defined parameter passed from the function +used to upgrade the release. The file has the following syntax:

            {Vsn,
            +  [{UpFromVsn, Descr, Instructions}, ...],
            +  [{DownToVsn, Descr, Instructions}, ...]}.
            • Vsn = string() - Current release version.

            • UpFromVsn = string() - Earlier version of the release to upgrade from.

            • Descr = term() - A user-defined parameter passed from the function systools:make_relup/3,4. It is used in the return value of release_handler:install_release/1,2.

            • Instructions - A list of low-level release upgrade instructions, see @@ -157,7 +157,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/appup.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/appup.xhtml 2026-04-20 15:17:42.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/appup.xhtml 2042-05-23 04:36:07.000000000 +0000 @@ -23,9 +23,9 @@ Application is the application name. The file is to be located in the ebin directory for the application.

              The .appup file contains one single Erlang term, which defines the instructions used to upgrade or downgrade the application. The file has the -following syntax:

              {Vsn,
              -  [{UpFromVsn, Instructions}, ...],
              -  [{DownToVsn, Instructions}, ...]}.
              • Vsn = string() - Current application version.

              • UpFromVsn = string() | binary() - An earlier application version to +following syntax:

                {Vsn,
                +  [{UpFromVsn, Instructions}, ...],
                +  [{DownToVsn, Instructions}, ...]}.
                • Vsn = string() - Current application version.

                • UpFromVsn = string() | binary() - An earlier application version to upgrade from. If it is a string, it is interpreted as a specific version number. If it is a binary, it is interpreted as a regular expression that can match multiple version numbers.

                • DownToVsn = string() | binary() - An earlier application version to @@ -88,21 +88,21 @@ version. For static modules, the new version is loaded before the process is asked to change code, both in the case of upgrading and downgrading. Callback modules are dynamic.

                update with argument supervisor is used when changing the start -specification of a supervisor.

                {load_module, Mod}
                -{load_module, Mod, DepMods}
                -{load_module, Mod, PrePurge, PostPurge, DepMods}
                -  Mod = atom()
                +specification of a supervisor.

                {load_module, Mod}
                +{load_module, Mod, DepMods}
                +{load_module, Mod, PrePurge, PostPurge, DepMods}
                +  Mod = atom()
                   PrePurge = PostPurge = soft_purge | brutal_purge
                -  DepMods = [Mod]

                Simple code replacement of the module Mod.

                For a description of PrePurge and PostPurge, see update above.

                DepMods defaults to [] and defines which other modules Mod is dependent + DepMods = [Mod]

                Simple code replacement of the module Mod.

                For a description of PrePurge and PostPurge, see update above.

                DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions for loading these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

                {add_module, Mod}
                -{add_module, Mod, DepMods}
                -  Mod = atom()
                -  DepMods = [Mod]

                Loads a new module Mod.

                DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

                {add_module, Mod}
                +{add_module, Mod, DepMods}
                +  Mod = atom()
                +  DepMods = [Mod]

                Loads a new module Mod.

                DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

                {delete_module, Mod}
                -{delete_module, Mod, DepMods}
                -  Mod = atom()

                Deletes a module Mod using the low-level instructions remove and purge.

                DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

                {delete_module, Mod}
                +{delete_module, Mod, DepMods}
                +  Mod = atom()

                Deletes a module Mod using the low-level instructions remove and purge.

                DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the instruction for removing Mod when upgrading, and conversely when downgrading.

                {add_application, Application}
                 {add_application, Application, Type}
                @@ -123,9 +123,9 @@
                 load it rather than start it, depending on the application's start type:
                 If Type = load, the application is only loaded. If Type = none, the
                 application is not loaded and not started, although the code for its modules is
                -loaded.

                Low-Level Instructions

                {load_object_code, {App, Vsn, [Mod]}}
                -  App = Mod = atom()
                -  Vsn = string()

                Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the +loaded.

                Low-Level Instructions

                {load_object_code, {App, Vsn, [Mod]}}
                +  App = Mod = atom()
                +  Vsn = string()

                Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the modules. The instruction is to be placed first in the script to read all new code from the file to make the suspend-load-resume cycle less time-consuming.

                point_of_no_return

                If a crash occurs after this instruction, the system cannot recover and is restarted from the old release version. The instruction must only occur once in @@ -139,38 +139,38 @@ PrePurge = PostPurge = soft_purge | brutal_purge

                Makes the current version of Mod old. PrePurge is ignored. For a description of PostPurge, see the high-level instruction update earlier.

                {purge, [Mod]}
                   Mod = atom()

                Purges each module Mod, that is, removes the old code. Notice that any process -executing purged code is killed.

                {suspend, [Mod | {Mod, Timeout}]}
                -  Mod = atom()
                -  Timeout = int()>0 | default | infinity

                Tries to suspend all processes using a module Mod. If a process does not +executing purged code is killed.

                {suspend, [Mod | {Mod, Timeout}]}
                +  Mod = atom()
                +  Timeout = int()>0 | default | infinity

                Tries to suspend all processes using a module Mod. If a process does not respond, it is ignored. This can cause the process to die, either because it crashes when it spontaneously switches to new code, or as a result of a purge operation. If no Timeout is specified or default is specified, the default value for sys:suspend is used.

                {resume, [Mod]}
                -  Mod = atom()

                Resumes all suspended processes using a module Mod.

                {code_change, [{Mod, Extra}]}
                -{code_change, Mode, [{Mod, Extra}]}
                -  Mod = atom()
                +  Mod = atom()

                Resumes all suspended processes using a module Mod.

                {code_change, [{Mod, Extra}]}
                +{code_change, Mode, [{Mod, Extra}]}
                +  Mod = atom()
                   Mode = up | down
                -  Extra = term()

                Mode defaults to up and specifies if it is an upgrade or downgrade. This + Extra = term()

        Mode defaults to up and specifies if it is an upgrade or downgrade. This instruction sends a code_change system message to all processes using a module Mod by calling function sys:change_code, passing term Extra as argument.

        {stop, [Mod]}
           Mod = atom()

        Stops all processes using a module Mod by calling supervisor:terminate_child/2. This instruction is useful when the simplest way -to change code is to stop and restart the processes that run the code.

        {start, [Mod]}
        -  Mod = atom()

        Starts all stopped processes using a module Mod by calling -supervisor:restart_child/2.

        {sync_nodes, Id, [Node]}
        -{sync_nodes, Id, {M, F, A}}
        -  Id = term()
        -  Node = node()
        -  M = F = atom()
        -  A = [term()]

        apply(M, F, A) must return a list of nodes.

        This instruction synchronizes the release installation with other nodes. Each +to change code is to stop and restart the processes that run the code.

        {start, [Mod]}
        +  Mod = atom()

        Starts all stopped processes using a module Mod by calling +supervisor:restart_child/2.

        {sync_nodes, Id, [Node]}
        +{sync_nodes, Id, {M, F, A}}
        +  Id = term()
        +  Node = node()
        +  M = F = atom()
        +  A = [term()]

        apply(M, F, A) must return a list of nodes.

        This instruction synchronizes the release installation with other nodes. Each Node must evaluate this command with the same Id. The local node waits for all other nodes to evaluate the instruction before execution continues. If a node goes down, it is considered to be an unrecoverable error, and the local node is restarted from the old release. There is no time-out for this -instruction, which means that it can hang forever.

        {apply, {M, F, A}}
        -  M = F = atom()
        -  A = [term()]

        Evaluates apply(M, F, A).

        If the instruction appears before instruction point_of_no_return, a failure is +instruction, which means that it can hang forever.

        {apply, {M, F, A}}
        +  M = F = atom()
        +  A = [term()]

        Evaluates apply(M, F, A).

        If the instruction appears before instruction point_of_no_return, a failure is caught. release_handler:install_release/1 then returns {error,{'EXIT',Reason}}, unless {error,Error} is thrown or returned. Then it returns {error,Error}.

        If the instruction appears after instruction point_of_no_return and the /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/content.opf 2026-04-20 15:17:42.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/content.opf 2042-05-23 04:36:07.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> sasl - 4.3.1 - urn:uuid:0b5a4a91-63db-6445-8573-f72ac811edc6 + urn:uuid:fa28f7cb-e948-5760-ed5a-42e79455fd5b en - 2026-04-20T15:17:42Z + 2042-05-23T04:36:07Z /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/error_logging.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/error_logging.xhtml 2026-04-20 15:17:42.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/error_logging.xhtml 2042-05-23 04:36:07.000000000 +0000 @@ -134,42 +134,42 @@ 2 error <0.15.0> 1996-10-16 16:17:04 1 progress <0.14.0> 1996-10-16 16:17:09 ok

        Show Reports

        Use function rb:show(Number) to show details of a specific -report:

        7> rb:show(4).
        +report:

        7> rb:show(4).
         
         PROGRESS REPORT  <0.20.0>                                   1996-10-16 16:16:36
         ===============================================================================
        -supervisor                                                     {local,sasl_sup}
        +supervisor                                                     {local,sasl_sup}
         started
        -[{pid,<0.24.0>},
        -{name,release_handler},
        -{mfa,{release_handler,start_link,[]}},
        -{restart_type,permanent},
        -{shutdown,2000},
        -{child_type,worker}]
        +[{pid,<0.24.0>},
        +{name,release_handler},
        +{mfa,{release_handler,start_link,[]}},
        +{restart_type,permanent},
        +{shutdown,2000},
        +{child_type,worker}]
         
         ok
        -8> rb:show(9).
        +8> rb:show(9).
         
         CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
         ===============================================================================
         Crashing process
         pid                                                                 <0.24.0>
         registered_name                                              release_handler
        -error_info                             {undef,{release_handler,mbj_func,[]}}
        +error_info                             {undef,{release_handler,mbj_func,[]}}
         initial_call
        -{gen,init_it,
        -[gen_server,
        +{gen,init_it,
        +[gen_server,
         <0.20.0>,
         <0.20.0>,
        -{erlang,register},
        +{erlang,register},
         release_handler,
         release_handler,
        -[],
        -[]]}
        -ancestors                                                [sasl_sup,<0.18.0>]
        -messages                                                                  []
        -links                                                    [<0.23.0>,<0.20.0>]
        -dictionary                                                                []
        +[],
        +[]]}
        +ancestors                                                [sasl_sup,<0.18.0>]
        +messages                                                                  []
        +links                                                    [<0.23.0>,<0.20.0>]
        +dictionary                                                                []
         trap_exit                                                              false
         status                                                               running
         heap_size                                                                610
        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/release_handler.xhtml differs (HTML document, ASCII text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/release_handler.xhtml	2026-04-20 15:17:42.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/release_handler.xhtml	2042-05-23 04:36:07.000000000 +0000
        @@ -943,8 +943,8 @@
         create_RELEASES/4 or set_unpacked/2.

        Example:

        In the current version CurVsn of a release, the application directory of myapp is $ROOT/lib/myapp-1.0. A new version NewVsn is unpacked outside the release handler and the release handler is informed about this with a call -as follows:

        release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
        -=> {ok,NewVsn}

        If NewVsn is installed with option {update_paths,true}, then +as follows:

        release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
        +=> {ok,NewVsn}

        If NewVsn is installed with option {update_paths,true}, then code:lib_dir(myapp) returns /home/user/myapp-1.0.

      Note

      Installing a new release can be time consuming if there are many processes in the system. The reason is that each process must be checked for references to old code before a module can be purged. This check can lead to garbage /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/relup.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/relup.xhtml 2026-04-20 15:17:42.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/relup.xhtml 2042-05-23 04:36:07.000000000 +0000 @@ -23,9 +23,9 @@ file (.rel), application resource files (.app), and application upgrade files (.appup) as input.

      File Syntax

      In a target system, the release upgrade file is to be located in directory $ROOT/releases/Vsn.

      The relup file contains one single Erlang term, which defines the instructions -used to upgrade the release. The file has the following syntax:

      {Vsn,
      -  [{UpFromVsn, Descr, Instructions}, ...],
      -  [{DownToVsn, Descr, Instructions}, ...]}.
      • Vsn = string() - Current release version.

      • UpFromVsn = string() - Earlier version of the release to upgrade from.

      • Descr = term() - A user-defined parameter passed from the function +used to upgrade the release. The file has the following syntax:

        {Vsn,
        +  [{UpFromVsn, Descr, Instructions}, ...],
        +  [{DownToVsn, Descr, Instructions}, ...]}.
        • Vsn = string() - Current release version.

        • UpFromVsn = string() - Earlier version of the release to upgrade from.

        • Descr = term() - A user-defined parameter passed from the function systools:make_relup/3,4. It is used in the return value of release_handler:install_release/1,2.

        • Instructions - A list of low-level release upgrade instructions, see /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/rel.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/rel.xhtml 2026-04-20 15:17:42.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/rel.xhtml 2042-05-23 04:36:07.000000000 +0000 @@ -20,11 +20,11 @@

          Release resource file

          Description

          The release resource file specifies which applications are included in a release (system) based on Erlang/OTP.

          This file is used by the functions in systools when generating start scripts (.script, .boot) and release upgrade files (relup).

          File Syntax

          The release resource file is to be called Name.rel.

          The .rel file contains one single Erlang term, which is called a release -specification. The file has the following syntax:

          {release, {RelName,Vsn}, {erts, EVsn},
          -  [{Application, AppVsn} |
          -   {Application, AppVsn, Type} |
          -   {Application, AppVsn, IncApps} |
          -   {Application, AppVsn, Type, IncApps}]}.
          • RelName = string() - Release name.

          • Vsn = string() - Release version.

          • EVsn = string() - ERTS version the release is intended for.

          • Application = atom() - Name of an application included in the release.

          • AppVsn = string() - Version of an application included in the release.

          • Type = permanent | transient | temporary | load | none - Start type of +specification. The file has the following syntax:

            {release, {RelName,Vsn}, {erts, EVsn},
            +  [{Application, AppVsn} |
            +   {Application, AppVsn, Type} |
            +   {Application, AppVsn, IncApps} |
            +   {Application, AppVsn, Type, IncApps}]}.
            • RelName = string() - Release name.

            • Vsn = string() - Release version.

            • EVsn = string() - ERTS version the release is intended for.

            • Application = atom() - Name of an application included in the release.

            • AppVsn = string() - Version of an application included in the release.

            • Type = permanent | transient | temporary | load | none - Start type of an application included in the release.

              If Type = permanent | transient | temporary, the application is loaded and started in the corresponding way, see application.

              If Type = load, the application is only loaded.

              If Type = none, the application is not loaded and not started, although the code for its modules is loaded.

              Defaults to permanent

            • IncApps = [atom()] - A list of applications that are included by an /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/script.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/script.xhtml 2026-04-20 15:17:42.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl.epub/OEBPS/script.xhtml 2042-05-23 04:36:07.000000000 +0000 @@ -22,20 +22,20 @@ to start.

              Command erl -boot Name starts the system with a boot file called Name.boot, which is generated from the Name.script file, using systools:script2boot/1.

              The .script file is generated by systools from a .rel file and from .app files.

              File Syntax

              The boot script is stored in a file with extension .script. The file has the -following syntax:

              {script, {Name, Vsn},
              - [
              -  {progress, loading},
              -  {preLoaded, [Mod1, Mod2, ...]},
              -  {path, [Dir1,"$ROOT/Dir",...]}.
              -  {primLoad, [Mod1, Mod2, ...]},
              +following syntax:

              {script, {Name, Vsn},
              + [
              +  {progress, loading},
              +  {preLoaded, [Mod1, Mod2, ...]},
              +  {path, [Dir1,"$ROOT/Dir",...]}.
              +  {primLoad, [Mod1, Mod2, ...]},
                 ...
              -  {kernel_load_completed},
              -  {progress, loaded},
              -  {kernelProcess, Name, {Mod, Func, Args}},
              +  {kernel_load_completed},
              +  {progress, loaded},
              +  {kernelProcess, Name, {Mod, Func, Args}},
                 ...
              -  {apply, {Mod, Func, Args}},
              +  {apply, {Mod, Func, Args}},
                 ...
              -  {progress, started}]}.
              • Name = string() - Defines the system name.

              • Vsn = string() - Defines the system version.

              • {progress, Term} - Sets the "progress" of the initialization program. + {progress, started}]}.

              • Name = string() - Defines the system name.

              • Vsn = string() - Defines the system version.

              • {progress, Term} - Sets the "progress" of the initialization program. The init:get_status/0 function returns the current value of the progress, which is {InternalStatus,Term}.

              • {path, [Dir]} - Dir is a string. This argument sets the load path of the system to [Dir]. The load path used to load modules is obtained from the /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_app.html 2026-04-20 17:48:49.141738654 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_app.html 2026-04-20 17:48:49.145738679 +0000 @@ -197,7 +197,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_intro.html 2026-04-20 17:48:49.173738852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/sasl_intro.html 2026-04-20 17:48:49.173738852 +0000 @@ -145,7 +145,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/script.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/script.html 2026-04-20 17:48:49.201739026 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/script.html 2026-04-20 17:48:49.205739050 +0000 @@ -94,20 +94,20 @@ to start.

                Command erl -boot Name starts the system with a boot file called Name.boot, which is generated from the Name.script file, using systools:script2boot/1.

                The .script file is generated by systools from a .rel file and from .app files.

                File Syntax

                The boot script is stored in a file with extension .script. The file has the -following syntax:

                {script, {Name, Vsn},
                - [
                -  {progress, loading},
                -  {preLoaded, [Mod1, Mod2, ...]},
                -  {path, [Dir1,"$ROOT/Dir",...]}.
                -  {primLoad, [Mod1, Mod2, ...]},
                +following syntax:

                {script, {Name, Vsn},
                + [
                +  {progress, loading},
                +  {preLoaded, [Mod1, Mod2, ...]},
                +  {path, [Dir1,"$ROOT/Dir",...]}.
                +  {primLoad, [Mod1, Mod2, ...]},
                   ...
                -  {kernel_load_completed},
                -  {progress, loaded},
                -  {kernelProcess, Name, {Mod, Func, Args}},
                +  {kernel_load_completed},
                +  {progress, loaded},
                +  {kernelProcess, Name, {Mod, Func, Args}},
                   ...
                -  {apply, {Mod, Func, Args}},
                +  {apply, {Mod, Func, Args}},
                   ...
                -  {progress, started}]}.
                • Name = string() - Defines the system name.

                • Vsn = string() - Defines the system version.

                • {progress, Term} - Sets the "progress" of the initialization program. + {progress, started}]}.

                • Name = string() - Defines the system name.

                • Vsn = string() - Defines the system version.

                • {progress, Term} - Sets the "progress" of the initialization program. The init:get_status/0 function returns the current value of the progress, which is {InternalStatus,Term}.

                • {path, [Dir]} - Dir is a string. This argument sets the load path of the system to [Dir]. The load path used to load modules is obtained from the @@ -181,7 +181,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/search.html 2026-04-20 17:48:49.233739224 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/search.html 2026-04-20 17:48:49.233739224 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/systools.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/systools.html 2026-04-20 17:48:49.265739422 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3.1/doc/html/systools.html 2026-04-20 17:48:49.265739422 +0000 @@ -631,7 +631,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/404.html 2026-04-20 17:48:49.293739597 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/404.html 2026-04-20 17:48:49.293739597 +0000 @@ -110,7 +110,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/api-reference.html 2026-04-20 17:48:49.337739869 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/api-reference.html 2026-04-20 17:48:49.337739869 +0000 @@ -415,7 +415,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/notes.html 2026-04-20 17:48:49.369740068 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/notes.html 2026-04-20 17:48:49.373740093 +0000 @@ -89,9 +89,9 @@ -

                  SNMP 5.20.1

                  Improvements and New Features

                  • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

                    A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

                    make release_docs places the documentation in the released code under the doc folder.

                    make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

                    The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

                    Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

                    Improves the source Software-Bill-of-Materials

                    • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
                    • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
                    • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

                    Own Id: OTP-19886 Aux Id: PR-10434

                  SNMP 5.20

                  Fixed Bugs and Malfunctions

                  • Fixed a bug where running snmp:config() from Elixir would crash due to io:get_line/1 returning unexpected datatype.

                    Own Id: OTP-19883 Aux Id: PR-10326

                  Improvements and New Features

                  • Inherit ERL_DETERMINISTIC variable for compiling snmp_pdus_basic.beam.

                    Own Id: OTP-19885 Aux Id: PR-10288

                  SNMP 5.19.1

                  Fixed Bugs and Malfunctions

                  • Using ASN.1 generated code for decode/encode of basic types, starting with Counter64.

                    Own Id: OTP-19619 Aux Id: GH-5756, PR-9869

                  Improvements and New Features

                  • Reworked the timer handling of the (SNMP) manager start notification feature.

                    Own Id: OTP-19696 Aux Id: PR-10014

                  • Added missing specs to already documented functions.

                    Own Id: OTP-19723 Aux Id: PR-10087

                  SNMP 5.19

                  Improvements and New Features

                  • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

                    All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

                    -type meter() :: integer().
                    --type foot() :: integer().

                    Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

                    -nominal meter() :: integer().
                    --nominal foot() :: integer().

                    More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

                    Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

                    Own Id: OTP-19364 Aux Id: PR-9079

                  • Added support for compiling Erlang/OTP for Windows on ARM64.

                    Own Id: OTP-19480 Aux Id: PR-8734

                  • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

                    Own Id: OTP-19519 Aux Id: PR-9441

                  • Add copyright notice to files that still had none.

                    Own Id: OTP-19572

                  • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

                    Own Id: OTP-19575 Aux Id: PR-9670

                  SNMP 5.18.2

                  Fixed Bugs and Malfunctions

                  • When manager receives an v3 inform (request) it used engine-id and full address (including port number) to check if engine was known. This did not work if agent used ephemeral ports for notifications. Has now been changed to only use (context) engine-id and address (without port).

                    Own Id: OTP-19562 Aux Id: ERIERL-1207

                  • Fixed snmp_generic (dialyzer) spec for function table_func.

                    Own Id: OTP-19568 Aux Id: ERIERL-1211

                  SNMP 5.18.1

                  Fixed Bugs and Malfunctions

                  • SNMP Agent transports type (intAgentTransports) was incorrectly not documented as a list of transports. +

                    SNMP 5.20.1

                    Improvements and New Features

                    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

                      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

                      make release_docs places the documentation in the released code under the doc folder.

                      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

                      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

                      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

                      Improves the source Software-Bill-of-Materials

                      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
                      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
                      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

                      Own Id: OTP-19886 Aux Id: PR-10434

                    SNMP 5.20

                    Fixed Bugs and Malfunctions

                    • Fixed a bug where running snmp:config() from Elixir would crash due to io:get_line/1 returning unexpected datatype.

                      Own Id: OTP-19883 Aux Id: PR-10326

                    Improvements and New Features

                    • Inherit ERL_DETERMINISTIC variable for compiling snmp_pdus_basic.beam.

                      Own Id: OTP-19885 Aux Id: PR-10288

                    SNMP 5.19.1

                    Fixed Bugs and Malfunctions

                    • Using ASN.1 generated code for decode/encode of basic types, starting with Counter64.

                      Own Id: OTP-19619 Aux Id: GH-5756, PR-9869

                    Improvements and New Features

                    • Reworked the timer handling of the (SNMP) manager start notification feature.

                      Own Id: OTP-19696 Aux Id: PR-10014

                    • Added missing specs to already documented functions.

                      Own Id: OTP-19723 Aux Id: PR-10087

                    SNMP 5.19

                    Improvements and New Features

                    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

                      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

                      -type meter() :: integer().
                      +-type foot() :: integer().

                      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

                      -nominal meter() :: integer().
                      +-nominal foot() :: integer().

                      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

                      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

                      Own Id: OTP-19364 Aux Id: PR-9079

                    • Added support for compiling Erlang/OTP for Windows on ARM64.

                      Own Id: OTP-19480 Aux Id: PR-8734

                    • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

                      Own Id: OTP-19519 Aux Id: PR-9441

                    • Add copyright notice to files that still had none.

                      Own Id: OTP-19572

                    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

                      Own Id: OTP-19575 Aux Id: PR-9670

                    SNMP 5.18.2

                    Fixed Bugs and Malfunctions

                    • When manager receives an v3 inform (request) it used engine-id and full address (including port number) to check if engine was known. This did not work if agent used ephemeral ports for notifications. Has now been changed to only use (context) engine-id and address (without port).

                      Own Id: OTP-19562 Aux Id: ERIERL-1207

                    • Fixed snmp_generic (dialyzer) spec for function table_func.

                      Own Id: OTP-19568 Aux Id: ERIERL-1211

                    SNMP 5.18.1

                    Fixed Bugs and Malfunctions

                    • SNMP Agent transports type (intAgentTransports) was incorrectly not documented as a list of transports. Also add a couple of config file generation examples.

                      Own Id: OTP-19438 Aux Id: ERIERL-1180

                    SNMP 5.18

                    Improvements and New Features

                    • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

                      Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

                    SNMP 5.17

                    Fixed Bugs and Malfunctions

                    • 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

                    Improvements and New Features

                    • Figures in the documentation have been improved.

                      Own Id: OTP-19130 Aux Id: PR-7226

                    SNMP 5.16

                    Improvements and New Features

                    SNMP 5.15

                    Improvements and New Features

                    • Make snmp handle gen_udp with socket backend on Windows (completion).

                      Own Id: OTP-18598 Aux Id: OTP-18029

                    SNMP 5.14

                    Improvements and New Features

                    • The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

                      * POTENTIAL INCOMPATIBILITY *

                      Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843

                    SNMP 5.13.5

                    Improvements and New Features

                    • Attempts to minimize the number of the error reports during a failed agent init.

                      Own Id: OTP-18422 Aux Id: ERIERL-873

                    SNMP 5.13.4

                    Improvements and New Features

                    • Replace size/1 with either tuple_size/1 or byte_size/1

                      The size/1 BIF is not optimized by the JIT, and its use can @@ -264,7 +264,7 @@ Erlang programming language

                      -

                      Copyright © 1996-2026 Ericsson AB

                      +

                      Copyright © 1996-2042 Ericsson AB

                      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/search.html 2026-04-20 17:48:49.401740266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/search.html 2026-04-20 17:48:49.405740291 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                      -

                      Copyright © 1996-2026 Ericsson AB

                      +

                      Copyright © 1996-2042 Ericsson AB

                      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/content.opf 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/content.opf 2042-05-23 04:37:03.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> snmp - 5.20.1 - urn:uuid:0d3468e5-c243-ad85-33ee-24997f62d0b4 + urn:uuid:0dbf7bb8-d8bc-2aa8-8e7e-088895d6331f en - 2026-04-20T15:18:30Z + 2042-05-23T04:37:03Z /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/notes.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/notes.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/notes.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -17,9 +17,9 @@

                      SNMP Release Notes

                      -

                      SNMP 5.20.1

                      Improvements and New Features

                      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

                        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

                        make release_docs places the documentation in the released code under the doc folder.

                        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

                        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

                        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

                        Improves the source Software-Bill-of-Materials

                        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
                        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
                        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

                        Own Id: OTP-19886 Aux Id: PR-10434

                      SNMP 5.20

                      Fixed Bugs and Malfunctions

                      • Fixed a bug where running snmp:config() from Elixir would crash due to io:get_line/1 returning unexpected datatype.

                        Own Id: OTP-19883 Aux Id: PR-10326

                      Improvements and New Features

                      • Inherit ERL_DETERMINISTIC variable for compiling snmp_pdus_basic.beam.

                        Own Id: OTP-19885 Aux Id: PR-10288

                      SNMP 5.19.1

                      Fixed Bugs and Malfunctions

                      • Using ASN.1 generated code for decode/encode of basic types, starting with Counter64.

                        Own Id: OTP-19619 Aux Id: GH-5756, PR-9869

                      Improvements and New Features

                      • Reworked the timer handling of the (SNMP) manager start notification feature.

                        Own Id: OTP-19696 Aux Id: PR-10014

                      • Added missing specs to already documented functions.

                        Own Id: OTP-19723 Aux Id: PR-10087

                      SNMP 5.19

                      Improvements and New Features

                      • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

                        All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

                        -type meter() :: integer().
                        --type foot() :: integer().

                        Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

                        -nominal meter() :: integer().
                        --nominal foot() :: integer().

                        More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

                        Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

                        Own Id: OTP-19364 Aux Id: PR-9079

                      • Added support for compiling Erlang/OTP for Windows on ARM64.

                        Own Id: OTP-19480 Aux Id: PR-8734

                      • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

                        Own Id: OTP-19519 Aux Id: PR-9441

                      • Add copyright notice to files that still had none.

                        Own Id: OTP-19572

                      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

                        Own Id: OTP-19575 Aux Id: PR-9670

                      SNMP 5.18.2

                      Fixed Bugs and Malfunctions

                      • When manager receives an v3 inform (request) it used engine-id and full address (including port number) to check if engine was known. This did not work if agent used ephemeral ports for notifications. Has now been changed to only use (context) engine-id and address (without port).

                        Own Id: OTP-19562 Aux Id: ERIERL-1207

                      • Fixed snmp_generic (dialyzer) spec for function table_func.

                        Own Id: OTP-19568 Aux Id: ERIERL-1211

                      SNMP 5.18.1

                      Fixed Bugs and Malfunctions

                      • SNMP Agent transports type (intAgentTransports) was incorrectly not documented as a list of transports. +

                        SNMP 5.20.1

                        Improvements and New Features

                        • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

                          A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

                          make release_docs places the documentation in the released code under the doc folder.

                          make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

                          The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

                          Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

                          Improves the source Software-Bill-of-Materials

                          • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
                          • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
                          • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

                          Own Id: OTP-19886 Aux Id: PR-10434

                        SNMP 5.20

                        Fixed Bugs and Malfunctions

                        • Fixed a bug where running snmp:config() from Elixir would crash due to io:get_line/1 returning unexpected datatype.

                          Own Id: OTP-19883 Aux Id: PR-10326

                        Improvements and New Features

                        • Inherit ERL_DETERMINISTIC variable for compiling snmp_pdus_basic.beam.

                          Own Id: OTP-19885 Aux Id: PR-10288

                        SNMP 5.19.1

                        Fixed Bugs and Malfunctions

                        • Using ASN.1 generated code for decode/encode of basic types, starting with Counter64.

                          Own Id: OTP-19619 Aux Id: GH-5756, PR-9869

                        Improvements and New Features

                        • Reworked the timer handling of the (SNMP) manager start notification feature.

                          Own Id: OTP-19696 Aux Id: PR-10014

                        • Added missing specs to already documented functions.

                          Own Id: OTP-19723 Aux Id: PR-10087

                        SNMP 5.19

                        Improvements and New Features

                        • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

                          All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

                          -type meter() :: integer().
                          +-type foot() :: integer().

                          Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

                          -nominal meter() :: integer().
                          +-nominal foot() :: integer().

                          More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

                          Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

                          Own Id: OTP-19364 Aux Id: PR-9079

                        • Added support for compiling Erlang/OTP for Windows on ARM64.

                          Own Id: OTP-19480 Aux Id: PR-8734

                        • When compiling C/C++ code on Unix systems, the compiler hardening flags suggested by the Open Source Security Foundation are now enabled by default. To disable them, pass --disable-security-hardening-flags to configure.

                          Own Id: OTP-19519 Aux Id: PR-9441

                        • Add copyright notice to files that still had none.

                          Own Id: OTP-19572

                        • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

                          Own Id: OTP-19575 Aux Id: PR-9670

                        SNMP 5.18.2

                        Fixed Bugs and Malfunctions

                        • When manager receives an v3 inform (request) it used engine-id and full address (including port number) to check if engine was known. This did not work if agent used ephemeral ports for notifications. Has now been changed to only use (context) engine-id and address (without port).

                          Own Id: OTP-19562 Aux Id: ERIERL-1207

                        • Fixed snmp_generic (dialyzer) spec for function table_func.

                          Own Id: OTP-19568 Aux Id: ERIERL-1211

                        SNMP 5.18.1

                        Fixed Bugs and Malfunctions

                        • SNMP Agent transports type (intAgentTransports) was incorrectly not documented as a list of transports. Also add a couple of config file generation examples.

                          Own Id: OTP-19438 Aux Id: ERIERL-1180

                        SNMP 5.18

                        Improvements and New Features

                        • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

                          Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

                        SNMP 5.17

                        Fixed Bugs and Malfunctions

                        • 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

                        Improvements and New Features

                        • Figures in the documentation have been improved.

                          Own Id: OTP-19130 Aux Id: PR-7226

                        SNMP 5.16

                        Improvements and New Features

                        SNMP 5.15

                        Improvements and New Features

                        • Make snmp handle gen_udp with socket backend on Windows (completion).

                          Own Id: OTP-18598 Aux Id: OTP-18029

                        SNMP 5.14

                        Improvements and New Features

                        • The implementation has been fixed to use proc_lib:init_fail/2,3 where appropriate, instead of proc_lib:init_ack/1,2.

                          * POTENTIAL INCOMPATIBILITY *

                          Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843

                        SNMP 5.13.5

                        Improvements and New Features

                        • Attempts to minimize the number of the error reports during a failed agent init.

                          Own Id: OTP-18422 Aux Id: ERIERL-873

                        SNMP 5.13.4

                        Improvements and New Features

                        • Replace size/1 with either tuple_size/1 or byte_size/1

                          The size/1 BIF is not optimized by the JIT, and its use can /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -149,48 +149,48 @@ empName DisplayString, empTelNo DisplayString, empStatus RowStatus - }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two -elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify + }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two +elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify rows. Also, you can use the ordinary Mnesia API to access the table from your programs. The only explicit action is to create the Mnesia table, an action the user has to perform in order to create the required table schemas.

    Adding Own Actions

    It is often necessary to take some specific action when a table is modified. This is accomplished with an instrumentation function. It executes some specific code when the table is set, and passes all other requests down to the -pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    -    notify_internal_resources(RowIndex, Cols),
    -    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. +pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    +    notify_internal_resources(RowIndex, Cols),
    +    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. Refer to the Reference Manual, section SNMP, module snmp_generic for details.

    Extending the Mnesia Table

    A table may contain columns that are used internally, but should not be visible to a manager. These internal columns must be the last columns in the table. The set operation will not work with this arrangement, because there are columns that the agent does not know about. This situation is handled by adding values for the internal columns in the set function.

    To illustrate this, suppose we extend our Mnesia empTable with one internal column. We create it as before, but with an arity of 4, by adding another -attribute.

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which +attribute.

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which creates a row, we must give a value to the internal column. The instrumentation -functions will now look as follows:

    -define(createAndGo, 4).
    --define(createAndWait, 5).
    +functions will now look as follows:

    -define(createAndGo, 4).
    +-define(createAndWait, 5).
     
    -emp_table(set, RowIndex, Cols) ->
    -  notify_internal_resources(RowIndex, Cols),
    +emp_table(set, RowIndex, Cols) ->
    +  notify_internal_resources(RowIndex, Cols),
       NewCols =
    -    case is_row_created(empTable, Cols) of
    -      true -> Cols ++ [{4, "internal"}]; % add internal column
    +    case is_row_created(empTable, Cols) of
    +      true -> Cols ++ [{4, "internal"}]; % add internal column
           false -> Cols                      % keep original cols
       end,
    -  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    +  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
     
    -is_row_created(Name, Cols) ->
    -  case snmp_generic:get_status_col(Name, Cols) of
    -    {ok, ?createAndGo} -> true;
    -    {ok, ?createAndWait} -> true;
    +is_row_created(Name, Cols) ->
    +  case snmp_generic:get_status_col(Name, Cols) of
    +    {ok, ?createAndGo} -> true;
    +    {ok, ?createAndWait} -> true;
         _ -> false
       end.

    If a row is created, we always set the internal column to "internal".

    Deviations from the Standard

    In some aspects the agent does not implement SNMP fully. Here are the differences:

    • The default functions and snmp_generic cannot handle an object of type /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -36,30 +36,30 @@ config_err/2 of the error report module at start-up.

      Agent Information

      The agent information should be stored in a file called agent.conf.

      Each entry is a tuple of size two:

      {AgentVariable, Value}.

      • AgentVariable is one of the variables in SNMP-FRAMEWORK-MIB or one of the internal variables intAgentUDPPort, which defines which UDP port the agent listens to, or intAgentTransports, which defines the transport domains and -addresses of the agent.
      • Value is the value for the variable.

      The following example shows an agent.conf file:

      {intAgentUDPPort, 4000}.
      -{intAgentTransports,
      - [{transportDomainUdpIpv4, {141,213,11,24}},
      -  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
      -{snmpEngineID, "mbj's engine"}.
      -{snmpEngineMaxMessageSize, 484}.

      And this is a code (snippet) example of how to generate this file in runtime:

      AgentDir    = "/tmp",
      +addresses of the agent.
    • Value is the value for the variable.

    The following example shows an agent.conf file:

    {intAgentUDPPort, 4000}.
    +{intAgentTransports,
    + [{transportDomainUdpIpv4, {141,213,11,24}},
    +  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
    +{snmpEngineID, "mbj's engine"}.
    +{snmpEngineMaxMessageSize, 484}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir    = "/tmp",
     AgentPort   = 4000,
    -Transports  = [{transportDomainUdpIpv4, {141,213,11,24}},
    -               {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}],
    +Transports  = [{transportDomainUdpIpv4, {141,213,11,24}},
    +               {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}],
     EngineID    = "mbj's engine",
     MMS         = 484,
     AgentConfig =
    -   [snmpa_conf:agent_entry(intAgentUDPPort,          AgentPort),
    -    snmpa_conf:agent_entry(intAgentTransports,       Transports),
    -    snmpa_conf:agent_entry(snmpEngineID,             EngineID),
    -    snmpa_conf:agent_entry(snmpEngineMaxMessageSize, MMS)],
    -snmpa_conf:write_agent_config(AgentDir, AgentConfig),

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    -      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    -      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    -      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling + [snmpa_conf:agent_entry(intAgentUDPPort, AgentPort), + snmpa_conf:agent_entry(intAgentTransports, Transports), + snmpa_conf:agent_entry(snmpEngineID, EngineID), + snmpa_conf:agent_entry(snmpEngineMaxMessageSize, MMS)], +snmpa_conf:write_agent_config(AgentDir, AgentConfig),

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    +      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    +      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    +      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling both requests and traps) for a transport domain, its not possible to also specify a transport (for that domain) with a specific Kind. This is for -example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    -  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be +example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    +  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be configured.

    PortInfo system is used to indicate that the 'system' should choose (the way port number '0' (zero) is normally used). Port info '0' (zero) cannot be used for this, since it is (internally) used to represent the 'default' port number.

    In the traditional transport entries, when the Addr value does not contain a @@ -74,32 +74,32 @@ default context "" need not be present.

    Each row defines a context in the agent. This information is used in the table vacmContextTable in the SNMP-VIEW-BASED-ACM-MIB.

    Each entry is a term:

    ContextName.

    • ContextName is a string.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir      = "/tmp",
     ContextConfig =
    -   [snmpa_conf:context_entry("foo"),
    -    snmpa_conf:context_entry("bar")],
    -snmpa_conf:write_context_config(AgentDir, ContextConfig),

    System Information

    The system information should be stored in a file called standard.conf.

    Each entry is a tuple of size two:

    {SystemVariable, Value}.

    • SystemVariable is one of the variables in the system group, or -snmpEnableAuthenTraps.
    • Value is the value for the variable.

    The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    -{sysObjectID, [1,2,3]}.
    -{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    -{sysName, "test"}.
    -{sysServices, 72}.
    -{snmpEnableAuthenTraps, enabled}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
    +   [snmpa_conf:context_entry("foo"),
    +    snmpa_conf:context_entry("bar")],
    +snmpa_conf:write_context_config(AgentDir, ContextConfig),

    System Information

    The system information should be stored in a file called standard.conf.

    Each entry is a tuple of size two:

    {SystemVariable, Value}.

    • SystemVariable is one of the variables in the system group, or +snmpEnableAuthenTraps.
    • Value is the value for the variable.

    The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    +{sysObjectID, [1,2,3]}.
    +{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    +{sysName, "test"}.
    +{sysServices, 72}.
    +{snmpEnableAuthenTraps, enabled}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
     StdConfig =
    -   [snmpa_conf:standard_entry(sysDescr,    "Erlang SNMP agent"),
    -    snmpa_conf:standard_entry(sysObjectID, [1,2,3]),
    -    snmpa_conf:standard_entry(sysContact,  "(mbj,eklas)@erlang.ericsson.se"),
    -    snmpa_conf:standard_entry(sysName,     "test"),
    -    snmpa_conf:standard_entry(sysServices, 72),
    -    snmpa_conf:standard_entry(snmpEnableAuthenTraps, enabled)],
    -snmpa_conf:write_standard_config(AgentDir, StdConfig),

    A value must be provided for all variables, which lack default values in the + [snmpa_conf:standard_entry(sysDescr, "Erlang SNMP agent"), + snmpa_conf:standard_entry(sysObjectID, [1,2,3]), + snmpa_conf:standard_entry(sysContact, "(mbj,eklas)@erlang.ericsson.se"), + snmpa_conf:standard_entry(sysName, "test"), + snmpa_conf:standard_entry(sysServices, 72), + snmpa_conf:standard_entry(snmpEnableAuthenTraps, enabled)], +snmpa_conf:write_standard_config(AgentDir, StdConfig),

    A value must be provided for all variables, which lack default values in the MIB.

    Communities

    The community information should be stored in a file called community.conf. It must be present if the agent is configured for SNMPv1 or SNMPv2c.

    An SNMP community is a relationship between an SNMP agent and a set of SNMP managers that defines authentication, access control and proxy characteristics.

    The corresponding table is snmpCommunityTable in the SNMP-COMMUNITY-MIB.

    Each entry is a term:

    {CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.

    • CommunityIndex is a non-empty string.
    • CommunityName is a string.
    • SecurityName is a string.
    • ContextName is a string.
    • TransportTag is a string.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir        = "/tmp",
     CommunityConfig =
    -   [snmpa_conf:community_entry("public"),
    -    snmpa_conf:community_entry("all-rights"),
    -    snmpa_conf:community_entry("standard trap",
    -                               "standard trap", "initial", "", "")],
    -snmpa_conf:write_community_config(AgentDir, CommunityConfig),

    MIB Views for VACM

    The information about MIB Views for VACM should be stored in a file called + [snmpa_conf:community_entry("public"), + snmpa_conf:community_entry("all-rights"), + snmpa_conf:community_entry("standard trap", + "standard trap", "initial", "", "")], +snmpa_conf:write_community_config(AgentDir, CommunityConfig),

    MIB Views for VACM

    The information about MIB Views for VACM should be stored in a file called vacm.conf.

    The corresponding tables are vacmSecurityToGroupTable, vacmAccessTable and vacmViewTreeFamilyTable in the SNMP-VIEW-BASED-ACM-MIB.

    Each entry is one of the terms, one entry corresponds to one row in one of the tables.

    {vacmSecurityToGroup, SecModel, SecName, GroupName}.

    {vacmAccess, GroupName, Prefix, SecModel, SecLevel, Match, ReadView, WriteView, NotifyView}.

    {vacmViewTreeFamily, ViewIndex, ViewSubtree, ViewStatus, ViewMask}.

    • SecModel is any, v1, v2c, or usm.
    • SecName is a string.
    • GroupName is a string.
    • Prefix is a string.
    • SecLevel is noAuthNoPriv, authNoPriv, or authPriv
    • Match is prefix or exact.
    • ReadView is a string.
    • WriteView is a string.
    • NotifyView is a string.
    • ViewIndex is an integer.
    • ViewSubtree is a list of integer.
    • ViewStatus is either included or excluded
    • ViewMask is either null or a list of ones and zeros. Ones nominate that an @@ -108,17 +108,17 @@ regarded as all ones. null is shorthand for a mask with all ones.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir   = "/tmp",
     SecName    = "plain",
     VacmConfig =
    -   [%%                        SecModel, SecName, GroupName
    -    snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
    +   [%%                        SecModel, SecName, GroupName
    +    snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
     
         %%                        GroupName, Prefix, SecModel,
    -    snmpa_conf:vacm_acc_entry(SecName, "", any,
    +    snmpa_conf:vacm_acc_entry(SecName, "", any,
         %%                        SecLevel, Match, RV, WV, NV
    -                              noAuthNoPriv, exact, "all", "all", "all"),
    +                              noAuthNoPriv, exact, "all", "all", "all"),
     
         %%                        ViewName, ViewSubtree, ViewType, ViewMask
    -    snmpa_conf:vacm_vtf_entry("restricted", [1,3,6,1], included, null)],
    -snmpa_conf:write_vacm_config(AgentDir, VacmConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called + snmpa_conf:vacm_vtf_entry("restricted", [1,3,6,1], included, null)], +snmpa_conf:write_vacm_config(AgentDir, VacmConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called usm.conf, which must be present if the agent is configured for SNMPv3.

    The corresponding table is usmUserTable in the SNMP-USER-BASED-SM-MIB (adjusted according to SNMP-USM-HMAC-SHA2-MIB).

    Each entry is a term:

    {EngineID, UserName, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey}.

    • EngineID is a string.

    • UserName is a string.

    • SecName is a string.

    • Clone is zeroDotZero or a list of integers.

    • AuthP is a usmNoAuthProtocol, usmHMACMD5AuthProtocol, usmHMACSHAAuthProtocol, usmHMAC128SHA224AuthProtocol, @@ -131,29 +131,29 @@ be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
     EngineID  = "plain engine"
     Passwd    = "FooBar Hoopla", %% This should *obviously* be choosen better
    -Secret16  = snmp:passwd2localized_key(md5, Passwd, EngineID),
    -Secret20  = snmp:passwd2localized_key(sha, Passwd, EngineID),
    +Secret16  = snmp:passwd2localized_key(md5, Passwd, EngineID),
    +Secret20  = snmp:passwd2localized_key(sha, Passwd, EngineID),
     UsmConfig =
    -   [snmpa_conf:usm_entry(EngineID, "initial", "initial", zeroDotZero,
    +   [snmpa_conf:usm_entry(EngineID, "initial", "initial", zeroDotZero,
                              usmHMACMD5AuthProtocol, "", "",
                              usmNoPrivProtocol, "", "",
    -                         "", Secret16, ""),
    +                         "", Secret16, ""),
     
    -    snmpa_conf:usm_entry(EngineID, "templateMD5", "templateMD5", zeroDotZero,
    +    snmpa_conf:usm_entry(EngineID, "templateMD5", "templateMD5", zeroDotZero,
                              usmHMACMD5AuthProtocol, "", "",
                              usmDESPrivProtocol, "", "",
    -                         "", Secret16, Secret16),
    +                         "", Secret16, Secret16),
     
    -    snmpa_conf:usm_entry(EngineID, "templateSHA", "templateSHA", zeroDotZero,
    +    snmpa_conf:usm_entry(EngineID, "templateSHA", "templateSHA", zeroDotZero,
                              usmHMACSHAAuthProtocol, "", "",
                              usmAesCfb128Protocol, "", "",
    -                         "", Secret20, Secret16)],
    -snmpa_conf:write_usm_config(AgentDir, UsmConfig),

    Notify Definitions

    The information about Notify Definitions should be stored in a file called + "", Secret20, Secret16)], +snmpa_conf:write_usm_config(AgentDir, UsmConfig),

    Notify Definitions

    The information about Notify Definitions should be stored in a file called notify.conf.

    The corresponding table is snmpNotifyTable in the SNMP-NOTIFICATION-MIB.

    Each entry is a term:

    {NotifyName, Tag, Type}.

    • NotifyName is a unique non-empty string.
    • Tag is a string.
    • Type is trap or inform.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir     = "/tmp",
     NotifyConfig =
    -   [snmpa_conf:notify_entry("standard trap",   "std_trap",   trap),
    -    snmpa_conf:notify_entry("standard inform", "std_inform", inform)],
    -snmpa_conf:write_notify_config(AgentDir, NotifyConfig),

    Target Address Definitions

    The information about Target Address Definitions should be stored in a file + [snmpa_conf:notify_entry("standard trap", "std_trap", trap), + snmpa_conf:notify_entry("standard inform", "std_inform", inform)], +snmpa_conf:write_notify_config(AgentDir, NotifyConfig),

    Target Address Definitions

    The information about Target Address Definitions should be stored in a file called target_addr.conf.

    The corresponding tables are snmpTargetAddrTable in the SNMP-TARGET-MIB and snmpTargetAddrExtTable in the SNMP-COMMUNITY-MIB.

    Each entry is a term:

    {TargetName, Domain, Addr, Timeout, RetryCount, TagList, ParamsName, EngineId}.
    or
    {TargetName, Domain, Addr, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize}.

    • TargetName is a unique non-empty string.

    • Domain is one of the atoms: transportDomainUdpIpv4 | transportDomainUdpIpv6.

    • Addr is either an IpAddr or an {IpAddr, IpPort} tuple. IpAddr is @@ -164,12 +164,12 @@ configurations still work.

      Note that if EngineId has the value discovery, the agent cannot send inform messages to that manager until it has performed the discovery process with that manager.

      And this is a code (snippet) example of how to generate this file in runtime:

      AgentDir         = "/tmp",
      -Addr1            = {{1,2,3,4},     162},
      -Addr2            = {{11,21,31,41}, 162},
      +Addr1            = {{1,2,3,4},     162},
      +Addr2            = {{11,21,31,41}, 162},
       Timeout          = 1500,
       RetryCount       = 3,
       TargetAddrConfig =
      -   [snmpa_conf:target_addr_entry("Target 1",
      +   [snmpa_conf:target_addr_entry("Target 1",
                                        transportDomainUdpIpv4, Addr1,
       				 Timeout, RetryCount,
       				 "std_trap, "target_1", "",
      @@ -178,13 +178,13 @@
                                        transportDomainUdpIpv4, Addr2,
       				 Timeout, RetryCount,
       				 "std_inform, "target_2", "",
      -				 [], 2048)],
      -snmpa_conf:write_target_addr_config(AgentDir, TargetAddrConfig),

      Target Parameters Definitions

      The information about Target Parameters Definitions should be stored in a file + [], 2048)], +snmpa_conf:write_target_addr_config(AgentDir, TargetAddrConfig),

    Target Parameters Definitions

    The information about Target Parameters Definitions should be stored in a file called target_params.conf.

    The corresponding table is snmpTargetParamsTable in the SNMP-TARGET-MIB.

    Each entry is a term:

    {ParamsName, MPModel, SecurityModel, SecurityName, SecurityLevel}.

    • ParamsName is a unique non-empty string.
    • MPModel is v1, v2c or v3
    • SecurityModel is v1, v2c, or usm.
    • SecurityName is a string.
    • SecurityLevel is noAuthNoPriv, authNoPriv or authPriv.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir         = "/tmp",
     TargetAddrConfig =
    -   [snmpa_conf:target_params_entry("target_1", v1),
    -    snmpa_conf:target_params_entry("target_2", v2, "initial", noAthNoPriv],
    -snmpa_conf:write_target_params_config(AgentDir, TargetParamsConfig),
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -164,7 +164,7 @@ MIBs are always available in all contexts.

    The ASN.1 code, the Erlang source code, and the generated .hrl files for them are provided in the distribution and are placed in the directories mibs, src, and include, respectively, in the snmp application.

    The .hrl files are generated with snmpc:mib_to_hrl/1. Include these files in -your code as in the following example:

    -include_lib("snmp/include/SNMPv2-MIB.hrl").

    The initial values for the managed objects defined in these tables, are read at +your code as in the following example:

    -include_lib("snmp/include/SNMPv2-MIB.hrl").

    The initial values for the managed objects defined in these tables, are read at start-up from a set of configuration files. These are described in Configuration Files.

    STANDARD-MIB and SNMPv2-MIB

    These MIBs contain the snmp- and system groups from MIB-II which is defined in RFC1213 (STANDARD-MIB) or RFC1907 (SNMPv2-MIB). They are implemented in the @@ -277,9 +277,9 @@ objects in this MIB are now obsolete.

    Notifications

    Notifications are defined in SMIv1 with the TRAP-TYPE macro in the definition of an MIB (see RFC1215). The corresponding macro in SMIv2 is NOTIFICATION-TYPE. When an application decides to send a notification, it calls one of the -following functions:

    snmpa:send_notification(Agent, Notification, Receiver
    -                       [, NotifyName, ContextName, Varbinds])
    -snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

    providing the registered name or process identifier of the agent where the MIB, +following functions:

    snmpa:send_notification(Agent, Notification, Receiver
    +                       [, NotifyName, ContextName, Varbinds])
    +snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

    providing the registered name or process identifier of the agent where the MIB, which defines the notification is loaded and the symbolic name of the notification.

    If the send_notification/3,4 function is used, all management targets are selected, as defined in RFC2273. The Receiver parameter defines where the /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -466,23 +466,23 @@ immediately removed." - SYNTAX INTEGER { + SYNTAX INTEGER { -- the following two values are states: -- these values may be read or written - active(1), - notInService(2), + active(1), + notInService(2), -- the following value is a state: -- this value may be read, but not written - notReady(3), + notReady(3), -- the following three values are -- actions: these values may be written, -- but are never read - createAndGo(4), - createAndWait(5), - destroy(6) - }

    + createAndGo(4), + createAndWait(5), + destroy(6) + }
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_app.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -20,51 +20,51 @@

    Description

    This chapter describes the snmp application in OTP. The SNMP application provides the following services:

    • a multilingual extensible SNMP agent
    • a SNMP manager
    • a MIB compiler

    Configuration

    The following configuration parameters are defined for the SNMP application. Refer to application(3) for more information about configuration parameters.

    The snmp part of the config file specifying the configuration parameters is -basically the following tuple:

          {snmp, snmp_components_config()}

    A minimal config file for starting a node with both a manager and an agent:

          [{snmp,
    -        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
    -                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
    -         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
    -                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
    -        ]
    +basically the following tuple:

          {snmp, snmp_components_config()}

    A minimal config file for starting a node with both a manager and an agent:

          [{snmp,
    +        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
    +                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
    +         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
    +                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
    +        ]
            }
           ].

    Each snmp component has its own set of configuration parameters, even though -some of the types are common to both components.

          snmp_components_config() -> [snmp_component_config()]
    -      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
    -      agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {discovery,        agent_discovery()}  |
    -                       {versions,         versions()}         |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +some of the types are common to both components.

            snmp_components_config() -> [snmp_component_config()]
      +      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
      +      agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {discovery,        agent_discovery()}  |
      +                       {versions,         versions()}         |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpa.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -3213,8 +3213,8 @@

        Load a single Mib into an agent. The MibName is the name of the Mib, -including the path to where the compiled mib is found. For example:

                  Dir = code:priv_dir(my_app) ++ "/mibs/",
        -          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
        +including the path to where the compiled mib is found. For example:

                  Dir = code:priv_dir(my_app) ++ "/mibs/",
        +          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
        @@ -3330,8 +3330,8 @@

        Load Mibs into an agent. If the agent cannot load all MIBs (the default value of the Force argument is false), it will indicate where loading was aborted. The MibName is the name of the Mib, including the path to where the compiled -mib is found. For example,

                  Dir = code:priv_dir(my_app) ++ "/mibs/",
        -          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

        If Force = true then the agent will continue attempting to load each mib even +mib is found. For example,

                  Dir = code:priv_dir(my_app) ++ "/mibs/",
        +          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

        If Force = true then the agent will continue attempting to load each mib even after failing to load a previous mib. Use with care.

        @@ -4357,8 +4357,8 @@ -

        Accepted type specifications are:

        -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
        --spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
        +

        Accepted type specifications are:

        -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
        +-spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
        @@ -4431,8 +4431,8 @@

        Registers a sub-agent under a sub-tree of another agent.

        It is easy to make mistakes when registering sub-agents and this activity should be done carefully. For example, a strange behaviour would result from the -following configuration:

        snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
        -snmp_agent:register_subagent(SA1,[1,2,3], SA2).

        SA2 will not get requests starting with object identifier [1,2,3] since +following configuration:

        snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
        +snmp_agent:register_subagent(SA1,[1,2,3], SA2).

        SA2 will not get requests starting with object identifier [1,2,3] since SA1 does not.

        @@ -4877,20 +4877,20 @@ Addresses and if there are no targets for which an Inform-Request is sent, Addresses is the empty list [].

        The receiver will first be sent the snmp_targets message, and then for each address in Addresses list, one of the two snmp_notification messages.

      • {Mod, Func, Args} - The info will be delivered via the function call:

        Mod:Func([Msg | Args])

        where Msg has the same content and purpose as the messages descrived above.

      Address is a management target address and Addresses is a list of management -target addresses. They are defined as followes:

              Addresses  = [address()]
      -        Address    = address()
      -        address()  = v1_address() | v3_address()
      -        v1_address() = {TDomain, TAddress}
      -        v3_address() = {{TDomain, TAddress}, V3MsgData}
      -        TDomain    = tdoamin()
      -        TAddress   = taddress()
      -        tdomain()  = The oid of snmpUDPDomain
      +target addresses. They are defined as followes:

              Addresses  = [address()]
      +        Address    = address()
      +        address()  = v1_address() | v3_address()
      +        v1_address() = {TDomain, TAddress}
      +        v3_address() = {{TDomain, TAddress}, V3MsgData}
      +        TDomain    = tdoamin()
      +        TAddress   = taddress()
      +        tdomain()  = The oid of snmpUDPDomain
                            This is the only supported transport domain.
      -        taddress() = [A1, A2, A3, A4, P1, P3]
      +        taddress() = [A1, A2, A3, A4, P1, P3]
                            The 4 first bytes makes up the IP-address and the last 2,
                            the UDP-port number.
      -        V3MsgData  = v3_msg_data()
      -        v3_msg_data() = term()

      If Receiver is a notification_delivery_info/0 record, then the information + V3MsgData = v3_msg_data() + v3_msg_data() = term()

      If Receiver is a notification_delivery_info/0 record, then the information about the notification delivery will be delivered to the receiver via the callback functions defined by the snmpa_notification_delivery_info_receiver behaviour according to the content of the notification_delivery_info/0 /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -17,7 +17,7 @@

      snmpc

      -

      SNMP MIB compiler frontend

      Synopsis

      snmpc [options] file.mib | file.bin

      Description

      The snmpc program provides a way to run the SNMP MIB compiler of the Erlang +

      SNMP MIB compiler frontend

      Synopsis

      snmpc [options] file.mib | file.bin

      Description

      The snmpc program provides a way to run the SNMP MIB compiler of the Erlang system.

      snmpc compiles an SNMP MIB file. See compile/1,2 for more information.

      It can also be used to generate a header file (.hrl) with definitions of Erlang constants for the objects in the MIB. See mib_to_hrl/1.

      Compiler options

      The following options are supported (note that most of these relate to the /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_config.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -31,41 +31,41 @@ more information).

    • the database directory stores the internal database files.

    The agent and manager uses (application) configuration parameters to find out where these directories are located. The parameters should be defined in an Erlang system configuration file. The following configuration parameters are -defined for the SNMP application:

          agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {versions,         versions()}         |
    -                       {discovery,        agent_discovery()}  |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +defined for the SNMP application:

            agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {versions,         versions()}         |
      +                       {discovery,        agent_discovery()}  |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. @@ -424,34 +424,34 @@ configuration parameters. The verbosity itself has several _levels: silence | info | log | debug | trace. For the lowest verbosity silence, nothing is printed. The higher the verbosity, the -more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
        +more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
         ok
        -5> snmpa:verbosity(net_if, log).
        +5> snmpa:verbosity(net_if, log).
         ok
         6>
         %% Example of output from the agent when a get-next-request arrives:
         ** SNMP NET-IF LOG:
        -   got packet from {147,12,12,12}:5000
        +   got packet from {147,12,12,12}:5000
         
         ** SNMP NET-IF MPD LOG:
            v1, community: all-rights
         
         ** SNMP NET-IF LOG:
        -   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
        +   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
                                                   62612569,noError,0,
        -                                          [{varbind,[1,1],'NULL','NULL',1}]}
        +                                          [{varbind,[1,1],'NULL','NULL',1}]}
         
         ** SNMP MASTER-AGENT LOG:
        -   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
        +   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
         
         ** SNMP MASTER-AGENT LOG:
        -   returned: {value,"Erlang SNMP agent"}
        +   returned: {value,"Erlang SNMP agent"}
         
         ** SNMP NET-IF LOG:
        -   reply pdu: {pdu,'get-response',62612569,noError,0,
        -                   [{varbind,[1,3,6,1,2,1,1,1,0],
        +   reply pdu: {pdu,'get-response',62612569,noError,0,
        +                   [{varbind,[1,3,6,1,2,1,1,1,0],
                                      'OCTET STRING',
        -                             "Erlang SNMP agent",1}]}
        +                             "Erlang SNMP agent",1}]}
         
         ** SNMP NET-IF INFO: time in agent: 19711 mysec

        Other useful function(s) for debugging the agent are:

        • snmpa:info/0,1 - info is used to retrieve a list of miscellaneous agent information.

        • snmpa:which_aliasnames/0 - /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -34,9 +34,9 @@ | MIB | +---------------+ | - Association file (associates a MIB object with + Association file (associates a MIB object with | snmp_generic:table_funct - | snmp_generic:variable_func) + | snmp_generic:variable_func) +--------------------------------------+ | snmp_generic | Support for get-next, | | RowStatus operations @@ -44,7 +44,7 @@ | snmpa_local_db | Mnesia | Database +--------------+-------+---------------+ | dets | ets | -| (persistent) | | +| (persistent) | | +--------------+-------+

        Each function takes the argument NameDb, which is a tuple {Name, Db}, to identify which database the functions should use. Name is the symbolic name of the managed object as defined in the MIB, and Db is either volatile, @@ -56,35 +56,35 @@ this. Specifically, if variables are stored in Mnesia, the table snmp_variables must be created by the programmer. The record definition for this table is defined in the file snmp/include/snmp_types.hrl.

        If an instrumentation function in the association file for a variable myVar -does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in -Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(new, NameDb).
        +does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in +Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(new, NameDb).
         
        -myTable_func(delete, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(delete, NameDb).
        +myTable_func(delete, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(delete, NameDb).
         
         %% change row
        -myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(is_set_ok, RowIndex,
        -                               Cols, NameDb) of
        -    {noError, 0} ->
        -      myApplication:is_set_ok(RowIndex, Cols);
        +myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(is_set_ok, RowIndex,
        +                               Cols, NameDb) of
        +    {noError, 0} ->
        +      myApplication:is_set_ok(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(set, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(set, RowIndex, Cols,
        -                               NameDb),
        -    {noError, 0} ->
        +myTable_func(set, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(set, RowIndex, Cols,
        +                               NameDb),
        +    {noError, 0} ->
               % Now the row is updated, tell the application
        -      myApplication:update(RowIndex, Cols);
        +      myApplication:update(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(Op, RowIndex, Cols, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        +
        myTable_func(Op, RowIndex, Cols, NameDb) -> % pass unchanged + snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -110,108 +110,108 @@ the default implementation of it. Recall that MIBs imported by "EX1-MIB.mib" must be present and compiled in the current directory ("./STANDARD-MIB.bin","./RFC1213-MIB.bin") when compiling.

        unix> erl -config ./sys
        -1> application:start(snmp).
        +1> application:start(snmp).
         ok
        -2> snmpc:compile("EX1-MIB").
        +2> snmpc:compile("EX1-MIB").
         No accessfunction for 'friendsTable', using default.
         No accessfunction for 'myName', using default.
        -{ok, "EX1-MIB.bin"}
        -3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
        +{ok, "EX1-MIB.bin"}
        +3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
         ok

        This MIB is now loaded into the agent, and a manager can ask questions. As an example of this, we start another Erlang system and the simple Erlang manager in -the toolkit:

        1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
        +the toolkit:

        1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
          %% making it understand symbolic names: {mibs,["EX1-MIB","STANDARD-MIB"]}]).
        -{ok, <0.89.0>}
        +{ok, <0.89.0>}
         %% a get-next request with one OID.
        -2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
        +2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
         ok
         * Got PDU:
        -[myName,0] = []
        +[myName,0] = []
         %% A set-request (now using symbolic names for convenience)
        -3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
        +3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
         ok
         * Got PDU:
        -[myName,0] = "Martin"
        +[myName,0] = "Martin"
         %% Try the same get-next request again
        -4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
        +4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
         ok
         * Got PDU:
        -[myName,0] = "Martin"
        +[myName,0] = "Martin"
         %% ... and we got the new value.
         %% you can event do row operations. How to add a row:
        -5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
        +5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
          %% createAndGo
         ok
         * Got PDU:
        -[fName,0] = "Martin"
        -[fAddress,0] = "home"
        -[fStatus,0] = 4
        -6> snmp_test_mgr:gn([[myName,0]]).
        +[fName,0] = "Martin"
        +[fAddress,0] = "home"
        +[fStatus,0] = 4
        +6> snmp_test_mgr:gn([[myName,0]]).
         ok
         * Got PDU:
        -[fName,0] = "Martin"
        -7> snmp_test_mgr:gn().
        +[fName,0] = "Martin"
        +7> snmp_test_mgr:gn().
         ok
         * Got PDU:
        -[fAddress,0] = "home"
        -8> snmp_test_mgr:gn().
        +[fAddress,0] = "home"
        +8> snmp_test_mgr:gn().
         ok
         * Got PDU:
        -[fStatus,0] = 1
        +[fStatus,0] = 1
         9>

        Manual Implementation

        The following example shows a "manual" implementation of the EX1-MIB in Erlang. In this example, the values of the objects are stored in an Erlang server. The server has a 2-tuple as loop data, where the first element is the value of variable myName, and the second is a sorted list of rows in the table friendsTable. Each row is a 4-tuple.

        Note

        There are more efficient ways to create tables manually, i.e. to use the -module snmp_index.

        Code

        -module(ex1).
        --author('dummy@flop.org').
        +module snmp_index.

        Code

        -module(ex1).
        +-author('dummy@flop.org').
         %% External exports
        --export([start/0, my_name/1, my_name/2, friends_table/3]).
        +-export([start/0, my_name/1, my_name/2, friends_table/3]).
         %% Internal exports
        --export([init/0]).
        --define(status_col, 4).
        --define(active, 1).
        --define(notInService, 2).
        --define(notReady, 3).
        --define(createAndGo, 4).   % Action; written, not read
        --define(createAndWait, 5). % Action; written, not read
        --define(destroy, 6).       % Action; written, not read
        -start() ->
        -    spawn(ex1, init, []).
        +-export([init/0]).
        +-define(status_col, 4).
        +-define(active, 1).
        +-define(notInService, 2).
        +-define(notReady, 3).
        +-define(createAndGo, 4).   % Action; written, not read
        +-define(createAndWait, 5). % Action; written, not read
        +-define(destroy, 6).       % Action; written, not read
        +start() ->
        +    spawn(ex1, init, []).
         %%----------------------------------------------------------------
         %% Instrumentation function for variable myName.
         %% Returns: (get) {value, Name}
         %%          (set) noError
         %%----------------------------------------------------------------
        -my_name(get) ->
        -    ex1_server ! {self(), get_my_name},
        -    Name = wait_answer(),
        -    {value, Name}.
        -my_name(set, NewName) ->
        -    ex1_server ! {self(), {set_my_name, NewName}},
        +my_name(get) ->
        +    ex1_server ! {self(), get_my_name},
        +    Name = wait_answer(),
        +    {value, Name}.
        +my_name(set, NewName) ->
        +    ex1_server ! {self(), {set_my_name, NewName}},
             noError.
         %%----------------------------------------------------------------
         %% Instrumentation function for table friendsTable.
         %%----------------------------------------------------------------
        -friends_table(get, RowIndex, Cols) ->
        -    case get_row(RowIndex) of
        -   {ok, Row} ->
        -        get_cols(Cols, Row);
        +friends_table(get, RowIndex, Cols) ->
        +    case get_row(RowIndex) of
        +   {ok, Row} ->
        +        get_cols(Cols, Row);
            _  ->
        -        {noValue, noSuchInstance}
        +        {noValue, noSuchInstance}
             end;
        -friends_table(get_next, RowIndex, Cols) ->
        -    case get_next_row(RowIndex) of
        -   {ok, Row} ->
        -        get_next_cols(Cols, Row);
        +friends_table(get_next, RowIndex, Cols) ->
        +    case get_next_row(RowIndex) of
        +   {ok, Row} ->
        +        get_next_cols(Cols, Row);
            _  ->
        -       case get_next_row([]) of
        -     {ok, Row} ->
        +       case get_next_row([]) of
        +     {ok, Row} ->
                  % Get next cols from first row.
        -         NewCols = add_one_to_cols(Cols),
        -         get_next_cols(NewCols, Row);
        +         NewCols = add_one_to_cols(Cols),
        +         get_next_cols(NewCols, Row);
              _  ->
        -        end_of_table(Cols)
        +        end_of_table(Cols)
                 end
             end;
         %%----------------------------------------------------------------
        @@ -222,168 +222,168 @@
         %%    *) Otherwise, error (for simplicity).
         %% Otherwise, row is modified; check that row exists.
         %%----------------------------------------------------------------
        -friends_table(is_set_ok, RowIndex, Cols) ->
        +friends_table(is_set_ok, RowIndex, Cols) ->
             RowExists =
        -   case get_row(RowIndex) of
        -        {ok, _Row} -> true;
        +   case get_row(RowIndex) of
        +        {ok, _Row} -> true;
                _ -> false
            end,
        -    case is_row_status_col_changed(Cols) of
        -   {true, ?destroy} when RowExists == true ->
        -        {noError, 0};
        -   {true, ?createAndGo} when RowExists == false,
        -                                 length(Cols) == 3 ->
        -        {noError, 0};
        -   {true, _} ->
        -       {inconsistentValue, ?status_col};
        +    case is_row_status_col_changed(Cols) of
        +   {true, ?destroy} when RowExists == true ->
        +        {noError, 0};
        +   {true, ?createAndGo} when RowExists == false,
        +                                 length(Cols) == 3 ->
        +        {noError, 0};
        +   {true, _} ->
        +       {inconsistentValue, ?status_col};
            false when RowExists == true ->
        -        {noError, 0};
        +        {noError, 0};
            _ ->
        -        [{Col, _NewVal} | _Cols] = Cols,
        /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_index.xhtml differs (HTML document, ASCII text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2026-04-20 15:18:30.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2042-05-23 04:37:03.000000000 +0000
        @@ -29,13 +29,13 @@
         actual implementation of the table. The SNMP ordering, that is implementation of
         GET NEXT, is implemented in this module.

        For example, suppose there is an SNMP table, which is best implemented in Erlang as one process per SNMP table row. Suppose further that the INDEX in the SNMP -table is an OCTET STRING. The index structure would be created as follows:

        snmp_index:new(string)

        For each new process we create, we insert an item in an snmp_index structure:

        new_process(Name, SnmpIndex) ->
        -  Pid = start_process(),
        +table is an OCTET STRING. The index structure would be created as follows:

        snmp_index:new(string)

        For each new process we create, we insert an item in an snmp_index structure:

        new_process(Name, SnmpIndex) ->
        +  Pid = start_process(),
           NewSnmpIndex =
        -    snmp_index:insert(SnmpIndex, Name, Pid),
        +    snmp_index:insert(SnmpIndex, Name, Pid),
           <...>

        With this structure, we can now map an OBJECT IDENTIFIER in e.g. a GET NEXT -request, to the correct process:

        get_next_pid(Oid, SnmpIndex) ->
        -  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
        +request, to the correct process:

        get_next_pid(Oid, SnmpIndex) ->
        +  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
           Pid.

        Warnings

        Warning

        All API functions that update the index return a NewIndex term. This is for backward compatibility with a previous implementation that used a B+ tree written purely in Erlang for the index. The NewIndex return value /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -33,8 +33,8 @@ operation is translated into a series of calls to get-next.

        Instrumentation Functions

        The following sections describe how the instrumentation functions should be defined in Erlang for the different operations. In the following, RowIndex is a list of key values for the table, and Column is a column number.

        These functions are described in detail in -Definition of Instrumentation Functions.

        New / Delete Operations

        For scalar variables:

        variable_access(new [, ExtraArg1, ...])
        -variable_access(delete [, ExtraArg1, ...])

        For tables:

        table_access(new [, ExtraArg1, ...])
        +Definition of Instrumentation Functions.

        New / Delete Operations

        For scalar variables:

        variable_access(new [, ExtraArg1, ...])
        +variable_access(delete [, ExtraArg1, ...])

        For tables:

        table_access(new [, ExtraArg1, ...])
         table_access(delete [, ExtraArg1, ...])

        These functions are called for each object in an MIB when the MIB is unloaded or loaded, respectively.

        Get Operation

        For scalar variables:

        variable_access(get [, ExtraArg1, ...])

        For tables:

        table_access(get,RowIndex,Cols [,ExtraArg1, ...])

        Cols is a list of Column. The agent will sort incoming variables so that all operations on one row (same index) will be supplied at the same time. The reason @@ -64,9 +64,9 @@ value 1, and [3, 5] is the list of requested columns. The function should now return the lexicographically next elements:

        [{[3, 1, 2], d}, {[5, 1, 2], f}]

        This is illustrated in the following table:

        GetNext from [3,1,1] and [5,1,1].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry.3.2.1,
                  myTable.myTableEntry.5.2.1 }

        This is transformed into one call to my_table:

        my_table(get_next, [2, 1], [3, 5])

        The function should now return:

        [{[4, 1, 1], b}, endOfTable]

        This is illustrated in the following table:

        GetNext from [3,2,1] and [5,2,1].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry.3.1.2,
        -         myTable.myTableEntry.4.1.2 }

        This will be transform into one call to my_table:

        my_table(get_next, [1, 2], [3, 4])

        The function should now return:

        [{[3, 2, 1], g}, {[5, 1, 1], c}]

        This is illustrated in the following table:

        GetNext from [3,1,2] and [4,1,2].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry,
        -         myTable.myTableEntry.1.3.2 }

        This will be transform into two calls to my_table:

        my_table(get_next, [], [0]) and
        -my_table(get_next, [3, 2], [1])

        The function should now return:

        [{[3, 1, 1], a}] and
        +         myTable.myTableEntry.4.1.2 }

        This will be transform into one call to my_table:

        my_table(get_next, [1, 2], [3, 4])

        The function should now return:

        [{[3, 2, 1], g}, {[5, 1, 1], c}]

        This is illustrated in the following table:

        GetNext from [3,1,2] and [4,1,2].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry,
        +         myTable.myTableEntry.1.3.2 }

        This will be transform into two calls to my_table:

        my_table(get_next, [], [0]) and
        +my_table(get_next, [3, 2], [1])

        The function should now return:

        [{[3, 1, 1], a}] and
         [{[3, 1, 1], a}]

        In both cases, the first accessible element in the table should be returned. As the key columns are not accessible, this means that the third column is the first row.

        Note

        Normally, the functions described above behave exactly as shown, but they are @@ -77,17 +77,17 @@ variables for a device, ipAdr and name with object identifiers 1.1.23.4 and 1.1.7 respectively. To access these variables, one could implement the two Erlang functions ip_access and name_access, which will be in the MIB. The -functions could be specified in a text file as follows:

        {ipAdr, {my_module, ip_access, []}}.
        +functions could be specified in a text file as follows:

        {ipAdr, {my_module, ip_access, []}}.
         % Or using the oid syntax for 'name'
        -{[1,1,7], {my_module, name_access, []}}.

        The ExtraArgument parameter is the empty list. For example, when the agent +{[1,1,7], {my_module, name_access, []}}.

        The ExtraArgument parameter is the empty list. For example, when the agent receives a get-request for the ipAdr variable, a call will be made to ip_access(get). The value returned by this function is the answer to the get-request.

        If ip_access and name_access are implemented similarly, we could write a -generic_access function using the ListOfExtraArguments:

        {ipAdr, {my_module, generic_access, ['IPADR']}}.
        +generic_access function using the ListOfExtraArguments:

        {ipAdr, {my_module, generic_access, ['IPADR']}}.
         % The mnemonic 'name' is more convenient than 1.1.7
        -{name, {my_module, generic_access, ['NAME']}}.

        When the agent receives the same get-request as above, a call will be made to -generic_access(get,'IPADR').

        Yet another possibility, closer to the hardware, could be:

        {ipAdr, {my_module, generic_access, [16#2543]}}.
        -{name, {my_module, generic_access, [16#A2B3]}}.

        Default Instrumentation

        When the MIB definition work is finished, there are two major issues left.

        • Implementing the MIB
        • Implementing a Manager Application.

        Implementing an MIB can be a tedious task. Most probably, there is a need to +{name, {my_module, generic_access, ['NAME']}}.

        When the agent receives the same get-request as above, a call will be made to +generic_access(get,'IPADR').

        Yet another possibility, closer to the hardware, could be:

        {ipAdr, {my_module, generic_access, [16#2543]}}.
        +{name, {my_module, generic_access, [16#A2B3]}}.

        Default Instrumentation

        When the MIB definition work is finished, there are two major issues left.

        • Implementing the MIB
        • Implementing a Manager Application.

        Implementing an MIB can be a tedious task. Most probably, there is a need to test the agent before all tables and variables are implemented. In this case, the default instrumentation functions are useful. The toolkit can generate default instrumentation functions for variables as well as for tables. /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -35,32 +35,32 @@ every transport.

      • engine_id - The SnmpEngineID as defined in SNMP-FRAMEWORK-MIB. Mandatory.

      • max_message_size - The snmpEngineMaxMessageSize as defined in SNMP-FRAMEWORK-MIB. Mandatory.

    • Value is the value for the variable.

    The legacy and intermediate variables address and domain are still supported -so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    -                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    -{engine_id,        "mgrEngine"}.
    -{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific +so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    +                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    +{engine_id,        "mgrEngine"}.
    +{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific structure. See RFC 2271/2571 for details.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir    = "/tmp",
     Port          = 5000,
    -Addr4         = {141,213,11,24},
    -Addr6         = {0,0,0,0,0,0,0,1},
    -Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    -                 {transportDomainUdpIpv6, {Addr6, Port}}],
    +Addr4         = {141,213,11,24},
    +Addr6         = {0,0,0,0,0,0,0,1},
    +Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    +                 {transportDomainUdpIpv6, {Addr6, Port}}],
     EngineID      = "mgrEngine",
     MMS           = 484,
    -ManagerConfig = [snmpm_conf:manager_entry(transports,       Transports),
    -                 snmpm_conf:manager_entry(engine_id,        EngineID),
    -                 snmpm_conf:manager_entry(max_message_size, MMS)],
    -snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    Users

    For each manager user, the manager needs some information. This information is +ManagerConfig = [snmpm_conf:manager_entry(transports, Transports), + snmpm_conf:manager_entry(engine_id, EngineID), + snmpm_conf:manager_entry(max_message_size, MMS)], +snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    Users

    For each manager user, the manager needs some information. This information is either added in the users.conf config file or by calling the register_user function in run-time.

    Each row defines a manager user of the manager.

    Each entry is a tuple of size four:

    {UserId, UserMod, UserData, DefaultAgentConfig}.

    • UserId is any term (used to uniquely identify the user).
    • UserMod is the user callback module (atom).
    • UserData is any term (passed on to the user when calling the UserMod.
    • DefaultAgentConfig is a list of default agent config's. These values are used as default values when this user registers agents.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir         = "/tmp",
    -UserID             = make_ref(),
    +UserID             = make_ref(),
     UserMod            = my_manager_callback_mod,
    -UserData           = self(),
    -DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}],
    -UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData,
    -                                      DefaultAgentConfig)],
    -snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    Agents

    The information needed to handle agents should be stored in a file called +UserData = self(), +DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}], +UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData, + DefaultAgentConfig)], +snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    Agents

    The information needed to handle agents should be stored in a file called agents.conf. It is also possible to add agents in run-time by calling the register_agent.

    Each entry is a tuple:

    {UserId, TargetName, Comm, Domain, Addr, EngineID, Timeout, MaxMessageSize, Version, SecModel, SecName, SecLevel}.

    • UserId is the identity of the manager user responsible for this agent (term).
    • TargetName is a unique non-empty string.
    • Comm is the community string (string).
    • Domain is the transport domain, either transportDomainUdpIpv4 or @@ -72,23 +72,23 @@ (integer).
    • Version is the version (v1 | v2 | v3).

    • SecModel is the security model (any | v1 | v2c | usm).

    • SecName is the security name (string).
    • SecLevel is security level (noAuthNoPriv | authNoPriv | authPriv).

    Legacy configurations using tuples without Domain element, as well as with all TDomain, Ip and Port elements still work.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir   = "/tmp",
     UserID       = ...
    -AgentsConfig = [snmpm_conf:agents_entry(UserID,
    +AgentsConfig = [snmpm_conf:agents_entry(UserID,
                                             "target 1",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{1,2,3,4},161},
    +					transportDomainUdpIpv4, {{1,2,3,4},161},
     					"agent Engine 1"
     					1500,
     					484.
    -					v1, v1, "sec name 1", noAuthNoPriv),
    -		snmpm_conf:agents_entry(UserID,
    +					v1, v1, "sec name 1", noAuthNoPriv),
    +		snmpm_conf:agents_entry(UserID,
                                             "target 2",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{5,6,7,8},161},
    +					transportDomainUdpIpv4, {{5,6,7,8},161},
     					"agent Engine 2"
     					1500,
     					1000.
    -					v1, v1, "sec name 2", noAuthNoPriv)],
    -snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called + v1, v1, "sec name 2", noAuthNoPriv)], +snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called usm.conf, which must be present if the manager wishes to use SNMPv3 when communicating with agents. It is also possible to add usm data in run-time by calling the register_usm_user.

    The corresponding table is usmUserTable in the SNMP-USER-BASED-SM-MIB @@ -101,13 +101,13 @@ usmAesCfb128Protocol.

  • PrivKey is a list (of integer). This is the User's secret localized encryption key. It is not visible in the MIB. The length of this key needs to be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

  • ManagerDir = "/tmp",
    -UsmConfig  = [snmpm_conf:usm_entry("engine",
    +UsmConfig  = [snmpm_conf:usm_entry("engine",
                                        "user 1",
     	                           usmNoAuthProtocol,
    -	 			   [],
    +	 			   [],
     	 			   usmNoPrivProtocol,
    -	 			   [])],
    -snmpm_conf:write_usm_config(ManagerDir, UsmConfig),
    + [])], +snmpm_conf:write_usm_config(ManagerDir, UsmConfig),
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -27,16 +27,16 @@ association file, it gives a warning message and uses default instrumentation functions. (See Default Instrumentation for more details).

    The MIB compiler is started with a call to snmpc:compile(<mibname>). For -example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the +example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the MODULE-IDENTITY statement to determinate if the MIB is written in SMI version 1 or 2.

    Importing MIBs

    The compiler handles the IMPORT statement. It is important to import the compiled file and not the ASN.1 (source) file. A MIB must be recompiled to make changes visible to other MIBs importing it.

    The compiled files of the imported MIBs must be present in the current directory, or a directory in the current path. The path is supplied with the -{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    -       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" -like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    -       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP +{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    +       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" +like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    +       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP system and uses the expanded paths as include paths.

    Note that an SMIv2 MIB can import an SMIv1 MIB and vice versa.

    The following MIBs are built-ins of the Erlang SNMP compiler: SNMPv2-SMI, RFC-1215, RFC-1212, SNMPv2-TC, SNMPv2-CONF, and RFC1155-SMI. They cannot therefore be compiled separately.

    MIB Consistency Checking

    When an MIB is compiled, the compiler detects if several managed objects use the /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpm.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -1886,8 +1886,8 @@

    Load a Mib into the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:load_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:load_mib(Dir ++ "MY-MIB").
    @@ -3467,8 +3467,8 @@

    Unload a Mib from the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:unload_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:unload_mib(Dir ++ "MY-MIB").
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -28,8 +28,8 @@ Erlang record representations and vice versa. The record definitions can be found in the file snmp/include/snmp_types.hrl. If snmpv3 is used, the module that includes snmp_types.hrl must define the constant SNMP_USE_V3 before the -header file is included. Example:

    -define(SNMP_USE_V3, true).
    --include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if +header file is included. Example:

    -define(SNMP_USE_V3, true).
    +-include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if process.

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp.xhtml 2026-04-20 15:18:30.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.epub/OEBPS/snmp.xhtml 2042-05-23 04:37:03.000000000 +0000 @@ -3214,8 +3214,8 @@

    Utility function(s) to produce a formatted printout of the versions info -generated by the versions1 function

    This is the same as doing, e.g.:

               {ok, V} = snmp:versions1(),
    -           snmp:print_versions(V).
    +generated by the versions1 function

    This is the same as doing, e.g.:

               {ok, V} = snmp:versions1(),
    +           snmp:print_versions(V).
    @@ -3413,17 +3413,17 @@

    This function is used to set up trace on function(s) for the given module or modules.

    The example below sets up trace on the exported functions (default) of module snmp_generic and all functions of module snmp_generic_mnesia. With return -values (which is default) and timestamps in both cases (which is also default):

    	  snmp:enable_trace(),
    -	  snmp:set_trace([snmp_generic,
    -                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
    +values (which is default) and timestamps in both cases (which is also default):

    	  snmp:enable_trace(),
    +	  snmp:set_trace([snmp_generic,
    +                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
     	  .
     	  .
     	  .
    -          snmp:set_trace(snmp_generic, disable),
    +          snmp:set_trace(snmp_generic, disable),
     	  .
     	  .
     	  .
    -	  snmp:disable_trace(),
    +
    snmp:disable_trace(),
    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.html 2026-04-20 17:48:50.025744137 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp.html 2026-04-20 17:48:50.025744137 +0000 @@ -3301,8 +3301,8 @@

    Utility function(s) to produce a formatted printout of the versions info -generated by the versions1 function

    This is the same as doing, e.g.:

               {ok, V} = snmp:versions1(),
    -           snmp:print_versions(V).
    +generated by the versions1 function

    This is the same as doing, e.g.:

               {ok, V} = snmp:versions1(),
    +           snmp:print_versions(V).
    @@ -3500,17 +3500,17 @@

    This function is used to set up trace on function(s) for the given module or modules.

    The example below sets up trace on the exported functions (default) of module snmp_generic and all functions of module snmp_generic_mnesia. With return -values (which is default) and timestamps in both cases (which is also default):

    	  snmp:enable_trace(),
    -	  snmp:set_trace([snmp_generic,
    -                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
    +values (which is default) and timestamps in both cases (which is also default):

    	  snmp:enable_trace(),
    +	  snmp:set_trace([snmp_generic,
    +                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
     	  .
     	  .
     	  .
    -          snmp:set_trace(snmp_generic, disable),
    +          snmp:set_trace(snmp_generic, disable),
     	  .
     	  .
     	  .
    -	  snmp:disable_trace(),
    +
    snmp:disable_trace(),
    @@ -3904,7 +3904,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_advanced_agent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_advanced_agent.html 2026-04-20 17:48:50.061744361 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_advanced_agent.html 2026-04-20 17:48:50.061744361 +0000 @@ -221,48 +221,48 @@ empName DisplayString, empTelNo DisplayString, empStatus RowStatus - }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two -elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify + }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two +elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify rows. Also, you can use the ordinary Mnesia API to access the table from your programs. The only explicit action is to create the Mnesia table, an action the user has to perform in order to create the required table schemas.

    Adding Own Actions

    It is often necessary to take some specific action when a table is modified. This is accomplished with an instrumentation function. It executes some specific code when the table is set, and passes all other requests down to the -pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    -    notify_internal_resources(RowIndex, Cols),
    -    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. +pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    +    notify_internal_resources(RowIndex, Cols),
    +    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. Refer to the Reference Manual, section SNMP, module snmp_generic for details.

    Extending the Mnesia Table

    A table may contain columns that are used internally, but should not be visible to a manager. These internal columns must be the last columns in the table. The set operation will not work with this arrangement, because there are columns that the agent does not know about. This situation is handled by adding values for the internal columns in the set function.

    To illustrate this, suppose we extend our Mnesia empTable with one internal column. We create it as before, but with an arity of 4, by adding another -attribute.

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which +attribute.

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which creates a row, we must give a value to the internal column. The instrumentation -functions will now look as follows:

    -define(createAndGo, 4).
    --define(createAndWait, 5).
    +functions will now look as follows:

    -define(createAndGo, 4).
    +-define(createAndWait, 5).
     
    -emp_table(set, RowIndex, Cols) ->
    -  notify_internal_resources(RowIndex, Cols),
    +emp_table(set, RowIndex, Cols) ->
    +  notify_internal_resources(RowIndex, Cols),
       NewCols =
    -    case is_row_created(empTable, Cols) of
    -      true -> Cols ++ [{4, "internal"}]; % add internal column
    +    case is_row_created(empTable, Cols) of
    +      true -> Cols ++ [{4, "internal"}]; % add internal column
           false -> Cols                      % keep original cols
       end,
    -  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    -
    -is_row_created(Name, Cols) ->
    -  case snmp_generic:get_status_col(Name, Cols) of
    -    {ok, ?createAndGo} -> true;
    -    {ok, ?createAndWait} -> true;
    +  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    +
    +is_row_created(Name, Cols) ->
    +  case snmp_generic:get_status_col(Name, Cols) of
    +    {ok, ?createAndGo} -> true;
    +    {ok, ?createAndWait} -> true;
         _ -> false
       end.

    If a row is created, we always set the internal column to "internal".

    Deviations from the Standard

    In some aspects the agent does not implement SNMP fully. Here are the differences:

    • The default functions and snmp_generic cannot handle an object of type @@ -326,7 +326,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_config_files.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_config_files.html 2026-04-20 17:48:50.101744609 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_config_files.html 2026-04-20 17:48:50.105744633 +0000 @@ -108,30 +108,30 @@ config_err/2 of the error report module at start-up.

      Agent Information

      The agent information should be stored in a file called agent.conf.

      Each entry is a tuple of size two:

      {AgentVariable, Value}.

      • AgentVariable is one of the variables in SNMP-FRAMEWORK-MIB or one of the internal variables intAgentUDPPort, which defines which UDP port the agent listens to, or intAgentTransports, which defines the transport domains and -addresses of the agent.
      • Value is the value for the variable.

      The following example shows an agent.conf file:

      {intAgentUDPPort, 4000}.
      -{intAgentTransports,
      - [{transportDomainUdpIpv4, {141,213,11,24}},
      -  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
      -{snmpEngineID, "mbj's engine"}.
      -{snmpEngineMaxMessageSize, 484}.

      And this is a code (snippet) example of how to generate this file in runtime:

      AgentDir    = "/tmp",
      +addresses of the agent.
    • Value is the value for the variable.

    The following example shows an agent.conf file:

    {intAgentUDPPort, 4000}.
    +{intAgentTransports,
    + [{transportDomainUdpIpv4, {141,213,11,24}},
    +  {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}]}.
    +{snmpEngineID, "mbj's engine"}.
    +{snmpEngineMaxMessageSize, 484}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir    = "/tmp",
     AgentPort   = 4000,
    -Transports  = [{transportDomainUdpIpv4, {141,213,11,24}},
    -               {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}],
    +Transports  = [{transportDomainUdpIpv4, {141,213,11,24}},
    +               {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}}],
     EngineID    = "mbj's engine",
     MMS         = 484,
     AgentConfig =
    -   [snmpa_conf:agent_entry(intAgentUDPPort,          AgentPort),
    -    snmpa_conf:agent_entry(intAgentTransports,       Transports),
    -    snmpa_conf:agent_entry(snmpEngineID,             EngineID),
    -    snmpa_conf:agent_entry(snmpEngineMaxMessageSize, MMS)],
    -snmpa_conf:write_agent_config(AgentDir, AgentConfig),

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    -      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    -      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    -      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling + [snmpa_conf:agent_entry(intAgentUDPPort, AgentPort), + snmpa_conf:agent_entry(intAgentTransports, Transports), + snmpa_conf:agent_entry(snmpEngineID, EngineID), + snmpa_conf:agent_entry(snmpEngineMaxMessageSize, MMS)], +snmpa_conf:write_agent_config(AgentDir, AgentConfig),

    These are the supported entries and their value types:

          {snmpEngine,               string()}.                     % Mandatory
    +      {snmpEngineMaxMessageSize, snmp_framework_mib:max_message_size()}.  % Mandatory
    +      {intAgentUDPPort,          inet:port_number()}.                      % Optional
    +      {intAgentTransports,       [snmpa_conf:intAgentTransport()]}.   % Mandatory

    If a "traditional" transport is specified (without explicit Kind, handling both requests and traps) for a transport domain, its not possible to also specify a transport (for that domain) with a specific Kind. This is for -example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    -  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be +example, not allowed:

     [{transportDomainUdpIpv4, {{141,213,11,24}, 4000}},
    +  {transportDomainUdpIpv4, {{141,213,11,24}, 4001}, trap_sender}].

    Note that only one transport per kind for each transport domain can be configured.

    PortInfo system is used to indicate that the 'system' should choose (the way port number '0' (zero) is normally used). Port info '0' (zero) cannot be used for this, since it is (internally) used to represent the 'default' port number.

    In the traditional transport entries, when the Addr value does not contain a @@ -146,32 +146,32 @@ default context "" need not be present.

    Each row defines a context in the agent. This information is used in the table vacmContextTable in the SNMP-VIEW-BASED-ACM-MIB.

    Each entry is a term:

    ContextName.

    • ContextName is a string.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir      = "/tmp",
     ContextConfig =
    -   [snmpa_conf:context_entry("foo"),
    -    snmpa_conf:context_entry("bar")],
    -snmpa_conf:write_context_config(AgentDir, ContextConfig),

    System Information

    The system information should be stored in a file called standard.conf.

    Each entry is a tuple of size two:

    {SystemVariable, Value}.

    • SystemVariable is one of the variables in the system group, or -snmpEnableAuthenTraps.
    • Value is the value for the variable.

    The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    -{sysObjectID, [1,2,3]}.
    -{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    -{sysName, "test"}.
    -{sysServices, 72}.
    -{snmpEnableAuthenTraps, enabled}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
    +   [snmpa_conf:context_entry("foo"),
    +    snmpa_conf:context_entry("bar")],
    +snmpa_conf:write_context_config(AgentDir, ContextConfig),

    System Information

    The system information should be stored in a file called standard.conf.

    Each entry is a tuple of size two:

    {SystemVariable, Value}.

    • SystemVariable is one of the variables in the system group, or +snmpEnableAuthenTraps.
    • Value is the value for the variable.

    The following example shows a valid standard.conf file:

    {sysDescr, "Erlang SNMP agent"}.
    +{sysObjectID, [1,2,3]}.
    +{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
    +{sysName, "test"}.
    +{sysServices, 72}.
    +{snmpEnableAuthenTraps, enabled}.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
     StdConfig =
    -   [snmpa_conf:standard_entry(sysDescr,    "Erlang SNMP agent"),
    -    snmpa_conf:standard_entry(sysObjectID, [1,2,3]),
    -    snmpa_conf:standard_entry(sysContact,  "(mbj,eklas)@erlang.ericsson.se"),
    -    snmpa_conf:standard_entry(sysName,     "test"),
    -    snmpa_conf:standard_entry(sysServices, 72),
    -    snmpa_conf:standard_entry(snmpEnableAuthenTraps, enabled)],
    -snmpa_conf:write_standard_config(AgentDir, StdConfig),

    A value must be provided for all variables, which lack default values in the + [snmpa_conf:standard_entry(sysDescr, "Erlang SNMP agent"), + snmpa_conf:standard_entry(sysObjectID, [1,2,3]), + snmpa_conf:standard_entry(sysContact, "(mbj,eklas)@erlang.ericsson.se"), + snmpa_conf:standard_entry(sysName, "test"), + snmpa_conf:standard_entry(sysServices, 72), + snmpa_conf:standard_entry(snmpEnableAuthenTraps, enabled)], +snmpa_conf:write_standard_config(AgentDir, StdConfig),

    A value must be provided for all variables, which lack default values in the MIB.

    Communities

    The community information should be stored in a file called community.conf. It must be present if the agent is configured for SNMPv1 or SNMPv2c.

    An SNMP community is a relationship between an SNMP agent and a set of SNMP managers that defines authentication, access control and proxy characteristics.

    The corresponding table is snmpCommunityTable in the SNMP-COMMUNITY-MIB.

    Each entry is a term:

    {CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.

    • CommunityIndex is a non-empty string.
    • CommunityName is a string.
    • SecurityName is a string.
    • ContextName is a string.
    • TransportTag is a string.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir        = "/tmp",
     CommunityConfig =
    -   [snmpa_conf:community_entry("public"),
    -    snmpa_conf:community_entry("all-rights"),
    -    snmpa_conf:community_entry("standard trap",
    -                               "standard trap", "initial", "", "")],
    -snmpa_conf:write_community_config(AgentDir, CommunityConfig),

    MIB Views for VACM

    The information about MIB Views for VACM should be stored in a file called + [snmpa_conf:community_entry("public"), + snmpa_conf:community_entry("all-rights"), + snmpa_conf:community_entry("standard trap", + "standard trap", "initial", "", "")], +snmpa_conf:write_community_config(AgentDir, CommunityConfig),

    MIB Views for VACM

    The information about MIB Views for VACM should be stored in a file called vacm.conf.

    The corresponding tables are vacmSecurityToGroupTable, vacmAccessTable and vacmViewTreeFamilyTable in the SNMP-VIEW-BASED-ACM-MIB.

    Each entry is one of the terms, one entry corresponds to one row in one of the tables.

    {vacmSecurityToGroup, SecModel, SecName, GroupName}.

    {vacmAccess, GroupName, Prefix, SecModel, SecLevel, Match, ReadView, WriteView, NotifyView}.

    {vacmViewTreeFamily, ViewIndex, ViewSubtree, ViewStatus, ViewMask}.

    • SecModel is any, v1, v2c, or usm.
    • SecName is a string.
    • GroupName is a string.
    • Prefix is a string.
    • SecLevel is noAuthNoPriv, authNoPriv, or authPriv
    • Match is prefix or exact.
    • ReadView is a string.
    • WriteView is a string.
    • NotifyView is a string.
    • ViewIndex is an integer.
    • ViewSubtree is a list of integer.
    • ViewStatus is either included or excluded
    • ViewMask is either null or a list of ones and zeros. Ones nominate that an @@ -180,17 +180,17 @@ regarded as all ones. null is shorthand for a mask with all ones.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir   = "/tmp",
     SecName    = "plain",
     VacmConfig =
    -   [%%                        SecModel, SecName, GroupName
    -    snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
    +   [%%                        SecModel, SecName, GroupName
    +    snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
     
         %%                        GroupName, Prefix, SecModel,
    -    snmpa_conf:vacm_acc_entry(SecName, "", any,
    +    snmpa_conf:vacm_acc_entry(SecName, "", any,
         %%                        SecLevel, Match, RV, WV, NV
    -                              noAuthNoPriv, exact, "all", "all", "all"),
    +                              noAuthNoPriv, exact, "all", "all", "all"),
     
         %%                        ViewName, ViewSubtree, ViewType, ViewMask
    -    snmpa_conf:vacm_vtf_entry("restricted", [1,3,6,1], included, null)],
    -snmpa_conf:write_vacm_config(AgentDir, VacmConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called + snmpa_conf:vacm_vtf_entry("restricted", [1,3,6,1], included, null)], +snmpa_conf:write_vacm_config(AgentDir, VacmConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called usm.conf, which must be present if the agent is configured for SNMPv3.

    The corresponding table is usmUserTable in the SNMP-USER-BASED-SM-MIB (adjusted according to SNMP-USM-HMAC-SHA2-MIB).

    Each entry is a term:

    {EngineID, UserName, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey}.

    • EngineID is a string.

    • UserName is a string.

    • SecName is a string.

    • Clone is zeroDotZero or a list of integers.

    • AuthP is a usmNoAuthProtocol, usmHMACMD5AuthProtocol, usmHMACSHAAuthProtocol, usmHMAC128SHA224AuthProtocol, @@ -203,29 +203,29 @@ be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir  = "/tmp",
     EngineID  = "plain engine"
     Passwd    = "FooBar Hoopla", %% This should *obviously* be choosen better
    -Secret16  = snmp:passwd2localized_key(md5, Passwd, EngineID),
    -Secret20  = snmp:passwd2localized_key(sha, Passwd, EngineID),
    +Secret16  = snmp:passwd2localized_key(md5, Passwd, EngineID),
    +Secret20  = snmp:passwd2localized_key(sha, Passwd, EngineID),
     UsmConfig =
    -   [snmpa_conf:usm_entry(EngineID, "initial", "initial", zeroDotZero,
    +   [snmpa_conf:usm_entry(EngineID, "initial", "initial", zeroDotZero,
                              usmHMACMD5AuthProtocol, "", "",
                              usmNoPrivProtocol, "", "",
    -                         "", Secret16, ""),
    +                         "", Secret16, ""),
     
    -    snmpa_conf:usm_entry(EngineID, "templateMD5", "templateMD5", zeroDotZero,
    +    snmpa_conf:usm_entry(EngineID, "templateMD5", "templateMD5", zeroDotZero,
                              usmHMACMD5AuthProtocol, "", "",
                              usmDESPrivProtocol, "", "",
    -                         "", Secret16, Secret16),
    +                         "", Secret16, Secret16),
     
    -    snmpa_conf:usm_entry(EngineID, "templateSHA", "templateSHA", zeroDotZero,
    +    snmpa_conf:usm_entry(EngineID, "templateSHA", "templateSHA", zeroDotZero,
                              usmHMACSHAAuthProtocol, "", "",
                              usmAesCfb128Protocol, "", "",
    -                         "", Secret20, Secret16)],
    -snmpa_conf:write_usm_config(AgentDir, UsmConfig),

    Notify Definitions

    The information about Notify Definitions should be stored in a file called + "", Secret20, Secret16)], +snmpa_conf:write_usm_config(AgentDir, UsmConfig),

    Notify Definitions

    The information about Notify Definitions should be stored in a file called notify.conf.

    The corresponding table is snmpNotifyTable in the SNMP-NOTIFICATION-MIB.

    Each entry is a term:

    {NotifyName, Tag, Type}.

    • NotifyName is a unique non-empty string.
    • Tag is a string.
    • Type is trap or inform.

    And this is a code (snippet) example of how to generate this file in runtime:

    AgentDir     = "/tmp",
     NotifyConfig =
    -   [snmpa_conf:notify_entry("standard trap",   "std_trap",   trap),
    -    snmpa_conf:notify_entry("standard inform", "std_inform", inform)],
    -snmpa_conf:write_notify_config(AgentDir, NotifyConfig),

    Target Address Definitions

    The information about Target Address Definitions should be stored in a file + [snmpa_conf:notify_entry("standard trap", "std_trap", trap), + snmpa_conf:notify_entry("standard inform", "std_inform", inform)], +snmpa_conf:write_notify_config(AgentDir, NotifyConfig),

    Target Address Definitions

    The information about Target Address Definitions should be stored in a file called target_addr.conf.

    The corresponding tables are snmpTargetAddrTable in the SNMP-TARGET-MIB and snmpTargetAddrExtTable in the SNMP-COMMUNITY-MIB.

    Each entry is a term:

    {TargetName, Domain, Addr, Timeout, RetryCount, TagList, ParamsName, EngineId}.
    or
    {TargetName, Domain, Addr, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize}.

    • TargetName is a unique non-empty string.

    • Domain is one of the atoms: transportDomainUdpIpv4 | transportDomainUdpIpv6.

    • Addr is either an IpAddr or an {IpAddr, IpPort} tuple. IpAddr is @@ -236,12 +236,12 @@ configurations still work.

      Note that if EngineId has the value discovery, the agent cannot send inform messages to that manager until it has performed the discovery process with that manager.

      And this is a code (snippet) example of how to generate this file in runtime:

      AgentDir         = "/tmp",
      -Addr1            = {{1,2,3,4},     162},
      -Addr2            = {{11,21,31,41}, 162},
      +Addr1            = {{1,2,3,4},     162},
      +Addr2            = {{11,21,31,41}, 162},
       Timeout          = 1500,
       RetryCount       = 3,
       TargetAddrConfig =
      -   [snmpa_conf:target_addr_entry("Target 1",
      +   [snmpa_conf:target_addr_entry("Target 1",
                                        transportDomainUdpIpv4, Addr1,
       				 Timeout, RetryCount,
       				 "std_trap, "target_1", "",
      @@ -250,13 +250,13 @@
                                        transportDomainUdpIpv4, Addr2,
       				 Timeout, RetryCount,
       				 "std_inform, "target_2", "",
      -				 [], 2048)],
      -snmpa_conf:write_target_addr_config(AgentDir, TargetAddrConfig),

      Target Parameters Definitions

      The information about Target Parameters Definitions should be stored in a file + [], 2048)], +snmpa_conf:write_target_addr_config(AgentDir, TargetAddrConfig),

      Target Parameters Definitions

      The information about Target Parameters Definitions should be stored in a file called target_params.conf.

      The corresponding table is snmpTargetParamsTable in the SNMP-TARGET-MIB.

      Each entry is a term:

      {ParamsName, MPModel, SecurityModel, SecurityName, SecurityLevel}.

      • ParamsName is a unique non-empty string.
      • MPModel is v1, v2c or v3
      • SecurityModel is v1, v2c, or usm.
      • SecurityName is a string.
      • SecurityLevel is noAuthNoPriv, authNoPriv or authPriv.

      And this is a code (snippet) example of how to generate this file in runtime:

      AgentDir         = "/tmp",
       TargetAddrConfig =
      -   [snmpa_conf:target_params_entry("target_1", v1),
      -    snmpa_conf:target_params_entry("target_2", v2, "initial", noAthNoPriv],
      -snmpa_conf:write_target_params_config(AgentDir, TargetParamsConfig),
      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_funct_descr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_funct_descr.html 2026-04-20 17:48:50.145744881 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_funct_descr.html 2026-04-20 17:48:50.145744881 +0000 @@ -236,7 +236,7 @@ MIBs are always available in all contexts.

      The ASN.1 code, the Erlang source code, and the generated .hrl files for them are provided in the distribution and are placed in the directories mibs, src, and include, respectively, in the snmp application.

      The .hrl files are generated with snmpc:mib_to_hrl/1. Include these files in -your code as in the following example:

      -include_lib("snmp/include/SNMPv2-MIB.hrl").

      The initial values for the managed objects defined in these tables, are read at +your code as in the following example:

      -include_lib("snmp/include/SNMPv2-MIB.hrl").

      The initial values for the managed objects defined in these tables, are read at start-up from a set of configuration files. These are described in Configuration Files.

      STANDARD-MIB and SNMPv2-MIB

      These MIBs contain the snmp- and system groups from MIB-II which is defined in RFC1213 (STANDARD-MIB) or RFC1907 (SNMPv2-MIB). They are implemented in the @@ -349,9 +349,9 @@ objects in this MIB are now obsolete.

      Notifications

      Notifications are defined in SMIv1 with the TRAP-TYPE macro in the definition of an MIB (see RFC1215). The corresponding macro in SMIv2 is NOTIFICATION-TYPE. When an application decides to send a notification, it calls one of the -following functions:

      snmpa:send_notification(Agent, Notification, Receiver
      -                       [, NotifyName, ContextName, Varbinds])
      -snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

      providing the registered name or process identifier of the agent where the MIB, +following functions:

      snmpa:send_notification(Agent, Notification, Receiver
      +                       [, NotifyName, ContextName, Varbinds])
      +snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

      providing the registered name or process identifier of the agent where the MIB, which defines the notification is loaded and the symbolic name of the notification.

      If the send_notification/3,4 function is used, all management targets are selected, as defined in RFC2273. The Receiver parameter defines where the @@ -472,7 +472,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_netif.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_netif.html 2026-04-20 17:48:50.173745055 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_agent_netif.html 2026-04-20 17:48:50.177745080 +0000 @@ -202,7 +202,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app.html 2026-04-20 17:48:50.217745328 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app.html 2026-04-20 17:48:50.221745353 +0000 @@ -92,51 +92,51 @@

      Description

      This chapter describes the snmp application in OTP. The SNMP application provides the following services:

      • a multilingual extensible SNMP agent
      • a SNMP manager
      • a MIB compiler

      Configuration

      The following configuration parameters are defined for the SNMP application. Refer to application(3) for more information about configuration parameters.

      The snmp part of the config file specifying the configuration parameters is -basically the following tuple:

            {snmp, snmp_components_config()}

      A minimal config file for starting a node with both a manager and an agent:

            [{snmp,
      -        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
      -                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
      -         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
      -                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
      -        ]
      +basically the following tuple:

            {snmp, snmp_components_config()}

      A minimal config file for starting a node with both a manager and an agent:

            [{snmp,
      +        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
      +                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
      +         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
      +                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
      +        ]
              }
             ].

      Each snmp component has its own set of configuration parameters, even though -some of the types are common to both components.

            snmp_components_config() -> [snmp_component_config()]
      -      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
      -      agent_options() = [agent_option()]
      -      agent_option() = {restart_type,     restart_type()}     |
      -                       {agent_type,       agent_type()}       |
      -                       {agent_verbosity,  verbosity()}        |
      -                       {discovery,        agent_discovery()}  |
      -                       {versions,         versions()}         |
      -                       {gb_max_vbs,       gb_max_vbs()}       |
      -                       {priority,         priority()}         |
      -                       {multi_threaded,   multi_threaded()}   |
      -                       {db_dir,           db_dir()}           |
      -                       {db_init_error,    db_init_error()}    |
      -                       {local_db,         local_db()}         |
      -                       {net_if,           agent_net_if()}     |
      -                       {mibs,             mibs()}             |
      -                       {mib_storage,      mib_storage()}      |
      -                       {mib_server,       mib_server()}       |
      -                       {audit_trail_log,  audit_trail_log()}  |
      -                       {error_report_mod, error_report_mod()} |
      -                       {note_store,       note_store()}       |
      -                       {symbolic_store,   symbolic_store()}   |
      -                       {target_cache,     target_cache()}     |
      -                       {config,           agent_config()}
      -      manager_options() = [manager_option()]
      -      manager_option() = {restart_type,             restart_type()}    |
      -                         {net_if,                   manager_net_if()}  |
      -                         {server,                   server()}          |
      -                         {note_store,               note_store()}      |
      -                         {config,                   manager_config()}  |
      -                         {inform_request_behaviour, manager_irb()}     |
      -                         {mibs,                     manager_mibs()}    |
      -                         {priority,                 priority()}        |
      -                         {audit_trail_log,          audit_trail_log()} |
      -                         {versions,                 versions()}        |
      -                         {def_user_mod,             def_user_module()  |
      -                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, +some of the types are common to both components.

              snmp_components_config() -> [snmp_component_config()]
        +      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
        +      agent_options() = [agent_option()]
        +      agent_option() = {restart_type,     restart_type()}     |
        +                       {agent_type,       agent_type()}       |
        +                       {agent_verbosity,  verbosity()}        |
        +                       {discovery,        agent_discovery()}  |
        +                       {versions,         versions()}         |
        +                       {gb_max_vbs,       gb_max_vbs()}       |
        +                       {priority,         priority()}         |
        +                       {multi_threaded,   multi_threaded()}   |
        +                       {db_dir,           db_dir()}           |
        +                       {db_init_error,    db_init_error()}    |
        +                       {local_db,         local_db()}         |
        +                       {net_if,           agent_net_if()}     |
        +                       {mibs,             mibs()}             |
        +                       {mib_storage,      mib_storage()}      |
        +                       {mib_server,       mib_server()}       |
        +                       {audit_trail_log,  audit_trail_log()}  |
        +                       {error_report_mod, error_report_mod()} |
        +                       {note_store,       note_store()}       |
        +                       {symbolic_store,   symbolic_store()}   |
        +                       {target_cache,     target_cache()}     |
        +                       {config,           agent_config()}
        +      manager_options() = [manager_option()]
        +      manager_option() = {restart_type,             restart_type()}    |
        +                         {net_if,                   manager_net_if()}  |
        +                         {server,                   server()}          |
        +                         {note_store,               note_store()}      |
        +                         {config,                   manager_config()}  |
        +                         {inform_request_behaviour, manager_irb()}     |
        +                         {mibs,                     manager_mibs()}    |
        +                         {priority,                 priority()}        |
        +                         {audit_trail_log,          audit_trail_log()} |
        +                         {versions,                 versions()}        |
        +                         {def_user_mod,             def_user_module()  |
        +                         {def_user_data,            def_user_data()}

        Agent specific config options and types:

        • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

          Default is master.

        • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

          The terminating options effects discovery initiated by a manager.

          The originating options effects discovery initiated by this agent.

          For defaults see the options in agent_discovery_opt().

        • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

          These are options effecting discovery terminating in this agent (i.e. @@ -363,7 +363,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_a.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_a.html 2026-04-20 17:48:50.253745552 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_a.html 2026-04-20 17:48:50.253745552 +0000 @@ -142,7 +142,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_b.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_b.html 2026-04-20 17:48:50.289745775 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_b.html 2026-04-20 17:48:50.285745750 +0000 @@ -538,23 +538,23 @@ immediately removed." - SYNTAX INTEGER { + SYNTAX INTEGER { -- the following two values are states: -- these values may be read or written - active(1), - notInService(2), + active(1), + notInService(2), -- the following value is a state: -- this value may be read, but not written - notReady(3), + notReady(3), -- the following three values are -- actions: these values may be written, -- but are never read - createAndGo(4), - createAndWait(5), - destroy(6) - }
      + createAndGo(4), + createAndWait(5), + destroy(6) + } @@ -606,7 +606,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_c.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_c.html 2026-04-20 17:48:50.321745973 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_app_c.html 2026-04-20 17:48:50.321745973 +0000 @@ -143,7 +143,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_audit_trail_log.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_audit_trail_log.html 2026-04-20 17:48:50.353746172 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_audit_trail_log.html 2026-04-20 17:48:50.353746172 +0000 @@ -155,7 +155,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_community_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_community_mib.html 2026-04-20 17:48:50.385746370 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_community_mib.html 2026-04-20 17:48:50.389746395 +0000 @@ -584,7 +584,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_config.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_config.html 2026-04-20 17:48:50.437746693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_config.html 2026-04-20 17:48:50.437746693 +0000 @@ -103,41 +103,41 @@ more information).
    • the database directory stores the internal database files.

    The agent and manager uses (application) configuration parameters to find out where these directories are located. The parameters should be defined in an Erlang system configuration file. The following configuration parameters are -defined for the SNMP application:

          agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {versions,         versions()}         |
    -                       {discovery,        agent_discovery()}  |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +defined for the SNMP application:

            agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {versions,         versions()}         |
      +                       {discovery,        agent_discovery()}  |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. @@ -496,34 +496,34 @@ configuration parameters. The verbosity itself has several _levels: silence | info | log | debug | trace. For the lowest verbosity silence, nothing is printed. The higher the verbosity, the -more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
        +more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
         ok
        -5> snmpa:verbosity(net_if, log).
        +5> snmpa:verbosity(net_if, log).
         ok
         6>
         %% Example of output from the agent when a get-next-request arrives:
         ** SNMP NET-IF LOG:
        -   got packet from {147,12,12,12}:5000
        +   got packet from {147,12,12,12}:5000
         
         ** SNMP NET-IF MPD LOG:
            v1, community: all-rights
         
         ** SNMP NET-IF LOG:
        -   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
        +   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
                                                   62612569,noError,0,
        -                                          [{varbind,[1,1],'NULL','NULL',1}]}
        +                                          [{varbind,[1,1],'NULL','NULL',1}]}
         
         ** SNMP MASTER-AGENT LOG:
        -   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
        +   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
         
         ** SNMP MASTER-AGENT LOG:
        -   returned: {value,"Erlang SNMP agent"}
        +   returned: {value,"Erlang SNMP agent"}
         
         ** SNMP NET-IF LOG:
        -   reply pdu: {pdu,'get-response',62612569,noError,0,
        -                   [{varbind,[1,3,6,1,2,1,1,1,0],
        +   reply pdu: {pdu,'get-response',62612569,noError,0,
        +                   [{varbind,[1,3,6,1,2,1,1,1,0],
                                      'OCTET STRING',
        -                             "Erlang SNMP agent",1}]}
        +                             "Erlang SNMP agent",1}]}
         
         ** SNMP NET-IF INFO: time in agent: 19711 mysec

        Other useful function(s) for debugging the agent are:

        • snmpa:info/0,1 - info is used to retrieve a list of miscellaneous agent information.

        • snmpa:which_aliasnames/0 - @@ -591,7 +591,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_def_instr_functions.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_def_instr_functions.html 2026-04-20 17:48:50.469746891 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_def_instr_functions.html 2026-04-20 17:48:50.469746891 +0000 @@ -243,7 +243,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_framework_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_framework_mib.html 2026-04-20 17:48:50.501747089 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_framework_mib.html 2026-04-20 17:48:50.497747065 +0000 @@ -576,7 +576,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_generic.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_generic.html 2026-04-20 17:48:50.537747313 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_generic.html 2026-04-20 17:48:50.541747338 +0000 @@ -105,9 +105,9 @@ | MIB | +---------------+ | - Association file (associates a MIB object with + Association file (associates a MIB object with | snmp_generic:table_funct - | snmp_generic:variable_func) + | snmp_generic:variable_func) +--------------------------------------+ | snmp_generic | Support for get-next, | | RowStatus operations @@ -115,7 +115,7 @@ | snmpa_local_db | Mnesia | Database +--------------+-------+---------------+ | dets | ets | -| (persistent) | | +| (persistent) | | +--------------+-------+

        Each function takes the argument NameDb, which is a tuple {Name, Db}, to identify which database the functions should use. Name is the symbolic name of the managed object as defined in the MIB, and Db is either volatile, @@ -127,35 +127,35 @@ this. Specifically, if variables are stored in Mnesia, the table snmp_variables must be created by the programmer. The record definition for this table is defined in the file snmp/include/snmp_types.hrl.

        If an instrumentation function in the association file for a variable myVar -does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in -Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(new, NameDb).
        +does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in +Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(new, NameDb).
         
        -myTable_func(delete, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(delete, NameDb).
        +myTable_func(delete, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(delete, NameDb).
         
         %% change row
        -myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(is_set_ok, RowIndex,
        -                               Cols, NameDb) of
        -    {noError, 0} ->
        -      myApplication:is_set_ok(RowIndex, Cols);
        +myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(is_set_ok, RowIndex,
        +                               Cols, NameDb) of
        +    {noError, 0} ->
        +      myApplication:is_set_ok(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(set, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(set, RowIndex, Cols,
        -                               NameDb),
        -    {noError, 0} ->
        +myTable_func(set, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(set, RowIndex, Cols,
        +                               NameDb),
        +    {noError, 0} ->
               % Now the row is updated, tell the application
        -      myApplication:update(RowIndex, Cols);
        +      myApplication:update(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(Op, RowIndex, Cols, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        +
        myTable_func(Op, RowIndex, Cols, NameDb) -> % pass unchanged + snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        @@ -958,7 +958,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_agent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_agent.html 2026-04-20 17:48:50.577747561 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_agent.html 2026-04-20 17:48:50.577747561 +0000 @@ -182,108 +182,108 @@ the default implementation of it. Recall that MIBs imported by "EX1-MIB.mib" must be present and compiled in the current directory ("./STANDARD-MIB.bin","./RFC1213-MIB.bin") when compiling.

        unix> erl -config ./sys
        -1> application:start(snmp).
        +1> application:start(snmp).
         ok
        -2> snmpc:compile("EX1-MIB").
        +2> snmpc:compile("EX1-MIB").
         No accessfunction for 'friendsTable', using default.
         No accessfunction for 'myName', using default.
        -{ok, "EX1-MIB.bin"}
        -3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
        +{ok, "EX1-MIB.bin"}
        +3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
         ok

        This MIB is now loaded into the agent, and a manager can ask questions. As an example of this, we start another Erlang system and the simple Erlang manager in -the toolkit:

        1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
        +the toolkit:

        1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
          %% making it understand symbolic names: {mibs,["EX1-MIB","STANDARD-MIB"]}]).
        -{ok, <0.89.0>}
        +{ok, <0.89.0>}
         %% a get-next request with one OID.
        -2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
        +2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
         ok
         * Got PDU:
        -[myName,0] = []
        +[myName,0] = []
         %% A set-request (now using symbolic names for convenience)
        -3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
        +3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
         ok
         * Got PDU:
        -[myName,0] = "Martin"
        +[myName,0] = "Martin"
         %% Try the same get-next request again
        -4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
        +4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
         ok
         * Got PDU:
        -[myName,0] = "Martin"
        +[myName,0] = "Martin"
         %% ... and we got the new value.
         %% you can event do row operations. How to add a row:
        -5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
        +5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
          %% createAndGo
         ok
         * Got PDU:
        -[fName,0] = "Martin"
        -[fAddress,0] = "home"
        -[fStatus,0] = 4
        -6> snmp_test_mgr:gn([[myName,0]]).
        +[fName,0] = "Martin"
        +[fAddress,0] = "home"
        +[fStatus,0] = 4
        +6> snmp_test_mgr:gn([[myName,0]]).
         ok
         * Got PDU:
        -[fName,0] = "Martin"
        -7> snmp_test_mgr:gn().
        +[fName,0] = "Martin"
        +7> snmp_test_mgr:gn().
         ok
         * Got PDU:
        -[fAddress,0] = "home"
        -8> snmp_test_mgr:gn().
        +[fAddress,0] = "home"
        +8> snmp_test_mgr:gn().
         ok
         * Got PDU:
        -[fStatus,0] = 1
        +[fStatus,0] = 1
         9>

        Manual Implementation

        The following example shows a "manual" implementation of the EX1-MIB in Erlang. In this example, the values of the objects are stored in an Erlang server. The server has a 2-tuple as loop data, where the first element is the value of variable myName, and the second is a sorted list of rows in the table friendsTable. Each row is a 4-tuple.

        Note

        There are more efficient ways to create tables manually, i.e. to use the -module snmp_index.

        Code

        -module(ex1).
        --author('dummy@flop.org').
        +module snmp_index.

        Code

        -module(ex1).
        +-author('dummy@flop.org').
         %% External exports
        --export([start/0, my_name/1, my_name/2, friends_table/3]).
        +-export([start/0, my_name/1, my_name/2, friends_table/3]).
         %% Internal exports
        --export([init/0]).
        --define(status_col, 4).
        --define(active, 1).
        --define(notInService, 2).
        --define(notReady, 3).
        --define(createAndGo, 4).   % Action; written, not read
        --define(createAndWait, 5). % Action; written, not read
        --define(destroy, 6).       % Action; written, not read
        -start() ->
        -    spawn(ex1, init, []).
        +-export([init/0]).
        +-define(status_col, 4).
        +-define(active, 1).
        +-define(notInService, 2).
        +-define(notReady, 3).
        +-define(createAndGo, 4).   % Action; written, not read
        +-define(createAndWait, 5). % Action; written, not read
        +-define(destroy, 6).       % Action; written, not read
        +start() ->
        +    spawn(ex1, init, []).
         %%----------------------------------------------------------------
         %% Instrumentation function for variable myName.
         %% Returns: (get) {value, Name}
         %%          (set) noError
         %%----------------------------------------------------------------
        -my_name(get) ->
        -    ex1_server ! {self(), get_my_name},
        -    Name = wait_answer(),
        -    {value, Name}.
        -my_name(set, NewName) ->
        -    ex1_server ! {self(), {set_my_name, NewName}},
        +my_name(get) ->
        +    ex1_server ! {self(), get_my_name},
        +    Name = wait_answer(),
        +    {value, Name}.
        +my_name(set, NewName) ->
        +    ex1_server ! {self(), {set_my_name, NewName}},
             noError.
         %%----------------------------------------------------------------
         %% Instrumentation function for table friendsTable.
         %%----------------------------------------------------------------
        -friends_table(get, RowIndex, Cols) ->
        -    case get_row(RowIndex) of
        -   {ok, Row} ->
        -        get_cols(Cols, Row);
        +friends_table(get, RowIndex, Cols) ->
        +    case get_row(RowIndex) of
        +   {ok, Row} ->
        +        get_cols(Cols, Row);
            _  ->
        -        {noValue, noSuchInstance}
        +        {noValue, noSuchInstance}
             end;
        -friends_table(get_next, RowIndex, Cols) ->
        -    case get_next_row(RowIndex) of
        -   {ok, Row} ->
        -        get_next_cols(Cols, Row);
        +friends_table(get_next, RowIndex, Cols) ->
        +    case get_next_row(RowIndex) of
        +   {ok, Row} ->
        +        get_next_cols(Cols, Row);
            _  ->
        -       case get_next_row([]) of
        -     {ok, Row} ->
        +       case get_next_row([]) of
        +     {ok, Row} ->
                  % Get next cols from first row.
        -         NewCols = add_one_to_cols(Cols),
        -         get_next_cols(NewCols, Row);
        +         NewCols = add_one_to_cols(Cols),
        +         get_next_cols(NewCols, Row);
              _  ->
        -        end_of_table(Cols)
        +        end_of_table(Cols)
                 end
             end;
         %%----------------------------------------------------------------
        @@ -294,168 +294,168 @@
         %%    *) Otherwise, error (for simplicity).
         %% Otherwise, row is modified; check that row exists.
         %%----------------------------------------------------------------
        -friends_table(is_set_ok, RowIndex, Cols) ->
        +friends_table(is_set_ok, RowIndex, Cols) ->
             RowExists =
        -   case get_row(RowIndex) of
        -        {ok, _Row} -> true;
        +   case get_row(RowIndex) of
        +        {ok, _Row} -> true;
                _ -> false
            end,
        -    case is_row_status_col_changed(Cols) of
        -   {true, ?destroy} when RowExists == true ->
        -        {noError, 0};
        -   {true, ?createAndGo} when RowExists == false,
        -                                 length(Cols) == 3 ->
        -        {noError, 0};
        -   {true, _} ->
        -       {inconsistentValue, ?status_col};
        +    case is_row_status_col_changed(Cols) of
        +   {true, ?destroy} when RowExists == true ->
        +        {noError, 0};
        +   {true, ?createAndGo} when RowExists == false,
        +                                 length(Cols) == 3 ->
        +        {noError, 0};
        +   {true, _} ->
        +       {inconsistentValue, ?status_col};
            false when RowExists == true ->
        -        {noError, 0};
        +        {noError, 0};
            _ ->
        -        [{Col, _NewVal} | _Cols] = Cols,
        /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_manager.html differs (HTML document, UTF-8 Unicode text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_manager.html	2026-04-20 17:48:50.609747760 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_impl_example_manager.html	2026-04-20 17:48:50.609747760 +0000
        @@ -146,7 +146,7 @@
                   Erlang programming language
         
               

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_index.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_index.html 2026-04-20 17:48:50.641747958 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_index.html 2026-04-20 17:48:50.641747958 +0000 @@ -100,13 +100,13 @@ actual implementation of the table. The SNMP ordering, that is implementation of GET NEXT, is implemented in this module.

        For example, suppose there is an SNMP table, which is best implemented in Erlang as one process per SNMP table row. Suppose further that the INDEX in the SNMP -table is an OCTET STRING. The index structure would be created as follows:

        snmp_index:new(string)

        For each new process we create, we insert an item in an snmp_index structure:

        new_process(Name, SnmpIndex) ->
        -  Pid = start_process(),
        +table is an OCTET STRING. The index structure would be created as follows:

        snmp_index:new(string)

        For each new process we create, we insert an item in an snmp_index structure:

        new_process(Name, SnmpIndex) ->
        +  Pid = start_process(),
           NewSnmpIndex =
        -    snmp_index:insert(SnmpIndex, Name, Pid),
        +    snmp_index:insert(SnmpIndex, Name, Pid),
           <...>

        With this structure, we can now map an OBJECT IDENTIFIER in e.g. a GET NEXT -request, to the correct process:

        get_next_pid(Oid, SnmpIndex) ->
        -  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
        +request, to the correct process:

        get_next_pid(Oid, SnmpIndex) ->
        +  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
           Pid.

        Warnings

        Warning

        All API functions that update the index return a NewIndex term. This is for backward compatibility with a previous implementation that used a B+ tree written purely in Erlang for the index. The NewIndex return value @@ -754,7 +754,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_instr_functions.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_instr_functions.html 2026-04-20 17:48:50.677748182 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_instr_functions.html 2026-04-20 17:48:50.677748182 +0000 @@ -105,8 +105,8 @@ operation is translated into a series of calls to get-next.

        Instrumentation Functions

        The following sections describe how the instrumentation functions should be defined in Erlang for the different operations. In the following, RowIndex is a list of key values for the table, and Column is a column number.

        These functions are described in detail in -Definition of Instrumentation Functions.

        New / Delete Operations

        For scalar variables:

        variable_access(new [, ExtraArg1, ...])
        -variable_access(delete [, ExtraArg1, ...])

        For tables:

        table_access(new [, ExtraArg1, ...])
        +Definition of Instrumentation Functions.

        New / Delete Operations

        For scalar variables:

        variable_access(new [, ExtraArg1, ...])
        +variable_access(delete [, ExtraArg1, ...])

        For tables:

        table_access(new [, ExtraArg1, ...])
         table_access(delete [, ExtraArg1, ...])

        These functions are called for each object in an MIB when the MIB is unloaded or loaded, respectively.

        Get Operation

        For scalar variables:

        variable_access(get [, ExtraArg1, ...])

        For tables:

        table_access(get,RowIndex,Cols [,ExtraArg1, ...])

        Cols is a list of Column. The agent will sort incoming variables so that all operations on one row (same index) will be supplied at the same time. The reason @@ -136,9 +136,9 @@ value 1, and [3, 5] is the list of requested columns. The function should now return the lexicographically next elements:

        [{[3, 1, 2], d}, {[5, 1, 2], f}]

        This is illustrated in the following table:

        GetNext from [3,1,1] and [5,1,1].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry.3.2.1,
                  myTable.myTableEntry.5.2.1 }

        This is transformed into one call to my_table:

        my_table(get_next, [2, 1], [3, 5])

        The function should now return:

        [{[4, 1, 1], b}, endOfTable]

        This is illustrated in the following table:

        GetNext from [3,2,1] and [5,2,1].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry.3.1.2,
        -         myTable.myTableEntry.4.1.2 }

        This will be transform into one call to my_table:

        my_table(get_next, [1, 2], [3, 4])

        The function should now return:

        [{[3, 2, 1], g}, {[5, 1, 1], c}]

        This is illustrated in the following table:

        GetNext from [3,1,2] and [4,1,2].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry,
        -         myTable.myTableEntry.1.3.2 }

        This will be transform into two calls to my_table:

        my_table(get_next, [], [0]) and
        -my_table(get_next, [3, 2], [1])

        The function should now return:

        [{[3, 1, 1], a}] and
        +         myTable.myTableEntry.4.1.2 }

        This will be transform into one call to my_table:

        my_table(get_next, [1, 2], [3, 4])

        The function should now return:

        [{[3, 2, 1], g}, {[5, 1, 1], c}]

        This is illustrated in the following table:

        GetNext from [3,1,2] and [4,1,2].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry,
        +         myTable.myTableEntry.1.3.2 }

        This will be transform into two calls to my_table:

        my_table(get_next, [], [0]) and
        +my_table(get_next, [3, 2], [1])

        The function should now return:

        [{[3, 1, 1], a}] and
         [{[3, 1, 1], a}]

        In both cases, the first accessible element in the table should be returned. As the key columns are not accessible, this means that the third column is the first row.

        Note

        Normally, the functions described above behave exactly as shown, but they are @@ -149,17 +149,17 @@ variables for a device, ipAdr and name with object identifiers 1.1.23.4 and 1.1.7 respectively. To access these variables, one could implement the two Erlang functions ip_access and name_access, which will be in the MIB. The -functions could be specified in a text file as follows:

        {ipAdr, {my_module, ip_access, []}}.
        +functions could be specified in a text file as follows:

        {ipAdr, {my_module, ip_access, []}}.
         % Or using the oid syntax for 'name'
        -{[1,1,7], {my_module, name_access, []}}.

        The ExtraArgument parameter is the empty list. For example, when the agent +{[1,1,7], {my_module, name_access, []}}.

        The ExtraArgument parameter is the empty list. For example, when the agent receives a get-request for the ipAdr variable, a call will be made to ip_access(get). The value returned by this function is the answer to the get-request.

        If ip_access and name_access are implemented similarly, we could write a -generic_access function using the ListOfExtraArguments:

        {ipAdr, {my_module, generic_access, ['IPADR']}}.
        +generic_access function using the ListOfExtraArguments:

        {ipAdr, {my_module, generic_access, ['IPADR']}}.
         % The mnemonic 'name' is more convenient than 1.1.7
        -{name, {my_module, generic_access, ['NAME']}}.

        When the agent receives the same get-request as above, a call will be made to -generic_access(get,'IPADR').

        Yet another possibility, closer to the hardware, could be:

        {ipAdr, {my_module, generic_access, [16#2543]}}.
        -{name, {my_module, generic_access, [16#A2B3]}}.

        Default Instrumentation

        When the MIB definition work is finished, there are two major issues left.

        • Implementing the MIB
        • Implementing a Manager Application.

        Implementing an MIB can be a tedious task. Most probably, there is a need to +{name, {my_module, generic_access, ['NAME']}}.

        When the agent receives the same get-request as above, a call will be made to +generic_access(get,'IPADR').

        Yet another possibility, closer to the hardware, could be:

        {ipAdr, {my_module, generic_access, [16#2543]}}.
        +{name, {my_module, generic_access, [16#A2B3]}}.

        Default Instrumentation

        When the MIB definition work is finished, there are two major issues left.

        • Implementing the MIB
        • Implementing a Manager Application.

        Implementing an MIB can be a tedious task. Most probably, there is a need to test the agent before all tables and variables are implemented. In this case, the default instrumentation functions are useful. The toolkit can generate default instrumentation functions for variables as well as for tables. @@ -248,7 +248,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_intro.html 2026-04-20 17:48:50.709748380 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_intro.html 2026-04-20 17:48:50.705748355 +0000 @@ -192,7 +192,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_config_files.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_config_files.html 2026-04-20 17:48:50.745748603 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_config_files.html 2026-04-20 17:48:50.749748628 +0000 @@ -107,32 +107,32 @@ every transport.

      • engine_id - The SnmpEngineID as defined in SNMP-FRAMEWORK-MIB. Mandatory.

      • max_message_size - The snmpEngineMaxMessageSize as defined in SNMP-FRAMEWORK-MIB. Mandatory.

    • Value is the value for the variable.

    The legacy and intermediate variables address and domain are still supported -so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    -                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    -{engine_id,        "mgrEngine"}.
    -{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific +so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    +                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    +{engine_id,        "mgrEngine"}.
    +{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific structure. See RFC 2271/2571 for details.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir    = "/tmp",
     Port          = 5000,
    -Addr4         = {141,213,11,24},
    -Addr6         = {0,0,0,0,0,0,0,1},
    -Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    -                 {transportDomainUdpIpv6, {Addr6, Port}}],
    +Addr4         = {141,213,11,24},
    +Addr6         = {0,0,0,0,0,0,0,1},
    +Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    +                 {transportDomainUdpIpv6, {Addr6, Port}}],
     EngineID      = "mgrEngine",
     MMS           = 484,
    -ManagerConfig = [snmpm_conf:manager_entry(transports,       Transports),
    -                 snmpm_conf:manager_entry(engine_id,        EngineID),
    -                 snmpm_conf:manager_entry(max_message_size, MMS)],
    -snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    Users

    For each manager user, the manager needs some information. This information is +ManagerConfig = [snmpm_conf:manager_entry(transports, Transports), + snmpm_conf:manager_entry(engine_id, EngineID), + snmpm_conf:manager_entry(max_message_size, MMS)], +snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    Users

    For each manager user, the manager needs some information. This information is either added in the users.conf config file or by calling the register_user function in run-time.

    Each row defines a manager user of the manager.

    Each entry is a tuple of size four:

    {UserId, UserMod, UserData, DefaultAgentConfig}.

    • UserId is any term (used to uniquely identify the user).
    • UserMod is the user callback module (atom).
    • UserData is any term (passed on to the user when calling the UserMod.
    • DefaultAgentConfig is a list of default agent config's. These values are used as default values when this user registers agents.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir         = "/tmp",
    -UserID             = make_ref(),
    +UserID             = make_ref(),
     UserMod            = my_manager_callback_mod,
    -UserData           = self(),
    -DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}],
    -UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData,
    -                                      DefaultAgentConfig)],
    -snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    Agents

    The information needed to handle agents should be stored in a file called +UserData = self(), +DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}], +UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData, + DefaultAgentConfig)], +snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    Agents

    The information needed to handle agents should be stored in a file called agents.conf. It is also possible to add agents in run-time by calling the register_agent.

    Each entry is a tuple:

    {UserId, TargetName, Comm, Domain, Addr, EngineID, Timeout, MaxMessageSize, Version, SecModel, SecName, SecLevel}.

    • UserId is the identity of the manager user responsible for this agent (term).
    • TargetName is a unique non-empty string.
    • Comm is the community string (string).
    • Domain is the transport domain, either transportDomainUdpIpv4 or @@ -144,23 +144,23 @@ (integer).
    • Version is the version (v1 | v2 | v3).

    • SecModel is the security model (any | v1 | v2c | usm).

    • SecName is the security name (string).
    • SecLevel is security level (noAuthNoPriv | authNoPriv | authPriv).

    Legacy configurations using tuples without Domain element, as well as with all TDomain, Ip and Port elements still work.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir   = "/tmp",
     UserID       = ...
    -AgentsConfig = [snmpm_conf:agents_entry(UserID,
    +AgentsConfig = [snmpm_conf:agents_entry(UserID,
                                             "target 1",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{1,2,3,4},161},
    +					transportDomainUdpIpv4, {{1,2,3,4},161},
     					"agent Engine 1"
     					1500,
     					484.
    -					v1, v1, "sec name 1", noAuthNoPriv),
    -		snmpm_conf:agents_entry(UserID,
    +					v1, v1, "sec name 1", noAuthNoPriv),
    +		snmpm_conf:agents_entry(UserID,
                                             "target 2",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{5,6,7,8},161},
    +					transportDomainUdpIpv4, {{5,6,7,8},161},
     					"agent Engine 2"
     					1500,
     					1000.
    -					v1, v1, "sec name 2", noAuthNoPriv)],
    -snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called + v1, v1, "sec name 2", noAuthNoPriv)], +snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called usm.conf, which must be present if the manager wishes to use SNMPv3 when communicating with agents. It is also possible to add usm data in run-time by calling the register_usm_user.

    The corresponding table is usmUserTable in the SNMP-USER-BASED-SM-MIB @@ -173,13 +173,13 @@ usmAesCfb128Protocol.

  • PrivKey is a list (of integer). This is the User's secret localized encryption key. It is not visible in the MIB. The length of this key needs to be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

  • ManagerDir = "/tmp",
    -UsmConfig  = [snmpm_conf:usm_entry("engine",
    +UsmConfig  = [snmpm_conf:usm_entry("engine",
                                        "user 1",
     	                           usmNoAuthProtocol,
    -	 			   [],
    +	 			   [],
     	 			   usmNoPrivProtocol,
    -	 			   [])],
    -snmpm_conf:write_usm_config(ManagerDir, UsmConfig),
    + [])], +snmpm_conf:write_usm_config(ManagerDir, UsmConfig), @@ -231,7 +231,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_funct_descr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_funct_descr.html 2026-04-20 17:48:50.777748802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_funct_descr.html 2026-04-20 17:48:50.781748827 +0000 @@ -160,7 +160,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_netif.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_netif.html 2026-04-20 17:48:50.809749000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_manager_netif.html 2026-04-20 17:48:50.809749000 +0000 @@ -190,7 +190,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_mib_compiler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_mib_compiler.html 2026-04-20 17:48:50.845749224 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_mib_compiler.html 2026-04-20 17:48:50.845749224 +0000 @@ -99,16 +99,16 @@ association file, it gives a warning message and uses default instrumentation functions. (See Default Instrumentation for more details).

    The MIB compiler is started with a call to snmpc:compile(<mibname>). For -example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the +example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the MODULE-IDENTITY statement to determinate if the MIB is written in SMI version 1 or 2.

    Importing MIBs

    The compiler handles the IMPORT statement. It is important to import the compiled file and not the ASN.1 (source) file. A MIB must be recompiled to make changes visible to other MIBs importing it.

    The compiled files of the imported MIBs must be present in the current directory, or a directory in the current path. The path is supplied with the -{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    -       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" -like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    -       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP +{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    +       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" +like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    +       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP system and uses the expanded paths as include paths.

    Note that an SMIv2 MIB can import an SMIv1 MIB and vice versa.

    The following MIBs are built-ins of the Erlang SNMP compiler: SNMPv2-SMI, RFC-1215, RFC-1212, SNMPv2-TC, SNMPv2-CONF, and RFC1155-SMI. They cannot therefore be compiled separately.

    MIB Consistency Checking

    When an MIB is compiled, the compiler detects if several managed objects use the @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_notification_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_notification_mib.html 2026-04-20 17:48:50.873749398 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_notification_mib.html 2026-04-20 17:48:50.877749422 +0000 @@ -451,7 +451,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_pdus.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_pdus.html 2026-04-20 17:48:50.913749645 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_pdus.html 2026-04-20 17:48:50.909749621 +0000 @@ -99,8 +99,8 @@ Erlang record representations and vice versa. The record definitions can be found in the file snmp/include/snmp_types.hrl. If snmpv3 is used, the module that includes snmp_types.hrl must define the constant SNMP_USE_V3 before the -header file is included. Example:

    -define(SNMP_USE_V3, true).
    --include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if +header file is included. Example:

    -define(SNMP_USE_V3, true).
    +-include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if process.

    @@ -1018,7 +1018,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_standard_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_standard_mib.html 2026-04-20 17:48:50.945749844 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_standard_mib.html 2026-04-20 17:48:50.945749844 +0000 @@ -391,7 +391,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_target_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_target_mib.html 2026-04-20 17:48:50.981750068 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_target_mib.html 2026-04-20 17:48:50.981750068 +0000 @@ -770,7 +770,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_user_based_sm_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_user_based_sm_mib.html 2026-04-20 17:48:51.021750316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_user_based_sm_mib.html 2026-04-20 17:48:51.025750340 +0000 @@ -727,7 +727,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_view_based_acm_mib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_view_based_acm_mib.html 2026-04-20 17:48:51.065750588 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmp_view_based_acm_mib.html 2026-04-20 17:48:51.065750588 +0000 @@ -1053,7 +1053,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa.html 2026-04-20 17:48:51.137751035 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa.html 2026-04-20 17:48:51.145751085 +0000 @@ -3300,8 +3300,8 @@

    Load a single Mib into an agent. The MibName is the name of the Mib, -including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    +including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    @@ -3417,8 +3417,8 @@

    Load Mibs into an agent. If the agent cannot load all MIBs (the default value of the Force argument is false), it will indicate where loading was aborted. The MibName is the name of the Mib, including the path to where the compiled -mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even +mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even after failing to load a previous mib. Use with care.

    @@ -4444,8 +4444,8 @@ -

    Accepted type specifications are:

    -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
    --spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
    +

    Accepted type specifications are:

    -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
    +-spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
    @@ -4518,8 +4518,8 @@

    Registers a sub-agent under a sub-tree of another agent.

    It is easy to make mistakes when registering sub-agents and this activity should be done carefully. For example, a strange behaviour would result from the -following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    -snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since +following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    +snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since SA1 does not.

    @@ -4964,20 +4964,20 @@ Addresses and if there are no targets for which an Inform-Request is sent, Addresses is the empty list [].

    The receiver will first be sent the snmp_targets message, and then for each address in Addresses list, one of the two snmp_notification messages.

  • {Mod, Func, Args} - The info will be delivered via the function call:

    Mod:Func([Msg | Args])

    where Msg has the same content and purpose as the messages descrived above.

  • Address is a management target address and Addresses is a list of management -target addresses. They are defined as followes:

            Addresses  = [address()]
    -        Address    = address()
    -        address()  = v1_address() | v3_address()
    -        v1_address() = {TDomain, TAddress}
    -        v3_address() = {{TDomain, TAddress}, V3MsgData}
    -        TDomain    = tdoamin()
    -        TAddress   = taddress()
    -        tdomain()  = The oid of snmpUDPDomain
    +target addresses. They are defined as followes:

            Addresses  = [address()]
    +        Address    = address()
    +        address()  = v1_address() | v3_address()
    +        v1_address() = {TDomain, TAddress}
    +        v3_address() = {{TDomain, TAddress}, V3MsgData}
    +        TDomain    = tdoamin()
    +        TAddress   = taddress()
    +        tdomain()  = The oid of snmpUDPDomain
                          This is the only supported transport domain.
    -        taddress() = [A1, A2, A3, A4, P1, P3]
    +        taddress() = [A1, A2, A3, A4, P1, P3]
                          The 4 first bytes makes up the IP-address and the last 2,
                          the UDP-port number.
    -        V3MsgData  = v3_msg_data()
    -        v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information + V3MsgData = v3_msg_data() + v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information about the notification delivery will be delivered to the receiver via the callback functions defined by the snmpa_notification_delivery_info_receiver behaviour according to the content of the notification_delivery_info/0 @@ -6012,7 +6012,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_conf.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_conf.html 2026-04-20 17:48:51.205751457 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_conf.html 2026-04-20 17:48:51.205751457 +0000 @@ -3772,7 +3772,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_discovery_handler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_discovery_handler.html 2026-04-20 17:48:51.245751705 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_discovery_handler.html 2026-04-20 17:48:51.245751705 +0000 @@ -209,7 +209,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error.html 2026-04-20 17:48:51.277751904 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error.html 2026-04-20 17:48:51.277751904 +0000 @@ -234,7 +234,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_io.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_io.html 2026-04-20 17:48:51.309752102 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_io.html 2026-04-20 17:48:51.309752102 +0000 @@ -234,7 +234,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_logger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_logger.html 2026-04-20 17:48:51.345752325 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_logger.html 2026-04-20 17:48:51.345752325 +0000 @@ -235,7 +235,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_report.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_report.html 2026-04-20 17:48:51.377752524 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_error_report.html 2026-04-20 17:48:51.377752524 +0000 @@ -230,7 +230,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_local_db.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_local_db.html 2026-04-20 17:48:51.417752772 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_local_db.html 2026-04-20 17:48:51.417752772 +0000 @@ -692,7 +692,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_data.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_data.html 2026-04-20 17:48:51.453752996 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_data.html 2026-04-20 17:48:51.457753020 +0000 @@ -1089,7 +1089,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_storage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_storage.html 2026-04-20 17:48:51.493753244 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mib_storage.html 2026-04-20 17:48:51.497753268 +0000 @@ -812,7 +812,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mpd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mpd.html 2026-04-20 17:48:51.537753516 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_mpd.html 2026-04-20 17:48:51.537753516 +0000 @@ -976,7 +976,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface.html 2026-04-20 17:48:51.573753739 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface.html 2026-04-20 17:48:51.573753739 +0000 @@ -457,7 +457,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface_filter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface_filter.html 2026-04-20 17:48:51.605753938 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_network_interface_filter.html 2026-04-20 17:48:51.605753938 +0000 @@ -469,7 +469,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_delivery_info_receiver.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_delivery_info_receiver.html 2026-04-20 17:48:51.641754162 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_delivery_info_receiver.html 2026-04-20 17:48:51.637754137 +0000 @@ -389,7 +389,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_filter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_filter.html 2026-04-20 17:48:51.669754335 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_notification_filter.html 2026-04-20 17:48:51.673754360 +0000 @@ -294,7 +294,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_supervisor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_supervisor.html 2026-04-20 17:48:51.709754583 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpa_supervisor.html 2026-04-20 17:48:51.705754558 +0000 @@ -337,7 +337,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc.html 2026-04-20 17:48:51.745754808 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc.html 2026-04-20 17:48:51.745754808 +0000 @@ -379,7 +379,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc_cmd.html 2026-04-20 17:48:51.781755031 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpc_cmd.html 2026-04-20 17:48:51.781755031 +0000 @@ -89,7 +89,7 @@ -

    SNMP MIB compiler frontend

    Synopsis

    snmpc [options] file.mib | file.bin

    Description

    The snmpc program provides a way to run the SNMP MIB compiler of the Erlang +

    SNMP MIB compiler frontend

    Synopsis

    snmpc [options] file.mib | file.bin

    Description

    The snmpc program provides a way to run the SNMP MIB compiler of the Erlang system.

    snmpc compiles an SNMP MIB file. See compile/1,2 for more information.

    It can also be used to generate a header file (.hrl) with definitions of Erlang constants for the objects in the MIB. See mib_to_hrl/1.

    Compiler options

    The following options are supported (note that most of these relate to the @@ -156,7 +156,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm.html 2026-04-20 17:48:51.837755378 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm.html 2026-04-20 17:48:51.837755378 +0000 @@ -1973,8 +1973,8 @@

    Load a Mib into the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:load_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:load_mib(Dir ++ "MY-MIB").
    @@ -3554,8 +3554,8 @@

    Unload a Mib from the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:unload_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:unload_mib(Dir ++ "MY-MIB").
    @@ -4023,7 +4023,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_conf.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_conf.html 2026-04-20 17:48:51.885755675 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_conf.html 2026-04-20 17:48:51.881755651 +0000 @@ -1333,7 +1333,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_mpd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_mpd.html 2026-04-20 17:48:51.917755874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_mpd.html 2026-04-20 17:48:51.925755923 +0000 @@ -612,7 +612,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface.html 2026-04-20 17:48:51.961756147 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface.html 2026-04-20 17:48:51.961756147 +0000 @@ -539,7 +539,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface_filter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface_filter.html 2026-04-20 17:48:51.993756345 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_network_interface_filter.html 2026-04-20 17:48:51.997756370 +0000 @@ -461,7 +461,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_user.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_user.html 2026-04-20 17:48:52.037756618 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.20.1/doc/html/snmpm_user.html 2026-04-20 17:48:52.033756593 +0000 @@ -684,7 +684,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/404.html 2026-04-20 17:48:52.065756792 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/404.html 2026-04-20 17:48:52.065756792 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/api-reference.html 2026-04-20 17:48:52.093756966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/api-reference.html 2026-04-20 17:48:52.093756966 +0000 @@ -210,7 +210,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configurations.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configurations.html 2026-04-20 17:48:52.133757213 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configurations.html 2026-04-20 17:48:52.133757213 +0000 @@ -94,23 +94,23 @@ describe and define different ways by which they could be entered.

    Options for hardening are described in the Hardening SSH chapter. How the options for algorithm configuration interact are described in the Configuring algorithms in SSH chapter.

    Options configuration

    There are from OTP-23.0 two main ways to set an option:

    • Like before, in the Options parameter in the Erlang code in a call to for -example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

      ssh:connect(22, [{user,"foo"}])
    • In OTP Configuration Parameters:

      • In the erl command line:

        erl -ssh user \"foo\"
      • In the ssh.app file, in the env part

        {application, ssh,
        - [{description, "SSH-2 for Erlang/OTP"},
        -  {vsn, "4.9"},
        -  {modules, [ssh,
        +example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

        ssh:connect(22, [{user,"foo"}])
      • In OTP Configuration Parameters:

        • In the erl command line:

          erl -ssh user \"foo\"
        • In the ssh.app file, in the env part

          {application, ssh,
          + [{description, "SSH-2 for Erlang/OTP"},
          +  {vsn, "4.9"},
          +  {modules, [ssh,
                   ...
          -         ssh_xfer]},
          -  {registered, []},
          -  {applications, [kernel, stdlib, crypto, public_key]},
          -  {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE
          -  {mod, {ssh_app, []}},
          -       ...
        • In a .config file:

          erl -config ex1

          where ex1.config contains:

          [
          -{ssh, [{user, "foo"}]}
          -].

        If the option is intended only for a server or for a client, it may be set in -this way:

        [
        -{ssh, [{server_options,[{user, "foo"}]},
        -       {client_options,[{user, "bar"}]}
        -].

        A server (daemon) will use the user name foo, and a client will use the name + ssh_xfer]}, + {registered, []}, + {applications, [kernel, stdlib, crypto, public_key]}, + {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE + {mod, {ssh_app, []}}, + ...

      • In a .config file:

        erl -config ex1

        where ex1.config contains:

        [
        +{ssh, [{user, "foo"}]}
        +].

      If the option is intended only for a server or for a client, it may be set in +this way:

      [
      +{ssh, [{server_options,[{user, "foo"}]},
      +       {client_options,[{user, "bar"}]}
      +].

      A server (daemon) will use the user name foo, and a client will use the name bar.

    Precedence

    If an option is set in more than one way, what happens?

    There is an ordering, which is:

    If the same option is set at two different levels, the one at the highest level is used.

    The only exception is the @@ -169,17 +169,17 @@ 'hmac-sha1']}]}, {compression,[{client2server,[none,'zlib@openssh.com']}, {server2client,[none,'zlib@openssh.com']}]}]

    Note that the algorithms in the file ex2.config is not yet applied. They will -be when we start ssh:

    2> ssh:start().
    +be when we start ssh:

    2> ssh:start().
     ok
    -3> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes192-ctr']},
    -          {server2client,['aes192-ctr']}]},
    - {mac,[{client2server,['hmac-sha1']},
    -       {server2client,['hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]
    +3> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384']},
    + {public_key,['ssh-rsa']},
    + {cipher,[{client2server,['aes192-ctr']},
    +          {server2client,['aes192-ctr']}]},
    + {mac,[{client2server,['hmac-sha1']},
    +       {server2client,['hmac-sha1']}]},
    + {compression,[{client2server,[none,'zlib@openssh.com']},
    +               {server2client,[none,'zlib@openssh.com']}]}]
     4>

    We see that the algorithm set is changed to the one in the ex2.config. Since compression is not specified in the file, the hard-coded default is still used for that entry.

    Establishing a connection (ssh:connect et al) or starting a daemon (ssh:daemon)

    Both when the client establishes a connection with ssh:connect or other @@ -192,65 +192,65 @@ modify_algorithms on all levels in order starting with level 0 are applied.

    We continue the example above by connecting to a server and modifying the kex algorithm set. We remove the only one ('ecdh-sha2-nistp384') and add -'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    -                        [{modify_algorithms,
    -                                 [{rm,
    -                                     [ {kex,['ecdh-sha2-nistp384']} ]
    -				  },
    -                                  {append,
    -			             [ {kex,['curve25519-sha256@libssh.org']} ]
    -				  }
    -				 ]
    -	                 }
    -                        ]).
    -{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note -that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    -{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    -             {hkey,'ssh-rsa'},
    -             {send_mac,'hmac-sha1'},
    -             {recv_mac,'hmac-sha1'},
    -             {encrypt,'aes192-ctr'},
    -             {decrypt,'aes192-ctr'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the +'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    +                        [{modify_algorithms,
    +                                 [{rm,
    +                                     [ {kex,['ecdh-sha2-nistp384']} ]
    +				  },
    +                                  {append,
    +			             [ {kex,['curve25519-sha256@libssh.org']} ]
    +				  }
    +				 ]
    +	                 }
    +                        ]).
    +{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note +that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    +{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    +             {hkey,'ssh-rsa'},
    +             {send_mac,'hmac-sha1'},
    +             {recv_mac,'hmac-sha1'},
    +             {encrypt,'aes192-ctr'},
    +             {decrypt,'aes192-ctr'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the modify_algorithms on a lower level is applied to a preferred_algorithms on a higher level. We will do that by enabling the ssh-dss algorithm that is supported, -but not in the default set.

    The config file ex3.config has the contents:

    [
    - {ssh, [{modify_algorithms,
    -         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    -        }]}
    -].

    A newly started erlang shell shows that no 'ssh-dss' is present in the -public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    -['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +but not in the default set.

    The config file ex3.config has the contents:

    [
    + {ssh, [{modify_algorithms,
    +         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    +        }]}
    +].

    A newly started erlang shell shows that no 'ssh-dss' is present in the +public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    +['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
      'ecdsa-sha2-nistp256','ssh-ed25519','ssh-ed448',
    - 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    -2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
    + 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    +2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
     ok
    -3> {ok,C} = ssh:connect(loopback, 22,
    -                        [{preferred_algorithms,
    -                         [{public_key, ['ecdsa-sha2-nistp256']},
    -			  {kex, ['ecdh-sha2-nistp256']},
    -		          {cipher, ['chacha20-poly1305@openssh.com']},
    -			  {mac, ['hmac-sha2-256']},
    -			  {compression, [none]}
    -			  ]}
    -			 ]).
    -{ok,<0.101.0>}
    -4> ssh:connection_info(C,algorithms).
    -{algorithms,[{kex,'ecdh-sha2-nistp256'},
    -             {hkey,'ssh-dss'},
    -             {send_mac,'chacha20-poly1305@openssh.com'},
    -             {recv_mac,'chacha20-poly1305@openssh.com'},
    -             {encrypt,'chacha20-poly1305@openssh.com'},
    -             {decrypt,'chacha20-poly1305@openssh.com'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}
    +3> {ok,C} = ssh:connect(loopback, 22,
    +                        [{preferred_algorithms,
    +                         [{public_key, ['ecdsa-sha2-nistp256']},
    +			  {kex, ['ecdh-sha2-nistp256']},
    +		          {cipher, ['chacha20-poly1305@openssh.com']},
    +			  {mac, ['hmac-sha2-256']},
    +			  {compression, [none]}
    +			  ]}
    +			 ]).
    +{ok,<0.101.0>}
    +4> ssh:connection_info(C,algorithms).
    +{algorithms,[{kex,'ecdh-sha2-nistp256'},
    +             {hkey,'ssh-dss'},
    +             {send_mac,'chacha20-poly1305@openssh.com'},
    +             {recv_mac,'chacha20-poly1305@openssh.com'},
    +             {encrypt,'chacha20-poly1305@openssh.com'},
    +             {decrypt,'chacha20-poly1305@openssh.com'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}
     5>

    But 'ssh-dss' is selected although the call inserted only 'ecdsa-sha2-nistp256' as acceptable.

    This example showed that we could augment the set of algorithms with a config-file without the need to change the actual call.

    For demonstration purposes we used prepend instead of append. This forces @@ -308,7 +308,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configure_algos.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configure_algos.html 2026-04-20 17:48:52.181757511 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/configure_algos.html 2026-04-20 17:48:52.177757486 +0000 @@ -118,29 +118,29 @@ supported by the:

    • crypto app,
    • The cryptolib OTP is linked with, usually the one the OS uses, probably OpenSSL,
    • and finally what the SSH app implements

    Due to this, it impossible to list in documentation what algorithms that are available in a certain installation.

    There is an important command to list the actual algorithms and their ordering: -ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]

    To change the algorithm list, there are two options which can be used in + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com']}, + {server2client,[none,'zlib@openssh.com']}]}]

    To change the algorithm list, there are two options which can be used in ssh:connect/2,3,4 and ssh:daemon/2,3. The options could of course be used in all other functions that initiates connections.

    The options are @@ -151,98 +151,98 @@ ssh:chk_algos_opts(Opts). It mangles the options preferred_algorithms and modify_algorithms in the same way as ssh:daemon, ssh:connect and their friends does.

    Example 1

    Replace the kex algorithms list with the single algorithm -'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{kex, ['diffie-hellman-group14-sha256']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['diffie-hellman-group14-sha256']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{kex, ['diffie-hellman-group14-sha256']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['diffie-hellman-group14-sha256']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]

    Note that the unmentioned lists (public_key, cipher, mac and + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com']}, + {server2client,[none,'zlib@openssh.com']}]}]

    Note that the unmentioned lists (public_key, cipher, mac and compression) are unchanged.

    Example 2

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change both directions at once:

    2> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,['aes128-ctr']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change both directions at once:

    2> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,['aes128-ctr']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]

    Note that both lists in cipher has been changed to the provided value + 'rsa-sha2-512','ssh-dss']}, + {cipher,[{client2server,['aes128-ctr']}, + {server2client,['aes128-ctr']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com']}, + {server2client,[none,'zlib@openssh.com']}]}]

    Note that both lists in cipher has been changed to the provided value ('aes128-ctr').

    Example 3

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,[{client2server,['aes128-ctr']}]}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,[{client2server,['aes128-ctr']}]}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]

    Example 4

    It is of course possible to change more than one list:

    4> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,['aes128-ctr']},
    -		      {mac,['hmac-sha2-256']},
    -                      {kex,['ecdh-sha2-nistp384']},
    -		      {public_key,['ssh-rsa']},
    -		      {compression,[{server2client,[none]},
    -		                    {client2server,[zlib]}]}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256']},
    -       {server2client,['hmac-sha2-256']}]},
    - {compression,[{client2server,[zlib]},
    -               {server2client,[none]}]}]

    Note that the order of the tuples in the lists does not matter.

    Modifying the default set: modify_algorithms

    A situation where it might be useful to add an algorithm is when one need to use + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com']}, + {server2client,[none,'zlib@openssh.com']}]}]

    Example 4

    It is of course possible to change more than one list:

    4> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/hardening.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/hardening.html	2026-04-20 17:48:52.213757710 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/hardening.html	2026-04-20 17:48:52.209757685 +0000
    @@ -150,16 +150,16 @@
     could be replaced with a pwdfun plugin. The arity
     four variant (pwdfun_4()) can also be used for
     introducing delays after failed password checking attempts. Here is a simple
    -example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    -        case lists:member({User,Password}, my_user_pwds()) of
    +example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    +        case lists:member({User,Password}, my_user_pwds()) of
                 true ->
    -                {true, undefined}; % Reset delay time
    +                {true, undefined}; % Reset delay time
                 false when State == undefined ->
    -                timer:sleep(1000),
    -                {false, 2000}; % Next delay is 2000 ms
    -            false when is_integer(State) ->
    -                timer:sleep(State),
    -                {false, 2*State} % Double the delay for each failure
    +                timer:sleep(1000),
    +                {false, 2000}; % Next delay is 2000 ms
    +            false when is_integer(State) ->
    +                timer:sleep(State),
    +                {false, 2*State} % Double the delay for each failure
             end
     end.

    If a public key is used for logging in, there is normally no checking of the user name. It could be enabled by setting the option @@ -192,17 +192,17 @@ exploiting known faults or peculiarities learned by reading the public code.

    Each SSH client or daemon presents themselves to each other with brand and version. This may look like

    SSH-2.0-Erlang/4.10

    or

    SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

    This brand and version may be changed with the option id_string. We start a daemon with that -option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each +option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each connection attempt. See the reference manual for id_string.

    Client connection options

    A client could limit the time for the initial tcp connection establishment with the option connect_timeout. The time is in milliseconds, and the initial value is infinity.

    The negotiation (session setup time) time can be limited with the parameter NegotiationTimeout in a call establishing an ssh session, for example ssh:connect/3.

    SFTP Security

    Root Directory Isolation

    The root option (see ssh_sftpd) restricts SFTP users to a -specific directory tree, preventing access to files outside that directory.

    Example:

    ssh:daemon(Port, [
    -    {subsystems, [ssh_sftpd:subsystem_spec([{root, "/home/sftpuser"}])]},
    +specific directory tree, preventing access to files outside that directory.

    Example:

    ssh:daemon(Port, [
    +    {subsystems, [ssh_sftpd:subsystem_spec([{root, "/home/sftpuser"}])]},
         ...
    -]).

    Important: The root option is configured per daemon, not per user. All +]).

    Important: The root option is configured per daemon, not per user. All users connecting to the same daemon share the same root directory. For per-user isolation, consider running separate daemon instances on different ports or using OS-level mechanisms (PAM chroot, containers, file permissions).

    Defense-in-depth: For high-security deployments, combine the root option @@ -250,7 +250,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/introduction.html 2026-04-20 17:48:52.241757884 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/introduction.html 2026-04-20 17:48:52.245757908 +0000 @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/notes.html 2026-04-20 17:48:52.301758256 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/notes.html 2026-04-20 17:48:52.309758305 +0000 @@ -738,7 +738,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/search.html 2026-04-20 17:48:52.337758479 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/search.html 2026-04-20 17:48:52.337758479 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/configurations.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/configurations.xhtml 2026-04-20 15:20:17.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/configurations.xhtml 2042-05-23 04:39:08.000000000 +0000 @@ -22,23 +22,23 @@ describe and define different ways by which they could be entered.

    Options for hardening are described in the Hardening SSH chapter. How the options for algorithm configuration interact are described in the Configuring algorithms in SSH chapter.

    Options configuration

    There are from OTP-23.0 two main ways to set an option:

    • Like before, in the Options parameter in the Erlang code in a call to for -example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

      ssh:connect(22, [{user,"foo"}])
    • In OTP Configuration Parameters:

      • In the erl command line:

        erl -ssh user \"foo\"
      • In the ssh.app file, in the env part

        {application, ssh,
        - [{description, "SSH-2 for Erlang/OTP"},
        -  {vsn, "4.9"},
        -  {modules, [ssh,
        +example ssh:daemon/3 or ssh:connect/3 or any of their variants. Example:

        ssh:connect(22, [{user,"foo"}])
      • In OTP Configuration Parameters:

        • In the erl command line:

          erl -ssh user \"foo\"
        • In the ssh.app file, in the env part

          {application, ssh,
          + [{description, "SSH-2 for Erlang/OTP"},
          +  {vsn, "4.9"},
          +  {modules, [ssh,
                   ...
          -         ssh_xfer]},
          -  {registered, []},
          -  {applications, [kernel, stdlib, crypto, public_key]},
          -  {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE
          -  {mod, {ssh_app, []}},
          -       ...
        • In a .config file:

          erl -config ex1

          where ex1.config contains:

          [
          -{ssh, [{user, "foo"}]}
          -].

        If the option is intended only for a server or for a client, it may be set in -this way:

        [
        -{ssh, [{server_options,[{user, "foo"}]},
        -       {client_options,[{user, "bar"}]}
        -].

        A server (daemon) will use the user name foo, and a client will use the name + ssh_xfer]}, + {registered, []}, + {applications, [kernel, stdlib, crypto, public_key]}, + {env, [{user, "bar"]}, % <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE + {mod, {ssh_app, []}}, + ...

  • In a .config file:

    erl -config ex1

    where ex1.config contains:

    [
    +{ssh, [{user, "foo"}]}
    +].
  • If the option is intended only for a server or for a client, it may be set in +this way:

    [
    +{ssh, [{server_options,[{user, "foo"}]},
    +       {client_options,[{user, "bar"}]}
    +].

    A server (daemon) will use the user name foo, and a client will use the name bar.

    Precedence

    If an option is set in more than one way, what happens?

    There is an ordering, which is:

    If the same option is set at two different levels, the one at the highest level is used.

    The only exception is the @@ -97,17 +97,17 @@ 'hmac-sha1']}]}, {compression,[{client2server,[none,'zlib@openssh.com']}, {server2client,[none,'zlib@openssh.com']}]}]

    Note that the algorithms in the file ex2.config is not yet applied. They will -be when we start ssh:

    2> ssh:start().
    +be when we start ssh:

    2> ssh:start().
     ok
    -3> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes192-ctr']},
    -          {server2client,['aes192-ctr']}]},
    - {mac,[{client2server,['hmac-sha1']},
    -       {server2client,['hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]
    +3> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384']},
    + {public_key,['ssh-rsa']},
    + {cipher,[{client2server,['aes192-ctr']},
    +          {server2client,['aes192-ctr']}]},
    + {mac,[{client2server,['hmac-sha1']},
    +       {server2client,['hmac-sha1']}]},
    + {compression,[{client2server,[none,'zlib@openssh.com']},
    +               {server2client,[none,'zlib@openssh.com']}]}]
     4>

    We see that the algorithm set is changed to the one in the ex2.config. Since compression is not specified in the file, the hard-coded default is still used for that entry.

    Establishing a connection (ssh:connect et al) or starting a daemon (ssh:daemon)

    Both when the client establishes a connection with ssh:connect or other @@ -120,65 +120,65 @@ modify_algorithms on all levels in order starting with level 0 are applied.

    We continue the example above by connecting to a server and modifying the kex algorithm set. We remove the only one ('ecdh-sha2-nistp384') and add -'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    -                        [{modify_algorithms,
    -                                 [{rm,
    -                                     [ {kex,['ecdh-sha2-nistp384']} ]
    -				  },
    -                                  {append,
    -			             [ {kex,['curve25519-sha256@libssh.org']} ]
    -				  }
    -				 ]
    -	                 }
    -                        ]).
    -{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note -that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    -{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    -             {hkey,'ssh-rsa'},
    -             {send_mac,'hmac-sha1'},
    -             {recv_mac,'hmac-sha1'},
    -             {encrypt,'aes192-ctr'},
    -             {decrypt,'aes192-ctr'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the +'curve25519-sha256@libssh.org' by appending it to the now empty list:

    4> {ok,C} = ssh:connect(loopback, 22,
    +                        [{modify_algorithms,
    +                                 [{rm,
    +                                     [ {kex,['ecdh-sha2-nistp384']} ]
    +				  },
    +                                  {append,
    +			             [ {kex,['curve25519-sha256@libssh.org']} ]
    +				  }
    +				 ]
    +	                 }
    +                        ]).
    +{ok,>0.118.0>}

    We check which algorithms are negotiated by the client and the server, and note +that the (only) kex algorithm 'curve25519-sha256@libssh.org' was selected:

    5> ssh:connection_info(C, algorithms).
    +{algorithms,[{kex,'curve25519-sha256@libssh.org'},
    +             {hkey,'ssh-rsa'},
    +             {send_mac,'hmac-sha1'},
    +             {recv_mac,'hmac-sha1'},
    +             {encrypt,'aes192-ctr'},
    +             {decrypt,'aes192-ctr'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}

    Example of modify_algorithms handling

    We will now check if the modify_algorithms on a lower level is applied to a preferred_algorithms on a higher level. We will do that by enabling the ssh-dss algorithm that is supported, -but not in the default set.

    The config file ex3.config has the contents:

    [
    - {ssh, [{modify_algorithms,
    -         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    -        }]}
    -].

    A newly started erlang shell shows that no 'ssh-dss' is present in the -public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    -['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +but not in the default set.

    The config file ex3.config has the contents:

    [
    + {ssh, [{modify_algorithms,
    +         [ {prepend, [{public_key, ['ssh-dss']}]} ]
    +        }]}
    +].

    A newly started erlang shell shows that no 'ssh-dss' is present in the +public_key entry:

    1> proplists:get_value(public_key, ssh:default_algorithms()).
    +['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
      'ecdsa-sha2-nistp256','ssh-ed25519','ssh-ed448',
    - 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    -2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
    + 'rsa-sha2-256','rsa-sha2-512','ssh-rsa']
    +2>

    A call to ssh:connect/3 removes all algorithms but one of each type:

    2> ssh:start().
     ok
    -3> {ok,C} = ssh:connect(loopback, 22,
    -                        [{preferred_algorithms,
    -                         [{public_key, ['ecdsa-sha2-nistp256']},
    -			  {kex, ['ecdh-sha2-nistp256']},
    -		          {cipher, ['chacha20-poly1305@openssh.com']},
    -			  {mac, ['hmac-sha2-256']},
    -			  {compression, [none]}
    -			  ]}
    -			 ]).
    -{ok,<0.101.0>}
    -4> ssh:connection_info(C,algorithms).
    -{algorithms,[{kex,'ecdh-sha2-nistp256'},
    -             {hkey,'ssh-dss'},
    -             {send_mac,'chacha20-poly1305@openssh.com'},
    -             {recv_mac,'chacha20-poly1305@openssh.com'},
    -             {encrypt,'chacha20-poly1305@openssh.com'},
    -             {decrypt,'chacha20-poly1305@openssh.com'},
    -             {compress,none},
    -             {decompress,none},
    -             {send_ext_info,false},
    -             {recv_ext_info,true}]}
    +3> {ok,C} = ssh:connect(loopback, 22,
    +                        [{preferred_algorithms,
    +                         [{public_key, ['ecdsa-sha2-nistp256']},
    +			  {kex, ['ecdh-sha2-nistp256']},
    +		          {cipher, ['chacha20-poly1305@openssh.com']},
    +			  {mac, ['hmac-sha2-256']},
    +			  {compression, [none]}
    +			  ]}
    +			 ]).
    +{ok,<0.101.0>}
    +4> ssh:connection_info(C,algorithms).
    +{algorithms,[{kex,'ecdh-sha2-nistp256'},
    +             {hkey,'ssh-dss'},
    +             {send_mac,'chacha20-poly1305@openssh.com'},
    +             {recv_mac,'chacha20-poly1305@openssh.com'},
    +             {encrypt,'chacha20-poly1305@openssh.com'},
    +             {decrypt,'chacha20-poly1305@openssh.com'},
    +             {compress,none},
    +             {decompress,none},
    +             {send_ext_info,false},
    +             {recv_ext_info,true}]}
     5>

    But 'ssh-dss' is selected although the call inserted only 'ecdsa-sha2-nistp256' as acceptable.

    This example showed that we could augment the set of algorithms with a config-file without the need to change the actual call.

    For demonstration purposes we used prepend instead of append. This forces /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/configure_algos.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2026-04-20 15:20:17.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2042-05-23 04:39:08.000000000 +0000 @@ -46,29 +46,29 @@ supported by the:

    • crypto app,
    • The cryptolib OTP is linked with, usually the one the OS uses, probably OpenSSL,
    • and finally what the SSH app implements

    Due to this, it impossible to list in documentation what algorithms that are available in a certain installation.

    There is an important command to list the actual algorithms and their ordering: -ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +ssh:default_algorithms/0.

    0> ssh:default_algorithms().
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]

    To change the algorithm list, there are two options which can be used in + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com']}, + {server2client,[none,'zlib@openssh.com']}]}]

    To change the algorithm list, there are two options which can be used in ssh:connect/2,3,4 and ssh:daemon/2,3. The options could of course be used in all other functions that initiates connections.

    The options are @@ -79,98 +79,98 @@ ssh:chk_algos_opts(Opts). It mangles the options preferred_algorithms and modify_algorithms in the same way as ssh:daemon, ssh:connect and their friends does.

    Example 1

    Replace the kex algorithms list with the single algorithm -'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{kex, ['diffie-hellman-group14-sha256']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['diffie-hellman-group14-sha256']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +'diffie-hellman-group14-sha256':

    1> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{kex, ['diffie-hellman-group14-sha256']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['diffie-hellman-group14-sha256']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes256-gcm@openssh.com',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes256-gcm@openssh.com',
                               'aes256-ctr','aes192-ctr','aes128-gcm@openssh.com',
    -                          'aes128-ctr','aes128-cbc','3des-cbc']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +                          'aes128-ctr','aes128-cbc','3des-cbc']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]

    Note that the unmentioned lists (public_key, cipher, mac and + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com']}, + {server2client,[none,'zlib@openssh.com']}]}]

    Note that the unmentioned lists (public_key, cipher, mac and compression) are unchanged.

    Example 2

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change both directions at once:

    2> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,['aes128-ctr']}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change both directions at once:

    2> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,['aes128-ctr']}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]

    Note that both lists in cipher has been changed to the provided value + 'rsa-sha2-512','ssh-dss']}, + {cipher,[{client2server,['aes128-ctr']}, + {server2client,['aes128-ctr']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com']}, + {server2client,[none,'zlib@openssh.com']}]}]

    Note that both lists in cipher has been changed to the provided value ('aes128-ctr').

    Example 3

    In the lists that are divided in two for the two directions (for example cipher) it is -possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,[{client2server,['aes128-ctr']}]}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
    +possible to change only one of the directions:

    3> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    +                     [{cipher,[{client2server,['aes128-ctr']}]}
    +                     ]
    +                }
    +              ]).
    +[{kex,['ecdh-sha2-nistp384','ecdh-sha2-nistp521',
            'ecdh-sha2-nistp256','diffie-hellman-group-exchange-sha256',
            'diffie-hellman-group16-sha512',
            'diffie-hellman-group18-sha512',
            'diffie-hellman-group14-sha256',
            'diffie-hellman-group14-sha1',
    -       'diffie-hellman-group-exchange-sha1']},
    - {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
    +       'diffie-hellman-group-exchange-sha1']},
    + {public_key,['ecdsa-sha2-nistp384','ecdsa-sha2-nistp521',
                   'ecdsa-sha2-nistp256','ssh-rsa','rsa-sha2-256',
    -              'rsa-sha2-512','ssh-dss']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
    +              'rsa-sha2-512','ssh-dss']},
    + {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes256-gcm@openssh.com','aes256-ctr',
                               'aes192-ctr','aes128-gcm@openssh.com','aes128-ctr',
    -                          'aes128-cbc','3des-cbc']}]},
    - {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']},
    -       {server2client,['hmac-sha2-256','hmac-sha2-512',
    -                       'hmac-sha1']}]},
    - {compression,[{client2server,[none,'zlib@openssh.com']},
    -               {server2client,[none,'zlib@openssh.com']}]}]

    Example 4

    It is of course possible to change more than one list:

    4> ssh:chk_algos_opts(
    -               [{preferred_algorithms,
    -                     [{cipher,['aes128-ctr']},
    -		      {mac,['hmac-sha2-256']},
    -                      {kex,['ecdh-sha2-nistp384']},
    -		      {public_key,['ssh-rsa']},
    -		      {compression,[{server2client,[none]},
    -		                    {client2server,[zlib]}]}
    -                     ]
    -                }
    -              ]).
    -[{kex,['ecdh-sha2-nistp384']},
    - {public_key,['ssh-rsa']},
    - {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-ctr']}]},
    - {mac,[{client2server,['hmac-sha2-256']},
    -       {server2client,['hmac-sha2-256']}]},
    - {compression,[{client2server,[zlib]},
    -               {server2client,[none]}]}]

    Note that the order of the tuples in the lists does not matter.

    Modifying the default set: modify_algorithms

    A situation where it might be useful to add an algorithm is when one need to use + 'aes128-cbc','3des-cbc']}]}, + {mac,[{client2server,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}, + {server2client,['hmac-sha2-256','hmac-sha2-512', + 'hmac-sha1']}]}, + {compression,[{client2server,[none,'zlib@openssh.com']}, + {server2client,[none,'zlib@openssh.com']}]}]

    Example 4

    It is of course possible to change more than one list:

    4> ssh:chk_algos_opts(
    +               [{preferred_algorithms,
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/content.opf	2026-04-20 15:20:17.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/content.opf	2042-05-23 04:39:08.000000000 +0000
    @@ -4,10 +4,10 @@
              version="3.0">
       
         ssh - 5.5.1
    -    urn:uuid:78a06e9d-7dc5-d9ef-f456-3d070e4229c4
    +    urn:uuid:bd13e8b2-149e-0820-03fd-48ae7a0d99f5
         en
     
    -    2026-04-20T15:20:17Z
    +    2042-05-23T04:39:08Z
     
       
       
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/hardening.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/hardening.xhtml	2026-04-20 15:20:17.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/hardening.xhtml	2042-05-23 04:39:08.000000000 +0000
    @@ -78,16 +78,16 @@
     could be replaced with a pwdfun plugin. The arity
     four variant (pwdfun_4()) can also be used for
     introducing delays after failed password checking attempts. Here is a simple
    -example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    -        case lists:member({User,Password}, my_user_pwds()) of
    +example of such a pwdfun:

    fun(User, Password, _PeerAddress, State) ->
    +        case lists:member({User,Password}, my_user_pwds()) of
                 true ->
    -                {true, undefined}; % Reset delay time
    +                {true, undefined}; % Reset delay time
                 false when State == undefined ->
    -                timer:sleep(1000),
    -                {false, 2000}; % Next delay is 2000 ms
    -            false when is_integer(State) ->
    -                timer:sleep(State),
    -                {false, 2*State} % Double the delay for each failure
    +                timer:sleep(1000),
    +                {false, 2000}; % Next delay is 2000 ms
    +            false when is_integer(State) ->
    +                timer:sleep(State),
    +                {false, 2*State} % Double the delay for each failure
             end
     end.

    If a public key is used for logging in, there is normally no checking of the user name. It could be enabled by setting the option @@ -120,17 +120,17 @@ exploiting known faults or peculiarities learned by reading the public code.

    Each SSH client or daemon presents themselves to each other with brand and version. This may look like

    SSH-2.0-Erlang/4.10

    or

    SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

    This brand and version may be changed with the option id_string. We start a daemon with that -option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each +option:

    	ssh:daemon(1234, [{id_string,"hi there"}, ... ]).

    and the daemon will present itself as:

    SSH-2.0-hi there

    It is possible to replace the string with one randomly generated for each connection attempt. See the reference manual for id_string.

    Client connection options

    A client could limit the time for the initial tcp connection establishment with the option connect_timeout. The time is in milliseconds, and the initial value is infinity.

    The negotiation (session setup time) time can be limited with the parameter NegotiationTimeout in a call establishing an ssh session, for example ssh:connect/3.

    SFTP Security

    Root Directory Isolation

    The root option (see ssh_sftpd) restricts SFTP users to a -specific directory tree, preventing access to files outside that directory.

    Example:

    ssh:daemon(Port, [
    -    {subsystems, [ssh_sftpd:subsystem_spec([{root, "/home/sftpuser"}])]},
    +specific directory tree, preventing access to files outside that directory.

    Example:

    ssh:daemon(Port, [
    +    {subsystems, [ssh_sftpd:subsystem_spec([{root, "/home/sftpuser"}])]},
         ...
    -]).

    Important: The root option is configured per daemon, not per user. All +]).

    Important: The root option is configured per daemon, not per user. All users connecting to the same daemon share the same root directory. For per-user isolation, consider running separate daemon instances on different ports or using OS-level mechanisms (PAM chroot, containers, file permissions).

    Defense-in-depth: For high-security deployments, combine the root option /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2026-04-20 15:20:17.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2042-05-23 04:39:08.000000000 +0000 @@ -29,11 +29,11 @@ authentication.

    Ssh_agent implements the ssh_client_key_api, to allow it to be used by setting the option key_cb when starting a client (with for example ssh:connect, -ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, +ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, the socket path will be fetched from the SSH_AUTH_SOCK environment variable, which is the default socket path in the agent implementation of OpenSSH.

    In order to set a different socket path the socket_path -option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be +option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be called from the user's code!

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/ssh.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/ssh.xhtml 2026-04-20 15:20:17.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/ssh.xhtml 2042-05-23 04:39:08.000000000 +0000 @@ -2179,14 +2179,14 @@

    List of algorithms to use in the algorithm negotiation. The default algs_list/0 can be obtained from default_algorithms/0.

    If an alg_entry() is missing in the algs_list(), the default value is used for -that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    -	  [{public_key,['ssh-rsa','ssh-dss']},
    -	  {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-cbc','3des-cbc']}]},
    -	  {mac,['hmac-sha2-256','hmac-sha1']},
    -	  {compression,[none,zlib]}
    -	  ]
    -	  }

    The example specifies different algorithms in the two directions (client2server +that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    +	  [{public_key,['ssh-rsa','ssh-dss']},
    +	  {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes128-cbc','3des-cbc']}]},
    +	  {mac,['hmac-sha2-256','hmac-sha1']},
    +	  {compression,[none,zlib]}
    +	  ]
    +	  }

    The example specifies different algorithms in the two directions (client2server and server2client), for cipher but specifies the same algorithms for mac and compression in both directions. The kex (key exchange) is implicit but public_key is set explicitly.

    For background and more examples see the @@ -5404,21 +5404,21 @@

    hostkey_fingerprint([DigestType], HostKey) -> [string()]hostkey_fingerprint(DigestType, HostKey) -> string()

    Calculates a ssh fingerprint from a public host key as openssh does.

    The algorithm in hostkey_fingerprint/1 is md5 to be compatible with older ssh-keygen commands. The string from the second variant is -prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
    +prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
      "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 3> ssh:hostkey_fingerprint(md5,Key).
    + 3> ssh:hostkey_fingerprint(md5,Key).
      "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 4> ssh:hostkey_fingerprint(sha,Key).
    + 4> ssh:hostkey_fingerprint(sha,Key).
      "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"
     
    - 5> ssh:hostkey_fingerprint(sha256,Key).
    + 5> ssh:hostkey_fingerprint(sha256,Key).
      "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"
     
    - 6> ssh:hostkey_fingerprint([sha,sha256],Key).
    - ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY",
    -  "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    +
    6> ssh:hostkey_fingerprint([sha,sha256],Key). + ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY", + "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/using_ssh.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2026-04-20 15:20:17.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2042-05-23 04:39:08.000000000 +0000 @@ -26,9 +26,9 @@ entering a password). Also, ssh.example.com is a known host in the known_hosts file of the user otptest. This means that host-verification can be done without user-interaction.

    Using the Erlang ssh Terminal Client

    The user otptest, which has bash as default shell, uses the ssh:shell/1 -client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
    +client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
     ok
    -2> {ok, S} = ssh:shell("ssh.example.com").
    +2> {ok, S} = ssh:shell("ssh.example.com").
     otptest@ssh.example.com:> pwd
     /home/otptest
     otptest@ssh.example.com:> exit
    @@ -41,11 +41,11 @@
     [...]
     $bash> ssh-keygen -t rsa -f /tmp/otptest_user/.ssh/id_rsa
     [...]

    Step 2. Create the file /tmp/otptest_user/.ssh/authorized_keys and add the -content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
    +content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    -{ok,<0.54.0>}
    +2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    +{ok,<0.54.0>}
     3>

    Step 4. Use the OpenSSH client from a shell to connect to the Erlang ssh daemon:

    $bash> ssh ssh.example.com -p 8989  -i /tmp/otptest_user/.ssh/id_rsa \
                       -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts
    @@ -56,42 +56,42 @@
     Eshell V5.10  (abort with ^G)
     1>

    There are two ways of shutting down an ssh daemon, see Step 5a and Step 5b.

    Step 5a. Shut down the Erlang ssh daemon so that it stops the listener but -leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
    +leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
     ok
     4>

    Step 5b. Shut down the Erlang ssh daemon so that it stops the listener and -all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
    +all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
     ok
     4>

    One-Time Execution

    Erlang client contacting OS standard ssh server

    In the following example, the Erlang shell is the client process that receives the channel replies as Erlang messages.

    Do an one-time execution of a remote OS command ("pwd") over ssh to the ssh -server of the OS at the host "ssh.example.com":

    1> ssh:start().
    +server of the OS at the host "ssh.example.com":

    1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    -{ok,<0.57.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    -5> flush(). % Get all pending messages. NOTE: ordering may vary!
    -Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    -Shell got {ssh_cm,<0.57.0>,{eof,0}}
    -Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.57.0>,{closed,0}}
    +2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    +{ok,<0.57.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    +5> flush(). % Get all pending messages. NOTE: ordering may vary!
    +Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    +Shell got {ssh_cm,<0.57.0>,{eof,0}}
    +Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.57.0>,{closed,0}}
     ok
    -6> ssh:connection_info(ConnectionRef, channels).
    -{channels,[]}
    +6> ssh:connection_info(ConnectionRef, channels).
    +{channels,[]}
     7>

    See ssh_connection and ssh_connection:exec/4 for finding documentation of the channel messages.

    To collect the channel messages in a program, use receive...end instead of flush/1:

    5> receive
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    -5>         {ok,Result}
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    -5>         {error,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    +5>         {ok,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    +5>         {error,Result}
     5> end.
    -{ok,<<"/home/otptest\n">>}
    +{ok,<<"/home/otptest\n">>}
     6>

    Note that only the exec channel is closed after the one-time execution. The connection is still up and can handle previously opened channels. It is also possible to open a new channel:

    % try to open a new channel to check if the ConnectionRef is still open
    -7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,1}
    +7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,1}
     8>

    To close the connection, call the function ssh:close(ConnectionRef). As an alternative, set the option {idle_time, 1} when opening the @@ -100,23 +100,23 @@ "command" must be as if entered into the erlang shell, that is a sequence of Erlang expressions ended by a period (.). Variables bound in that sequence will keep their bindings throughout the expression -sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in +sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in Step 3 above:

    $bash> ssh ssh.example.com -p 8989 "A=1, B=2, 3 == (A + B)."
     true
     $bash>

    The same example but now using the Erlang ssh client to contact the Erlang -server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    -{ok,<0.216.0>}
    -2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -3> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    +{ok,<0.216.0>}
    +2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +3> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "A=1, B=2, 3 == (A + B).",
    -                                 infinity).
    +                                 infinity).
     success
    -4> flush().
    -Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    -Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.216.0>,{eof,0}}
    -Shell got {ssh_cm,<0.216.0>,{closed,0}}
    +4> flush().
    +Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    +Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.216.0>,{eof,0}}
    +Shell got {ssh_cm,<0.216.0>,{closed,0}}
     ok
     5>

    Note that Erlang shell specific functions and control sequences like for example h(). are not supported.

    I/O from a function called in an Erlang ssh daemon

    Output to stdout on the server side is also displayed as well as the resulting @@ -131,36 +131,36 @@ write something: [a,b,c]. {ok,[a,b,c]} $bash>

    The same example but using the Erlang ssh client:

    
    -Eshell V10.5.2  (abort with ^G)
    -1> ssh:start().
    +Eshell V10.5.2  (abort with ^G)
    +1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    -{ok,<0.92.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    +{ok,<0.92.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "io:read(\"write something: \").",
    -                                 infinity).
    +                                 infinity).
     success
    -5> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
    +5> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
     ok
     % All data is sent as binaries with string contents:
    -6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
    +6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
     ok
    -7> flush().
    +7> flush().
     ok
     %% Nothing is received, because the io:read/1
     %% requires the input line to end with a newline.
     
     %% Send a newline (it could have been included in the last send):
    -8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
    +8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
     ok
    -9> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    -Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.92.0>,{eof,0}}
    -Shell got {ssh_cm,<0.92.0>,{closed,0}}
    +9> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    +Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.92.0>,{eof,0}}
    +Shell got {ssh_cm,<0.92.0>,{closed,0}}
     ok
     10>

    Configuring the server's (daemon's) command execution

    Every time a daemon is started, it enables one-time execution of commands as described in the @@ -171,44 +171,44 @@ ssh:daemon/2,3 and exec_daemon_option() for details.

    Examples of the two ways to configure the exec evaluator:

    1. Disable one-time execution.
      To modify the daemon start example above to reject one-time execution requests, we change Step 3 by adding the -option {exec, disabled} to:
    1> ssh:start().
    +option {exec, disabled} to:
    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"},
    -                                  {exec, disabled}
    -                                 ]).
    -{ok,<0.54.0>}
    +2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"},
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.html	2026-04-20 17:48:52.645760390 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh.html	2026-04-20 17:48:52.645760390 +0000
    @@ -2266,14 +2266,14 @@
     
     

    List of algorithms to use in the algorithm negotiation. The default algs_list/0 can be obtained from default_algorithms/0.

    If an alg_entry() is missing in the algs_list(), the default value is used for -that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    -	  [{public_key,['ssh-rsa','ssh-dss']},
    -	  {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-cbc','3des-cbc']}]},
    -	  {mac,['hmac-sha2-256','hmac-sha1']},
    -	  {compression,[none,zlib]}
    -	  ]
    -	  }

    The example specifies different algorithms in the two directions (client2server +that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    +	  [{public_key,['ssh-rsa','ssh-dss']},
    +	  {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes128-cbc','3des-cbc']}]},
    +	  {mac,['hmac-sha2-256','hmac-sha1']},
    +	  {compression,[none,zlib]}
    +	  ]
    +	  }

    The example specifies different algorithms in the two directions (client2server and server2client), for cipher but specifies the same algorithms for mac and compression in both directions. The kex (key exchange) is implicit but public_key is set explicitly.

    For background and more examples see the @@ -5516,21 +5516,21 @@

    hostkey_fingerprint([DigestType], HostKey) -> [string()]hostkey_fingerprint(DigestType, HostKey) -> string()

    Calculates a ssh fingerprint from a public host key as openssh does.

    The algorithm in hostkey_fingerprint/1 is md5 to be compatible with older ssh-keygen commands. The string from the second variant is -prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
    +prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
      "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 3> ssh:hostkey_fingerprint(md5,Key).
    + 3> ssh:hostkey_fingerprint(md5,Key).
      "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 4> ssh:hostkey_fingerprint(sha,Key).
    + 4> ssh:hostkey_fingerprint(sha,Key).
      "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"
     
    - 5> ssh:hostkey_fingerprint(sha256,Key).
    + 5> ssh:hostkey_fingerprint(sha256,Key).
      "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"
     
    - 6> ssh:hostkey_fingerprint([sha,sha256],Key).
    - ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY",
    -  "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    +
    6> ssh:hostkey_fingerprint([sha,sha256],Key). + ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY", + "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    @@ -6113,7 +6113,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_agent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_agent.html 2026-04-20 17:48:52.685760639 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_agent.html 2026-04-20 17:48:52.681760614 +0000 @@ -100,11 +100,11 @@ authentication.

    Ssh_agent implements the ssh_client_key_api, to allow it to be used by setting the option key_cb when starting a client (with for example ssh:connect, -ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, +ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, the socket path will be fetched from the SSH_AUTH_SOCK environment variable, which is the default socket path in the agent implementation of OpenSSH.

    In order to set a different socket path the socket_path -option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be +option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be called from the user's code!

    @@ -532,7 +532,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_app.html 2026-04-20 17:48:52.725760887 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_app.html 2026-04-20 17:48:52.725760887 +0000 @@ -231,7 +231,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_channel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_channel.html 2026-04-20 17:48:52.765761134 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_channel.html 2026-04-20 17:48:52.765761134 +0000 @@ -952,7 +952,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_key_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_key_api.html 2026-04-20 17:48:52.797761333 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_client_key_api.html 2026-04-20 17:48:52.801761358 +0000 @@ -506,7 +506,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_connection.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_connection.html 2026-04-20 17:48:52.849761656 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_connection.html 2026-04-20 17:48:52.849761656 +0000 @@ -1982,7 +1982,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_file.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_file.html 2026-04-20 17:48:52.893761929 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_file.html 2026-04-20 17:48:52.897761953 +0000 @@ -1022,7 +1022,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_channel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_channel.html 2026-04-20 17:48:52.929762152 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_channel.html 2026-04-20 17:48:52.929762152 +0000 @@ -352,7 +352,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_key_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_key_api.html 2026-04-20 17:48:52.957762325 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_server_key_api.html 2026-04-20 17:48:52.957762325 +0000 @@ -296,7 +296,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftp.html 2026-04-20 17:48:53.013762673 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftp.html 2026-04-20 17:48:53.017762698 +0000 @@ -2889,7 +2889,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftpd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftpd.html 2026-04-20 17:48:53.049762896 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/ssh_sftpd.html 2026-04-20 17:48:53.049762896 +0000 @@ -220,7 +220,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/terminology.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/terminology.html 2026-04-20 17:48:53.081763095 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/terminology.html 2026-04-20 17:48:53.081763095 +0000 @@ -188,7 +188,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/using_ssh.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/using_ssh.html 2026-04-20 17:48:53.117763318 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.5.1/doc/html/using_ssh.html 2026-04-20 17:48:53.117763318 +0000 @@ -98,9 +98,9 @@ entering a password). Also, ssh.example.com is a known host in the known_hosts file of the user otptest. This means that host-verification can be done without user-interaction.

    Using the Erlang ssh Terminal Client

    The user otptest, which has bash as default shell, uses the ssh:shell/1 -client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
    +client to connect to the OpenSSH daemon running on a host called ssh.example.com:

    1> ssh:start().
     ok
    -2> {ok, S} = ssh:shell("ssh.example.com").
    +2> {ok, S} = ssh:shell("ssh.example.com").
     otptest@ssh.example.com:> pwd
     /home/otptest
     otptest@ssh.example.com:> exit
    @@ -113,11 +113,11 @@
     [...]
     $bash> ssh-keygen -t rsa -f /tmp/otptest_user/.ssh/id_rsa
     [...]

    Step 2. Create the file /tmp/otptest_user/.ssh/authorized_keys and add the -content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
    +content of /tmp/otptest_user/.ssh/id_rsa.pub.

    Step 3. Start the Erlang ssh daemon:

    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    -{ok,<0.54.0>}
    +2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"}]).
    +{ok,<0.54.0>}
     3>

    Step 4. Use the OpenSSH client from a shell to connect to the Erlang ssh daemon:

    $bash> ssh ssh.example.com -p 8989  -i /tmp/otptest_user/.ssh/id_rsa \
                       -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts
    @@ -128,42 +128,42 @@
     Eshell V5.10  (abort with ^G)
     1>

    There are two ways of shutting down an ssh daemon, see Step 5a and Step 5b.

    Step 5a. Shut down the Erlang ssh daemon so that it stops the listener but -leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
    +leaves existing connections, started by the listener, operational:

    3> ssh:stop_listener(Sshd).
     ok
     4>

    Step 5b. Shut down the Erlang ssh daemon so that it stops the listener and -all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
    +all connections started by the listener:

    3> ssh:stop_daemon(Sshd).
     ok
     4>

    One-Time Execution

    Erlang client contacting OS standard ssh server

    In the following example, the Erlang shell is the client process that receives the channel replies as Erlang messages.

    Do an one-time execution of a remote OS command ("pwd") over ssh to the ssh -server of the OS at the host "ssh.example.com":

    1> ssh:start().
    +server of the OS at the host "ssh.example.com":

    1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    -{ok,<0.57.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    -5> flush(). % Get all pending messages. NOTE: ordering may vary!
    -Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    -Shell got {ssh_cm,<0.57.0>,{eof,0}}
    -Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.57.0>,{closed,0}}
    +2> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 22, []).
    +{ok,<0.57.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
    +5> flush(). % Get all pending messages. NOTE: ordering may vary!
    +Shell got {ssh_cm,<0.57.0>,{data,0,0,<<"/home/otptest\n">>}}
    +Shell got {ssh_cm,<0.57.0>,{eof,0}}
    +Shell got {ssh_cm,<0.57.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.57.0>,{closed,0}}
     ok
    -6> ssh:connection_info(ConnectionRef, channels).
    -{channels,[]}
    +6> ssh:connection_info(ConnectionRef, channels).
    +{channels,[]}
     7>

    See ssh_connection and ssh_connection:exec/4 for finding documentation of the channel messages.

    To collect the channel messages in a program, use receive...end instead of flush/1:

    5> receive
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    -5>         {ok,Result}
    -5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    -5>         {error,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 ->
    +5>         {ok,Result}
    +5>     {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 ->
    +5>         {error,Result}
     5> end.
    -{ok,<<"/home/otptest\n">>}
    +{ok,<<"/home/otptest\n">>}
     6>

    Note that only the exec channel is closed after the one-time execution. The connection is still up and can handle previously opened channels. It is also possible to open a new channel:

    % try to open a new channel to check if the ConnectionRef is still open
    -7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,1}
    +7> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,1}
     8>

    To close the connection, call the function ssh:close(ConnectionRef). As an alternative, set the option {idle_time, 1} when opening the @@ -172,23 +172,23 @@ "command" must be as if entered into the erlang shell, that is a sequence of Erlang expressions ended by a period (.). Variables bound in that sequence will keep their bindings throughout the expression -sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in +sequence. The bindings are disposed when the result is returned.

    Here is an example of a suitable expression sequence:

    A=1, B=2, 3 == (A + B).

    It evaluates to true if submitted to the Erlang daemon started in Step 3 above:

    $bash> ssh ssh.example.com -p 8989 "A=1, B=2, 3 == (A + B)."
     true
     $bash>

    The same example but now using the Erlang ssh client to contact the Erlang -server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    -{ok,<0.216.0>}
    -2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -3> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +server:

    1> {ok, ConnectionRef} = ssh:connect("ssh.example.com", 8989, []).
    +{ok,<0.216.0>}
    +2> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +3> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "A=1, B=2, 3 == (A + B).",
    -                                 infinity).
    +                                 infinity).
     success
    -4> flush().
    -Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    -Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.216.0>,{eof,0}}
    -Shell got {ssh_cm,<0.216.0>,{closed,0}}
    +4> flush().
    +Shell got {ssh_cm,<0.216.0>,{data,0,0,<<"true">>}}
    +Shell got {ssh_cm,<0.216.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.216.0>,{eof,0}}
    +Shell got {ssh_cm,<0.216.0>,{closed,0}}
     ok
     5>

    Note that Erlang shell specific functions and control sequences like for example h(). are not supported.

    I/O from a function called in an Erlang ssh daemon

    Output to stdout on the server side is also displayed as well as the resulting @@ -203,36 +203,36 @@ write something: [a,b,c]. {ok,[a,b,c]} $bash>

    The same example but using the Erlang ssh client:

    
    -Eshell V10.5.2  (abort with ^G)
    -1> ssh:start().
    +Eshell V10.5.2  (abort with ^G)
    +1> ssh:start().
     ok
    -2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    -{ok,<0.92.0>}
    -3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    -{ok,0}
    -4> success = ssh_connection:exec(ConnectionRef, ChannelId,
    +2> {ok, ConnectionRef} = ssh:connect(loopback, 8989, []).
    +{ok,<0.92.0>}
    +3> {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
    +{ok,0}
    +4> success = ssh_connection:exec(ConnectionRef, ChannelId,
                                      "io:read(\"write something: \").",
    -                                 infinity).
    +                                 infinity).
     success
    -5> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
    +5> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"write something: ">>}}
     ok
     % All data is sent as binaries with string contents:
    -6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
    +6> ok = ssh_connection:send(ConnectionRef, ChannelId, <<"[a,b,c].">>).
     ok
    -7> flush().
    +7> flush().
     ok
     %% Nothing is received, because the io:read/1
     %% requires the input line to end with a newline.
     
     %% Send a newline (it could have been included in the last send):
    -8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
    +8> ssh_connection:send(ConnectionRef, ChannelId, <<"\n">>).
     ok
    -9> flush().
    -Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    -Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    -Shell got {ssh_cm,<0.92.0>,{eof,0}}
    -Shell got {ssh_cm,<0.92.0>,{closed,0}}
    +9> flush().
    +Shell got {ssh_cm,<0.92.0>,{data,0,0,<<"{ok,[a,b,c]}">>}}
    +Shell got {ssh_cm,<0.92.0>,{exit_status,0,0}}
    +Shell got {ssh_cm,<0.92.0>,{eof,0}}
    +Shell got {ssh_cm,<0.92.0>,{closed,0}}
     ok
     10>

    Configuring the server's (daemon's) command execution

    Every time a daemon is started, it enables one-time execution of commands as described in the @@ -243,44 +243,44 @@ ssh:daemon/2,3 and exec_daemon_option() for details.

    Examples of the two ways to configure the exec evaluator:

    1. Disable one-time execution.
      To modify the daemon start example above to reject one-time execution requests, we change Step 3 by adding the -option {exec, disabled} to:
    1> ssh:start().
    +option {exec, disabled} to:
    1> ssh:start().
     ok
    -2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    -                                  {user_dir, "/tmp/otptest_user/.ssh"},
    -                                  {exec, disabled}
    -                                 ]).
    -{ok,<0.54.0>}
    +2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
    +                                  {user_dir, "/tmp/otptest_user/.ssh"},
    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/404.html	2026-04-20 17:48:53.149763517 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/404.html	2026-04-20 17:48:53.149763517 +0000
    @@ -110,7 +110,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/api-reference.html 2026-04-20 17:48:53.181763715 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/api-reference.html 2026-04-20 17:48:53.181763715 +0000 @@ -146,7 +146,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/notes.html 2026-04-20 17:48:53.245764112 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/notes.html 2026-04-20 17:48:53.241764087 +0000 @@ -941,7 +941,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/search.html 2026-04-20 17:48:53.277764310 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/search.html 2026-04-20 17:48:53.281764336 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/content.opf 2026-04-20 15:20:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/content.opf 2042-05-23 04:38:51.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> ssl - 11.5.3 - urn:uuid:3f8ed9a2-e77d-ceb8-8db9-c0afde2a9231 + urn:uuid:3f7ab4f7-5c3d-c9eb-9958-d4d4d45ccfd6 en - 2026-04-20T15:20:01Z + 2042-05-23T04:38:51Z /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2026-04-20 15:20:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2042-05-23 04:38:51.000000000 +0000 @@ -33,14 +33,14 @@ applications. Such a script is located in the bin directory of the Erlang distribution. The source for the script is found under the Erlang installation top directory under releases/<OTP version>/start_clean.rel.

    Do the following:

    • Copy that script to another location (and preferably another name).
    • Add the applications Crypto, Public Key, and SSL with their current version -numbers after the STDLIB application.

    The following shows an example .rel file with TLS added:

          {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
    -      [{kernel,"2.15"},
    -      {stdlib,"1.18"},
    -      {crypto, "2.0.3"},
    -      {public_key, "0.12"},
    -      {asn1, "4.0"},
    -      {ssl, "5.0"}
    -      ]}.

    The version numbers differ in your system. Whenever one of the applications +numbers after the STDLIB application.

    The following shows an example .rel file with TLS added:

          {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
    +      [{kernel,"2.15"},
    +      {stdlib,"1.18"},
    +      {crypto, "2.0.3"},
    +      {public_key, "0.12"},
    +      {asn1, "4.0"},
    +      {ssl, "5.0"}
    +      ]}.

    The version numbers differ in your system. Whenever one of the applications included in the script is upgraded, change the script.

    Do the following:

    • Build the boot script.

      Assuming the .rel file is stored in a file start_ssl.rel in the current directory, a boot script can be built as follows:

       1> systools:make_script("start_ssl",[]).

    There is now a start_ssl.boot file in the current directory.

    Do the following:

    • Test the boot script. To do this, start Erlang with the -boot command-line parameter specifying this boot script (with its full path, but without the @@ -75,10 +75,10 @@ so beware!

    For TLS to work, at least a public key and a certificate must be specified for the server side and the client needs to specify CAs that it trusts (client certification is optional and requires more configuration).

    In the following example (to keep it simple), the PEM file "/home/me/ssl/erlserver.pem" -contains both the server certificate and its private key .

    Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

    [{server,
    -  [{certfile, "/home/me/ssl/erlserver.pem"}]},
    - {client,
    -  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

    And then start the node like this (line breaks in the command are for +contains both the server certificate and its private key .

    Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

    [{server,
    +  [{certfile, "/home/me/ssl/erlserver.pem"}]},
    + {client,
    +  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

    And then start the node like this (line breaks in the command are for readability, and shall not be there when typed):

    $ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls
       -ssl_dist_optfile "/home/me/ssl/ssl_test@myhost.conf"
       -sname ssl_test

    The options in the {server, Opts} tuple are used when calling @@ -96,25 +96,25 @@ present any certificate.

    A node started in this way is fully functional, using TLS as the distribution protocol.

    verify_fun Configuration Example

    The verify_fun option creates a reference to the implementing function since the configuration is evaluated as an Erlang term. In -an example file for use with -ssl_dist_optfile:

    [{server,[{fail_if_no_peer_cert,true},
    -          {certfile,"/home/me/ssl/cert.pem"},
    -          {keyfile,"/home/me/ssl/privkey.pem"},
    -          {cacertfile,"/home/me/ssl/ca_cert.pem"},
    -          {verify,verify_peer},
    -          {verify_fun,{fun mydist:verify/3,"any initial value"}}]},
    - {client,[{certfile,"/home/me/ssl/cert.pem"},
    -          {keyfile,"/home/me/ssl/privkey.pem"},
    -          {cacertfile,"/home/me/ssl/ca_cert.pem"},
    -          {verify,verify_peer},
    -          {verify_fun,{fun mydist:verify/3,"any initial value"}}]}].
    -

    mydist:verify/3 will be called with:

    • OtpCert, the other party's certificate PKIX Certificates
    • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
    • Init will be "any initial value"

    A pattern for verify/3 will look like:

    verify(OtpCert, _SslStatus, Init) ->
    -    IsOk = is_ok(OtpCert, Init),
    +an example file for use with -ssl_dist_optfile:

    [{server,[{fail_if_no_peer_cert,true},
    +          {certfile,"/home/me/ssl/cert.pem"},
    +          {keyfile,"/home/me/ssl/privkey.pem"},
    +          {cacertfile,"/home/me/ssl/ca_cert.pem"},
    +          {verify,verify_peer},
    +          {verify_fun,{fun mydist:verify/3,"any initial value"}}]},
    + {client,[{certfile,"/home/me/ssl/cert.pem"},
    +          {keyfile,"/home/me/ssl/privkey.pem"},
    +          {cacertfile,"/home/me/ssl/ca_cert.pem"},
    +          {verify,verify_peer},
    +          {verify_fun,{fun mydist:verify/3,"any initial value"}}]}].
    +

    mydist:verify/3 will be called with:

    • OtpCert, the other party's certificate PKIX Certificates
    • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
    • Init will be "any initial value"

    A pattern for verify/3 will look like:

    verify(OtpCert, _SslStatus, Init) ->
    +    IsOk = is_ok(OtpCert, Init),
         NewInitValue = "some new value",
         case IsOk of
            true ->
    -           {valid, NewInitValue};
    +           {valid, NewInitValue};
            false ->
    -           {failure, NewInitValue}
    +           {failure, NewInitValue}
         end.

    verify_fun can accept a verify/4 function, which will receive:

    • OtpCert, the other party's certificate PKIX Certificates
    • DerCert, the other party's original DER Encoded certificate
    • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
    • Init will be "any initial value"

    The verify/4 can use the DerCert for atypical workarounds such as handling decoding errors and directly verifying signatures.

    For more details see {verify_fun, Verify} in common_option_cert

    Note

    The legacy command line format for verify_fun cannot be used in a -ssl_dist_optfile file as described below in @@ -154,19 +154,19 @@ -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true" $ export ERL_FLAGS $ erl -sname ssl_test -Erlang (BEAM) emulator version 5.0 [source] +Erlang (BEAM) emulator version 5.0 [source] -Eshell V5.0 (abort with ^G) -(ssl_test@myhost)1> init:get_arguments(). -[{root,["/usr/local/erlang"]}, - {progname,["erl "]}, - {sname,["ssl_test"]}, - {boot,["/home/me/ssl/start_ssl"]}, - {proto_dist,["inet_tls"]}, - {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, - {ssl_dist_opt,["server_secure_renegotiate","true", - "client_secure_renegotiate","true"] - {home,["/home/me"]}]

    The init:get_arguments() call verifies that the correct arguments are supplied +Eshell V5.0 (abort with ^G) +(ssl_test@myhost)1> init:get_arguments(). +[{root,["/usr/local/erlang"]}, + {progname,["erl "]}, + {sname,["ssl_test"]}, + {boot,["/home/me/ssl/start_ssl"]}, + {proto_dist,["inet_tls"]}, + {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, + {ssl_dist_opt,["server_secure_renegotiate","true", + "client_secure_renegotiate","true"] + {home,["/home/me"]}]

    The init:get_arguments() call verifies that the correct arguments are supplied to the emulator.

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/ssl.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/ssl.xhtml 2026-04-20 15:20:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/ssl.xhtml 2042-05-23 04:38:51.000000000 +0000 @@ -25,9 +25,9 @@

    Interface functions for TLS (Transport Layer Security) and DTLS (Datagram Transport Layer Security).

    Note

    The application's name is still SSL because the first versions of the TLS protocol were named SSL (Secure Socket Layer). However, no version -of the old SSL protocol is supported by this application.

    Example:

    1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    -    {cacerts, public_key:cacerts_get()}]).
    -{ok,{sslsocket, [...]}}

    See Examples for detailed usage and more examples of +of the old SSL protocol is supported by this application.

    Example:

    1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    +    {cacerts, public_key:cacerts_get()}]).
    +{ok,{sslsocket, [...]}}

    See Examples for detailed usage and more examples of this API.

    Special Erlang node configuration for the application can be found in SSL Application.

    @@ -1887,26 +1887,26 @@ signature schemes supplied by the signature_algs_cert option.

    The TLS-1.2 default is Default_TLS_12_Alg_Pairs interleaved with rsa_pss_schemes since ssl-11.0 (Erlang/OTP 25). pss_pss is -preferred over pss_rsae, which in turn is preferred over rsa.

    The list for Default_TLS_12_Alg_Pairs is defined as follows:

    [
    -{sha512, ecdsa},
    -{sha512, rsa},
    -{sha384, ecdsa},
    -{sha384, rsa},
    -{sha256, ecdsa},
    -{sha256, rsa}
    -]

    Change

    • Support for {md5, rsa} was removed from the TLS-1.2 default in +preferred over pss_rsae, which in turn is preferred over rsa.

      The list for Default_TLS_12_Alg_Pairs is defined as follows:

      [
      +{sha512, ecdsa},
      +{sha512, rsa},
      +{sha384, ecdsa},
      +{sha384, rsa},
      +{sha256, ecdsa},
      +{sha256, rsa}
      +]

      Change

      • Support for {md5, rsa} was removed from the TLS-1.2 default in ssl-8.0 (Erlang/OTP 22).
      • Support for {sha, _} (SHA1) and {sha224, _} was removed -from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).

      The list for rsa_pss_schemes is defined as follows:

      [rsa_pss_pss_sha512,
      +from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).

    The list for rsa_pss_schemes is defined as follows:

    [rsa_pss_pss_sha512,
     rsa_pss_pss_sha384,
     rsa_pss_pss_sha256,
     rsa_pss_rsae_sha512,
     rsa_pss_rsae_sha384,
    -rsa_pss_rsae_sha256]

    The list of TLS_13_Legacy_Schemes is defined as follows:

    [
    +rsa_pss_rsae_sha256]

    The list of TLS_13_Legacy_Schemes is defined as follows:

    [
     %% Legacy algorithms only applicable to certificate signatures
     rsa_pkcs1_sha512, %% Corresponds to {sha512, rsa}
     rsa_pkcs1_sha384, %% Corresponds to {sha384, rsa}
     rsa_pkcs1_sha256, %% Corresponds to {sha256, rsa}
    -]

    The list of Default_TLS_13_Schemes is defined as follows:

    [
    +]

    The list of Default_TLS_13_Schemes is defined as follows:

    [
     %% EDDSA
     eddsa_ed25519,
     eddsa_ed448
    @@ -2183,8 +2183,8 @@
     
           
     
    -

    Claim an intermediate CA in the chain as trusted.

    fun(Chain::[public_key:der_encoded()]) ->
    -      {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.

    TLS then uses public_key:pkix_path_validation/3 with the selected CA +

    Claim an intermediate CA in the chain as trusted.

    fun(Chain::[public_key:der_encoded()]) ->
    +      {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.

    TLS then uses public_key:pkix_path_validation/3 with the selected CA as the trusted anchor and verifies the rest of the chain.

    @@ -2438,7 +2438,7 @@ being sent and disables the hostname verification check.

  • {customize_hostname_check, HostNameCheckOpts} - Customization option

    Customizes the hostname verification of the peer certificate, as various protocols that use TLS, such as HTTP or LDAP, may require different approaches. For example, here is how to use standard hostname checking for HTTPS implemented in -Public_Key:

    {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}

    For futher description of the customize options, see +Public_Key:

    {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}

    For futher description of the customize options, see public_key:pkix_verify_hostname/3.

  • {client_certificate_authorities, UseCertAuth} - Inter-op hint option

    If UseCertAuth is set to true, sends the certificate authorities extension in the TLS-1.3 client hello. The default is false. Note that setting UseCertAuth to true can result in a significant @@ -2582,7 +2582,7 @@

    Options only relevant for TLS-1.3.

    • {session_tickets, SessionTickets} - Use of session tickets

      Configures the session ticket functionality. Allowed values are disabled, manual, and auto. If it is set to manual the client will send the ticket -information to user process in a 3-tuple:

      {ssl, session_ticket, `Ticket::`(`t:session_ticket/0`)}

      where Ticket is a map with information about the created TLS-1.3 session ticket. +information to user process in a 3-tuple:

      {ssl, session_ticket, `Ticket::`(`t:session_ticket/0`)}

      where Ticket is a map with information about the created TLS-1.3 session ticket. The only key that the user needs to consider is sni key to be able to provide it as a value in the use_ticket option list of possible tickets to use it to attempt session resumption to a server identified by the @@ -2595,7 +2595,7 @@ mandatory option in manual mode ({session_tickets, manual}).

      Note

      Session tickets are only sent to the user if option session_tickets is set to manual

      This option is supported by TLS-1.3. See also SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3.

    • {early_data, EarlyData}

      Configures the early data to be sent by the client.

      To verify that the server has the intention to process the early -data, the following tuple is sent to the user process:

      {ssl, SslSocket, {early_data, Result}}

      where Result is either accepted or rejected.

      Warning

      It is the responsibility of the user to handle rejected EarlyData and to +data, the following tuple is sent to the user process:

      {ssl, SslSocket, {early_data, Result}}

      where Result is either accepted or rejected.

      Warning

      It is the responsibility of the user to handle rejected EarlyData and to resend when appropriate.

    • {middlebox_comp_mode, MiddleBoxMode}

      Configures the middlebox compatibility mode for a TLS-1.3 connection.

      A significant number of middleboxes misbehave when a TLS-1.3 connection is negotiated. Implementations can increase the chance of making connections through those middleboxes by adapting the TLS-1.3 @@ -2779,20 +2779,20 @@ peer certificate in a valid certification path. So, if depth is 0 the PEER must be signed by the trusted ROOT-CA directly; if 1 the path can be PEER, CA, ROOT-CA; if 2 the path can be PEER, CA, CA, ROOT-CA, and so on. The default -value is 10. Used to mitigate DoS attack possibilities.

    • {verify_fun, Verify} - Customize certificate path validation

      The verification fun is to be defined as follows:

      fun(OtpCert :: #'OTPCertificate'{},
      -    Event, InitialUserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      -
      -fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),
      -    Event, InitialUserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      +value is 10. Used to mitigate DoS attack possibilities.

    • {verify_fun, Verify} - Customize certificate path validation

      The verification fun is to be defined as follows:

      fun(OtpCert :: #'OTPCertificate'{},
      +    Event, InitialUserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {fail, Reason :: term()} | {unknown, UserState :: term()}.
      +
      +fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),
      +    Event, InitialUserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {fail, Reason :: term()} | {unknown, UserState :: term()}.
       
       Types:
      -      Event = {bad_cert, Reason :: atom() |
      -              {revoked, atom()}} |
      -      {extension, #'Extension'{}} |
      +      Event = {bad_cert, Reason :: atom() |
      +              {revoked, atom()}} |
      +      {extension, #'Extension'{}} |
                     valid |
                     valid_peer

      The verification fun is called during the X.509-path validation when an error occurs or an extension unknown to the SSL application is @@ -2809,25 +2809,25 @@ handshake does not terminate regardless of verification failures, and the connection is established.

    • If called with an extension unknown to the user application, the fun is to return {unknown, UserState}.

    Note that if the fun returns unknown for an extension marked as critical, -validation will fail.

    Default option verify_fun in verify_peer mode:

    {fun(_, _, {bad_cert, _} = Reason, _) ->
    -   {fail, Reason};
    -    (_, _, {extension, _}, UserState) ->
    -   {unknown, UserState};
    -    (_, _, valid, UserState) ->
    -   {valid, UserState};
    -    (_, _, valid_peer, UserState) ->
    -       {valid, UserState}
    - end, []}

    Default option verify_fun in mode verify_none:

     {fun(_, _, {bad_cert, _}, UserState) ->
    -   {valid, UserState};
    -    (_, _, {extension, #'Extension'{critical = true}}, UserState) ->
    -   {valid, UserState};
    -    (_, _, {extension, _}, UserState) ->
    -   {unknown, UserState};
    -    (_, _, valid, UserState) ->
    -   {valid, UserState};
    -    (_, _, valid_peer, UserState) ->
    -       {valid, UserState}
    - end, []}

    The possible path validation errors are given in the form {bad_cert, Reason}, +validation will fail.

    Default option verify_fun in verify_peer mode:

    {fun(_, _, {bad_cert, _} = Reason, _) ->
    +   {fail, Reason};
    +    (_, _, {extension, _}, UserState) ->
    +   {unknown, UserState};
    +    (_, _, valid, UserState) ->
    +   {valid, UserState};
    +    (_, _, valid_peer, UserState) ->
    +       {valid, UserState}
    + end, []}

    Default option verify_fun in mode verify_none:

     {fun(_, _, {bad_cert, _}, UserState) ->
    +   {valid, UserState};
    +    (_, _, {extension, #'Extension'{critical = true}}, UserState) ->
    +   {valid, UserState};
    +    (_, _, {extension, _}, UserState) ->
    +   {unknown, UserState};
    +    (_, _, valid, UserState) ->
    +   {valid, UserState};
    +    (_, _, valid_peer, UserState) ->
    +       {valid, UserState}
    + end, []}

    The possible path validation errors are given in the form {bad_cert, Reason}, where Reason is:

    • unknown_ca

      No trusted CA was found in the trusted store. The trusted CA is normally a so-called ROOT CA, which is a self-signed certificate. Trust can be claimed for an intermediate CA (the trusted anchor does not have to be @@ -2977,11 +2977,11 @@ enforced. If SecureRenegotiate is false secure renegotiation will still be used if possible, but it falls back to insecure renegotiation if the peer does not support if RFC -5746.

    • {user_lookup_fun, {LookupFun, UserState}} - PSK/SRP cipher suite option

      The lookup fun is to be defined as follows:

      fun(psk, PSKIdentity :: binary(), UserState :: term()) ->
      -  {ok, SharedSecret :: binary()} | error;
      -fun(srp, Username :: binary(), UserState :: term()) ->
      -  {ok, {SRPParams :: srp_param_type(), Salt :: binary(),
      -        DerivedKey :: binary()}} | error.

      For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client +5746.

    • {user_lookup_fun, {LookupFun, UserState}} - PSK/SRP cipher suite option

      The lookup fun is to be defined as follows:

      fun(psk, PSKIdentity :: binary(), UserState :: term()) ->
      +  {ok, SharedSecret :: binary()} | error;
      +fun(srp, Username :: binary(), UserState :: term()) ->
      +  {ok, {SRPParams :: srp_param_type(), Salt :: binary(),
      +        DerivedKey :: binary()}} | error.

      For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client and server to determine the shared secret. When called by the client, PSKIdentity is the hint presented by the server or undefined. When called by the server, PSKIdentity is the identity presented by the client.

      For Secure Remote Password (SRP), the fun is only used by the server to obtain @@ -4228,8 +4228,8 @@ -

      Opens a TLS/DTLS connection.

      connect(TCPSocket, TLSOptions, Timeout).

      Upgrades a gen_tcp (or equivalent) connected socket to a TLS socket by -performing the client-side TLS handshake.

      connect(Host, Port, TLSOptions).

      Opens a TLS/DTLS connection to Host, Port. This call is equivalent to:

      connect(Host, Port, TLSOptions, infinity).
      +

      Opens a TLS/DTLS connection.

      connect(TCPSocket, TLSOptions, Timeout).

      Upgrades a gen_tcp (or equivalent) connected socket to a TLS socket by +performing the client-side TLS handshake.

      connect(Host, Port, TLSOptions).

      Opens a TLS/DTLS connection to Host, Port. This call is equivalent to:

      connect(Host, Port, TLSOptions, infinity).
      @@ -4906,7 +4906,7 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/using_ssl.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2026-04-20 15:20:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2042-05-23 04:38:51.000000000 +0000 @@ -35,87 +35,87 @@ except for the purpose of pattern matching.

      Note

      Note that client certificate verification is optional for the server and needs additional conguration on both sides to work. The Certificate and keys, in the examples, are provided using the ssl:cert_key_conf/0 supplied in the certs_keys -introduced in OTP 25.

      Basic Client

       1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
      -                                                 {cacerts, public_key:cacerts_get()}]).
      -   {ok,{sslsocket, [...]}}

      Basic Connection

      Step 1: Start the server side:

      1 server> ssl:start().
      +introduced in OTP 25.

      Basic Client

       1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
      +                                                 {cacerts, public_key:cacerts_get()}]).
      +   {ok,{sslsocket, [...]}}

      Basic Connection

      Step 1: Start the server side:

      1 server> ssl:start().
       ok

      Step 2: with alternative certificates, in this example the EDDSA certificate will be preferred if TLS-1.3 is negotiated and the RSA certificate will always -be used for TLS-1.2 as it does not support the EDDSA algorithm:

      2 server> {ok, ListenSocket} =
      -ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
      -                                  keyfile => "eddsakey.pem"},
      -                                #{certfile => "rsacert.pem",
      +be used for TLS-1.2 as it does not support the EDDSA algorithm:

      2 server> {ok, ListenSocket} =
      +ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
      +                                  keyfile => "eddsakey.pem"},
      +                                #{certfile => "rsacert.pem",
                                         keyfile => "rsakey.pem",
      -                                  password => "foobar"}
      -                               ]},{reuseaddr, true}]).
      -{ok,{sslsocket, [...]}}

      Step 3: Do a transport accept on the TLS listen socket:

      3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
      -{ok,{sslsocket, [...]}}

      Note

      ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the + password => "foobar"} + ]},{reuseaddr, true}]). +{ok,{sslsocket, [...]}}

      Step 3: Do a transport accept on the TLS listen socket:

      3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
      +{ok,{sslsocket, [...]}}

      Note

      ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the handshake part can be called in a new Erlang process dedicated to handling the -connection

      Step 4: Start the client side:

      1 client> ssl:start().
      +connection

      Step 4: Start the client side:

      1 client> ssl:start().
       ok

      Be sure to configure trusted certificates to use for server certificate -verification.

      2 client> {ok, Socket} = ssl:connect("localhost", 9999,
      -      [{verify, verify_peer},
      -      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
      -{ok,{sslsocket, [...]}}

      Step 5: Do the TLS handshake:

      4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
      -{ok,{sslsocket, [...]}}

      Note

      A real server should use ssl:handshake/2, which accepts a timeout, to avoid DoS -attacks. In the example the timeout defaults to infinity.

      Step 6: Send a message over TLS:

      5 server> ssl:send(Socket, "foo").
      +verification.

      2 client> {ok, Socket} = ssl:connect("localhost", 9999,
      +      [{verify, verify_peer},
      +      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
      +{ok,{sslsocket, [...]}}

      Step 5: Do the TLS handshake:

      4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
      +{ok,{sslsocket, [...]}}

      Note

      A real server should use ssl:handshake/2, which accepts a timeout, to avoid DoS +attacks. In the example the timeout defaults to infinity.

      Step 6: Send a message over TLS:

      5 server> ssl:send(Socket, "foo").
       ok

      Step 7: Flush the shell message queue to see that the message sent on the -server side is recived by the client side:

      3 client> flush().
      -Shell got {ssl,{sslsocket,[...]},"foo"}
      +server side is recived by the client side:

      3 client> flush().
      +Shell got {ssl,{sslsocket,[...]},"foo"}
       ok

      Upgrade Example - TLS only

      Upgrading a a TCP/IP connection to a TLS connections is mostly used when there is a desire have unencrypted communication first and then later secure the communication channel by using TLS. Note that the client and server need to agree to do the upgrade in the protocol doing the communication. This is concept is often referenced as STARTLS and used in many protocols such as SMTP, -FTPS and HTTPS via a proxy.

      Warning

      Maximum security recommendations are however moving away from such solutions.

      To upgrade to a TLS connection:

      Step 1: Start the server side:

      1 server> ssl:start().
      +FTPS and HTTPS via a proxy.

      Warning

      Maximum security recommendations are however moving away from such solutions.

      To upgrade to a TLS connection:

      Step 1: Start the server side:

      1 server> ssl:start().
         ok

      Step 2: Create a normal TCP listen socket and ensure active is set to false and not set to any active mode otherwise TLS handshake messages can be -delivered to the wrong process.

      2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
      -  {active, false}]).
      -  {ok, #Port<0.475>}

      Step 3: Accept client connection:

      3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
      -  {ok, #Port<0.476>}

      Step 4: Start the client side:

      1 client> ssl:start().
      -  ok
      2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

      Step 5: Do the TLS handshake:

      4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
      -  {fail_if_no_peer_cert, true},
      -  {cacertfile, "cacerts.pem"},
      -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
      -  {ok,{sslsocket,[...]}}

      Step 6: Upgrade to a TLS connection. The client and server must agree upon the +delivered to the wrong process.

      2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
      +  {active, false}]).
      +  {ok, #Port<0.475>}

      Step 3: Accept client connection:

      3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
      +  {ok, #Port<0.476>}

      Step 4: Start the client side:

      1 client> ssl:start().
      +  ok
      2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

      Step 5: Do the TLS handshake:

      4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
      +  {fail_if_no_peer_cert, true},
      +  {cacertfile, "cacerts.pem"},
      +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
      +  {ok,{sslsocket,[...]}}

      Step 6: Upgrade to a TLS connection. The client and server must agree upon the upgrade. The server must be prepared to be a TLS server before the client can do -a successful connect.

      3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
      -  {cacertfile, "cacerts.pem"},
      -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
      -{ok,{sslsocket,[...]}}

      Step 7: Send a message over TLS:

      4 client> ssl:send(TLSSocket, "foo").
      -      ok

      Step 8: Set active once on the TLS socket:

      5 server> ssl:setopts(TLSSocket, [{active, once}]).
      +a successful connect.

      3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
      +  {cacertfile, "cacerts.pem"},
      +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
      +{ok,{sslsocket,[...]}}

      Step 7: Send a message over TLS:

      4 client> ssl:send(TLSSocket, "foo").
      +      ok

      Step 8: Set active once on the TLS socket:

      5 server> ssl:setopts(TLSSocket, [{active, once}]).
             ok

      Step 9: Flush the shell message queue to see that the message sent on the -client side is recived by the server side:

      5 server> flush().
      -      Shell got {ssl,{sslsocket,[...]},"foo"}
      +client side is recived by the server side:

      5 server> flush().
      +      Shell got {ssl,{sslsocket,[...]},"foo"}
             ok

      Customizing cipher suites

      Fetch default cipher suite list for a TLS/DTLS version. Change default to all to -get all possible cipher suites.

      1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
      -    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
      -    mac => aead,prf => sha384}, ....]

      In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange +get all possible cipher suites.

      1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
      +    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
      +    mac => aead,prf => sha384}, ....]

      In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange (removed from default in 21)

      2> NoRSA =
      -    ssl:filter_cipher_suites(Default,
      -                             [{key_exchange, fun(rsa) -> false;
      -                                                (_) -> true
      -                                             end}]).
      -    [...]

      Pick just a few suites

       3> Suites =
      - ssl:filter_cipher_suites(Default,
      -                             [{key_exchange, fun(ecdh_ecdsa) -> true;
      -                                                (_) -> false
      -                                             end},
      -                              {cipher, fun(aes_128_cbc) -> true;
      -                                          (_) ->false
      -                                       end}]).
      -
      -[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
      -   mac => sha256,prf => sha256},
      - #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
      -   prf => default_prf}]

      Make some particular suites the most preferred, or least preferred by changing -prepend to append.

       4>ssl:prepend_cipher_suites(Suites, Default).
      -  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
      -     mac => sha256,prf => sha256},
      -   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
      -     prf => default_prf},
      -   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
      -     mac => sha384,prf => sha384}, ...]

      Customizing signature algorithms(TLS-1.2)/schemes(TLS-1.3)

      Starting from TLS-1.2 signature algorithms (called signature schemes in TLS-1.3) + ssl:filter_cipher_suites(Default, + [{key_exchange, fun(rsa) -> false; + (_) -> true + end}]). + [...]

      Pick just a few suites

       3> Suites =
      + ssl:filter_cipher_suites(Default,
      +                             [{key_exchange, fun(ecdh_ecdsa) -> true;
      +                                                (_) -> false
      +                                             end},
      +                              {cipher, fun(aes_128_cbc) -> true;
      +                                          (_) ->false
      +                                       end}]).
      +
      +[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
      +   mac => sha256,prf => sha256},
      + #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
      +   prf => default_prf}]

      Make some particular suites the most preferred, or least preferred by changing +prepend to append.

       4>ssl:prepend_cipher_suites(Suites, Default).
      +  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
      +     mac => sha256,prf => sha256},
      +   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
      +     prf => default_prf},
      +   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
      +     mac => sha384,prf => sha384}, ...]

      Customizing signature algorithms(TLS-1.2)/schemes(TLS-1.3)

      Starting from TLS-1.2 signature algorithms (called signature schemes in TLS-1.3) is something that can be negotiated and hence also configured. These algorithms/schemes will be used for digital signatures in protocol messages and in certificates.

      Note

      TLS-1.3 schemes have atom names whereas TLS-1.2 configuration is two element @@ -127,9 +127,9 @@ suite that is chosen, which is not the case in TLS-1.3.

      Using the function ssl:signature_algs/2 will let you inspect different aspects of possible configurations for your system. For example if TLS-1.3 and TLS-1.2 is supported the default signature_algorithm list in OTP-26 and cryptolib from -OpenSSL 3.0.2 would look like:

       1>  ssl:signature_algs(default, 'tlsv1.3').
      +OpenSSL 3.0.2 would look like:

       1>  ssl:signature_algs(default, 'tlsv1.3').
        %% TLS-1.3 schemes
      - [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
      + [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
         ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
         rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
         rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
      @@ -137,47 +137,47 @@
         %% (would have a tuple name in TLS-1.2 only configuration)
         rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256
         %% TLS 1.2 algorithms
      -  {sha512,ecdsa},
      -  {sha384,ecdsa},
      -  {sha256,ecdsa}]

      If you want to add support for non default supported algorithms you should + {sha512,ecdsa}, + {sha384,ecdsa}, + {sha256,ecdsa}]

      If you want to add support for non default supported algorithms you should append them to the default list as the configuration is in prefered order, -something like this:

          MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
      -    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
      +something like this:

          MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
      +    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
           ...

      See also ssl:signature_algs/2 and sign_algo()

      Using an Engine Stored Key

      Erlang ssl application is able to use private keys provided by OpenSSL engines -using the following mechanism:

      1> ssl:start().
      +using the following mechanism:

      1> ssl:start().
       ok

      Load a crypto engine, should be done once per engine used. For example -dynamically load the engine called MyEngine:

      2> {ok, EngineRef} =
      -crypto:engine_load(<<"dynamic">>,
      -[{<<"SO_PATH">>, "/tmp/user/engines/MyEngine"},<<"LOAD">>],
      -[]).
      -{ok,#Ref<0.2399045421.3028942852.173962>}

      Create a map with the engine information and the algorithm used by the engine:

      3> PrivKey =
      - #{algorithm => rsa,
      +dynamically load the engine called MyEngine:

      2> {ok, EngineRef} =
      +crypto:engine_load(<<"dynamic">>,
      +[{<<"SO_PATH">>, "/tmp/user/engines/MyEngine"},<<"LOAD">>],
      +[]).
      +{ok,#Ref<0.2399045421.3028942852.173962>}

      Create a map with the engine information and the algorithm used by the engine:

      3> PrivKey =
      + #{algorithm => rsa,
          engine => EngineRef,
      -   key_id => "id of the private key in Engine"}.

      Use the map in the ssl key option:

      4> {ok, SSLSocket} =
      - ssl:connect("localhost", 9999,
      /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.html	2026-04-20 17:48:53.533765899 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl.html	2026-04-20 17:48:53.529765874 +0000
      @@ -96,9 +96,9 @@
       

      Interface functions for TLS (Transport Layer Security) and DTLS (Datagram Transport Layer Security).

      Note

      The application's name is still SSL because the first versions of the TLS protocol were named SSL (Secure Socket Layer). However, no version -of the old SSL protocol is supported by this application.

      Example:

      1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
      -    {cacerts, public_key:cacerts_get()}]).
      -{ok,{sslsocket, [...]}}

      See Examples for detailed usage and more examples of +of the old SSL protocol is supported by this application.

      Example:

      1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
      +    {cacerts, public_key:cacerts_get()}]).
      +{ok,{sslsocket, [...]}}

      See Examples for detailed usage and more examples of this API.

      Special Erlang node configuration for the application can be found in SSL Application.

      @@ -1969,26 +1969,26 @@ signature schemes supplied by the signature_algs_cert option.

      The TLS-1.2 default is Default_TLS_12_Alg_Pairs interleaved with rsa_pss_schemes since ssl-11.0 (Erlang/OTP 25). pss_pss is -preferred over pss_rsae, which in turn is preferred over rsa.

      The list for Default_TLS_12_Alg_Pairs is defined as follows:

      [
      -{sha512, ecdsa},
      -{sha512, rsa},
      -{sha384, ecdsa},
      -{sha384, rsa},
      -{sha256, ecdsa},
      -{sha256, rsa}
      -]

      Change

      • Support for {md5, rsa} was removed from the TLS-1.2 default in +preferred over pss_rsae, which in turn is preferred over rsa.

        The list for Default_TLS_12_Alg_Pairs is defined as follows:

        [
        +{sha512, ecdsa},
        +{sha512, rsa},
        +{sha384, ecdsa},
        +{sha384, rsa},
        +{sha256, ecdsa},
        +{sha256, rsa}
        +]

        Change

        • Support for {md5, rsa} was removed from the TLS-1.2 default in ssl-8.0 (Erlang/OTP 22).
        • Support for {sha, _} (SHA1) and {sha224, _} was removed -from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).

        The list for rsa_pss_schemes is defined as follows:

        [rsa_pss_pss_sha512,
        +from the TLS-1.2 default in ssl-11.0 (Erlang/OTP 26).

      The list for rsa_pss_schemes is defined as follows:

      [rsa_pss_pss_sha512,
       rsa_pss_pss_sha384,
       rsa_pss_pss_sha256,
       rsa_pss_rsae_sha512,
       rsa_pss_rsae_sha384,
      -rsa_pss_rsae_sha256]

      The list of TLS_13_Legacy_Schemes is defined as follows:

      [
      +rsa_pss_rsae_sha256]

      The list of TLS_13_Legacy_Schemes is defined as follows:

      [
       %% Legacy algorithms only applicable to certificate signatures
       rsa_pkcs1_sha512, %% Corresponds to {sha512, rsa}
       rsa_pkcs1_sha384, %% Corresponds to {sha384, rsa}
       rsa_pkcs1_sha256, %% Corresponds to {sha256, rsa}
      -]

      The list of Default_TLS_13_Schemes is defined as follows:

      [
      +]

      The list of Default_TLS_13_Schemes is defined as follows:

      [
       %% EDDSA
       eddsa_ed25519,
       eddsa_ed448
      @@ -2275,8 +2275,8 @@
       
             
       
      -

      Claim an intermediate CA in the chain as trusted.

      fun(Chain::[public_key:der_encoded()]) ->
      -      {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.

      TLS then uses public_key:pkix_path_validation/3 with the selected CA +

      Claim an intermediate CA in the chain as trusted.

      fun(Chain::[public_key:der_encoded()]) ->
      +      {trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.

      TLS then uses public_key:pkix_path_validation/3 with the selected CA as the trusted anchor and verifies the rest of the chain.

      @@ -2535,7 +2535,7 @@ being sent and disables the hostname verification check.

    • {customize_hostname_check, HostNameCheckOpts} - Customization option

      Customizes the hostname verification of the peer certificate, as various protocols that use TLS, such as HTTP or LDAP, may require different approaches. For example, here is how to use standard hostname checking for HTTPS implemented in -Public_Key:

      {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}

      For futher description of the customize options, see +Public_Key:

      {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]}

      For futher description of the customize options, see public_key:pkix_verify_hostname/3.

    • {client_certificate_authorities, UseCertAuth} - Inter-op hint option

      If UseCertAuth is set to true, sends the certificate authorities extension in the TLS-1.3 client hello. The default is false. Note that setting UseCertAuth to true can result in a significant @@ -2679,7 +2679,7 @@

      Options only relevant for TLS-1.3.

      • {session_tickets, SessionTickets} - Use of session tickets

        Configures the session ticket functionality. Allowed values are disabled, manual, and auto. If it is set to manual the client will send the ticket -information to user process in a 3-tuple:

        {ssl, session_ticket, `Ticket::`(`t:session_ticket/0`)}

        where Ticket is a map with information about the created TLS-1.3 session ticket. +information to user process in a 3-tuple:

        {ssl, session_ticket, `Ticket::`(`t:session_ticket/0`)}

        where Ticket is a map with information about the created TLS-1.3 session ticket. The only key that the user needs to consider is sni key to be able to provide it as a value in the use_ticket option list of possible tickets to use it to attempt session resumption to a server identified by the @@ -2692,7 +2692,7 @@ mandatory option in manual mode ({session_tickets, manual}).

        Note

        Session tickets are only sent to the user if option session_tickets is set to manual

        This option is supported by TLS-1.3. See also SSL User's Guide, Session Tickets and Session Resumption in TLS 1.3.

      • {early_data, EarlyData}

        Configures the early data to be sent by the client.

        To verify that the server has the intention to process the early -data, the following tuple is sent to the user process:

        {ssl, SslSocket, {early_data, Result}}

        where Result is either accepted or rejected.

        Warning

        It is the responsibility of the user to handle rejected EarlyData and to +data, the following tuple is sent to the user process:

        {ssl, SslSocket, {early_data, Result}}

        where Result is either accepted or rejected.

        Warning

        It is the responsibility of the user to handle rejected EarlyData and to resend when appropriate.

      • {middlebox_comp_mode, MiddleBoxMode}

        Configures the middlebox compatibility mode for a TLS-1.3 connection.

        A significant number of middleboxes misbehave when a TLS-1.3 connection is negotiated. Implementations can increase the chance of making connections through those middleboxes by adapting the TLS-1.3 @@ -2881,20 +2881,20 @@ peer certificate in a valid certification path. So, if depth is 0 the PEER must be signed by the trusted ROOT-CA directly; if 1 the path can be PEER, CA, ROOT-CA; if 2 the path can be PEER, CA, CA, ROOT-CA, and so on. The default -value is 10. Used to mitigate DoS attack possibilities.

      • {verify_fun, Verify} - Customize certificate path validation

        The verification fun is to be defined as follows:

        fun(OtpCert :: #href_anchor"ss">'OTPCertificate'{},
        -    Event, InitialUserState :: term()) ->
        -  {valid, UserState :: term()} |
        -  {fail, Reason :: term()} | {unknown, UserState :: term()}.
        -
        -fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),
        -    Event, InitialUserState :: term()) ->
        -  {valid, UserState :: term()} |
        -  {fail, Reason :: term()} | {unknown, UserState :: term()}.
        +value is 10. Used to mitigate DoS attack possibilities.

      • {verify_fun, Verify} - Customize certificate path validation

        The verification fun is to be defined as follows:

        fun(OtpCert :: #href_anchor"ss">'OTPCertificate'{},
        +    Event, InitialUserState :: term()) ->
        +  {valid, UserState :: term()} |
        +  {fail, Reason :: term()} | {unknown, UserState :: term()}.
        +
        +fun(OtpCert :: #'OTPCertificate'{}, DerCert :: public_key:der_encoded(),
        +    Event, InitialUserState :: term()) ->
        +  {valid, UserState :: term()} |
        +  {fail, Reason :: term()} | {unknown, UserState :: term()}.
         
         Types:
        -      Event = {bad_cert, Reason :: atom() |
        -              {revoked, atom()}} |
        -      {extension, #'Extension'{}} |
        +      Event = {bad_cert, Reason :: atom() |
        +              {revoked, atom()}} |
        +      {extension, #'Extension'{}} |
                       valid |
                       valid_peer

        The verification fun is called during the X.509-path validation when an error occurs or an extension unknown to the SSL application is @@ -2911,25 +2911,25 @@ handshake does not terminate regardless of verification failures, and the connection is established.

      • If called with an extension unknown to the user application, the fun is to return {unknown, UserState}.

      Note that if the fun returns unknown for an extension marked as critical, -validation will fail.

      Default option verify_fun in verify_peer mode:

      {fun(_, _, {bad_cert, _} = Reason, _) ->
      -   {fail, Reason};
      -    (_, _, {extension, _}, UserState) ->
      -   {unknown, UserState};
      -    (_, _, valid, UserState) ->
      -   {valid, UserState};
      -    (_, _, valid_peer, UserState) ->
      -       {valid, UserState}
      - end, []}

      Default option verify_fun in mode verify_none:

       {fun(_, _, {bad_cert, _}, UserState) ->
      -   {valid, UserState};
      -    (_, _, {extension, #'Extension'{critical = true}}, UserState) ->
      -   {valid, UserState};
      -    (_, _, {extension, _}, UserState) ->
      -   {unknown, UserState};
      -    (_, _, valid, UserState) ->
      -   {valid, UserState};
      -    (_, _, valid_peer, UserState) ->
      -       {valid, UserState}
      - end, []}

      The possible path validation errors are given in the form {bad_cert, Reason}, +validation will fail.

      Default option verify_fun in verify_peer mode:

      {fun(_, _, {bad_cert, _} = Reason, _) ->
      +   {fail, Reason};
      +    (_, _, {extension, _}, UserState) ->
      +   {unknown, UserState};
      +    (_, _, valid, UserState) ->
      +   {valid, UserState};
      +    (_, _, valid_peer, UserState) ->
      +       {valid, UserState}
      + end, []}

      Default option verify_fun in mode verify_none:

       {fun(_, _, {bad_cert, _}, UserState) ->
      +   {valid, UserState};
      +    (_, _, {extension, #'Extension'{critical = true}}, UserState) ->
      +   {valid, UserState};
      +    (_, _, {extension, _}, UserState) ->
      +   {unknown, UserState};
      +    (_, _, valid, UserState) ->
      +   {valid, UserState};
      +    (_, _, valid_peer, UserState) ->
      +       {valid, UserState}
      + end, []}

      The possible path validation errors are given in the form {bad_cert, Reason}, where Reason is:

      • unknown_ca

        No trusted CA was found in the trusted store. The trusted CA is normally a so-called ROOT CA, which is a self-signed certificate. Trust can be claimed for an intermediate CA (the trusted anchor does not have to be @@ -3079,11 +3079,11 @@ enforced. If SecureRenegotiate is false secure renegotiation will still be used if possible, but it falls back to insecure renegotiation if the peer does not support if RFC -5746.

      • {user_lookup_fun, {LookupFun, UserState}} - PSK/SRP cipher suite option

        The lookup fun is to be defined as follows:

        fun(psk, PSKIdentity :: binary(), UserState :: term()) ->
        -  {ok, SharedSecret :: binary()} | error;
        -fun(srp, Username :: binary(), UserState :: term()) ->
        -  {ok, {SRPParams :: srp_param_type(), Salt :: binary(),
        -        DerivedKey :: binary()}} | error.

        For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client +5746.

      • {user_lookup_fun, {LookupFun, UserState}} - PSK/SRP cipher suite option

        The lookup fun is to be defined as follows:

        fun(psk, PSKIdentity :: binary(), UserState :: term()) ->
        +  {ok, SharedSecret :: binary()} | error;
        +fun(srp, Username :: binary(), UserState :: term()) ->
        +  {ok, {SRPParams :: srp_param_type(), Salt :: binary(),
        +        DerivedKey :: binary()}} | error.

        For Pre-Shared Key (PSK) cipher suites, the lookup fun is called by the client and server to determine the shared secret. When called by the client, PSKIdentity is the hint presented by the server or undefined. When called by the server, PSKIdentity is the identity presented by the client.

        For Secure Remote Password (SRP), the fun is only used by the server to obtain @@ -4360,8 +4360,8 @@ -

        Opens a TLS/DTLS connection.

        connect(TCPSocket, TLSOptions, Timeout).

        Upgrades a gen_tcp (or equivalent) connected socket to a TLS socket by -performing the client-side TLS handshake.

        connect(Host, Port, TLSOptions).

        Opens a TLS/DTLS connection to Host, Port. This call is equivalent to:

        connect(Host, Port, TLSOptions, infinity).
        +

        Opens a TLS/DTLS connection.

        connect(TCPSocket, TLSOptions, Timeout).

        Upgrades a gen_tcp (or equivalent) connected socket to a TLS socket by +performing the client-side TLS handshake.

        connect(Host, Port, TLSOptions).

        Opens a TLS/DTLS connection to Host, Port. This call is equivalent to:

        connect(Host, Port, TLSOptions, infinity).
        @@ -5058,7 +5058,7 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_app.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_app.html 2026-04-20 17:48:53.577766171 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_app.html 2026-04-20 17:48:53.581766196 +0000 @@ -203,7 +203,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache.html 2026-04-20 17:48:53.621766445 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache.html 2026-04-20 17:48:53.621766445 +0000 @@ -334,7 +334,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache_api.html 2026-04-20 17:48:53.653766643 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_crl_cache_api.html 2026-04-20 17:48:53.653766643 +0000 @@ -485,7 +485,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_distribution.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_distribution.html 2026-04-20 17:48:53.685766841 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_distribution.html 2026-04-20 17:48:53.689766866 +0000 @@ -105,14 +105,14 @@ applications. Such a script is located in the bin directory of the Erlang distribution. The source for the script is found under the Erlang installation top directory under releases/<OTP version>/start_clean.rel.

        Do the following:

        • Copy that script to another location (and preferably another name).
        • Add the applications Crypto, Public Key, and SSL with their current version -numbers after the STDLIB application.

        The following shows an example .rel file with TLS added:

              {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
        -      [{kernel,"2.15"},
        -      {stdlib,"1.18"},
        -      {crypto, "2.0.3"},
        -      {public_key, "0.12"},
        -      {asn1, "4.0"},
        -      {ssl, "5.0"}
        -      ]}.

        The version numbers differ in your system. Whenever one of the applications +numbers after the STDLIB application.

      The following shows an example .rel file with TLS added:

            {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
      +      [{kernel,"2.15"},
      +      {stdlib,"1.18"},
      +      {crypto, "2.0.3"},
      +      {public_key, "0.12"},
      +      {asn1, "4.0"},
      +      {ssl, "5.0"}
      +      ]}.

      The version numbers differ in your system. Whenever one of the applications included in the script is upgraded, change the script.

      Do the following:

      • Build the boot script.

        Assuming the .rel file is stored in a file start_ssl.rel in the current directory, a boot script can be built as follows:

         1> systools:make_script("start_ssl",[]).

      There is now a start_ssl.boot file in the current directory.

      Do the following:

      • Test the boot script. To do this, start Erlang with the -boot command-line parameter specifying this boot script (with its full path, but without the @@ -147,10 +147,10 @@ so beware!

        For TLS to work, at least a public key and a certificate must be specified for the server side and the client needs to specify CAs that it trusts (client certification is optional and requires more configuration).

        In the following example (to keep it simple), the PEM file "/home/me/ssl/erlserver.pem" -contains both the server certificate and its private key .

        Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

        [{server,
        -  [{certfile, "/home/me/ssl/erlserver.pem"}]},
        - {client,
        -  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

        And then start the node like this (line breaks in the command are for +contains both the server certificate and its private key .

        Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

        [{server,
        +  [{certfile, "/home/me/ssl/erlserver.pem"}]},
        + {client,
        +  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

        And then start the node like this (line breaks in the command are for readability, and shall not be there when typed):

        $ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls
           -ssl_dist_optfile "/home/me/ssl/ssl_test@myhost.conf"
           -sname ssl_test

        The options in the {server, Opts} tuple are used when calling @@ -168,25 +168,25 @@ present any certificate.

        A node started in this way is fully functional, using TLS as the distribution protocol.

        verify_fun Configuration Example

        The verify_fun option creates a reference to the implementing function since the configuration is evaluated as an Erlang term. In -an example file for use with -ssl_dist_optfile:

        [{server,[{fail_if_no_peer_cert,true},
        -          {certfile,"/home/me/ssl/cert.pem"},
        -          {keyfile,"/home/me/ssl/privkey.pem"},
        -          {cacertfile,"/home/me/ssl/ca_cert.pem"},
        -          {verify,verify_peer},
        -          {verify_fun,{fun mydist:verify/3,"any initial value"}}]},
        - {client,[{certfile,"/home/me/ssl/cert.pem"},
        -          {keyfile,"/home/me/ssl/privkey.pem"},
        -          {cacertfile,"/home/me/ssl/ca_cert.pem"},
        -          {verify,verify_peer},
        -          {verify_fun,{fun mydist:verify/3,"any initial value"}}]}].
        -

        mydist:verify/3 will be called with:

        • OtpCert, the other party's certificate PKIX Certificates
        • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
        • Init will be "any initial value"

        A pattern for verify/3 will look like:

        verify(OtpCert, _SslStatus, Init) ->
        -    IsOk = is_ok(OtpCert, Init),
        +an example file for use with -ssl_dist_optfile:

        [{server,[{fail_if_no_peer_cert,true},
        +          {certfile,"/home/me/ssl/cert.pem"},
        +          {keyfile,"/home/me/ssl/privkey.pem"},
        +          {cacertfile,"/home/me/ssl/ca_cert.pem"},
        +          {verify,verify_peer},
        +          {verify_fun,{fun mydist:verify/3,"any initial value"}}]},
        + {client,[{certfile,"/home/me/ssl/cert.pem"},
        +          {keyfile,"/home/me/ssl/privkey.pem"},
        +          {cacertfile,"/home/me/ssl/ca_cert.pem"},
        +          {verify,verify_peer},
        +          {verify_fun,{fun mydist:verify/3,"any initial value"}}]}].
        +

        mydist:verify/3 will be called with:

        • OtpCert, the other party's certificate PKIX Certificates
        • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
        • Init will be "any initial value"

        A pattern for verify/3 will look like:

        verify(OtpCert, _SslStatus, Init) ->
        +    IsOk = is_ok(OtpCert, Init),
             NewInitValue = "some new value",
             case IsOk of
                true ->
        -           {valid, NewInitValue};
        +           {valid, NewInitValue};
                false ->
        -           {failure, NewInitValue}
        +           {failure, NewInitValue}
             end.

        verify_fun can accept a verify/4 function, which will receive:

        • OtpCert, the other party's certificate PKIX Certificates
        • DerCert, the other party's original DER Encoded certificate
        • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
        • Init will be "any initial value"

        The verify/4 can use the DerCert for atypical workarounds such as handling decoding errors and directly verifying signatures.

        For more details see {verify_fun, Verify} in common_option_cert

        Note

        The legacy command line format for verify_fun cannot be used in a -ssl_dist_optfile file as described below in @@ -226,19 +226,19 @@ -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true" $ export ERL_FLAGS $ erl -sname ssl_test -Erlang (BEAM) emulator version 5.0 [source] +Erlang (BEAM) emulator version 5.0 [source] -Eshell V5.0 (abort with ^G) -(ssl_test@myhost)1> init:get_arguments(). -[{root,["/usr/local/erlang"]}, - {progname,["erl "]}, - {sname,["ssl_test"]}, - {boot,["/home/me/ssl/start_ssl"]}, - {proto_dist,["inet_tls"]}, - {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, - {ssl_dist_opt,["server_secure_renegotiate","true", - "client_secure_renegotiate","true"] - {home,["/home/me"]}]

        The init:get_arguments() call verifies that the correct arguments are supplied +Eshell V5.0 (abort with ^G) +(ssl_test@myhost)1> init:get_arguments(). +[{root,["/usr/local/erlang"]}, + {progname,["erl "]}, + {sname,["ssl_test"]}, + {boot,["/home/me/ssl/start_ssl"]}, + {proto_dist,["inet_tls"]}, + {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, + {ssl_dist_opt,["server_secure_renegotiate","true", + "client_secure_renegotiate","true"] + {home,["/home/me"]}]

  • The init:get_arguments() call verifies that the correct arguments are supplied to the emulator.

    @@ -291,7 +291,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_protocol.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_protocol.html 2026-04-20 17:48:53.721767065 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_protocol.html 2026-04-20 17:48:53.721767065 +0000 @@ -202,7 +202,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_session_cache_api.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_session_cache_api.html 2026-04-20 17:48:53.757767288 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/ssl_session_cache_api.html 2026-04-20 17:48:53.753767264 +0000 @@ -688,7 +688,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/standards_compliance.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/standards_compliance.html 2026-04-20 17:48:53.793767512 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/standards_compliance.html 2026-04-20 17:48:53.797767536 +0000 @@ -153,7 +153,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/using_ssl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/using_ssl.html 2026-04-20 17:48:53.849767859 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.5.3/doc/html/using_ssl.html 2026-04-20 17:48:53.853767884 +0000 @@ -107,87 +107,87 @@ except for the purpose of pattern matching.

    Note

    Note that client certificate verification is optional for the server and needs additional conguration on both sides to work. The Certificate and keys, in the examples, are provided using the ssl:cert_key_conf/0 supplied in the certs_keys -introduced in OTP 25.

    Basic Client

     1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    -                                                 {cacerts, public_key:cacerts_get()}]).
    -   {ok,{sslsocket, [...]}}

    Basic Connection

    Step 1: Start the server side:

    1 server> ssl:start().
    +introduced in OTP 25.

    Basic Client

     1 > ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
    +                                                 {cacerts, public_key:cacerts_get()}]).
    +   {ok,{sslsocket, [...]}}

    Basic Connection

    Step 1: Start the server side:

    1 server> ssl:start().
     ok

    Step 2: with alternative certificates, in this example the EDDSA certificate will be preferred if TLS-1.3 is negotiated and the RSA certificate will always -be used for TLS-1.2 as it does not support the EDDSA algorithm:

    2 server> {ok, ListenSocket} =
    -ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
    -                                  keyfile => "eddsakey.pem"},
    -                                #{certfile => "rsacert.pem",
    +be used for TLS-1.2 as it does not support the EDDSA algorithm:

    2 server> {ok, ListenSocket} =
    +ssl:listen(9999, [{certs_keys, [#{certfile => "eddsacert.pem",
    +                                  keyfile => "eddsakey.pem"},
    +                                #{certfile => "rsacert.pem",
                                       keyfile => "rsakey.pem",
    -                                  password => "foobar"}
    -                               ]},{reuseaddr, true}]).
    -{ok,{sslsocket, [...]}}

    Step 3: Do a transport accept on the TLS listen socket:

    3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
    -{ok,{sslsocket, [...]}}

    Note

    ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the + password => "foobar"} + ]},{reuseaddr, true}]). +{ok,{sslsocket, [...]}}

    Step 3: Do a transport accept on the TLS listen socket:

    3 server> {ok, TLSTransportSocket} = ssl:transport_accept(ListenSocket).
    +{ok,{sslsocket, [...]}}

    Note

    ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the handshake part can be called in a new Erlang process dedicated to handling the -connection

    Step 4: Start the client side:

    1 client> ssl:start().
    +connection

    Step 4: Start the client side:

    1 client> ssl:start().
     ok

    Be sure to configure trusted certificates to use for server certificate -verification.

    2 client> {ok, Socket} = ssl:connect("localhost", 9999,
    -      [{verify, verify_peer},
    -      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
    -{ok,{sslsocket, [...]}}

    Step 5: Do the TLS handshake:

    4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
    -{ok,{sslsocket, [...]}}

    Note

    A real server should use ssl:handshake/2, which accepts a timeout, to avoid DoS -attacks. In the example the timeout defaults to infinity.

    Step 6: Send a message over TLS:

    5 server> ssl:send(Socket, "foo").
    +verification.

    2 client> {ok, Socket} = ssl:connect("localhost", 9999,
    +      [{verify, verify_peer},
    +      {cacertfile, "cacerts.pem"}, {active, once}], infinity).
    +{ok,{sslsocket, [...]}}

    Step 5: Do the TLS handshake:

    4 server> {ok, Socket} = ssl:handshake(TLSTransportSocket).
    +{ok,{sslsocket, [...]}}

    Note

    A real server should use ssl:handshake/2, which accepts a timeout, to avoid DoS +attacks. In the example the timeout defaults to infinity.

    Step 6: Send a message over TLS:

    5 server> ssl:send(Socket, "foo").
     ok

    Step 7: Flush the shell message queue to see that the message sent on the -server side is recived by the client side:

    3 client> flush().
    -Shell got {ssl,{sslsocket,[...]},"foo"}
    +server side is recived by the client side:

    3 client> flush().
    +Shell got {ssl,{sslsocket,[...]},"foo"}
     ok

    Upgrade Example - TLS only

    Upgrading a a TCP/IP connection to a TLS connections is mostly used when there is a desire have unencrypted communication first and then later secure the communication channel by using TLS. Note that the client and server need to agree to do the upgrade in the protocol doing the communication. This is concept is often referenced as STARTLS and used in many protocols such as SMTP, -FTPS and HTTPS via a proxy.

    Warning

    Maximum security recommendations are however moving away from such solutions.

    To upgrade to a TLS connection:

    Step 1: Start the server side:

    1 server> ssl:start().
    +FTPS and HTTPS via a proxy.

    Warning

    Maximum security recommendations are however moving away from such solutions.

    To upgrade to a TLS connection:

    Step 1: Start the server side:

    1 server> ssl:start().
       ok

    Step 2: Create a normal TCP listen socket and ensure active is set to false and not set to any active mode otherwise TLS handshake messages can be -delivered to the wrong process.

    2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
    -  {active, false}]).
    -  {ok, #Port<0.475>}

    Step 3: Accept client connection:

    3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
    -  {ok, #Port<0.476>}

    Step 4: Start the client side:

    1 client> ssl:start().
    -  ok
    2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

    Step 5: Do the TLS handshake:

    4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
    -  {fail_if_no_peer_cert, true},
    -  {cacertfile, "cacerts.pem"},
    -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
    -  {ok,{sslsocket,[...]}}

    Step 6: Upgrade to a TLS connection. The client and server must agree upon the +delivered to the wrong process.

    2 server> {ok, ListenSocket} = gen_tcp:listen(9999, [{reuseaddr, true},
    +  {active, false}]).
    +  {ok, #Port<0.475>}

    Step 3: Accept client connection:

    3 server> {ok, Socket} = gen_tcp:accept(ListenSocket).
    +  {ok, #Port<0.476>}

    Step 4: Start the client side:

    1 client> ssl:start().
    +  ok
    2 client> {ok, Socket} = gen_tcp:connect("localhost", 9999,  [], infinity).

    Step 5: Do the TLS handshake:

    4 server> {ok, TLSSocket} = ssl:handshake(Socket, [{verify, verify_peer},
    +  {fail_if_no_peer_cert, true},
    +  {cacertfile, "cacerts.pem"},
    +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}]).
    +  {ok,{sslsocket,[...]}}

    Step 6: Upgrade to a TLS connection. The client and server must agree upon the upgrade. The server must be prepared to be a TLS server before the client can do -a successful connect.

    3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
    -  {cacertfile, "cacerts.pem"},
    -  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
    -{ok,{sslsocket,[...]}}

    Step 7: Send a message over TLS:

    4 client> ssl:send(TLSSocket, "foo").
    -      ok

    Step 8: Set active once on the TLS socket:

    5 server> ssl:setopts(TLSSocket, [{active, once}]).
    +a successful connect.

    3 client>{ok, TLSSocket} = ssl:connect(Socket, [{verify, verify_peer},
    +  {cacertfile, "cacerts.pem"},
    +  {certs_keys, [#{certfile => "cert.pem", keyfile => "key.pem"}]}], infinity).
    +{ok,{sslsocket,[...]}}

    Step 7: Send a message over TLS:

    4 client> ssl:send(TLSSocket, "foo").
    +      ok

    Step 8: Set active once on the TLS socket:

    5 server> ssl:setopts(TLSSocket, [{active, once}]).
           ok

    Step 9: Flush the shell message queue to see that the message sent on the -client side is recived by the server side:

    5 server> flush().
    -      Shell got {ssl,{sslsocket,[...]},"foo"}
    +client side is recived by the server side:

    5 server> flush().
    +      Shell got {ssl,{sslsocket,[...]},"foo"}
           ok

    Customizing cipher suites

    Fetch default cipher suite list for a TLS/DTLS version. Change default to all to -get all possible cipher suites.

    1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
    -    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
    -    mac => aead,prf => sha384}, ....]

    In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange +get all possible cipher suites.

    1>  Default = ssl:cipher_suites(default, 'tlsv1.2').
    +    [#{cipher => aes_256_gcm,key_exchange => ecdhe_ecdsa,
    +    mac => aead,prf => sha384}, ....]

    In OTP 20 it is desirable to remove all cipher suites that uses rsa key exchange (removed from default in 21)

    2> NoRSA =
    -    ssl:filter_cipher_suites(Default,
    -                             [{key_exchange, fun(rsa) -> false;
    -                                                (_) -> true
    -                                             end}]).
    -    [...]

    Pick just a few suites

     3> Suites =
    - ssl:filter_cipher_suites(Default,
    -                             [{key_exchange, fun(ecdh_ecdsa) -> true;
    -                                                (_) -> false
    -                                             end},
    -                              {cipher, fun(aes_128_cbc) -> true;
    -                                          (_) ->false
    -                                       end}]).
    -
    -[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    -   mac => sha256,prf => sha256},
    - #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    -   prf => default_prf}]

    Make some particular suites the most preferred, or least preferred by changing -prepend to append.

     4>ssl:prepend_cipher_suites(Suites, Default).
    -  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    -     mac => sha256,prf => sha256},
    -   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    -     prf => default_prf},
    -   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
    -     mac => sha384,prf => sha384}, ...]

    Customizing signature algorithms(TLS-1.2)/schemes(TLS-1.3)

    Starting from TLS-1.2 signature algorithms (called signature schemes in TLS-1.3) + ssl:filter_cipher_suites(Default, + [{key_exchange, fun(rsa) -> false; + (_) -> true + end}]). + [...]

    Pick just a few suites

     3> Suites =
    + ssl:filter_cipher_suites(Default,
    +                             [{key_exchange, fun(ecdh_ecdsa) -> true;
    +                                                (_) -> false
    +                                             end},
    +                              {cipher, fun(aes_128_cbc) -> true;
    +                                          (_) ->false
    +                                       end}]).
    +
    +[#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    +   mac => sha256,prf => sha256},
    + #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    +   prf => default_prf}]

    Make some particular suites the most preferred, or least preferred by changing +prepend to append.

     4>ssl:prepend_cipher_suites(Suites, Default).
    +  [#{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,
    +     mac => sha256,prf => sha256},
    +   #{cipher => aes_128_cbc,key_exchange => ecdh_ecdsa,mac => sha,
    +     prf => default_prf},
    +   #{cipher => aes_256_cbc,key_exchange => ecdhe_ecdsa,
    +     mac => sha384,prf => sha384}, ...]

    Customizing signature algorithms(TLS-1.2)/schemes(TLS-1.3)

    Starting from TLS-1.2 signature algorithms (called signature schemes in TLS-1.3) is something that can be negotiated and hence also configured. These algorithms/schemes will be used for digital signatures in protocol messages and in certificates.

    Note

    TLS-1.3 schemes have atom names whereas TLS-1.2 configuration is two element @@ -199,9 +199,9 @@ suite that is chosen, which is not the case in TLS-1.3.

    Using the function ssl:signature_algs/2 will let you inspect different aspects of possible configurations for your system. For example if TLS-1.3 and TLS-1.2 is supported the default signature_algorithm list in OTP-26 and cryptolib from -OpenSSL 3.0.2 would look like:

     1>  ssl:signature_algs(default, 'tlsv1.3').
    +OpenSSL 3.0.2 would look like:

     1>  ssl:signature_algs(default, 'tlsv1.3').
      %% TLS-1.3 schemes
    - [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
    + [eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
       ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
       rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
       rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
    @@ -209,47 +209,47 @@
       %% (would have a tuple name in TLS-1.2 only configuration)
       rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256
       %% TLS 1.2 algorithms
    -  {sha512,ecdsa},
    -  {sha384,ecdsa},
    -  {sha256,ecdsa}]

    If you want to add support for non default supported algorithms you should + {sha512,ecdsa}, + {sha384,ecdsa}, + {sha256,ecdsa}]

    If you want to add support for non default supported algorithms you should append them to the default list as the configuration is in prefered order, -something like this:

        MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
    -    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
    +something like this:

        MySignatureAlgs = ssl:signature_algs(default, 'tlsv1.3') ++ [{sha, rsa}, {sha, dsa}],
    +    ssl:connect(Host,Port,[{signature_algs, MySignatureAlgs,...]}),
         ...

    See also ssl:signature_algs/2 and sign_algo()

    Using an Engine Stored Key

    Erlang ssl application is able to use private keys provided by OpenSSL engines -using the following mechanism:

    1> ssl:start().
    +using the following mechanism:

    1> ssl:start().
     ok

    Load a crypto engine, should be done once per engine used. For example -dynamically load the engine called MyEngine:

    2> {ok, EngineRef} =
    -crypto:engine_load(<<"dynamic">>,
    -[{<<"SO_PATH">>, "/tmp/user/engines/MyEngine"},<<"LOAD">>],
    -[]).
    -{ok,#Ref<0.2399045421.3028942852.173962>}

    Create a map with the engine information and the algorithm used by the engine:

    3> PrivKey =
    - #{algorithm => rsa,
    +dynamically load the engine called MyEngine:

    2> {ok, EngineRef} =
    +crypto:engine_load(<<"dynamic">>,
    +[{<<"SO_PATH">>, "/tmp/user/engines/MyEngine"},<<"LOAD">>],
    +[]).
    +{ok,#Ref<0.2399045421.3028942852.173962>}

    Create a map with the engine information and the algorithm used by the engine:

    3> PrivKey =
    + #{algorithm => rsa,
        engine => EngineRef,
    -   key_id => "id of the private key in Engine"}.

    Use the map in the ssl key option:

    4> {ok, SSLSocket} =
    - ssl:connect("localhost", 9999,
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/404.html	2026-04-20 17:48:53.889768107 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/404.html	2026-04-20 17:48:53.889768107 +0000
    @@ -110,7 +110,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/api-reference.html 2026-04-20 17:48:53.925768331 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/api-reference.html 2026-04-20 17:48:53.933768380 +0000 @@ -766,7 +766,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/argparse.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/argparse.html 2026-04-20 17:48:53.977768653 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/argparse.html 2026-04-20 17:48:53.973768628 +0000 @@ -105,20 +105,20 @@ errors when users give the program invalid arguments.

    Quick start

    argparse is designed to work with escript. The example below is a fully functioning Erlang program accepting two command line arguments and printing their product.

    #href_anchor"w">
    -main(Args) ->
    -    argparse:run(Args, cli(), #{progname => mul}).
    +main(Args) ->
    +    argparse:run(Args, cli(), #{progname => mul}).
     
    -cli() ->
    -    #{
    -        arguments => [
    -            #{name => left, type => integer},
    -            #{name => right, type => integer}
    -        ],
    +cli() ->
    +    #{
    +        arguments => [
    +            #{name => left, type => integer},
    +            #{name => right, type => integer}
    +        ],
             handler =>
    -            fun (#{left := Left, right := Right}) ->
    -                io:format("~b~n", [Left * Right])
    +            fun (#{left := Left, right := Right}) ->
    +                io:format("~b~n", [Left * Right])
                 end
    -    }.

    Running this script with no arguments results in an error, accompanied by the + }.

    Running this script with no arguments results in an error, accompanied by the usage information.

    The cli function defines a single command with embedded handler accepting a map. Keys of the map are argument names as defined by the argument field of the command, left and right in the example. Values are taken from the @@ -126,25 +126,25 @@ specification. Both arguments in the example above are required (and therefore defined as positional).

    Command hierarchy

    A command may contain nested commands, forming a hierarchy. Arguments defined at the upper level command are automatically added to all nested commands. Nested -commands example (assuming progname is nested):

    cli() ->
    -  #{
    +commands example (assuming progname is nested):

    cli() ->
    +  #{
         %% top level argument applicable to all commands
    -    arguments => [#{name => top}],
    -      commands => #{
    -        "first" => #{
    +    arguments => [#{name => top}],
    +      commands => #{
    +        "first" => #{
               %% argument applicable to "first" command and
               %%  all commands nested into "first"
    -          arguments => [#{name => mid}],
    -          commands => #{
    -            "second" => #{
    +          arguments => [#{name => mid}],
    +          commands => #{
    +            "second" => #{
                   %% argument only applicable for "second" command
    -              arguments => [#{name => bottom}],
    -              handler => fun (A) -> io:format("~p~n", [A]) end
    -          }
    -        }
    -      }
    -    }
    -  }.

    In the example above, a 3-level hierarchy is defined. First is the script itself + arguments => [#{name => bottom}], + handler => fun (A) -> io:format("~p~n", [A]) end + } + } + } + } + }.

    In the example above, a 3-level hierarchy is defined. First is the script itself (nested), accepting the only argument top. Since it has no associated handler, run/3 will not accept user input omitting nested command selection. For this example, user has to supply 5 arguments in the command line, two being @@ -156,14 +156,14 @@ on all operating systems). Both options and positional arguments have 1 or more associated values. See argument specification to find more details about supported combinations.

    In the user input, short options may be concatenated with their values. Long -options support values separated by =. Consider this definition:

    cli() ->
    -  #{
    -    arguments => [
    -      #{name => long, long => "-long"},
    -      #{name => short, short => $s}
    -    ],
    -    handler => fun (Args) -> io:format("~p~n", [Args]) end
    -  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running +options support values separated by =. Consider this definition:

    cli() ->
    +  #{
    +    arguments => [
    +      #{name => long, long => "-long"},
    +      #{name => short, short => $s}
    +    ],
    +    handler => fun (Args) -> io:format("~p~n", [Args]) end
    +  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running ./args -sVALUE prints #{short => "VALUE"}

    argparse supports boolean flags concatenation: it is possible to shorten -r -f -v to -rfv.

    Shortened option names are not supported: it is not possible to use --my-argum instead of --my-argument-name even when such option can be unambiguously @@ -594,111 +594,111 @@ which case resulting argument map will either contain the default value, or not have the key at all.

    • name - Sets the argument name in the parsed argument map. If help is not defined, name is also used to generate the default usage message.

    • short - Defines a short (single character) form of an optional argument.

      %% Define a command accepting argument named myarg, with short form $a:
      -1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
      +1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
       %% Parse command line "-a str":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
       
      -#{myarg => "str"}
      +#{myarg => "str"}
       
       %% Option value can be concatenated with the switch: "-astr"
      -3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
       
      -#{myarg => "str"}

      By default all options expect a single value following the option switch. The -only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
      +#{myarg => "str"}

      By default all options expect a single value following the option switch. The +only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
       %% Parse command line "-name Erlang":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}
      +#{myarg => "Erlang"}
       %% Or use "=" to separate the switch and the value:
      -3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}

      If neither short not long is defined, the argument is treated as +#{myarg => "Erlang"}

    If neither short not long is defined, the argument is treated as positional.

  • required - Forces the parser to expect the argument to be present in the command line. By default, all positional argument are required, and all options are not.

  • default - Specifies the default value to put in the parsed argument map -if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
    +if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
     
    -{ok,#{}, ...
    -2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
    +{ok,#{}, ...
    +2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
     
    -{ok,#{myarg => "def"}, ...
  • type - Defines type conversion and validation routine. The default is +{ok,#{myarg => "def"}, ...

  • type - Defines type conversion and validation routine. The default is string, assuming no conversion.

  • nargs - Defines the number of following arguments to consume from the command line. By default, the parser consumes the next argument and converts it into an Erlang term according to the specified type.

    • pos_integer/0 - Consume exactly this number of positional arguments, fail if there is not enough. Value in the argument map contains a list of exactly this length. Example, defining a positional argument expecting 3 -integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      -argparse:parse(["1", "2", "3"], Cmd).
      +integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      +argparse:parse(["1", "2", "3"], Cmd).
       
      -{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two -string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      -argparse:parse(["-env", "key", "value"], Cmd).
      +{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two +string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      +argparse:parse(["-env", "key", "value"], Cmd).
       
      -{ok, #{env => ["key", "value"]}, ...
    • list - Consume all following arguments until hitting the next option +{ok, #{env => ["key", "value"]}, ...

  • list - Consume all following arguments until hitting the next option (starting with an option prefix). May result in an empty list added to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => nodes, long => "nodes", nargs => list},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => nodes, long => "nodes", nargs => list},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
     
    -{ok, #{nodes => ["one", "two"], verbose => true}, ...
  • nonempty_list - Same as list, but expects at least one argument. +{ok, #{nodes => ["one", "two"], verbose => true}, ...

  • nonempty_list - Same as list, but expects at least one argument. Returns an error if the following command line argument is an option switch (starting with the prefix).

  • 'maybe' - Consumes the next argument from the command line, if it does not start with an option prefix. Otherwise, adds a default value to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-l", "info", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-l", "info", "-v"], Cmd).
     
    -{ok,#{level => "info",verbose => true}, ...
    +{ok,#{level => "info",verbose => true}, ...
     
     %% When "info" is omitted, argument maps receives the default "error"
    -2> argparse:parse(["-l", "-v"], Cmd).
    +2> argparse:parse(["-l", "-v"], Cmd).
     
    -{ok,#{level => "error",verbose => true}, ...
  • {'maybe', term()} - Consumes the next argument from the command line, +{ok,#{level => "error",verbose => true}, ...

  • {'maybe', term()} - Consumes the next argument from the command line, /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/array.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/array.html 2026-04-20 17:48:54.017768901 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/array.html 2026-04-20 17:48:54.017768901 +0000 @@ -101,14 +101,14 @@ reset/2). If you need to differentiate between unset and set entries, ensure that the default value cannot be confused with the values of set entries.

    The array never shrinks automatically. If an index I has been used to set an entry successfully, all indices in the range [0,I] stay accessible unless the -array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    -10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow -automatically:

    A1 = array:set(17, true, array:new()).
    -18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if -the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    -[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses -beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    -{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    +array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    +10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow +automatically:

    A1 = array:set(17, true, array:new()).
    +18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if +the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    +[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses +beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    +{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    @@ -1149,7 +1149,7 @@ array size; this also implies {fixed, true}. If N is not a non-negative integer, the call fails with reason badarg.

  • fixed or {fixed, true} - Creates a fixed-size array. See also fix/1.

  • {fixed, false} - Creates an extendible (non-fixed-size) array.

  • {default, Value} - Sets the default value for the array to Value.

  • Options are processed in the order they occur in the list, that is, later options have higher precedence.

    The default value is used as the value of uninitialized entries, and cannot be -changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    +changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    @@ -1182,7 +1182,7 @@ Options override parameter Size.

    If Options is a list, this is equivalent to new([{size, Size} | Options]), otherwise it is equivalent to new([{size, Size} | [Options]]). However, using this function -directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    +directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    @@ -1624,7 +1624,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/assert_hrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/assert_hrl.html 2026-04-20 17:48:54.049769099 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/assert_hrl.html 2026-04-20 17:48:54.053769125 +0000 @@ -90,7 +90,7 @@

    Assert macros.

    Description

    The include file assert.hrl provides macros for inserting assertions in your -program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an +program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an assertion fails, an exception of type error is generated. The associated error term has the form {Macro, Info}. Macro is the macro name, for example, assertEqual. Info is a list of tagged values, such as @@ -112,7 +112,7 @@ use ASSERT/NOASSERT to control only the assert macros.

    Macros

    • assert(BoolExpr)

    • assert(BoolExpr, Comment) - Tests that BoolExpr completes normally returning true.

    • assertNot(BoolExpr)

    • assertNot(BoolExpr, Comment) - Tests that BoolExpr completes normally returning false.

    • assertMatch(GuardedPattern, Expr)

    • assertMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes -normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr +normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes normally yielding a value that does not match GuardedPattern.

      As in assertMatch, GuardedPattern can have a when part.

    • assertEqual(ExpectedValue, Expr)

    • assertEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is exactly equal to ExpectedValue.

    • assertNotEqual(ExpectedValue, Expr)

    • assertNotEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is not exactly equal to @@ -169,7 +169,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/base64.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/base64.html 2026-04-20 17:48:54.093769373 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/base64.html 2026-04-20 17:48:54.093769373 +0000 @@ -636,16 +636,16 @@

      Decodes a base64 string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

      The function will strip away any whitespace characters and check for the -the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
      -<<1,2,3,4>>
      -2> base64:decode("AQ ID BA==").
      -<<1,2,3,4>>
      -3> base64:decode("AQIDBA=").
      +the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
      +<<1,2,3,4>>
      +2> base64:decode("AQ ID BA==").
      +<<1,2,3,4>>
      +3> base64:decode("AQIDBA=").
       ** exception error: missing_padding
            in function  base64:decode_list/7 (base64.erl, line 734)
               *** data to decode is missing final = padding characters, if this is intended, use the `padding => false` option
      -4> base64:decode("AQIDBA=", #{ padding => false }).
      -<<1,2,3,4>>
      +4>
      base64:decode("AQIDBA=", #{ padding => false }). +<<1,2,3,4>>
    @@ -899,10 +899,10 @@

    Decodes a base64 "mime" string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

    The function will strip away any illegal characters. It does not check for the -the correct number of = padding characters at the end of the encoded string.

    See decode_options/0 for details on which options can be passed.

    Example:

    1> base64:mime_decode("AQIDBA==").
    -<<1,2,3,4>>
    -2> base64:mime_decode("AQIDB=A=").
    -<<1,2,3,4>>
    +the correct number of = padding characters at the end of the encoded string.

    See decode_options/0 for details on which options can be passed.

    Example:

    1> base64:mime_decode("AQIDBA==").
    +<<1,2,3,4>>
    +2> base64:mime_decode("AQIDB=A=").
    +<<1,2,3,4>>
    @@ -998,7 +998,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/beam_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/beam_lib.html 2026-04-20 17:48:54.141769670 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/beam_lib.html 2026-04-20 17:48:54.137769645 +0000 @@ -104,8 +104,8 @@ Tools such as Debugger and Xref require the debug information to be included.

    Warning

    Source code can be reconstructed from the debug information. To prevent this, use encrypted debug information (see below).

    The debug information can also be removed from BEAM files using strip/1, strip_files/1, and/or strip_release/1.

    Reconstruct Source Code

    The following example shows how to reconstruct Erlang source code from the debug -information in a BEAM file Beam:

    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
    -io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

    Encrypted Debug Information

    The debug information can be encrypted to keep the source code secret, but still +information in a BEAM file Beam:

    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
    +io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

    Encrypted Debug Information

    The debug information can be encrypted to keep the source code secret, but still be able to use tools such as Debugger or Xref.

    To use encrypted debug information, a key must be provided to the compiler and beam_lib. The key is specified as a string. It is recommended that the string contains at least 32 characters and that both upper and lower case letters as @@ -125,13 +125,13 @@ user's home directory and then filename:basedir(user_config, "erlang"). If the file is found and contains a key, beam_lib implicitly creates a crypto key fun -and registers it.

    File .erlang.crypt is to contain a single list of tuples:

    {debug_info, Mode, Module, Key}

    Mode is the type of crypto algorithm; currently, the only allowed value is +and registers it.

    File .erlang.crypt is to contain a single list of tuples:

    {debug_info, Mode, Module, Key}

    Mode is the type of crypto algorithm; currently, the only allowed value is des3_cbc. Module is either an atom, in which case Key is only used for the module Module, or [], in which case Key is used for all modules. Key is the non-empty key string.

    Key in the first tuple where both Mode and Module match is used.

    The following is an example of an .erlang.crypt file that returns the same key -for all modules:

    [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    The following is a slightly more complicated example of an .erlang.crypt -providing one key for module t and another key for all other modules:

    [{debug_info, des3_cbc, t, "My KEY"},
    - {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    Note

    Do not use any of the keys in these examples. Use your own keys.

    +for all modules:

    [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    The following is a slightly more complicated example of an .erlang.crypt +providing one key for module t and another key for all other modules:

    [{debug_info, des3_cbc, t, "My KEY"},
    + {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    Note

    Do not use any of the keys in these examples. Use your own keys.

    @@ -1538,11 +1538,11 @@

    Registers an unary fun that is called if beam_lib must read an debug_info chunk that has been encrypted. The fun is held in a process that is started by the function.

    If a fun is already registered when attempting to register a fun, -{error, exists} is returned.

    The fun must handle the following arguments:

    CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

    Called when the fun is registered, in the process that holds the fun. Here the +{error, exists} is returned.

    The fun must handle the following arguments:

    CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

    Called when the fun is registered, in the process that holds the fun. Here the crypto key fun can do any necessary initializations. If {ok, NewCryptoKeyFun} is returned, NewCryptoKeyFun is registered instead of CryptoKeyFun. If {error, Term} is returned, the registration is aborted and -crypto_key_fun/1 also returns {error, Term}.

    CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for module Module in the file named Filename. +crypto_key_fun/1 also returns {error, Term}.

    CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for module Module in the file named Filename. Mode is the type of crypto algorithm; currently, the only possible value is des3_cbc. The call is to fail (raise an exception) if no key is available.

    CryptoKeyFun(clear) -> term()

    Called before the fun is unregistered. Here any cleaning up can be done. The return value is not important, but is passed back to the caller of @@ -1909,14 +1909,14 @@ -vsn(Vsn).

    If this attribute is not specified, the version defaults to the checksum of the module. Notice that if version Vsn is not a list, it is made into one, that is {ok,{Module,[Vsn]}} is returned. If there are many -vsn -module attributes, the result is the concatenated list of versions.

    Examples:

    1> beam_lib:version(a). % -vsn(1).
    -{ok,{a,[1]}}
    -2> beam_lib:version(b). % -vsn([1]).
    -{ok,{b,[1]}}
    -3> beam_lib:version(c). % -vsn([1]). -vsn(2).
    -{ok,{c,[1,2]}}
    -4> beam_lib:version(d). % no -vsn attribute
    -{ok,{d,[275613208176997377698094100858909383631]}}
    +module attributes, the result is the concatenated list of versions.

    Examples:

    1> beam_lib:version(a). % -vsn(1).
    +{ok,{a,[1]}}
    +2> beam_lib:version(b). % -vsn([1]).
    +{ok,{b,[1]}}
    +3> beam_lib:version(c). % -vsn([1]). -vsn(2).
    +{ok,{c,[1,2]}}
    +4> beam_lib:version(d). % no -vsn attribute
    +{ok,{d,[275613208176997377698094100858909383631]}}
    @@ -1945,7 +1945,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/binary.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/binary.html 2026-04-20 17:48:54.185769943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/binary.html 2026-04-20 17:48:54.181769918 +0000 @@ -589,11 +589,11 @@

    Returns the byte at position Pos (zero-based) in binary Subject as an integer.

    If Pos >= byte_size(Subject), a badarg exception -is raised.

    Examples

    1> binary:at(<<5,19,72,33>>, 0).
    +is raised.

    Examples

    1> binary:at(<<5,19,72,33>>, 0).
     5
    -2> binary:at(<<5,19,72,33>>, 1).
    +2> binary:at(<<5,19,72,33>>, 1).
     19
    -3> binary:at(<<5,19,72,33>>, 4).
    +3> binary:at(<<5,19,72,33>>, 4).
     ** exception error: bad argument
          in function  binary:at/2
             called as binary:at(<<5,19,72,33>>,4)
    @@ -627,8 +627,8 @@

    Converts Subject to a list of byte()s, each -representing the value of one byte.

    Examples

    1> binary:bin_to_list(<<"erlang",0>>).
    -[101,114,108,97,110,103,0]
    +representing the value of one byte.

    Examples

    1> binary:bin_to_list(<<"erlang",0>>).
    +[101,114,108,97,110,103,0]
    @@ -690,10 +690,10 @@

    Converts part of Subject to a list of byte/0s, each representing -the value of one byte.

    Pos and Len denote which part of the Subject binary to convert.

    Examples

    1> binary:bin_to_list(<<"erlang">>, 1, 3).
    +the value of one byte.

    Pos and Len denote which part of the Subject binary to convert.

    Examples

    1> binary:bin_to_list(<<"erlang">>, 1, 3).
     "rla"
     %% or [114,108,97] in list notation.
    -2> binary:bin_to_list(<<"erlang">>, 5, 3).
    +2> binary:bin_to_list(<<"erlang">>, 5, 3).
     ** exception error: bad argument
          in function  binary:bin_to_list/3
             called as binary:bin_to_list(<<"erlang">>,5,3)
    @@ -740,9 +740,9 @@
     binary is specified, the set has only one element. The order of alternatives in
     a pattern is not significant.

    The list of binaries used for search alternatives must be flat, proper, and non-empty.

    If Pattern is not a binary or a flat proper non-empty list of binaries with -length greater than 0, a badarg exception is raised.

    Examples

    1> Pat = binary:compile_pattern(~"rain").
    -2> binary:match(~"the rain in spain", Pat).
    -{4,4}
    +length greater than 0, a badarg exception is raised.

    Examples

    1> Pat = binary:compile_pattern(~"rain").
    +2> binary:match(~"the rain in spain", Pat).
    +{4,4}
    @@ -779,13 +779,13 @@ more binary data than needed. In general, sharing binary data is beneficial.

    Only in special cases — when small parts reference large binaries and the large binaries are no longer used in any process — can deliberate copying be -beneficial.

    Examples

    1> HugeBinary = <<0:100_000/unit:8>>.
    -2> byte_size(HugeBinary).
    +beneficial.

    Examples

    1> HugeBinary = <<0:100_000/unit:8>>.
    +2> byte_size(HugeBinary).
     100000
    -3> Part = binary:part(HugeBinary, 0, 5).
    -<<0,0,0,0,0>>
    -4> Copy = binary:copy(Part).
    -<<0,0,0,0,0>>
    +3>
    Part = binary:part(HugeBinary, 0, 5). +<<0,0,0,0,0>> +4> Copy = binary:copy(Part). +<<0,0,0,0,0>>
    @@ -815,8 +815,8 @@ -

    Creates a binary with the content of Subject duplicated N times.

    This function always creates a new binary, even when N is 1.

    Examples

    1> binary:copy(~"-", 10).
    -<<"----------">>
    +

    Creates a binary with the content of Subject duplicated N times.

    This function always creates a new binary, even when N is 1.

    Examples

    1> binary:copy(~"-", 10).
    +<<"----------">>
    @@ -847,9 +847,9 @@

    Decodes a hex-encoded binary into a binary.

    An exception is raised if the size of the binary is not evenly divisble by two, -or if the binary contains any characters that do not represent hex digits.

    Examples

    1> binary:decode_hex(<<"666f6f">>).
    -<<"foo">>
    -2> binary:decode_hex(<<"A">>).
    +or if the binary contains any characters that do not represent hex digits.

    Examples

    1> binary:decode_hex(<<"666f6f">>).
    +<<"foo">>
    +2> binary:decode_hex(<<"A">>).
     ** exception error: bad argument
          in function  binary:decode_hex/1
             called as binary:decode_hex(<<"A">>)
    @@ -918,15 +918,15 @@
           
     
     

    Converts the binary digit representation, in big endian or little endian, of a -positive integer in Subject to an Erlang integer/0.

    Examples

    1> binary:decode_unsigned(<<7>>).
    +positive integer in Subject to an Erlang integer/0.

    Examples

    1> binary:decode_unsigned(<<7>>).
     7
    -2> binary:decode_unsigned(<<1,0>>).
    +2> binary:decode_unsigned(<<1,0>>).
     256
    -3> binary:decode_unsigned(<<169,138,199>>).
    +3> binary:decode_unsigned(<<169,138,199>>).
     11111111
    -4> binary:decode_unsigned(<<169,138,199>>, big).
    +4> binary:decode_unsigned(<<169,138,199>>, big).
     11111111
    -5> binary:decode_unsigned(<<169,138,199>>, little).
    +5> binary:decode_unsigned(<<169,138,199>>, little).
     13077161
    @@ -989,12 +989,12 @@

    Encodes a binary into a hex-encoded binary using the specified case for the -hexadecimal digits "a" to "f".

    Examples

    1> binary:encode_hex(<<"foo">>, uppercase).
    -<<"666F6F">>
    -2> binary:encode_hex(<<"/">>, uppercase).
    -<<"2F">>
    -3> binary:encode_hex(<<"/">>, lowercase).
    -<<"2f">>
    +hexadecimal digits "a" to "f".

    Examples

    1> binary:encode_hex(<<"foo">>, uppercase).
    +<<"666F6F">>
    +2> binary:encode_hex(<<"/">>, uppercase).
    +<<"2F">>
    +3> binary:encode_hex(<<"/">>, lowercase).
    +<<"2f">>
    @@ -1057,18 +1057,18 @@

    Converts a non-negative integer into the smallest possible unsigned binary representation, using either big-endian or little-endian format.

    If Unsigned is not a non-negative integer, a badarg exception is -raised.

    Examples

    1> binary:encode_unsigned(0, big).
    -<<0>>
    -2> binary:encode_unsigned(255, big).
    -<<255>>
    -3> binary:encode_unsigned(256, big).
    -<<1,0>>
    -4> binary:encode_unsigned(256, little).
    -<<0,1>>
    -5> binary:encode_unsigned(11111111, big).
    -<<169,138,199>>
    -6> binary:encode_unsigned(11111111, little).
    -<<199,138,169>>
    +raised.

    Examples

    1> binary:encode_unsigned(0, big).
    +<<0>>
    +2> binary:encode_unsigned(255, big).
    +<<255>>
    +3> binary:encode_unsigned(256, big).
    +<<1,0>>
    +4> binary:encode_unsigned(256, little).
    +<<0,1>>
    +5> binary:encode_unsigned(11111111, big).
    +<<169,138,199>>
    +6> binary:encode_unsigned(11111111, little).
    +<<199,138,169>>
    @@ -1098,9 +1098,9 @@ -

    Returns the first byte of binary Subject as an integer.

    If the size of Subject is zero, a badarg exception is raised.

    Examples

    1> binary:first(<<42,99,100>>).
    +

    Returns the first byte of binary Subject as an integer.

    If the size of Subject is zero, a badarg exception is raised.

    Examples

    1> binary:first(<<42,99,100>>).
     42
    -2> binary:first(<<>>).
    +2> binary:first(<<>>).
     ** exception error: bad argument
          in function  binary:first/1
             called as binary:first(<<>>)
    @@ -1134,8 +1134,8 @@
     
           
     
    -

    Joins a list of binaries together by a specified Separator.

    Equivalent to iolist_to_binary(lists:join(Separator, Binaries)), but faster.

    Examples

    1> binary:join([<<"a">>, <<"b">>, <<"c">>], <<", ">>).
    -<<"a, b, c">>
    +

    Joins a list of binaries together by a specified Separator.

    Equivalent to iolist_to_binary(lists:join(Separator, Binaries)), but faster.

    Examples

    1> binary:join([<<"a">>, <<"b">>, <<"c">>], <<", ">>).
    +<<"a, b, c">>
    @@ -1165,9 +1165,9 @@ -

    Returns the last byte of binary Subject as an integer.

    If the size of Subject is zero, a badarg exception is raised.

    Examples

    1> binary:last(<<42,99,100>>).
    +

    Returns the last byte of binary Subject as an integer.

    If the size of Subject is zero, a badarg exception is raised.

    Examples

    1> binary:last(<<42,99,100>>).
     100
    -2> binary:last(<<>>).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/c.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/c.html	2026-04-20 17:48:54.225770192 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/c.html	2026-04-20 17:48:54.233770241 +0000
    @@ -1717,7 +1717,7 @@
           
     
     

    Compiles and then loads the code for a file on all nodes. Options defaults to -[]. Compilation is equivalent to:

    compile:file(File, Options ++ [report_errors, report_warnings])
    +[]. Compilation is equivalent to:

    compile:file(File, Options ++ [report_errors, report_warnings])
    @@ -2064,7 +2064,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/calendar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/calendar.html 2026-04-20 17:48:54.281770539 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/calendar.html 2026-04-20 17:48:54.289770588 +0000 @@ -1903,13 +1903,13 @@

    Converts an RFC 3339 timestamp into system time. The data format of RFC 3339 timestamps is described by RFC 3339. Starting from OTP 25.1, the minutes part of the time zone is optional.

    Valid option:

    • {unit, Unit} - The time unit of the return value. The default is -second.
    1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
    +second.
    1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
     1517498278
    -2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
    -   [{unit, nanosecond}]).
    +2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
    +   [{unit, nanosecond}]).
     1517498282088000000
    -3> calendar:rfc3339_to_system_time(<<"2018-02-01 15:18:02.088Z">>,
    -   [{unit, nanosecond}]).
    +3> calendar:rfc3339_to_system_time(<<"2018-02-01 15:18:02.088Z">>,
    +   [{unit, nanosecond}]).
     1517498282088000000
    @@ -2081,20 +2081,20 @@ second digits is three, six, or nine depending on what time unit is chosen. For native three fractional digits are included. Notice that trailing zeros are not removed from the fraction.

  • {return, Return} - The desired encoding type for the output, -whether a string or a binary is desired. Defaults to string.

  • 1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
    +whether a string or a binary is desired. Defaults to string.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
     "2018-04-23T14:56:28+02:00"
    -2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, "-02:00"}]).
    +2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, "-02:00"}]).
     "2018-04-23T10:56:52-02:00"
    -3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, -7200}]).
    +3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, -7200}]).
     "2018-04-23T10:57:05-02:00"
    -4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
    +4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    +   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
     "2018-04-23 12:57:20.482Z"
    -5> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}, {return, binary}]).
    -<<"2018-04-23 12:57:20.482Z">>
    +5>
    calendar:system_time_to_rfc3339(erlang:system_time(millisecond), + [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}, {return, binary}]). +<<"2018-04-23 12:57:20.482Z">>
    @@ -2389,7 +2389,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/custom_shell.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/custom_shell.html 2026-04-20 17:48:54.325770811 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/custom_shell.html 2026-04-20 17:48:54.329770836 +0000 @@ -104,20 +104,20 @@ started by default in -noshell mode, so we don't have to do anything special here. To start the custom shell we then call shell:start_interactive/1.

    #!/usr/bin/env escript
     %% pshell.es
    --export([start/0]).
    -main(_Args) ->
    -    shell:start_interactive({?MODULE, start, []}),
    -    timer:sleep(infinity). %% Make sure the escript does not exit
    +-export([start/0]).
    +main(_Args) ->
    +    shell:start_interactive({?MODULE, start, []}),
    +    timer:sleep(infinity). %% Make sure the escript does not exit
     
    --spec start() -> pid().
    -start() ->
    -    spawn(fun() ->
    -                  io:format(~"Starting process inspection shell~n"),
    -                  loop()
    -          end).
    +-spec start() -> pid().
    +start() ->
    +    spawn(fun() ->
    +                  io:format(~"Starting process inspection shell~n"),
    +                  loop()
    +          end).
     
    -loop() ->
    -    receive _M -> loop() end.

    If we run the above we will get this:

    $ ./pshell.es
    +loop() ->
    +    receive _M -> loop() end.

    If we run the above we will get this:

    $ ./pshell.es
     Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Starting process inspection shell
    @@ -128,32 +128,32 @@
     io:standard_io/0 as this shell will be line based. However, for a more complex
     shell it is better to send get_until I/O requests
     as commands read that way can span multiple lines. So we expand our loop/0 with
    -a io:get_line/1 and pass the results to our parser.

    loop() ->
    -    case io:get_line("> ") of
    +a io:get_line/1 and pass the results to our parser.

    loop() ->
    +    case io:get_line("> ") of
             eof -> ok;
    -        {error, Reason} -> exit(Reason);
    -        Data -> eval(string:trim(Data))
    +        {error, Reason} -> exit(Reason);
    +        Data -> eval(string:trim(Data))
         end,
    -    loop().
    +    loop().
     
    -eval("list") ->
    +eval("list") ->
         Format = " ~.10ts | ~.10ts | ~.10ts~n",
    -    io:format(Format,["Pid", "Name", "MsgQ Len"]),
    -    [begin
    -         [{registered_name,Name},{message_queue_len,Len}]
    -             = erlang:process_info(Pid, [registered_name, message_queue_len]),
    -         io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)])
    -     end || Pid <- processes()];
    -eval(Unknown) ->
    -    io:format("Unknown command: '~ts'~n",[Unknown]).
    -
    -to_list(Pid) when is_pid(Pid) ->
    -    pid_to_list(Pid);
    -to_list(Atom) when is_atom(Atom) ->
    -    atom_to_list(Atom);
    -to_list(Int) when is_integer(Int) ->
    -    integer_to_list(Int);
    -to_list(List) when is_list(List) ->
    +    io:format(Format,["Pid", "Name", "MsgQ Len"]),
    +    [begin
    +         [{registered_name,Name},{message_queue_len,Len}]
    +             = erlang:process_info(Pid, [registered_name, message_queue_len]),
    +         io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)])
    +     end || Pid <- processes()];
    +eval(Unknown) ->
    +    io:format("Unknown command: '~ts'~n",[Unknown]).
    +
    +to_list(Pid) when is_pid(Pid) ->
    +    pid_to_list(Pid);
    +to_list(Atom) when is_atom(Atom) ->
    +    atom_to_list(Atom);
    +to_list(Int) when is_integer(Int) ->
    +    integer_to_list(Int);
    +to_list(List) when is_list(List) ->
         List.

    If we run the above we will get this:

    $ ./pshell.es
     Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
    @@ -173,56 +173,56 @@
      <0.11.0>   | erl_prim_l | 0         
      <0.43.0>   | logger     | 0         
      <0.45.0>   | applicatio | 0
    -...

    With this all in place we can now easily add inspect, suspend and resume as well.

    eval("inspect " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +...

    With this all in place we can now easily add inspect, suspend and resume as well.

    eval("inspect " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] =
    -                erlang:process_info(Pid, [registered_name, memory, messages, status]),
    -            io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n",
    -                      [Pid, to_list(Name), Status, Memory, Messages])
    +            [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] =
    +                erlang:process_info(Pid, [registered_name, memory, messages, status]),
    +            io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n",
    +                      [Pid, to_list(Name), Status, Memory, Messages])
         end;
    -eval("suspend " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +eval("suspend " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            erlang:suspend_process(Pid),
    -            io:format("Suspeneded ~ts~n")
    +            erlang:suspend_process(Pid),
    +            io:format("Suspeneded ~ts~n")
         end;
    -eval("resume " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +eval("resume " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            erlang:resumne_process(Pid),
    -            io:format("Resumed ~ts~n")
    +            erlang:resumne_process(Pid),
    +            io:format("Resumed ~ts~n")
         end;

    Adding autocompletion

    Wouldn't it be great if we could add some simple auto-completion for our shell? We can do that by setting a edlin_expand fun for our shell. This is done by calling io:setopts([{expand_fun, Fun}]). The fun that we provide is will receive the reversed current line from edlin and is expected to return possible expansions. Let's start by adding a simple fun to -expand our commands.

    -spec start() -> pid().
    -start() ->
    -    spawn(fun() ->
    -                  io:setopts([{expand_fun, fun expand_fun/1}]),
    -                  io:format(~"Starting process inspection shell~n"),
    -                  loop()
    -          end).
    +expand our commands.

    -spec start() -> pid().
    +start() ->
    +    spawn(fun() ->
    +                  io:setopts([{expand_fun, fun expand_fun/1}]),
    +                  io:format(~"Starting process inspection shell~n"),
    +                  loop()
    +          end).
     
    --spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} |
    -          {no, nil(), nil()}.
    -expand_fun("") -> %% If line is empty, we list all available commands
    -    {yes, "", ["list", "inspect", "suspend", "resume"]};
    -expand_fun(Curr) ->
    -    expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]).
    -
    -expand_fun(_Curr, []) ->
    -    {no, "", []};
    -expand_fun(Curr, [Cmd | T]) ->
    -    case lists:prefix(Curr, Cmd) of
    +-spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} |
    +          {no, nil(), nil()}.
    +expand_fun("") -> %% If line is empty, we list all available commands
    +    {yes, "", ["list", "inspect", "suspend", "resume"]};
    +expand_fun(Curr) ->
    +    expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]).
    +
    +expand_fun(_Curr, []) ->
    +    {no, "", []};
    +expand_fun(Curr, [Cmd | T]) ->
    +    case lists:prefix(Curr, Cmd) of
             true ->
                 %% If Curr is a prefix of Cmd we subtract Curr from Cmd to get the
                 %% characters we need to complete with.
    -            {yes, lists:reverse(lists:reverse(Cmd) -- lists:reverse(Curr)), []};
    +            {yes, lists:reverse(lists:reverse(Cmd) -- lists:reverse(Curr)), []};
             false ->
    -            expand_fun(Curr, T)
    +            expand_fun(Curr, T)
         end.

    With the above code we will get expansions of our commands if we hit <TAB> in the shell. Its possible to make very complex completion algorithms, for example the Erlang shell has completions based on the function specifications of your code. It is important though that @@ -279,7 +279,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dets.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dets.html 2026-04-20 17:48:54.381771159 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dets.html 2026-04-20 17:48:54.385771184 +0000 @@ -1873,14 +1873,14 @@

    Returns a list of all objects with key Key stored in table Name, for -example:

    2> dets:open_file(abc, [{type, bag}]).
    -{ok,abc}
    -3> dets:insert(abc, {1,2,3}).
    +example:

    2> dets:open_file(abc, [{type, bag}]).
    +{ok,abc}
    +3> dets:insert(abc, {1,2,3}).
     ok
    -4> dets:insert(abc, {1,3,4}).
    +4> dets:insert(abc, {1,3,4}).
     ok
    -5> dets:lookup(abc, 1).
    -[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list +5> dets:lookup(abc, 1). +[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list with one object, as there cannot be more than one object with a given key. If the table type is bag or duplicate_bag, the function returns a list of arbitrary length.

    Notice that the order of objects returned is unspecified. In particular, the @@ -2737,11 +2737,11 @@ specification is specified explicitly. This is how to state match specifications that cannot easily be expressed within the syntax provided by qlc.

    The following example uses an explicit match specification to traverse the -table:

    1> dets:open_file(t, []),
    -ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    -MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    -QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using -function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
    +table:

    1> dets:open_file(t, []),
    +ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    +MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    +QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using +function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
     true

    qlc:info/1 returns information about a query handle. In this case identical information is returned for the two query handles.

    @@ -2815,7 +2815,7 @@

    Applies Fun to each object stored in table Name in some unspecified order. Different actions are taken depending on the return value of Fun. The following Fun return values are allowed:

    • continue - Continue to perform the traversal. For example, the following -function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The +function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The following function is supplied to collect all objects of a table in a list:

      fun(X) -> {continue, X} end.
    • {done, Value} - Terminate the traversal and return [Value | Acc].

    Any other value OtherValue returned by Fun terminates the traversal and is returned immediately.

    @@ -2886,7 +2886,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dict.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dict.html 2026-04-20 17:48:54.425771432 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/dict.html 2026-04-20 17:48:54.429771457 +0000 @@ -97,13 +97,13 @@ difference is that while this module considers two keys as different if they do not match (=:=), orddict considers two keys as different if and only if they do not compare equal (==).

    Notes

    Functions append and append_list are included so that keyed values can be -stored in a list accumulator, for example:

    > D0 = dict:new(),
    -  D1 = dict:store(files, [], D0),
    -  D2 = dict:append(files, f1, D1),
    -  D3 = dict:append(files, f2, D2),
    -  D4 = dict:append(files, f3, D3),
    -  dict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +stored in a list accumulator, for example:

    > D0 = dict:new(),
    +  D1 = dict:store(files, [], D0),
    +  D2 = dict:append(files, f1, D1),
    +  D3 = dict:append(files, f2, D2),
    +  D4 = dict:append(files, f3, D3),
    +  dict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch is to be used if the key is known to be in the dictionary, otherwise function find.

    See Also

    gb_trees, orddict

    @@ -858,10 +858,10 @@ the Key-Value pairs from both dictionaries are included in the new dictionary. If a key occurs in both dictionaries, Fun is called with the key and both values to return a new value. merge can be defined as follows, but is -faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).
    +faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).
    @@ -1074,8 +1074,8 @@

    Updates a value in a dictionary by calling Fun on the value to get a new value. If Key is not present in the dictionary, Initial is stored as the -first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    -    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    +first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    +    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    @@ -1106,8 +1106,8 @@

    Adds Increment to the value associated with Key and stores this value. If Key is not present in the dictionary, Increment is stored as the first -value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    -    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    +value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    +    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    @@ -1136,7 +1136,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph.html 2026-04-20 17:48:54.473771730 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph.html 2026-04-20 17:48:54.473771730 +0000 @@ -1801,7 +1801,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph_utils.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph_utils.html 2026-04-20 17:48:54.513771978 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/digraph_utils.html 2026-04-20 17:48:54.513771978 +0000 @@ -1003,7 +1003,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin.html 2026-04-20 17:48:54.545772176 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin.html 2026-04-20 17:48:54.541772152 +0000 @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin_expand.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin_expand.html 2026-04-20 17:48:54.581772400 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/edlin_expand.html 2026-04-20 17:48:54.585772424 +0000 @@ -301,7 +301,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/epp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/epp.html 2026-04-20 17:48:54.621772648 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/epp.html 2026-04-20 17:48:54.621772648 +0000 @@ -99,7 +99,7 @@ expression coding\s*[:=]\s*([-a-zA-Z0-9])+ selects the encoding. If the matching string is not a valid encoding, it is ignored. The valid encodings are Latin-1 and UTF-8, where the case of the characters can be chosen freely.

    Examples:

    %% coding: utf-8
    %% For this file we have chosen encoding = Latin-1
    %% -*- coding: latin-1 -*-

    Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    See Also

    erl_parse

    +modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    See Also

    erl_parse

    @@ -1186,7 +1186,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_anno.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_anno.html 2026-04-20 17:48:54.665772920 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_anno.html 2026-04-20 17:48:54.661772896 +0000 @@ -1268,7 +1268,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_error.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_error.html 2026-04-20 17:48:54.697773119 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_error.html 2026-04-20 17:48:54.697773119 +0000 @@ -276,7 +276,7 @@

    A fun used to format function arguments for BIF and function calls. By default -the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    +the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    @@ -397,23 +397,23 @@ caused the error starting at 1.

  • general - An error that is not associated with any argument caused the error.

  • reason - If the Reason should be printed differently than the default way.

  • If the text returned includes new-lines, format_exception/4 will indent the -text correctly.

    Example:

    -module(my_error_module).
    --export([atom_to_string/1, format_error/2]).
    +text correctly.

    Example:

    -module(my_error_module).
    +-export([atom_to_string/1, format_error/2]).
     
    -atom_to_string(Arg) when is_atom(Arg) ->
    -  atom_to_list(Arg);
    -atom_to_string(Arg) ->
    -  erlang:error(badarg,[Arg],
    -               [{error_info,#{ module => ?MODULE,
    -                               cause => #{ 1 => "should be an atom" }}}]).
    -
    -format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    -  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    -  ErrorMap = maps:get(cause, ErrorInfo),
    -  ErrorMap#{ general => "optional general information",
    -             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    -{ok,my_error_module}
    -2> my_error_module:atom_to_string(1).
    +atom_to_string(Arg) when is_atom(Arg) ->
    +  atom_to_list(Arg);
    +atom_to_string(Arg) ->
    +  erlang:error(badarg,[Arg],
    +               [{error_info,#{ module => ?MODULE,
    +                               cause => #{ 1 => "should be an atom" }}}]).
    +
    +format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    +  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    +  ErrorMap = maps:get(cause, ErrorInfo),
    +  ErrorMap#{ general => "optional general information",
    +             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    +{ok,my_error_module}
    +2> my_error_module:atom_to_string(1).
     ** exception error: my_error_module: badarg
          in function  my_error_module:atom_to_string/1
             called as my_error_module:atom_to_string(1)
    @@ -501,18 +501,18 @@
     
     

    Format the error reason and stack back-trace caught using try ... catch in the same style as the shell formats them.

    Example:

    try
    -    do_something()
    +    do_something()
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    If error_info is provided with the exception, format_exception will use that information to provide additional information about the exception.

    Example:

    try
    -  erlang:raise(badarg,[],[{error_info,#{}}])
    +  erlang:raise(badarg,[],[{error_info,#{}}])
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    See erlang:error/3 for details on how to raise an exception with error_info included.

    @@ -543,7 +543,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_eval.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_eval.html 2026-04-20 17:48:54.733773343 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_eval.html 2026-04-20 17:48:54.737773367 +0000 @@ -100,13 +100,13 @@ LocalFunctionHandler can be used to define a function that is called when there is a call to a local function. The argument can have the following formats:

    • {value,Func} - This defines a local function handler that is called -with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list +with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list of the evaluated arguments. The function handler returns the value of the local function. In this case, the current bindings cannot be accessed. To signal an error, the function handler calls exit/1 with a -suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of +suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of the unevaluated arguments, and Bindings are the current variable bindings. -The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated +The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated variable bindings. In this case, the function handler must itself evaluate all the function arguments and manage the bindings. To signal an error, the function handler calls exit/1 with a suitable exit value.

    • none - There is no local function handler.

    Non-Local Function Handler

    The optional argument NonLocalFunctionHandler can be used to define a function @@ -114,7 +114,7 @@ expressions.

  • An operator Op/A is called (this is handled as a call to function erlang:Op/A).
  • Exceptions are calls to erlang:apply/2,3; neither of the function handlers are called for such calls. The argument can have the following formats:

    • {value,Func} - This defines a non-local function handler. The function -may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec +may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec is the name of the function of the form {Module,Function} or a fun, and Arguments is a list of the evaluated arguments. The function handler returns the value of the function. To signal an error, the function handler @@ -1378,7 +1378,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_expand_records.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_expand_records.html 2026-04-20 17:48:54.773773591 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_expand_records.html 2026-04-20 17:48:54.765773541 +0000 @@ -195,7 +195,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_features.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_features.html 2026-04-20 17:48:54.801773764 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_features.html 2026-04-20 17:48:54.801773764 +0000 @@ -557,7 +557,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_id_trans.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_id_trans.html 2026-04-20 17:48:54.833773963 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_id_trans.html 2026-04-20 17:48:54.837773988 +0000 @@ -244,7 +244,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_internal.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_internal.html 2026-04-20 17:48:54.877774236 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_internal.html 2026-04-20 17:48:54.877774236 +0000 @@ -545,7 +545,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_lint.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_lint.html 2026-04-20 17:48:54.913774459 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_lint.html 2026-04-20 17:48:54.913774459 +0000 @@ -98,7 +98,7 @@ appropriate option, described below.

      The functions in this module are invoked automatically by the Erlang compiler. There is no reason to invoke these functions separately unless you have written your own Erlang compiler.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      epp, erl_parse

      +modules. The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      epp, erl_parse

      @@ -548,7 +548,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_parse.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_parse.html 2026-04-20 17:48:54.981774881 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_parse.html 2026-04-20 17:48:54.981774881 +0000 @@ -97,7 +97,7 @@ form of either forms (that is, top-level constructs), expressions, or terms.

      The Abstract Format is described in the ERTS User's Guide. Notice that a token list must end with the dot token to be acceptable to the parse functions (see the erl_scan) module.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O modules. -The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      erl_anno, erl_scan, io, section The Abstract Format +The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      erl_anno, erl_scan, io, section The Abstract Format in the ERTS User's Guide.

      @@ -5913,7 +5913,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_pp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_pp.html 2026-04-20 17:48:55.021775129 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_pp.html 2026-04-20 17:48:55.013775080 +0000 @@ -958,7 +958,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_scan.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_scan.html 2026-04-20 17:48:55.061775377 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_scan.html 2026-04-20 17:48:55.061775377 +0000 @@ -95,7 +95,7 @@

      The Erlang token scanner.

      This module contains functions for tokenizing (scanning) characters into Erlang tokens.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

      {ErrorLocation, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      Notes

      The continuation of the first call to the re-entrant input functions must be +modules. The format is as follows:

      {ErrorLocation, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      Notes

      The continuation of the first call to the re-entrant input functions must be []. For a complete description of how the re-entrant input scheme works, see Armstrong, Virding and Williams: 'Concurrent Programming in Erlang', Chapter 13.

      See Also

      erl_anno, erl_parse, io

      @@ -1292,7 +1292,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_tar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_tar.html 2026-04-20 17:48:55.101775625 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/erl_tar.html 2026-04-20 17:48:55.105775650 +0000 @@ -1238,14 +1238,14 @@ Notice that there is only an arity-2 read function, not an arity-1 function.

    • (position,{UserData,Position}) - Sets the position of UserData as defined for files in file:position/2

    Example:

    The following is a complete Fun parameter for reading and writing on files using the file module:

    ExampleFun =
    -   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    -      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    -      (read2, {Fd,Size}) -> file:read(Fd, Size);
    -      (close, Fd) -> file:close(Fd)
    -   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    -{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
    +   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    +      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    +      (read2, {Fd,Size}) -> file:read(Fd, Size);
    +      (close, Fd) -> file:close(Fd)
    +   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    +{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
     ...,
    -erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would +erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would call ExampleFun(write, {UserData,Data}).

    Note

    This example with the file module operations is not necessary to use directly, as that is what function open/2 in principle does.

    Warning

    The TarDescriptor term is not a file descriptor. You are advised not to rely on the specific contents of this term, as it can change in future Erlang/OTP @@ -1434,7 +1434,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/escript.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/escript.html 2026-04-20 17:48:55.145775899 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/escript.html 2026-04-20 17:48:55.149775923 +0000 @@ -487,67 +487,67 @@ number of schedulers with +S3. We also extract the different sections from the newly created script:

    > Source = "%% Demo\nmain(_Args) ->\n    io:format(\"~p\",[erlang:system_info(schedulers)]).\n".
     "%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedulers)).\n"
    -> io:format("~s\n", [Source]).
    +> io:format("~s\n", [Source]).
     %% Demo
    -main(_Args) ->
    -    io:format(erlang:system_info(schedulers)).
    +main(_Args) ->
    +    io:format(erlang:system_info(schedulers)).
     
     ok
    -> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    -                                      {source, list_to_binary(Source)}]).
    -{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    -> file:write_file("demo.escript", Bin).
    +> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    +                                      {source, list_to_binary(Source)}]).
    +{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    +> file:write_file("demo.escript", Bin).
     ok
    -> os:cmd("escript demo.escript").
    +> os:cmd("escript demo.escript").
     "3"
    -> escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    -     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    -                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    -ok
    -> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    -{ok,demo,
    -    <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    -      79,0,0,0,9,4,100,...>>}
    -> escript:create("demo.beam", [{beam, BeamCode}]).
    -ok
    -> escript:extract("demo.beam", []).
    -{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    -     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    -             111,109,0,0,0,83,0,0,0,9,...>>}]}
    -> os:cmd("escript demo.beam").
    +> escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    +     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    +                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    +ok
    +> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    +{ok,demo,
    +    <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    +      79,0,0,0,9,4,100,...>>}
    +> escript:create("demo.beam", [{beam, BeamCode}]).
    +ok
    +> escript:extract("demo.beam", []).
    +{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    +     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    +             111,109,0,0,0,83,0,0,0,9,...>>}]}
    +> os:cmd("escript demo.beam").
     "true"

    Here we create an archive script containing both Erlang code and Beam code, then we iterate over all files in the archive and collect their contents and some -information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    -{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    -> escript:create("demo.escript",
    -                 [shebang,
    -                  {archive, [{"demo.erl", SourceCode},
    -                             {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}]}
    -> file:write_file("demo.zip", ArchiveBin).
    -ok
    -> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    -{ok,[{"demo.beam",
    -      {file_info,748,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    -        83,0,0,...>>},
    -     {"demo.erl",
    -      {file_info,118,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    +information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    +{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    +> escript:create("demo.escript",
    +                 [shebang,
    +                  {archive, [{"demo.erl", SourceCode},
    +                             {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}]}
    +> file:write_file("demo.zip", ArchiveBin).
    +ok
    +> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    +{ok,[{"demo.beam",
    +      {file_info,748,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
    +      <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    +        83,0,0,...>>},
    +     {"demo.erl",
    +      {file_info,118,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
    +      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    @@ -580,16 +580,16 @@ extracted value is set to the atom default. If a section is missing, the extracted value is set to the atom undefined.

    Option compile_source only affects the result if the escript contains source code. In this case the Erlang code is automatically compiled and -{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    -                 [shebang, {archive, [{"demo.erl", SourceCode},
    -                                      {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} =
    -              escript:extract("demo.escript", []).
    -{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}
    -     {emu_args,undefined}]}
    +{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    +                 [shebang, {archive, [{"demo.erl", SourceCode},
    +                                      {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} =
    +              escript:extract("demo.escript", []).
    +{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}
    +     {emu_args,undefined}]}
    @@ -647,7 +647,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ets.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ets.html 2026-04-20 17:48:55.225776394 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ets.html 2026-04-20 17:48:55.225776394 +0000 @@ -167,10 +167,10 @@ find the next key is not done with such guarantees. This is often not a problem, but may cause rare subtle "unexpected" effects if a concurrent process inserts objects during a traversal. For example, consider one process -doing

    ets:new(t, [ordered_set, named_table]),
    -ets:insert(t, {1}),
    -ets:insert(t, {2}),
    -ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare +doing

    ets:new(t, [ordered_set, named_table]),
    +ets:insert(t, {1}),
    +ets:insert(t, {2}),
    +ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare cases return 2 even though 2 has never existed in the table ordered as the first key. In the same way, a concurrent call to ets:next(t, 1) may return 3 even though 3 never existed in the table ordered directly after 1.

    Effects like this are improbable but possible. The probability will further be @@ -183,11 +183,11 @@ lookup without any table traversal at all. For ordered_set a partially bound key will limit the traversal to only scan a subset of the table based on term order. A partially bound key is either a list or a tuple with a prefix that is -fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
    +fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
     true
     2> %% Efficient search of all with area code 555
    -2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}).
    -[["1234","John Smith"]]

    Match Specifications

    Some of the functions use a match specification, match_spec. For a brief +2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}). +[["1234","John Smith"]]

    Match Specifications

    Some of the functions use a match specification, match_spec. For a brief explanation, see select/2. For a detailed description, see section Match Specifications in Erlang in ERTS User's Guide.

    A match specifications with excessive nesting will cause a system_limit error exception to be raised.

    @@ -1877,19 +1877,19 @@ -include_lib("stdlib/include/ms_transform.hrl"). to the source file.

    The fun is very restricted, it can take only a single parameter (the object to match): a sole variable or a tuple. It must use the is_ guard tests. Language constructs that have no representation in a match specification (if, case, -receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    -[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
    +receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    +[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
     3
    -3> ets:fun2ms(fun({M,N}) when N > X -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, +3> ets:fun2ms(fun({M,N}) when N > X -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, which is consistent with the static scoping for Erlang funs. However, local or global function calls cannot be in the guard or body of the fun. Calls to -built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
    +built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
     Error: fun containing local Erlang function calls
    -('my_fun' called in guard) cannot be translated into match_spec
    -{error,transform_error}
    -5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun +('my_fun' called in guard) cannot be translated into match_spec +{error,transform_error} +5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun must be literally in the call when used from the shell as well.

    Warning

    If the parse_transform is not applied to a module that calls this pseudo function, the call fails in runtime (with a badarg). The ets module exports a function with this name, but it is never to be called except when @@ -2514,12 +2514,12 @@

    Matches the objects in table Table against pattern Pattern.

    A pattern is a term that can contain:

    • Bound parts (Erlang terms)
    • '_' that matches any Erlang term
    • Pattern variables '$N', where N=0,1,...

    The function returns a list with one element for each matching object, where -each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    -[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    -7> ets:match(T, {'_',dog,'$1'}).
    -[[7],[5]]
    -8> ets:match(T, {'_',cow,'$1'}).
    -[]

    If the key is specified in the pattern, the match is very efficient. If the key +each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    +[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    +7> ets:match(T, {'_',dog,'$1'}).
    +[[7],[5]]
    +8> ets:match(T, {'_',cow,'$1'}).
    +[]

    If the key is specified in the pattern, the match is very efficient. If the key is not specified, that is, if it is a variable or an underscore, the entire table must be searched. The search time can be substantial if the table is very large.

    For tables of type ordered_set, the result is in the same order as in a @@ -2771,10 +2771,10 @@ execution time):

    Table = ets:new...
     MatchSpec = ...
     % The following call...
    -ets:match_spec_run(ets:tab2list(Table),
    -                   ets:match_spec_compile(MatchSpec)),
    +ets:match_spec_run(ets:tab2list(Table),
    +                   ets:match_spec_compile(MatchSpec)),
     % ...gives the same result as the more common (and more efficient)
    -ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets +ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets module to perform the dets:select/1 operations and by Mnesia during transactions.

    @@ -3142,19 +3142,19 @@ format. Given that the original match specification is kept intact, the continuation can be restored, meaning it can once again be used in subsequent select/1 calls even though it has been stored on disk or on -another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
    +another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T, MS, 10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(MaybeBroken).

    The following sequence works, as the call to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T, MS, 10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(MaybeBroken).

    The following sequence works, as the call to repair_continuation/2 reestablishes the -MaybeBroken continuation.

    T=ets:new(x,[]),
    +MaybeBroken continuation.

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T,MS,10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T,MS,10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to provide distributed select/3 and select/1 sequences. A normal application would either use Mnesia or keep the continuation from being converted to external format.

    The actual behavior of compiled match specifications when recreated from @@ -3199,21 +3199,21 @@ to succeed even if keys are removed during the traversal. The keys for objects inserted or deleted during a traversal may or may not be returned by next/2 depending on the ordering of keys within the table and if -the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    -    safe_fixtable(Table,true),
    -    clean_all_with_value(Table,X,ets:first(Table)),
    -    safe_fixtable(Table,false).
    +the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    +    safe_fixtable(Table,true),
    +    clean_all_with_value(Table,X,ets:first(Table)),
    +    safe_fixtable(Table,false).
     
    -clean_all_with_value(Table,X,'$end_of_table') ->
    +clean_all_with_value(Table,X,'$end_of_table') ->
         true;
    -clean_all_with_value(Table,X,Key) ->
    -    case ets:lookup(Table,Key) of
    -        [{Key,X}] ->
    -            ets:delete(Table,Key);
    +clean_all_with_value(Table,X,Key) ->
    +    case ets:lookup(Table,Key) of
    +        [{Key,X}] ->
    +            ets:delete(Table,Key);
             _ ->
                 true
         end,
    -    clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been + clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been released. If a process fixes a table but never releases it, the memory used by the deleted objects is never freed. The performance of operations on the table also degrades significantly.

    To retrieve information about which processes have fixed which tables, use @@ -3297,11 +3297,11 @@ object.

    The return value is constructed using the "match variables" bound in MatchHead or using the special match variables '$_' (the whole matching object) and '$$' (all match variables in a list), so that the following -match/2 expression:

    ets:match(Table,{'$1','$2','$3'})

    is exactly equivalent to:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    And that the following match_object/2 call:

    ets:match_object(Table,{'$1','$2','$1'})

    is exactly equivalent to

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    Composite terms can be constructed in the Result part either by simply writing -a list, so that the following code:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

    That is, all the bound variables in the match head as a list. If tuples are to +match/2 expression:

    ets:match(Table,{'$1','$2','$3'})

    is exactly equivalent to:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    And that the following match_object/2 call:

    ets:match_object(Table,{'$1','$2','$1'})

    is exactly equivalent to

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    Composite terms can be constructed in the Result part either by simply writing +a list, so that the following code:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

    That is, all the bound variables in the match head as a list. If tuples are to be constructed, one has to write a tuple of arity 1 where the single element in the tuple is the tuple one wants to construct (as an ordinary tuple can be -mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the +mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the dbg) module in Runtime_Tools.

    The Guards are constructed as tuples, where the first element is the test name and the remaining elements are the test parameters. To check for a specific type (say a list) of the element bound to the match variable '$1', one would write @@ -3310,7 +3310,7 @@ present in Erlang can be used, but only the new versions prefixed is_ are allowed (is_float, is_atom, and so on).

    The Guard section can also contain logic and arithmetic operations, which are written with the same syntax as the guard tests (prefix notation), so that the -following guard test written in Erlang:

    is_integer(X), is_integer(Y), X + Y < 4711

    is expressed as follows (X replaced with '$1' and Y with '$2'):

    [{is_integer, &#href_anchor"p" data-group-id="0442212635-2">}, {is_integer, '$2'}, {'<', {'+', '$1', '$2'}, 4711}]

    For tables of type ordered_set, objects are visited in the same order as in a +following guard test written in Erlang:

    is_integer(X), is_integer(Y), X + Y < 4711

    is expressed as follows (X replaced with '$1' and Y with '$2'):

    [{is_integer, &#href_anchor"p" data-group-id="7676829120-2">}, {is_integer, '$2'}, {'<', {'+', '$1', '$2'}, 4711}]

    For tables of type ordered_set, objects are visited in the same order as in a first/next traversal. This means that the match specification is executed against objects with keys in the first/next order and the corresponding result list is in the order of that execution.

    @@ -3462,16 +3462,16 @@ object. If not, select_replace will fail with badarg without updating any objects.

    For the moment, due to performance and semantic constraints, tables of type bag are not yet supported.

    The function returns the total number of replaced objects.

    Example

    For all 2-tuples with a list in second position, add atom 'marker' first in -the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
    +the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
     true
    -2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    -[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    -3> ets:select_replace(T, MS).
    +2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    +[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    +3> ets:select_replace(T, MS).
     1
    -4> ets:tab2list(T).
    -[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    -New = update_object(Old),
    -Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
    +4>
    ets:tab2list(T). +[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/file_sorter.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/file_sorter.html	2026-04-20 17:48:55.281776742 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/file_sorter.html	2026-04-20 17:48:55.281776742 +0000
    @@ -160,35 +160,35 @@
     argument {value, Value}. This makes it easy to initiate the sequence of output
     functions with a value calculated by the input functions.

    As an example, consider sorting the terms on a disk log file. A function that reads chunks from the disk log and returns a list of binaries is used as input. -The results are collected in a list of terms.

    sort(Log) ->
    -    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    -    Input = input(Log, start),
    -    Output = output([]),
    -    Reply = file_sorter:sort(Input, Output, {format,term}),
    -    ok = disk_log:close(Log),
    +The results are collected in a list of terms.

    sort(Log) ->
    +    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    +    Input = input(Log, start),
    +    Output = output([]),
    +    Reply = file_sorter:sort(Input, Output, {format,term}),
    +    ok = disk_log:close(Log),
         Reply.
     
    -input(Log, Cont) ->
    -    fun(close) ->
    +input(Log, Cont) ->
    +    fun(close) ->
                 ok;
    -       (read) ->
    -            case disk_log:chunk(Log, Cont) of
    -                {error, Reason} ->
    -                    {error, Reason};
    -                {Cont2, Terms} ->
    -                    {Terms, input(Log, Cont2)};
    -                {Cont2, Terms, _Badbytes} ->
    -                    {Terms, input(Log, Cont2)};
    +       (read) ->
    +            case disk_log:chunk(Log, Cont) of
    +                {error, Reason} ->
    +                    {error, Reason};
    +                {Cont2, Terms} ->
    +                    {Terms, input(Log, Cont2)};
    +                {Cont2, Terms, _Badbytes} ->
    +                    {Terms, input(Log, Cont2)};
                     eof ->
                         end_of_input
                 end
         end.
     
    -output(L) ->
    -    fun(close) ->
    -            lists:append(lists:reverse(L));
    -       (Terms) ->
    -            output([Terms | L])
    +output(L) ->
    +    fun(close) ->
    +            lists:append(lists:reverse(L));
    +       (Terms) ->
    +            output([Terms | L])
         end.

    For more examples of functions as input and output, see the end of the file_sorter module; the term format is implemented with functions.

    The possible values of Reason returned when an error occurs are:

    • bad_object, {bad_object, FileName} - Applying the format function failed for some binary, or the key(s) could not be extracted from some term.
    • {bad_term, FileName} - io:read/2 failed to read some term.
    • {file_error, FileName, file:posix()} - For an explanation of @@ -1879,7 +1879,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filelib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filelib.html 2026-04-20 17:48:55.325777014 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filelib.html 2026-04-20 17:48:55.325777014 +0000 @@ -995,15 +995,15 @@

      Sanitizes the relative path by eliminating ".." and "." components to protect against directory traversal attacks.

      Either returns the sanitized path name, or the atom unsafe if the path is unsafe. -The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
      +The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
       ...
      -2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
      +2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
       "dir"
      -3> filelib:safe_relative_path("dir/..", Cwd).
      -[]
      -4> filelib:safe_relative_path("dir/../..", Cwd).
      +3> filelib:safe_relative_path("dir/..", Cwd).
      +[]
      +4> filelib:safe_relative_path("dir/../..", Cwd).
       unsafe
      -5> filelib:safe_relative_path("/abs/path", Cwd).
      +5> filelib:safe_relative_path("/abs/path", Cwd).
       unsafe
    @@ -1103,7 +1103,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filename.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filename.html 2026-04-20 17:48:55.365777262 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/filename.html 2026-04-20 17:48:55.365777262 +0000 @@ -491,20 +491,20 @@

    Converts a relative Filename and returns an absolute name. No attempt is made to create the shortest absolute name, as this can give incorrect results on file -systems that allow links.

    Unix examples:

    1> pwd().
    +systems that allow links.

    Unix examples:

    1> pwd().
     "/usr/local"
    -2> filename:absname("foo").
    +2> filename:absname("foo").
     "/usr/local/foo"
    -3> filename:absname("../x").
    +3> filename:absname("../x").
     "/usr/local/../x"
    -4> filename:absname("/").
    -"/"

    Windows examples:

    1> pwd().
    +4> filename:absname("/").
    +"/"

    Windows examples:

    1> pwd().
     "D:/usr/local"
    -2> filename:absname("foo").
    +2> filename:absname("foo").
     "D:/usr/local/foo"
    -3> filename:absname("../x").
    +3> filename:absname("../x").
     "D:/usr/local/../x"
    -4> filename:absname("/").
    +4> filename:absname("/").
     "D:/"
    @@ -643,58 +643,58 @@

    Returns a suitable path, or paths, for a given type.

    If os is not set in Opts the function will default to the native option, that is 'linux', 'darwin' or 'windows', as understood by os:type/0. Anything not recognized as 'darwin' or 'windows' is interpreted as 'linux'.

    The options 'author' and 'version' are only used with 'windows' option -mode.

    • user_cache

      The path location is intended for transient data files on a local machine.

      On Linux: Respects the os environment variable XDG_CACHE_HOME.

      1> filename:basedir(user_cache, "my_application", #{os=>linux}).
      -"/home/otptest/.cache/my_application"

      On Darwin:

      1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
      -"/home/otptest/Library/Caches/my_application"

      On Windows:

      1> filename:basedir(user_cache, "My App").
      +mode.

      • user_cache

        The path location is intended for transient data files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        1> filename:basedir(user_cache, "my_application", #{os=>linux}).
        +"/home/otptest/.cache/my_application"

        On Darwin:

        1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Caches/my_application"

        On Windows:

        1> filename:basedir(user_cache, "My App").
         "c:/Users/otptest/AppData/Local/My App/Cache"
        -2> filename:basedir(user_cache, "My App").
        +2> filename:basedir(user_cache, "My App").
         "c:/Users/otptest/AppData/Local/My App/Cache"
        -3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
        +3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
         "c:/Users/otptest/AppData/Local/Erlang/My App/Cache"
        -4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
        +4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
         "c:/Users/otptest/AppData/Local/My App/1.2/Cache"
        -5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
      • user_config

        The path location is intended for persistent configuration files.

        On Linux: Respects the os environment variable XDG_CONFIG_HOME.

        2> filename:basedir(user_config, "my_application", #{os=>linux}).
        -"/home/otptest/.config/my_application"

        On Darwin:

        2> filename:basedir(user_config, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Application Support/my_application"

        On Windows:

        1> filename:basedir(user_config, "My App").
        +5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
      • user_config

        The path location is intended for persistent configuration files.

        On Linux: Respects the os environment variable XDG_CONFIG_HOME.

        2> filename:basedir(user_config, "my_application", #{os=>linux}).
        +"/home/otptest/.config/my_application"

        On Darwin:

        2> filename:basedir(user_config, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Application Support/my_application"

        On Windows:

        1> filename:basedir(user_config, "My App").
         "c:/Users/otptest/AppData/Roaming/My App"
        -2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
        -"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
      • user_data

        The path location is intended for persistent data files.

        On Linux: Respects the os environment variable XDG_DATA_HOME.

        3> filename:basedir(user_data, "my_application", #{os=>linux}).
        -"/home/otptest/.local/my_application"

        On Darwin:

        3> filename:basedir(user_data, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Application Support/my_application"

        On Windows:

        8> filename:basedir(user_data, "My App").
        +2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
        +"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
      • user_data

        The path location is intended for persistent data files.

        On Linux: Respects the os environment variable XDG_DATA_HOME.

        3> filename:basedir(user_data, "my_application", #{os=>linux}).
        +"/home/otptest/.local/my_application"

        On Darwin:

        3> filename:basedir(user_data, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Application Support/my_application"

        On Windows:

        8> filename:basedir(user_data, "My App").
         "c:/Users/otptest/AppData/Local/My App"
        -9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
      • user_log

        The path location is intended for transient log files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        4> filename:basedir(user_log, "my_application", #{os=>linux}).
        -"/home/otptest/.cache/my_application/log"

        On Darwin:

        4> filename:basedir(user_log, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Logs/my_application"

        On Windows:

        12> filename:basedir(user_log, "My App").
        +9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
      • user_log

        The path location is intended for transient log files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        4> filename:basedir(user_log, "my_application", #{os=>linux}).
        +"/home/otptest/.cache/my_application/log"

        On Darwin:

        4> filename:basedir(user_log, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Logs/my_application"

        On Windows:

        12> filename:basedir(user_log, "My App").
         "c:/Users/otptest/AppData/Local/My App/Logs"
        -13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
      • site_config

        On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

        5> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/usr/local/share/my_application",
        - "/usr/share/my_application"]
        -6> os:getenv("XDG_CONFIG_DIRS").
        +13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
      • site_config

        On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

        5> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/usr/local/share/my_application",
        + "/usr/share/my_application"]
        +6> os:getenv("XDG_CONFIG_DIRS").
         "/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg"
        -7> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/etc/xdg/xdg-ubuntu/my_application",
        +7> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/etc/xdg/xdg-ubuntu/my_application",
          "/usr/share/upstart/xdg/my_application",
        - "/etc/xdg/my_application"]
        -8> os:unsetenv("XDG_CONFIG_DIRS").
        + "/etc/xdg/my_application"]
        +8> os:unsetenv("XDG_CONFIG_DIRS").
         true
        -9> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/etc/xdg/my_application"]

        On Darwin:

        5> filename:basedir(site_config, "my_application", #{os=>darwin}).
        -["/Library/Application Support/my_application"]
      • site_data

        On Linux: Respects the os environment variable XDG_DATA_DIRS.

        10> os:getenv("XDG_DATA_DIRS").
        +9> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/etc/xdg/my_application"]

        On Darwin:

        5> filename:basedir(site_config, "my_application", #{os=>darwin}).
        +["/Library/Application Support/my_application"]
      • site_data

        On Linux: Respects the os environment variable XDG_DATA_DIRS.

        10> os:getenv("XDG_DATA_DIRS").
         "/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/"
        -11> filename:basedir(site_data, "my_application", #{os=>linux}).
        -["/usr/share/ubuntu/my_application",
        +11> filename:basedir(site_data, "my_application", #{os=>linux}).
        +["/usr/share/ubuntu/my_application",
          "/usr/share/gnome/my_application",
          "/usr/local/share/my_application",
        - "/usr/share/my_application"]
        -12> os:unsetenv("XDG_DATA_DIRS").
        + "/usr/share/my_application"]
        +12> os:unsetenv("XDG_DATA_DIRS").
         true
        -13> filename:basedir(site_data, "my_application", #{os=>linux}).
        -["/usr/local/share/my_application",
        - "/usr/share/my_application"]

        On Darwin:

        5> filename:basedir(site_data, "my_application", #{os=>darwin}).
        -["/Library/Application Support/my_application"]
      +13>
      filename:basedir(site_data, "my_application", #{os=>linux}). +["/usr/local/share/my_application", + "/usr/share/my_application"]

      On Darwin:

      5> filename:basedir(site_data, "my_application", #{os=>darwin}).
      +["/Library/Application Support/my_application"]
    @@ -723,12 +723,12 @@

    Returns the last component of Filename, or Filename itself if it does not -contain any directory separators.

    Examples:

    5> filename:basename("foo").
    +contain any directory separators.

    Examples:

    5> filename:basename("foo").
     "foo"
    -6> filename:basename("/usr/foo").
    +6> filename:basename("/usr/foo").
     "foo"
    -7> filename:basename("/").
    -[]
    +7>
    filename:basename("/"). +[]
    @@ -759,15 +759,15 @@

    Returns the last component of Filename with extension Ext stripped.

    This function is to be used to remove a (possible) specific extension. To remove an existing extension when you are unsure which one it is, use -rootname(basename(Filename)).

    Examples:

    8> filename:basename("~/src/kalle.erl", ".erl").
    +rootname(basename(Filename)).

    Examples:

    8> filename:basename("~/src/kalle.erl", ".erl").
     "kalle"
    -9> filename:basename("~/src/kalle.beam", ".erl").
    +9> filename:basename("~/src/kalle.beam", ".erl").
     "kalle.beam"
    -10> filename:basename("~/src/kalle.old.erl", ".erl").
    +10> filename:basename("~/src/kalle.old.erl", ".erl").
     "kalle.old"
    -11> filename:rootname(filename:basename("~/src/kalle.erl")).
    +11> filename:rootname(filename:basename("~/src/kalle.erl")).
     "kalle"
    -12> filename:rootname(filename:basename("~/src/kalle.beam")).
    +12> filename:rootname(filename:basename("~/src/kalle.beam")).
     "kalle"
    @@ -796,10 +796,10 @@ -

    Returns the directory part of Filename.

    Examples:

    13> filename:dirname("/usr/src/kalle.erl").
    +

    Returns the directory part of Filename.

    Examples:

    13> filename:dirname("/usr/src/kalle.erl").
     "/usr/src"
    -14> filename:dirname("kalle.erl").
    -"."
    5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
    +14> filename:dirname("kalle.erl").
    +"."
    5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
     "/usr/src"
    @@ -829,10 +829,10 @@

    Returns the file extension of Filename, including the period. Returns an empty -string if no extension exists.

    Examples:

    15> filename:extension("foo.erl").
    +string if no extension exists.

    Examples:

    15> filename:extension("foo.erl").
     ".erl"
    -16> filename:extension("beam.src/kalle").
    -[]
    +16>
    filename:extension("beam.src/kalle"). +[]
    @@ -892,10 +892,10 @@

    Joins a list of filename Components with directory separators. If one of the elements of Components includes an absolute path, such as "/xxx", the preceding elements, if any, are removed from the result.

    The result is "normalized":

    • Redundant directory separators are removed.
    • In Windows, all directory separators are forward slashes and the drive letter -is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
    +is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_sets.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_sets.html	2026-04-20 17:48:55.417777585 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_sets.html	2026-04-20 17:48:55.425777634 +0000
    @@ -799,14 +799,14 @@
     
           
     
    -

    Returns a new set formed from Set1 with Element inserted.

    If Element is already an element in Set1, nothing is changed.

    Examples

    1> S0 = gb_sets:new().
    -2> S1 = gb_sets:add_element(7, S0).
    -3> gb_sets:to_list(S1).
    -[7]
    -4> S2 = gb_sets:add_element(42, S1).
    -5> S2 = gb_sets:add_element(42, S1).
    -6> gb_sets:to_list(S2).
    -[7,42]
    +

    Returns a new set formed from Set1 with Element inserted.

    If Element is already an element in Set1, nothing is changed.

    Examples

    1> S0 = gb_sets:new().
    +2> S1 = gb_sets:add_element(7, S0).
    +3> gb_sets:to_list(S1).
    +[7]
    +4> S2 = gb_sets:add_element(42, S1).
    +5> S2 = gb_sets:add_element(42, S1).
    +6> gb_sets:to_list(S2).
    +[7,42]
    @@ -837,12 +837,12 @@

    Rebalances the tree representation of Set1.

    This is rarely necessary, but can be motivated when a large number of elements have been deleted from the tree without further insertions. Forcing rebalancing can minimize lookup times, as deletion -does not rebalance the tree.

    Examples

    1> S0 = gb_sets:from_ordset(lists:seq(1, 100)).
    -2> Delete = fun(E, Set) -> gb_sets:delete(E, Set) end.
    -3> S1 = lists:foldl(Delete, S0, lists:seq(1, 50)).
    -4> gb_sets:size(S1).
    +does not rebalance the tree.

    Examples

    1> S0 = gb_sets:from_ordset(lists:seq(1, 100)).
    +2> Delete = fun(E, Set) -> gb_sets:delete(E, Set) end.
    +3> S1 = lists:foldl(Delete, S0, lists:seq(1, 50)).
    +4> gb_sets:size(S1).
     50
    -5> S2 = gb_sets:balance(S1).
    +5>
    S2 = gb_sets:balance(S1).
    @@ -900,9 +900,9 @@

    Returns a new set formed from Set1 with Element removed, assuming Element is present in Set1.

    Use delete_any/2 when deleting from a set where Element is potentially -missing.

    Examples

    1> S = gb_sets:from_list([a,b]).
    -2> gb_sets:to_list(gb_sets:delete(b, S)).
    -[a]
    +missing.

    Examples

    1> S = gb_sets:from_list([a,b]).
    +2> gb_sets:to_list(gb_sets:delete(b, S)).
    +[a]
    @@ -930,10 +930,10 @@ -

    Returns a new set formed from Set1 with Element removed.

    If Element is not an element in Set1, nothing is changed.

    Examples

    1> S = gb_sets:from_list([a,b]).
    -2> gb_sets:to_list(gb_sets:delete_any(b, S)).
    -[a]
    -3> S = gb_sets:delete_any(x, S).
    +

    Returns a new set formed from Set1 with Element removed.

    If Element is not an element in Set1, nothing is changed.

    Examples

    1> S = gb_sets:from_list([a,b]).
    +2> gb_sets:to_list(gb_sets:delete_any(b, S)).
    +[a]
    +3> S = gb_sets:delete_any(x, S).
    @@ -990,8 +990,8 @@ -

    Returns a new empty set.

    Examples

    1> gb_sets:to_list(gb_sets:empty()).
    -[]
    +

    Returns a new empty set.

    Examples

    1> gb_sets:to_list(gb_sets:empty()).
    +[]
    @@ -1020,11 +1020,11 @@ -

    Filters elements in Set1 using predicate function Pred.

    Examples

    1> S = gb_sets:from_list([1,2,3,4,5,6,7]).
    -2> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -3> Filtered = gb_sets:filter(IsEven, S).
    -4> gb_sets:to_list(Filtered).
    -[2,4,6]
    +

    Filters elements in Set1 using predicate function Pred.

    Examples

    1> S = gb_sets:from_list([1,2,3,4,5,6,7]).
    +2> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +3> Filtered = gb_sets:filter(IsEven, S).
    +4> gb_sets:to_list(Filtered).
    +[2,4,6]
    @@ -1061,17 +1061,17 @@

    Calls Fun(Elem) for each Elem of Set1 to update or remove elements from Set1.

    Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the set of elements for which Fun returns a new -value, with true being equivalent to {true, Elem}.

    gb_sets:filtermap/2 behaves as if it were defined as follows:

    filtermap(Fun, Set1) ->
    -    gb_sets:from_list(lists:filtermap(Fun, Set1)).

    Examples

    1> S = gb_sets:from_list([2,4,5,6,8,9])
    -2> F = fun(X) ->
    +value, with true being equivalent to {true, Elem}.

    gb_sets:filtermap/2 behaves as if it were defined as follows:

    filtermap(Fun, Set1) ->
    +    gb_sets:from_list(lists:filtermap(Fun, Set1)).

    Examples

    1> S = gb_sets:from_list([2,4,5,6,8,9])
    +2> F = fun(X) ->
                case X rem 2 of
    -               0 -> {true, X div 2};
    +               0 -> {true, X div 2};
                    1 -> false
                end
             end.
    -3> Set = gb_sets:filtermap(F, S).
    -4> gb_sets:to_list(Set).
    -[1,2,3,4]
    +3>
    Set = gb_sets:filtermap(F, S). +4> gb_sets:to_list(Set). +[1,2,3,4]
    @@ -1107,9 +1107,9 @@

    Folds Function over every element in Set and returns the final value of -the accumulator.

    Examples

    1> S = gb_sets:from_list([1,2,3,4]).
    +the accumulator.

    Examples

    1> S = gb_sets:from_list([1,2,3,4]).
     2> Plus = fun erlang:'+'/2.
    -3> gb_sets:fold(Plus, 0, S).
    +3> gb_sets:fold(Plus, 0, S).
     10
    @@ -1139,9 +1139,9 @@

    Returns a set of the elements in List, where List can be unordered and -contain duplicates.

    Examples

    1> Unordered = [x,y,a,x,y,b,b,z]
    -2> gb_sets:to_list(gb_sets:from_list(Unordered)).
    -[a,b,x,y,z]
    +contain duplicates.

    Examples

    1> Unordered = [x,y,a,x,y,b,b,z]
    +2> gb_sets:to_list(gb_sets:from_list(Unordered)).
    +[a,b,x,y,z]
    @@ -1170,9 +1170,9 @@

    Turns an ordered list without duplicates List into a set.

    See from_list/1 for a function that accepts unordered lists with -duplicates.

    Examples

    1> Ordset = [1,2,3].
    -2> gb_sets:to_list(gb_sets:from_ordset(Ordset)).
    -[1,2,3]
    +duplicates.

    Examples

    1> Ordset = [1,2,3].
    +2> gb_sets:to_list(gb_sets:from_ordset(Ordset)).
    +[1,2,3]
    @@ -1202,13 +1202,13 @@

    Returns a new set formed from Set1 with Element inserted, assuming Element is not already present.

    Use add/2 for inserting into a set where Element is potentially -already present.

    Examples

    1> S0 = gb_sets:new().
    -2> S1 = gb_sets:insert(7, S0).
    -3> gb_sets:to_list(S1).
    -[7]
    -4> S2 = gb_sets:insert(42, S1).
    -5> gb_sets:to_list(S2).
    -[7,42]
    +already present.

    Examples

    1> S0 = gb_sets:new().
    +2> S1 = gb_sets:insert(7, S0).
    +3> gb_sets:to_list(S1).
    +[7]
    +4> S2 = gb_sets:insert(42, S1).
    +5> gb_sets:to_list(S2).
    +[7,42]
    @@ -1237,15 +1237,15 @@

    Returns the intersection of the non-empty list of sets.

    The intersection of multiple sets is a new set that contains only the -elements that are present in all sets.

    Examples

    1> S0 = gb_sets:from_list([a,b,c,d]).
    -2> S1 = gb_sets:from_list([d,e,f]).
    -3> S2 = gb_sets:from_list([q,r])
    -4> Sets = [S0, S1, S2].
    -5> gb_sets:to_list(gb_sets:intersection([S0, S1, S2])).
    -[]
    -6> gb_sets:to_list(gb_sets:intersection([S0, S1])).
    -[d]
    -7> gb_sets:intersection([]).
    +elements that are present in all sets.

    Examples

    1> S0 = gb_sets:from_list([a,b,c,d]).
    +2> S1 = gb_sets:from_list([d,e,f]).
    +3> S2 = gb_sets:from_list([q,r])
    +4> Sets = [S0, S1, S2].
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_trees.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_trees.html	2026-04-20 17:48:55.465777884 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gb_trees.html	2026-04-20 17:48:55.473777933 +0000
    @@ -1562,7 +1562,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_event.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_event.html 2026-04-20 17:48:55.521778231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_event.html 2026-04-20 17:48:55.525778255 +0000 @@ -1262,15 +1262,15 @@ but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so event handler modules need not export it. + end, Status).

    Note

    This callback is optional, so event handler modules need not export it. If a handler does not export this function, the gen_event module uses the handler state directly for the purposes described below.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return the fact that @@ -2951,7 +2951,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_fsm.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_fsm.html 2026-04-20 17:48:55.581778603 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_fsm.html 2026-04-20 17:48:55.581778603 +0000 @@ -94,163 +94,163 @@

    Deprecated and replaced by gen_statem in OTP 20.

    Migration to gen_statem

    Here follows a simple example of turning a gen_fsm into a gen_statem. -The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    --define(NAME, code_lock).
    +The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    +-define(NAME, code_lock).
     %-define(BEFORE_REWRITE, true).
     
    --ifdef(BEFORE_REWRITE).
    --behaviour(gen_fsm).
    +-ifdef(BEFORE_REWRITE).
    +-behaviour(gen_fsm).
     -else.
    --behaviour(gen_statem).
    +-behaviour(gen_statem).
     -endif.
     
    --export([start_link/1, button/1, stop/0]).
    +-export([start_link/1, button/1, stop/0]).
     
    --ifdef(BEFORE_REWRITE).
    --export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    -     handle_info/3, terminate/3, code_change/4]).
    +-ifdef(BEFORE_REWRITE).
    +-export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    +     handle_info/3, terminate/3, code_change/4]).
     -else.
    --export([init/1, callback_mode/0, locked/3, open/3,
    -     terminate/3, code_change/4]).
    +-export([init/1, callback_mode/0, locked/3, open/3,
    +     terminate/3, code_change/4]).
     %% Add callback__mode/0
     %% Change arity of the state functions
     %% Remove handle_info/3
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -start_link(Code) ->
    -    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
    +-ifdef(BEFORE_REWRITE).
    +start_link(Code) ->
    +    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
     -else.
    -start_link(Code) ->
    -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
    +start_link(Code) ->
    +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -button(Digit) ->
    -    gen_fsm:send_event(?NAME, {button, Digit}).
    +-ifdef(BEFORE_REWRITE).
    +button(Digit) ->
    +    gen_fsm:send_event(?NAME, {button, Digit}).
     -else.
    -button(Digit) ->
    -    gen_statem:cast(?NAME, {button,Digit}).
    +button(Digit) ->
    +    gen_statem:cast(?NAME, {button,Digit}).
         %% send_event is asynchronous and becomes a cast
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -stop() ->
    -    gen_fsm:sync_send_all_state_event(?NAME, stop).
    +-ifdef(BEFORE_REWRITE).
    +stop() ->
    +    gen_fsm:sync_send_all_state_event(?NAME, stop).
     -else.
    -stop() ->
    -    gen_statem:call(?NAME, stop).
    +stop() ->
    +    gen_statem:call(?NAME, stop).
         %% sync_send is synchronous and becomes call
         %% all_state is handled by callback code in gen_statem
     -endif.
     
    -init(Code) ->
    -    do_lock(),
    -    Data = #href_anchor"ss">code => Code, remaining => Code},
    -    {ok, locked, Data}.
    +init(Code) ->
    +    do_lock(),
    +    Data = #href_anchor"ss">code => Code, remaining => Code},
    +    {ok, locked, Data}.
     
    --ifdef(BEFORE_REWRITE).
    +-ifdef(BEFORE_REWRITE).
     -else.
    -callback_mode() ->
    +callback_mode() ->
         state_functions.
     %% state_functions mode is the mode most similar to
     %% gen_fsm. There is also handle_event mode which is
     %% a fairly different concept.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -locked({button, Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +-ifdef(BEFORE_REWRITE).
    +locked({button, Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end.
     -else.
    -locked(cast, {button,Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +locked(cast, {button,Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end;
    -locked({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -locked({info, Msg}, StateName, Data) ->
    -    handle_info(Msg, StateName, Data).
    +locked({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +locked({info, Msg}, StateName, Data) ->
    +    handle_info(Msg, StateName, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -open(timeout, State) ->
    -     do_lock(),
    -    {next_state, locked, State};
    -open({button,_}, Data) ->
    -    {next_state, locked, Data}.
    +-ifdef(BEFORE_REWRITE).
    +open(timeout, State) ->
    +     do_lock(),
    +    {next_state, locked, State};
    +open({button,_}, Data) ->
    +    {next_state, locked, Data}.
     -else.
    -open(timeout, _, Data) ->
    -    do_lock(),
    -    {next_state, locked, Data};
    -open(cast, {button,_}, Data) ->
    -    {next_state, locked, Data};
    -open({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -open(info, Msg, Data) ->
    -    handle_info(Msg, open, Data).
    +open(timeout, _, Data) ->
    +    do_lock(),
    +    {next_state, locked, Data};
    +open(cast, {button,_}, Data) ->
    +    {next_state, locked, Data};
    +open({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +open(info, Msg, Data) ->
    +    handle_info(Msg, open, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -handle_sync_event(stop, _From, _StateName, Data) ->
    -    {stop, normal, ok, Data}.
    +-ifdef(BEFORE_REWRITE).
    +handle_sync_event(stop, _From, _StateName, Data) ->
    +    {stop, normal, ok, Data}.
     
    -handle_event(Event, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
    +handle_event(Event, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
     
    -handle_info(Info, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
    +handle_info(Info, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
     -else.
     -endif.
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_server.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_server.html	2026-04-20 17:48:55.637778950 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_server.html	2026-04-20 17:48:55.641778975 +0000
    @@ -1360,15 +1360,15 @@
     but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so callback modules need not export it. The + end, Status).

    Note

    This callback is optional, so callback modules need not export it. The gen_server module provides a default implementation of this function that returns the callback module state.

    If this callback is exported but fails, to hide possibly sensitive data, @@ -3059,7 +3059,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_statem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_statem.html 2026-04-20 17:48:55.721779470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/gen_statem.html 2026-04-20 17:48:55.721779470 +0000 @@ -141,7 +141,7 @@ depending on callback mode Release upgrade/downgrade -(code change) +(code change) -----> Module:code_change/4

    State callback

    The state callback for a specific state in a gen_statem is the callback function that is called for all events in this state. It is selected depending on which callback mode @@ -249,97 +249,97 @@ on --> off : push\n* Reply 'off'

    Not shown in the state diagram:

    • The API function push() generates an event push of type call.
    • The API function get_count() generates an event get_count of type call that is handled in all states by replying with the current count value.
    • Unknown events are ignored and discarded.
    • There is boilerplate code for start, stop, terminate, code change, -init, to set the callback mode to state_functions, etc...

    Pushbutton Code

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    --behaviour(gen_statem).
    +init, to set the callback mode to state_functions, etc...

    Pushbutton Code

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    +-behaviour(gen_statem).
     
    --export([start/0,push/0,get_count/0,stop/0]).
    --export([terminate/3,code_change/4,init/1,callback_mode/0]).
    --export([on/3,off/3]).
    +-export([start/0,push/0,get_count/0,stop/0]).
    +-export([terminate/3,code_change/4,init/1,callback_mode/0]).
    +-export([on/3,off/3]).
     
    -name() -> pushbutton_statem. % The registered server name
    +name() -> pushbutton_statem. % The registered server name
     
     %% API.  This example uses a registered name name()
     %% and does not link to the caller.
    -start() ->
    -    gen_statem:start({local,name()}, ?MODULE, [], []).
    -push() ->
    -    gen_statem:call(name(), push).
    -get_count() ->
    -    gen_statem:call(name(), get_count).
    -stop() ->
    -    gen_statem:stop(name()).
    +start() ->
    +    gen_statem:start({local,name()}, ?MODULE, [], []).
    +push() ->
    +    gen_statem:call(name(), push).
    +get_count() ->
    +    gen_statem:call(name(), get_count).
    +stop() ->
    +    gen_statem:stop(name()).
     
     %% Mandatory callback functions
    -terminate(_Reason, _State, _Data) ->
    +terminate(_Reason, _State, _Data) ->
         void.
    -code_change(_Vsn, State, Data, _Extra) ->
    -    {ok,State,Data}.
    -init([]) ->
    +code_change(_Vsn, State, Data, _Extra) ->
    +    {ok,State,Data}.
    +init([]) ->
         %% Set the initial state + data.  Data is used only as a counter.
         State = off, Data = 0,
    -    {ok,State,Data}.
    -callback_mode() -> state_functions.
    +    {ok,State,Data}.
    +callback_mode() -> state_functions.
     
     %%% state callback(s)
     
    -off({call,From}, push, Data) ->
    +off({call,From}, push, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -off(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +off(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
    -on({call,From}, push, Data) ->
    +on({call,From}, push, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    -on(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,off,Data,[{reply,From,off}]};
    +on(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
     %% Handle events common to all states
    -handle_event({call,From}, get_count, Data) ->
    +handle_event({call,From}, get_count, Data) ->
         %% Reply with the current count
    -    {keep_state,Data,[{reply,From,Data}]};
    -handle_event(_, _, Data) ->
    +    {keep_state,Data,[{reply,From,Data}]};
    +handle_event(_, _, Data) ->
         %% Ignore all other events
    -    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    -{ok,<0.36.0>}
    -2> pushbutton:get_count().
    +    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    +{ok,<0.36.0>}
    +2> pushbutton:get_count().
     0
    -3> pushbutton:push().
    +3> pushbutton:push().
     on
    -4> pushbutton:get_count().
    +4> pushbutton:get_count().
     1
    -5> pushbutton:push().
    +5> pushbutton:push().
     off
    -6> pushbutton:get_count().
    +6> pushbutton:get_count().
     1
    -7> pushbutton:stop().
    +7> pushbutton:stop().
     ok
    -8> pushbutton:push().
    +8> pushbutton:push().
     ** exception exit: {noproc,{gen_statem,call,[pushbutton_statem,push,infinity]}}
          in function  gen:do_for_proc/2 (gen.erl, line 261)
          in call from gen_statem:call/3 (gen_statem.erl, line 386)

    To compare styles, here follows the same example using callback mode handle_event_function, or rather, the code to replace after function init/1 -of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
    +of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
     
     %%% state callback(s)
     
    -handle_event({call,From}, push, off, Data) ->
    +handle_event({call,From}, push, off, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -handle_event({call,From}, push, on, Data) ->
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +handle_event({call,From}, push, on, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    +    {next_state,off,Data,[{reply,From,off}]};
     %%
     %% Event handling common to all states
    -handle_event({call,From}, get_count, State, Data) ->
    +handle_event({call,From}, get_count, State, Data) ->
         %% Reply with the current count
    -    {next_state,State,Data,[{reply,From,Data}]};
    -handle_event(_, _, State, Data) ->
    +    {next_state,State,Data,[{reply,From,Data}]};
    +handle_event(_, _, State, Data) ->
         %% Ignore all other events
    -    {next_state,State,Data}.

    Note

    API changes

    • This behavior appeared in Erlang/OTP 19.0 as experimental.
    • In OTP 19.1 a backwards incompatible change of the return tuple from + {next_state,State,Data}.

    Note

    API changes

    • This behavior appeared in Erlang/OTP 19.0 as experimental.
    • In OTP 19.1 a backwards incompatible change of the return tuple from Module:init/1 was made, the mandatory callback function Module:callback_mode/0 was introduced, @@ -3112,15 +3112,15 @@ containing the same keys as the input map, but it may transform some values.

      One use case for this function is to return compact alternative state representations to avoid having large state terms printed in log files. -Another is to hide sensitive data from being written to the error log.

      Example:

      format_status(Status) ->
      -  maps:map(
      -    fun(state,State) ->
      -            maps:remove(private_key, State);
      -       (message,{password, _Pass}) ->
      -            {password, removed};
      -       (_,Value) ->
      +Another is to hide sensitive data from being written to the error log.

      Example:

      format_status(Status) ->
      +  maps:map(
      +    fun(state,State) ->
      +            maps:remove(private_key, State);
      +       (message,{password, _Pass}) ->
      +            {password, removed};
      +       (_,Value) ->
                   Value
      -    end, Status).

      Note

      This callback is optional, so a callback module does not need + end, Status).

      Note

      This callback is optional, so a callback module does not need to export it. The gen_statem module provides a default implementation of this function that returns {State, Data}.

      If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return {State, Info}, @@ -3294,8 +3294,8 @@ to initialize the implementation state and server data.

      Args is the Args argument provided to that start function.

      Note

      Note that if the gen_statem is started through proc_lib and enter_loop/4,5,6, this callback will never be called. Since this callback is not optional -it can in that case be implemented as:

      -spec init(_) -> no_return().
      -init(Args) -> erlang:error(not_implemented, [Args]).
      +it can in that case be implemented as:

      -spec init(_) -> no_return().
      +init(Args) -> erlang:error(not_implemented, [Args]).
    @@ -4728,7 +4728,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/introduction.html 2026-04-20 17:48:55.761779719 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/introduction.html 2026-04-20 17:48:55.761779719 +0000 @@ -142,7 +142,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io.html 2026-04-20 17:48:55.821780091 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io.html 2026-04-20 17:48:55.821780091 +0000 @@ -107,7 +107,7 @@ binaries instead of lists. The binaries are encoded in UTF-8.

    To work with binaries in ISO Latin-1 encoding, use the file module instead.

    For conversion functions between character encodings, see the unicode module.

    Error Information

    The ErrorInfo mentioned in this module is the standard ErrorInfo structure -that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    +that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    @@ -1159,12 +1159,12 @@ no IoDevice argument is specified in the function calls in this module.

    It is sometimes desirable to use an explicit IoDevice argument that refers to the default I/O device. This is the case with functions that can access either a file or the default I/O device. The atom standard_io has this -special meaning. The following example illustrates this:

    27> io:read('enter>').
    +special meaning. The following example illustrates this:

    27> io:read('enter>').
     enter>foo.
    -{ok,foo}
    -28> io:read(standard_io, 'enter>').
    +{ok,foo}
    +28> io:read(standard_io, 'enter>').
     enter>bar.
    -{ok,bar}

    By default all I/O sent to standard_io will end up in the user +{ok,bar}

    By default all I/O sent to standard_io will end up in the user I/O device of the node that spawned the calling process.

    standard_io is an alias for group_leader/0, so in order to change where the default input/output requests are sent you can change the group leader of the current process using @@ -1439,33 +1439,33 @@ whitespace characters are stripped. An Erlang string (list of characters) is returned.

    If Unicode translation is in effect (~ts), characters > 255 are accepted, otherwise not. With the translation modifier, the returned list can as a -consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
    +consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~ts").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~ts").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{ok,[[1091,1085,1080,1094,1086,1076,1077]]}
  • a - Similar to s, but the resulting string is converted into an +{ok,[[1091,1085,1080,1094,1086,1076,1077]]}

  • a - Similar to s, but the resulting string is converted into an atom.

  • c - The number of characters equal to the field width are read (default is 1) and returned as an Erlang string. However, leading and trailing whitespace characters are not omitted as they are with s. All -characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
    +characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~tc").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~tc").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{ok,[[1091]]}
  • l - Returns the number of characters that have been scanned up to that +{ok,[[1091]]}

  • l - Returns the number of characters that have been scanned up to that point, including whitespace characters.

  • The function returns:
    • {ok, Terms} - The read was successful and Terms is the list of successfully matched and read items.

    • eof - End of file was encountered.

    • {error, FreadError} - The reading failed and FreadError gives a hint about the error.

    • {error, ErrorDescription} - The read operation failed and parameter -ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
    +ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
     enter>1.9 35.5e3 15.0
    -{ok,[1.9,3.55e4,15.0]}
    -21> io:fread('enter>', "~10f~d").
    +{ok,[1.9,3.55e4,15.0]}
    +21> io:fread('enter>', "~10f~d").
     enter>     5.67899
    -{ok,[5.678,99]}
    -22> io:fread('enter>', ":~10s:~10c:").
    +{ok,[5.678,99]}
    +22> io:fread('enter>', ":~10s:~10c:").
     enter>:   alan   :   joe    :
    -{ok, ["alan", "   joe    "]}
    +
    {ok, ["alan", " joe "]}
    @@ -1554,7 +1554,7 @@ the output device, and control sequences for formatting, see below. If Format is an atom or a binary, it is first converted to a list with the aid of atom_to_list/1 or -binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
    +binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
     Hello world!
     ok

    The general format of a control sequence is ~F.P.PadModC.

    The character C determines the type of control sequence to be used. It is the only required field. All of F, P, Pad, and Mod are optional. For @@ -1572,25 +1572,25 @@ padding character is ' ' (space).

  • Mod is the control sequence modifier. This is one or more characters that change the interpretation of Data.

    The current modifiers are:

    • t - For Unicode translation.

    • l - For stopping p and P from detecting printable characters.

    • k - For use with p, P, w, and W to format maps in map-key ordered order (see maps:iterator_order/0).

    • K - Similar to k, for formatting maps in map-key order, but takes an -extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      -#{a => 1,b => 2}
      -> io:format("~Kp~n", [reversed, M]).
      -#{b => 2,a => 1}
      +extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      +#{a => 1,b => 2}
      +> io:format("~Kp~n", [reversed, M]).
      +#{b => 2,a => 1}
       ok
  • If F, P, or Pad is a * character, the next argument in Data is used as -the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
    +the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
     003.14159
    -ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
    +ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
     **3.14159
     ok

    Available control sequences:

    • ~ - Character ~ is written.

    • c - The argument is a number that is interpreted as an ASCII code. The precision is the number of times the character is printed and defaults to the -field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
      +field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
       |     aaaaa|bbbbb     |ccccc|
       ok

      If the Unicode translation modifier (t) is in effect, the integer argument can be any number representing a valid Unicode codepoint, otherwise it is to -be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      -\x{400}
      +be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      +\x{400}
       ok
      -3> io:fwrite("~c~n",[1024]).
      +3> io:fwrite("~c~n",[1024]).
       ^@
       ok
    • f - The argument is a float that is written as [-]ddd.ddd, where the precision is the number of digits after the decimal point. The default @@ -1608,18 +1608,18 @@ binaries are in UTF-8. The characters are printed without quotes. The string is first truncated by the specified precision and then padded and justified to the specified field width. The default precision is the field width.

      This format can be used for printing any object and truncating the output so -it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
      +it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
       |**********|
       ok
      -2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey,h|
      -3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey  |
      +2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey,h|
      +3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey  |
       ok

      A list with integers > 255 is considered an error if the Unicode translation -modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      -\x{400}
      +modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      +\x{400}
       ok
      -5> io:fwrite("~s~n",[[1024]]).
      +5> io:fwrite("~s~n",[[1024]]).
       ** exception error: bad argument
            in function  io:format/3
               called as io:format(<0.53.0>,"~s~n",[[1024]])
    • w - Writes data with the standard syntax. This is used to output Erlang @@ -1630,122 +1630,122 @@ breaks terms whose printed representation is longer than one line into many lines and indents each line sensibly. Left-justification is not supported. It also tries to detect flat lists of printable characters and output these as -strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      -{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      -{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
      +strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      +{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      +{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
       ...
      -2> io:fwrite("~w~n", [T]).
      -[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      -[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      -me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      -,implicit}]
      +2> io:fwrite("~w~n", [T]).
      +[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      +[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      +me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      +,implicit}]
       ok
      -3> io:fwrite("~62p~n", [T]).
      -[{attributes,[[{id,age,1.5},
      -               {mode,explicit},
      -               {typename,"INTEGER"}],
      -              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      - {typename,'Person'},
      - {tag,{'PRIVATE',3}},
      - {mode,implicit}]
      +3> io:fwrite("~62p~n", [T]).
      +[{attributes,[[{id,age,1.5},
      +               {mode,explicit},
      +               {typename,"INTEGER"}],
      +              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      + {typename,'Person'},
      + {tag,{'PRIVATE',3}},
      + {mode,implicit}]
       ok

      The field width specifies the maximum line length. It defaults to 80. The precision specifies the initial indentation of the term. It defaults to the number of characters printed on this line in the same call to write/1 or -format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      -Here T = [{attributes,[[{id,age,1.5},
      -                        {mode,explicit},
      -                        {typename,"INTEGER"}],
      -                       [{id,cho},
      -                        {mode,explicit},
      -                        {typename,'Cho'}]]},
      -          {typename,'Person'},
      -          {tag,{'PRIVATE',3}},
      -          {mode,implicit}]
      +format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_lib.html	2026-04-20 17:48:55.869780389 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_lib.html	2026-04-20 17:48:55.873780413 +0000
      @@ -1263,8 +1263,8 @@
       input is needed to complete the original format string. RestFormat is the
       remaining format string, Nchars is the number of characters scanned, and
       InputStack is the reversed list of inputs matched up to that point.

    • {error, What} - The read operation failed and parameter What gives a -hint about the error.

    Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    -{ok,[15.6,1.73e-5,24.5],[]}
    +hint about the error.

    Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    +{ok,[15.6,1.73e-5,24.5],[]}
    @@ -1773,11 +1773,11 @@ "...".

    Depth defaults to -1, which means no limitation. Option CharsLimit puts a soft limit on the number of characters returned. When the number of characters is reached, remaining structures are replaced by "...". CharsLimit defaults to -1, -which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
    +which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
     "{1,[2],[3],[4,5],6,7,8,9}"
    -2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
    +2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
     "{1,[2],[3],[...],...}"
    -3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
    +3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
     "{[1,2|...],[4|...],...}"
    @@ -2046,7 +2046,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_protocol.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_protocol.html 2026-04-20 17:48:55.925780736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/io_protocol.html 2026-04-20 17:48:55.921780712 +0000 @@ -104,8 +104,8 @@ ever present in the client. Any I/O server can be used together with any client code, and the client code does not need to be aware of the I/O device that the I/O server communicates with.

    Protocol Basics

    As described in Robert's paper, I/O servers and clients communicate using -io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    -{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server +io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    +{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server eventually sends a corresponding io_reply tuple.

    • From is the pid/0 of the client, the process which the I/O server sends the I/O reply to.

    • ReplyAs can be any datum and is returned in the corresponding io_reply. The io module monitors the I/O server and uses the monitor reference as @@ -116,8 +116,8 @@ io_reply. The reply can be sent from any process, not necessarily the actual I/O server.

    • Request and Reply are described below.

    When an I/O server receives an io_request tuple, it acts upon the Request part and eventually sends an io_reply tuple with the corresponding Reply -part.

    Output Requests

    To output characters on an I/O device, the following Requests exist:

    {put_chars, Encoding, Characters}
    -{put_chars, Encoding, Module, Function, Args}
    • Encoding is unicode or latin1, meaning that the characters are (in case +part.

      Output Requests

      To output characters on an I/O device, the following Requests exist:

      {put_chars, Encoding, Characters}
      +{put_chars, Encoding, Module, Function, Args}
      • Encoding is unicode or latin1, meaning that the characters are (in case of binaries) encoded as UTF-8 or ISO Latin-1 (pure bytes). A well-behaved I/O server is also to return an error indication if list elements contain integers > 255 when Encoding is set to latin1.

        Notice that this does not in any way tell how characters are to be put on the @@ -136,8 +136,8 @@ the function returns anything else than a binary or list, or throws an exception, an error is to be sent back to the client.

      The I/O server replies to the client with an io_reply tuple, where element Reply is one of:

      ok
      -{error, Error}
      • Error describes the error to the client, which can do whatever it wants with -it. The io module typically returns it "as is".

      Input Requests

      To read characters from an I/O device, the following Requests exist:

      {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
      • Encoding denotes how data is to be sent back to the client and what data is +{error, Error}

    • Error describes the error to the client, which can do whatever it wants with +it. The io module typically returns it "as is".

    Input Requests

    To read characters from an I/O device, the following Requests exist:

    {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
    • Encoding denotes how data is to be sent back to the client and what data is sent to the function denoted by Module/Function/ExtraArgs. If the function supplied returns data as a list, the data is converted to this encoding. If the function supplied returns data in some other format, no @@ -153,8 +153,8 @@ nothing being written to the I/O device).

    • Module, Function, and ExtraArgs denote a function and arguments to determine when enough data is written. The function is to take two more arguments, the last state, and a list of characters. The function is to return -one of:

      {done, Result, RestChars}
      -{more, Continuation}

      Result can be any Erlang term, but if it is a list/0, the I/O server can +one of:

      {done, Result, RestChars}
      +{more, Continuation}

      Result can be any Erlang term, but if it is a list/0, the I/O server can convert it to a binary/0 of appropriate format before returning it to the client, if the I/O server is set in binary mode (see below).

      The function is called with the data the I/O server finds on its I/O device, returning one of:

      • {done, Result, RestChars} when enough data is read. In this case Result @@ -164,38 +164,38 @@ characters are available. When no more characters are available, the function must return {done, eof, Rest}. The initial state is the empty list. The data when an end of file is reached on the IO device is the atom eof.

        An emulation of the get_line request can be (inefficiently) implemented -using the following functions:

        -module(demo).
        --export([until_newline/3, get_line/1]).
        +using the following functions:

        -module(demo).
        +-export([until_newline/3, get_line/1]).
         
        -until_newline(_ThisFar,eof,_MyStopCharacter) ->
        -    {done,eof,[]};
        -until_newline(ThisFar,CharList,MyStopCharacter) ->
        +until_newline(_ThisFar,eof,_MyStopCharacter) ->
        +    {done,eof,[]};
        +until_newline(ThisFar,CharList,MyStopCharacter) ->
             case
        -        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
        +        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
             of
        -  {L,[]} ->
        -            {more,ThisFar++L};
        -  {L2,[MyStopCharacter|Rest]} ->
        -      {done,ThisFar++L2++[MyStopCharacter],Rest}
        +  {L,[]} ->
        +            {more,ThisFar++L};
        +  {L2,[MyStopCharacter|Rest]} ->
        +      {done,ThisFar++L2++[MyStopCharacter],Rest}
             end.
         
        -get_line(IoServer) ->
        -    IoServer ! {io_request,
        -                self(),
        +get_line(IoServer) ->
        +    IoServer ! {io_request,
        +                self(),
                         IoServer,
        -                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
        +                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
             receive
        -        {io_reply, IoServer, Data} ->
        +        {io_reply, IoServer, Data} ->
               Data
             end.

        Notice that the last element in the Request tuple ([$\n]) is appended to the argument list when the function is called. The function is to be called like apply(Module, Function, [ State, Data | ExtraArgs ]) by -the I/O server.

      A fixed number of characters is requested using the following Request:

      {get_chars, Encoding, Prompt, N}
      • Encoding and Prompt as for get_until.
      • N is the number of characters to be read from the I/O device.

      A single line (as in former example) is requested with the following Request:

      {get_line, Encoding, Prompt}
      • Encoding and Prompt as for get_until.

      Clearly, get_chars and get_line could be implemented with the get_until +the I/O server.

    A fixed number of characters is requested using the following Request:

    {get_chars, Encoding, Prompt, N}
    • Encoding and Prompt as for get_until.
    • N is the number of characters to be read from the I/O device.

    A single line (as in former example) is requested with the following Request:

    {get_line, Encoding, Prompt}
    • Encoding and Prompt as for get_until.

    Clearly, get_chars and get_line could be implemented with the get_until request (and indeed they were originally), but demands for efficiency have made these additions necessary.

    The I/O server replies to the client with an io_reply tuple, where element Reply is one of:

    Data
     eof
    -{error, Error}
    • Data is the characters read, in list or binary form (depending on the I/O +{error, Error}
    • Data is the characters read, in list or binary form (depending on the I/O server mode, see the next section).
    • eof is returned when input end is reached and no more data is available to the client process.
    • Error describes the error to the client, which can do whatever it wants with it. The io module typically returns it as is.

    I/O Server Modes

    Demands for efficiency when reading data from an I/O server has not only lead to @@ -215,164 +215,164 @@ This is done in the example in section An Annotated and Working Example I/O Server.

    An I/O server in binary mode affects the data sent to the client, so that it must be able to handle binary data. For convenience, the modes of an I/O server -can be set and retrieved using the following I/O requests:

    {setopts, Opts}
    • Opts is a list of options in the format recognized by the proplists +can be set and retrieved using the following I/O requests:

      {setopts, Opts}
      • Opts is a list of options in the format recognized by the proplists module (and by the I/O server).

      As an example, the I/O server for the interactive shell (in group.erl) -understands the following options:

      {binary, boolean()} (or binary/list)
      -{echo, boolean()}
      -{expand_fun, fun()}
      -{encoding, unicode/latin1} (or unicode/latin1)

      Options binary and encoding are common for all I/O servers in OTP, while +understands the following options:

      {binary, boolean()} (or binary/list)
      +{echo, boolean()}
      +{expand_fun, fun()}
      +{encoding, unicode/latin1} (or unicode/latin1)

      Options binary and encoding are common for all I/O servers in OTP, while echo and expand are valid only for this I/O server. Option unicode notifies how characters are put on the physical I/O device, that is, if the terminal itself is Unicode-aware. It does not affect how characters are sent in the I/O protocol, where each request contains encoding information for the provided or returned data.

      The I/O server is to send one of the following as Reply:

      ok
      -{error, Error}

      An error (preferably enotsup) is to be expected if the option is not supported +{error, Error}

    An error (preferably enotsup) is to be expected if the option is not supported by the I/O server (like if an echo option is sent in a setopts request to a plain file).

    To retrieve options, the following request is used:

    getopts

    This request asks for a complete list of all options supported by the I/O server as well as their current values.

    The I/O server replies:

    OptList
    -{error, Error}
    • OptList is a list of tuples {Option, Value}, where Option always is an +{error, Error}
    • OptList is a list of tuples {Option, Value}, where Option always is an atom.

    Multiple I/O Requests

    The Request element can in itself contain many Requests by using the -following format:

    {requests, Requests}
    • Requests is a list of valid io_request tuples for the protocol. They must +following format:

      {requests, Requests}
      • Requests is a list of valid io_request tuples for the protocol. They must be executed in the order that they appear in the list. The execution is to continue until one of the requests results in an error or the list is consumed. The result of the last request is sent back to the client.

      The I/O server can, for a list of requests, send any of the following valid results in the reply, depending on the requests in the list:

      ok
      -{ok, Data}
      -{ok, Options}
      -{error, Error}

      Optional I/O Request

      The following I/O request is optional to implement and a client is to be -prepared for an error return:

      {get_geometry, Geometry}
      • Geometry is the atom rows or the atom columns.

      The I/O server is to send one of the following as Reply:

      N
      -{error, Error}
      • N is the number of character rows or columns that the I/O device has, if +{ok, Data} +{ok, Options} +{error, Error}

    Optional I/O Request

    The following I/O request is optional to implement and a client is to be +prepared for an error return:

    {get_geometry, Geometry}
    • Geometry is the atom rows or the atom columns.

    The I/O server is to send one of the following as Reply:

    N
    +{error, Error}
    • N is the number of character rows or columns that the I/O device has, if applicable to the I/O device handled by the I/O server, otherwise {error, enotsup} is a good answer.

    Unimplemented Request Types

    If an I/O server encounters a request that it does not recognize (that is, the io_request tuple has the expected format, but the Request is unknown), the -I/O server is to send a valid reply with the error tuple:

    {error, request}

    This makes it possible to extend the protocol with optional requests and for the +I/O server is to send a valid reply with the error tuple:

    {error, request}

    This makes it possible to extend the protocol with optional requests and for the clients to be somewhat backward compatible.

    An Annotated and Working Example I/O Server

    An I/O server is any process capable of handling the I/O protocol. There is no generic I/O server behavior, but could well be. The framework is simple, a process handling incoming requests, usually both I/O-requests and other I/O device-specific requests (positioning, closing, and so on).

    The example I/O server stores characters in an ETS table, making up a fairly crude RAM file.

    The module begins with the usual directives, a function to start the I/O server -and a main loop handling the requests:

    -module(ets_io_server).
    +and a main loop handling the requests:

    -module(ets_io_server).
     
    --export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
    +-export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
     
    --define(CHARS_PER_REC, 10).
    +-define(CHARS_PER_REC, 10).
     
    --record(state, {
    +-record(state, {
     	  table,
     	  position, % absolute
     	  mode % binary | list
    -	 }).
    +	 }).
     
    -start_link() ->
    -    spawn_link(?MODULE,init,[]).
    +start_link() ->
    +    spawn_link(?MODULE,init,[]).
     
    -init() ->
    -    Table = ets:new(noname,[ordered_set]),
    -    ?MODULE:loop(#href_anchor"ss">state{table = Table, position = 0, mode=list}).
    +init() ->
    +    Table = ets:new(noname,[ordered_set]),
    +    ?MODULE:loop(#href_anchor"ss">state{table = Table, position = 0, mode=list}).
     
    -loop(State) ->
    +loop(State) ->
         receive
    -	{io_request, From, ReplyAs, Request} ->
    -	    case request(Request,State) of
    -		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
    -		    reply(From, ReplyAs, Reply),
    -		    ?MODULE:loop(NewState);
    -		{stop, Reply, _NewState} ->
    -		    reply(From, ReplyAs, Reply),
    -		    exit(Reply)
    +	{io_request, From, ReplyAs, Request} ->
    +	    case request(Request,State) of
    +		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
    +		    reply(From, ReplyAs, Reply),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/json.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/json.html	2026-04-20 17:48:55.969781009 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/json.html	2026-04-20 17:48:55.969781009 +0000
    @@ -964,8 +964,8 @@
     
           
     
    -

    Parses a JSON value from Binary.

    Supports basic data mapping:

    JSONErlang
    Numberinteger() | float()
    Booleantrue | false
    Nullnull
    Stringbinary()
    Object#{binary() => _}

    Errors

    • error(unexpected_end) if Binary contains incomplete JSON value
    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape

    Example

    > json:decode(<<"{\"foo\": 1}">>).
    -#{<<"foo">> => 1}
    +

    Parses a JSON value from Binary.

    Supports basic data mapping:

    JSONErlang
    Numberinteger() | float()
    Booleantrue | false
    Nullnull
    Stringbinary()
    Object#{binary() => _}

    Errors

    • error(unexpected_end) if Binary contains incomplete JSON value
    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape

    Example

    > json:decode(<<"{\"foo\": 1}">>).
    +#{<<"foo">> => 1}
    @@ -999,9 +999,9 @@ can be customized with the callbacks specified in Decoders. The callbacks will use the Acc value as the initial accumulator.

    Any leftover, unparsed data in Binary will be returned.

    Default callbacks

    All callbacks are optional. If not provided, they will fall back to -implementations used by the decode/1 function:

    • for array_start: fun(_) -> [] end
    • for array_push: fun(Elem, Acc) -> [Elem | Acc] end

    • for array_finish: fun(Acc, OldAcc) -> {lists:reverse(Acc), OldAcc} end
    • for object_start: fun(_) -> [] end
    • for object_push: fun(Key, Value, Acc) -> [{Key, Value} | Acc] end

    • for object_finish: fun(Acc, OldAcc) -> {maps:from_list(Acc), OldAcc} end
    • for float: fun erlang:binary_to_float/1
    • for integer: fun erlang:binary_to_integer/1
    • for string: fun (Value) -> Value end
    • for null: the atom null

    Errors

    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape
    • error(unexpected_end) if Binary contains incomplete JSON value

    Example

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    -> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    -{#{foo => 1},ok,<<>>}
    +implementations used by the decode/1 function:

    • for array_start: fun(_) -> [] end
    • for array_push: fun(Elem, Acc) -> [Elem | Acc] end

    • for array_finish: fun(Acc, OldAcc) -> {lists:reverse(Acc), OldAcc} end
    • for object_start: fun(_) -> [] end
    • for object_push: fun(Key, Value, Acc) -> [{Key, Value} | Acc] end

    • for object_finish: fun(Acc, OldAcc) -> {maps:from_list(Acc), OldAcc} end
    • for float: fun erlang:binary_to_float/1
    • for integer: fun erlang:binary_to_integer/1
    • for string: fun (Value) -> Value end
    • for null: the atom null

    Errors

    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape
    • error(unexpected_end) if Binary contains incomplete JSON value

    Example

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    +> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    +{#{foo => 1},ok,<<>>}
    @@ -1034,11 +1034,11 @@

    Continue parsing a stream of bytes of a JSON value.

    Similar to decode_start/3, if the function returns {continue, State} and -there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    -> json:decode_continue(<<"1}">>, State).
    -{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    -> json:decode_continue(end_of_input, State).
    -{123,ok,<<>>}
    +there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    +> json:decode_continue(<<"1}">>, State).
    +{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    +> json:decode_continue(end_of_input, State).
    +{123,ok,<<>>}
    @@ -1102,8 +1102,8 @@ -

    Generates JSON corresponding to Term.

    Supports basic data mapping:

    ErlangJSON
    integer() | float()Number
    true | falseBoolean
    nullNull
    binary()String
    atom()String
    list()Array
    #{binary() => _}Object
    #{atom() => _}Object
    #{integer() => _}Object

    This is equivalent to encode(Term, fun json:encode_value/2).

    Examples

    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
    -<<"{\"foo\":\"bar\"}">>
    +

    Generates JSON corresponding to Term.

    Supports basic data mapping:

    ErlangJSON
    integer() | float()Number
    true | falseBoolean
    nullNull
    binary()String
    atom()String
    list()Array
    #{binary() => _}Object
    #{atom() => _}Object
    #{integer() => _}Object

    This is equivalent to encode(Term, fun json:encode_value/2).

    Examples

    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
    +<<"{\"foo\":\"bar\"}">>
    @@ -1138,11 +1138,11 @@ to be encoded and is expected to return the corresponding encoded JSON as iodata.

    Various encode_* functions in this module can be used to help in constructing such callbacks.

    Examples

    An encoder that uses a heuristic to differentiate object-like -lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    -> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    -> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    -> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
    -<<"{\"a\":[],\"b\":1}">>
    +lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    +> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    +> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    +> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
    +<<"{\"a\":[],\"b\":1}">>
    @@ -1509,11 +1509,11 @@ -

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    -{
    +

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    +{
       "baz": 52,
       "foo": "bar"
    -}
    +}
     ok
    @@ -1578,20 +1578,20 @@

    Generates formatted JSON corresponding to Term.

    Similar to encode/2, can be customised with the Encoder callback and Options.

    Options can include 'indent' to specify number of spaces per level and 'max' which loosely limits the width of lists.

    The Encoder will get a 'State' argument which contains the 'Options' maps merged with other data when recursing through 'Term'.

    format_value/3 or various encode_* functions in this module can be used -to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    -    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    -    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    -> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
    +to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    +    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    +    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    +> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
     >
    -> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    -> Options = #{indent => 4}.
    -> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
    +> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    +> Options = #{indent => 4}.
    +> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
     >
    -> io:put_chars(json:format(Term, Fun, Options)).
    -{
    +> io:put_chars(json:format(Term, Fun, Options)).
    +{
         "id": 1,
         "time": "2024-05-23T16:07:48Z"
    -}
    +}
     ok
    @@ -1715,7 +1715,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/lists.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/lists.html 2026-04-20 17:48:56.045781480 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/lists.html 2026-04-20 17:48:56.045781480 +0000 @@ -1038,10 +1038,10 @@

    Returns true if Pred(Elem) returns true for all elements Elem in List; -otherwise, returns false.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -2> lists:all(IsEven, [2,4,5]).
    +otherwise, returns false.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +2> lists:all(IsEven, [2,4,5]).
     false
    -3> lists:all(IsEven, [2,4,6]).
    +3> lists:all(IsEven, [2,4,6]).
     true
    @@ -1071,10 +1071,10 @@

    Returns true if Pred(Elem) returns true for at least one element Elem in -List; otherwise, returns false.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -2> lists:any(IsEven, [3,5,7]).
    +List; otherwise, returns false.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +2> lists:any(IsEven, [3,5,7]).
     false
    -3> lists:any(IsEven, [2,3,5,7]).
    +3> lists:any(IsEven, [2,3,5,7]).
     true
    @@ -1103,8 +1103,8 @@ -

    Returns a list in which all sublists of ListOfLists have been concatenated.

    Examples

    1> lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    -[1,2,3,a,b,4,5,6]
    +

    Returns a list in which all sublists of ListOfLists have been concatenated.

    Examples

    1> lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    +[1,2,3,a,b,4,5,6]
    @@ -1133,7 +1133,7 @@

    Returns a new list, List3, consisting of the elements of -List1, followed by the elements of List2.

    Examples

    1> lists:append("abc", "def").
    +List1, followed by the elements of List2.

    Examples

    1> lists:append("abc", "def").
     "abcdef"

    lists:append(A, B) is equivalent to A ++ B.

    @@ -1163,7 +1163,7 @@ -

    Concatenates the text representation of the elements of Things.

    The elements of Things can be atoms, integers, floats, or strings.

    Examples

    1> lists:concat([doc, '/', file, '.', 3]).
    +

    Concatenates the text representation of the elements of Things.

    The elements of Things can be atoms, integers, floats, or strings.

    Examples

    1> lists:concat([doc, '/', file, '.', 3]).
     "doc/file.3"
    @@ -1193,10 +1193,10 @@

    Returns a copy of List1 where the first element matching Elem is removed, if -there is such an element.

    Examples

    1> lists:delete(b, [a,b,c]).
    -[a,c]
    -2> lists:delete(x, [a,b,c]).
    -[a,b,c]
    +there is such an element.

    Examples

    1> lists:delete(b, [a,b,c]).
    +[a,c]
    +2> lists:delete(x, [a,b,c]).
    +[a,b,c]
    @@ -1227,11 +1227,11 @@

    Drops the last element of a List.

    The list must be non-empty; otherwise, the function raises a -function_clause exception.

    Examples

    1> lists:droplast([1]).
    -[]
    -2> lists:droplast([1,2,3]).
    -[1,2]
    -3> lists:droplast([]).
    +function_clause exception.

    Examples

    1> lists:droplast([1]).
    +[]
    +2> lists:droplast([1,2,3]).
    +[1,2]
    +3> lists:droplast([]).
     ** exception error: no function clause matching lists:droplast([])
    @@ -1262,10 +1262,10 @@

    Drops elements Elem from List1 while Pred(Elem) returns true, -and then returns the remaining list.

    Examples

    1> lists:dropwhile(fun is_atom/1, [a,b,c,1,2,3,x,y,z]).
    -[1,2,3,x,y,z]
    -2> lists:dropwhile(fun is_integer/1, [a,b,c,1,2,3,x,y,z]).
    -[a,b,c,1,2,3,x,y,z]
    +and then returns the remaining list.

    Examples

    1> lists:dropwhile(fun is_atom/1, [a,b,c,1,2,3,x,y,z]).
    +[1,2,3,x,y,z]
    +2> lists:dropwhile(fun is_integer/1, [a,b,c,1,2,3,x,y,z]).
    +[a,b,c,1,2,3,x,y,z]
    @@ -1293,8 +1293,8 @@ -

    Returns a list containing N copies of term Elem.

    Examples

    1> lists:duplicate(5, xx).
    -[xx,xx,xx,xx,xx]
    +

    Returns a list containing N copies of term Elem.

    Examples

    1> lists:duplicate(5, xx).
    +[xx,xx,xx,xx,xx]
    @@ -1395,14 +1395,14 @@

    Returns List1 with each element H replaced by a tuple of form {I, H}, where I is the position of H in List1.

    The enumeration starts with Index and increases by Step in each step.

    That is, enumerate/3 behaves as if it were defined as -follows:

    enumerate(I, S, List) ->
    -  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
    -  List1.

    The default values for Index and Step are both 1.

    Examples

    1> lists:enumerate([a,b,c]).
    -[{1,a},{2,b},{3,c}]
    -2> lists:enumerate(10, [a,b,c]).
    -[{10,a},{11,b},{12,c}]
    -3> lists:enumerate(0, -2, [a,b,c]).
    -[{0,a},{-2,b},{-4,c}]
    +follows:

    enumerate(I, S, List) ->
    +  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
    +  List1.

    The default values for Index and Step are both 1.

    Examples

    1> lists:enumerate([a,b,c]).
    +[{1,a},{2,b},{3,c}]
    +2> lists:enumerate(10, [a,b,c]).
    +[{10,a},{11,b},{12,c}]
    +3> lists:enumerate(0, -2, [a,b,c]).
    +[{0,a},{-2,b},{-4,c}]
    @@ -1432,9 +1432,9 @@

    Returns a list of elements Elem in List1 for which Pred(Elem) -returns true.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -2> lists:filter(IsEven, [1,2,3,4,5]).
    -[2,4]
    +returns true.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +2> lists:filter(IsEven, [1,2,3,4,5]).
    +[2,4]
    @@ -1473,20 +1473,20 @@

    Calls Fun(Elem) on successive elements Elem of List1 to update or remove elements from List1.

    Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the list of elements for which Fun returns a new -value, with true being equivalent to {true, Elem}.

    That is, filtermap behaves as if it were defined as follows:

    filtermap(Fun, List1) ->
    -    lists:flatmap(fun(Elem) ->
    -                          case Fun(Elem) of
    -                              false -> [];
    -                              true -> [Elem];
    -                              {true,Value} -> [Value]
    +value, with true being equivalent to {true, Elem}.

    That is, filtermap behaves as if it were defined as follows:

    filtermap(Fun, List1) ->
    +    lists:flatmap(fun(Elem) ->
    +                          case Fun(Elem) of
    +                              false -> [];
    +                              true -> [Elem];
    +                              {true,Value} -> [Value]
                               end
    -                  end, List1).

    Examples

    1> lists:filtermap(fun(X) ->
    +                  end, List1).

    Examples

    1> lists:filtermap(fun(X) ->
                                case X rem 2 of
    -                               0 -> {true, X div 2};
    +                               0 -> {true, X div 2};
                                    1 -> false
                                end
    -                   end, [1,2,3,4,5]).
    -[1,2]
    +
    end, [1,2,3,4,5]). +[1,2]
    @@ -1514,9 +1514,9 @@ -

    Equivalent to length(flatten(DeepList)), but more efficient.

    Examples

    1> lists:flatlength([a,[b,c,[d,e]],f,[[g,h,i]]]).
    +

    Equivalent to length(flatten(DeepList)), but more efficient.

    Examples

    1> lists:flatlength([a,[b,c,[d,e]],f,[[g,h,i]]]).
     9
    -2> lists:flatlength([[[]]]).
    +2> lists:flatlength([[[]]]).
     0
    @@ -1548,14 +1548,14 @@

    Takes a function from As to lists of Bs, and a list of As (List1), producing a list of Bs by applying the function to each element in List1 and /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/log_mf_h.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/log_mf_h.html 2026-04-20 17:48:56.081781704 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/log_mf_h.html 2026-04-20 17:48:56.085781729 +0000 @@ -418,7 +418,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/maps.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/maps.html 2026-04-20 17:48:56.145782101 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/maps.html 2026-04-20 17:48:56.149782126 +0000 @@ -699,10 +699,10 @@

    Returns a map Map where each key-value pair from MapOrIter satisfies the predicate Pred(Key, Value).

    Unless MapOrIter is an ordered iterator returned by iterator/2, the order of the Pred(Key, Value) calls is not defined.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Pred is not a function of arity 2.

    Examples

    1> M = #{a => 2, b => 3, "a" => 1, "b" => 2}.
    -2> Pred = fun(K, V) -> is_atom(K) andalso V rem 2 =:= 0 end.
    -3> maps:filter(Pred, M).
    -#{a => 2}
    +valid iterator, or with badarg if Pred is not a function of arity 2.

    Examples

    1> M = #{a => 2, b => 3, "a" => 1, "b" => 2}.
    +2> Pred = fun(K, V) -> is_atom(K) andalso V rem 2 =:= 0 end.
    +3> maps:filter(Pred, M).
    +#{a => 2}
    @@ -742,12 +742,12 @@ {true, NewValue}, the value for Key is replaced with NewValue in the result map.

    Unless MapOrIter is an ordered iterator returned by iterator/2, the order of the Fun(Key, Value1) calls is not defined.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 2.

    Examples

    1> Fun = fun(K, V) when is_atom(K) -> {true, V*2};
    -            (_, V) -> V rem 2 =:= 0
    +valid iterator, or with badarg if Fun is not a function of arity 2.

    Examples

    1> Fun = fun(K, V) when is_atom(K) -> {true, V*2};
    +            (_, V) -> V rem 2 =:= 0
        end.
    -2> Map = #{k1 => 1, "k2" => 2, "k3" => 3}.
    -3> maps:filtermap(Fun, Map).
    -#{k1 => 2,"k2" => 2}
    +2>
    Map = #{k1 => 1, "k2" => 2, "k3" => 3}. +3> maps:filtermap(Fun, Map). +#{k1 => 2,"k2" => 2}
    @@ -778,10 +778,10 @@

    Returns a tuple {ok, Value}, where Value is the value associated with Key, -or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Examples

    1> Map = #{"hi" => 42}.
    +or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Examples

    1> Map = #{"hi" => 42}.
     2> Key = "hi".
    -3> maps:find(Key, Map).
    -{ok,42}
    +3>
    maps:find(Key, Map). +{ok,42}
    @@ -824,9 +824,9 @@ map is empty.

    Unless MapOrIter is an ordered iterator returned by iterator/2, the order of the Fun(Key, Value, AccIn) calls is not defined.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or valid iterator, or with badarg if Fun is not a function of -arity 3.

    Examples

    1> Fun = fun(K, V, AccIn) -> AccIn + V end.
    -2> Map = #{k1 => 1, k2 => 2, k3 => 3}.
    -3> maps:fold(Fun, 0, Map).
    +arity 3.

    Examples

    1> Fun = fun(K, V, AccIn) -> AccIn + V end.
    +2> Map = #{k1 => 1, k2 => 2, k3 => 3}.
    +3> maps:fold(Fun, 0, Map).
     6
    @@ -863,12 +863,12 @@

    Calls Fun(Key, Value) for every Key to Value association in MapOrIter.

    Unless MapOrIter is an ordered iterator returned by iterator/2, the order of the Fun(Key, Value) calls is not defined.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 2.

    Examples

    1> Fun = fun(K, V) -> self() ! {K,V} end.
    -2> Map = #{p => 1, q => 2,x => 10, y => 20, z => 30}.
    -3> maps:foreach(Fun, maps:iterator(Map, ordered)).
    +valid iterator, or with badarg if Fun is not a function of arity 2.

    Examples

    1> Fun = fun(K, V) -> self() ! {K,V} end.
    +2> Map = #{p => 1, q => 2,x => 10, y => 20, z => 30}.
    +3> maps:foreach(Fun, maps:iterator(Map, ordered)).
     ok
    -4> [receive X -> X end || _ <- [1,2,3,4,5]].
    -[{p,1},{q,2},{x,10},{y,20},{z,30}]
    +4>
    [receive X -> X end || _ <- [1,2,3,4,5]]. +[{p,1},{q,2},{x,10},{y,20},{z,30}]
    @@ -899,9 +899,9 @@

    Takes a list of keys and a value and builds a map where all keys are -associated with the same value.

    Examples

    1> Keys = ["a", "b", "c"].
    -2> maps:from_keys(Keys, ok).
    -#{"a" => ok,"b" => ok,"c" => ok}
    +associated with the same value.

    Examples

    1> Keys = ["a", "b", "c"].
    +2> maps:from_keys(Keys, ok).
    +#{"a" => ok,"b" => ok,"c" => ok}
    @@ -932,9 +932,9 @@

    Takes a list of key-value tuples and builds a map.

    If the same key appears more than once, the last (rightmost) value is -used, and previous values are ignored.

    Examples

    1> List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}].
    -2> maps:from_list(List).
    -#{42 => value_three,1337 => "value two","a" => 1}
    +used, and previous values are ignored.

    Examples

    1> List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}].
    +2> maps:from_list(List).
    +#{42 => value_three,1337 => "value two","a" => 1}
    @@ -966,8 +966,8 @@

    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.

    Examples

    1> Key = 1337.
    -2> Map = #{42 => value_two,1337 => "value one","a" => 1}.
    -3> maps:get(Key, Map).
    +2> Map = #{42 => value_two,1337 => "value one","a" => 1}.
    +3> maps:get(Key, Map).
     "value one"
    @@ -999,11 +999,11 @@

    Returns the value associated with key Key in Map, or Default if -Key is not present in the map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Examples

    1> Map = #{key1 => val1, key2 => val2}.
    -#{key1 => val1,key2 => val2}
    -2> maps:get(key1, Map, "Default value").
    +Key is not present in the map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Examples

    1> Map = #{key1 => val1, key2 => val2}.
    +#{key1 => val1,key2 => val2}
    +2> maps:get(key1, Map, "Default value").
     val1
    -3> maps:get(key3, Map, "Default value").
    +3> maps:get(key3, Map, "Default value").
     "Default value"
    @@ -1043,13 +1043,13 @@

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples

    1> EvenOdd = fun(X) when X rem 2 =:= 0 -> even;
    -                (_) -> odd
    +list.

    Examples

    1> EvenOdd = fun(X) when X rem 2 =:= 0 -> even;
    +                (_) -> odd
                  end.
    -2> maps:groups_from_list(EvenOdd, [1, 2, 3]).
    -#{even => [2], odd => [1, 3]}
    -3> maps:groups_from_list(fun length/1, ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    +2>
    maps:groups_from_list(EvenOdd, [1, 2, 3]). +#{even => [2], odd => [1, 3]} +3> maps:groups_from_list(fun length/1, ["ant", "buffalo", "cat", "dingo"]). +#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    @@ -1091,15 +1091,15 @@

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List, mapped via ValueFun, for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples

    1> EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end.
    -2> Square = fun(X) -> X * X end.
    -3> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    -#{even => [4], odd => [1, 9]}
    -4> maps:groups_from_list(
    +list.

    Examples

    1> EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end.
    +2> Square = fun(X) -> X * X end.
    +3> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    +#{even => [4], odd => [1, 9]}
    +4> maps:groups_from_list(
         fun length/1,
         fun lists:reverse/1,
    -    ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    +
    ["ant", "buffalo", "cat", "dingo"]). +#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    @@ -1133,10 +1133,10 @@

    Computes the intersection of maps Map1 and Map2, producing a single map Map3.

    If a key exists in both maps, the value in Map1 is superseded by the value in Map2. Keys existing in only one of the maps are discarded -along with their values.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Examples

    1> Map1 = #{a => "one", b => "two"}.
    -2> Map2 = #{a => 1, c => 3}.
    -3> maps:intersect(Map1, Map2).
    -#{a => 1}
    +along with their values.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Examples

    1> Map1 = #{a => "one", b => "two"}.
    +2> Map2 = #{a => 1, c => 3}.
    +3> maps:intersect(Map1, Map2).
    +#{a => 1}
    @@ -1177,10 +1177,10 @@ first parameter, the value from Map1 is the second parameter, and the value from Map2 is the third parameter.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map. The call fails with a badarg exception if Combiner is not a fun that takes -three arguments.

    Examples

    1> Map1 = #{a => "one", b => "two"}.
    -2> Map2 = #{a => 1, c => 3}.
    -3> maps:intersect_with(fun(_Key, Val1, Val2) -> {Val1, Val2} end, Map1, Map2).
    -#{a => {"one",1}}
    +three arguments.

    Examples

    1> Map1 = #{a => "one", b => "two"}.
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/math.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/math.html	2026-04-20 17:48:56.193782398 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/math.html	2026-04-20 17:48:56.193782398 +0000
    @@ -410,7 +410,7 @@
     
           
     
    -

    Returns the arc cosine of X in radians.

    Examples

    1> math:acos(1.0).
    +

    Returns the arc cosine of X in radians.

    Examples

    1> math:acos(1.0).
     0.0
    @@ -439,7 +439,7 @@ -

    Returns the inverse hyperbolic cosine of X.

    Examples

    1> math:acosh(1.0).
    +

    Returns the inverse hyperbolic cosine of X.

    Examples

    1> math:acosh(1.0).
     0.0
    @@ -468,7 +468,7 @@ -

    Returns the arc cosine of X in radians.

    Examples

    1> math:asin(0.0).
    +

    Returns the arc cosine of X in radians.

    Examples

    1> math:asin(0.0).
     0.0
    @@ -497,7 +497,7 @@ -

    Returns the inverse hyperbolic sine of X.

    Examples

    1> math:asinh(0.0).
    +

    Returns the inverse hyperbolic sine of X.

    Examples

    1> math:asinh(0.0).
     0.0
    @@ -527,7 +527,7 @@

    Returns the arc tangent of Y/X in radians, using the signs of both -arguments to determine the quadrant of the return value.

    Examples

    1> math:atan2(0.0, -10.0).
    +arguments to determine the quadrant of the return value.

    Examples

    1> math:atan2(0.0, -10.0).
     3.141592653589793
    @@ -556,7 +556,7 @@ -

    Returns the arc tangent of X in radians.

    Examples

    1> math:atan(0.0).
    +

    Returns the arc tangent of X in radians.

    Examples

    1> math:atan(0.0).
     0.0
    @@ -585,7 +585,7 @@ -

    Returns the inverse hyperbolic tangent of X.

    Examples

    1> math:atanh(0.0).
    +

    Returns the inverse hyperbolic tangent of X.

    Examples

    1> math:atanh(0.0).
     0.0
    @@ -616,11 +616,11 @@ -

    Returns the ceiling of X.

    Examples

    1> math:ceil(7.5).
    +

    Returns the ceiling of X.

    Examples

    1> math:ceil(7.5).
     8.0
    -2> math:ceil(-5.5).
    +2> math:ceil(-5.5).
     -5.0
    -3> math:ceil(1.0).
    +3> math:ceil(1.0).
     1.0
    @@ -649,7 +649,7 @@ -

    Returns the cosine of X in radians.

    Examples

    1> math:cos(0.0)
    +

    Returns the cosine of X in radians.

    Examples

    1> math:cos(0.0)
     1.0
    @@ -678,7 +678,7 @@ -

    Returns the hyperbolic cosine of X.

    Examples

    1> math:cosh(0.0)
    +

    Returns the hyperbolic cosine of X.

    Examples

    1> math:cosh(0.0)
     1.0
    @@ -707,9 +707,9 @@ -

    Returns the error function of X.

    See Error function (Wikipedia).

    Examples

    1> math:erf(0.0).
    +

    Returns the error function of X.

    See Error function (Wikipedia).

    Examples

    1> math:erf(0.0).
     0.0
    -2> math:erf(10.0).
    +2> math:erf(10.0).
     1.0
    @@ -739,7 +739,7 @@

    Returns 1.0 - erf(X), computed using methods -that avoid cancellation for large X.

    Examples

    1> math:erfc(0.0).
    +that avoid cancellation for large X.

    Examples

    1> math:erfc(0.0).
     1.0
    @@ -768,9 +768,9 @@ -

    Returns e raised to the power of X.

    Examples

    1> math:exp(0).
    +

    Returns e raised to the power of X.

    Examples

    1> math:exp(0).
     1.0
    -2> trunc(100 * math:exp(1)).
    +2> trunc(100 * math:exp(1)).
     271
    @@ -801,11 +801,11 @@ -

    Returns the floor of X.

    Examples

    1> math:floor(9.1).
    +

    Returns the floor of X.

    Examples

    1> math:floor(9.1).
     9.0
    -2> math:floor(-1.5).
    +2> math:floor(-1.5).
     -2.0
    -3> math:floor(1.0)
    +3> math:floor(1.0)
     1.0
    @@ -836,7 +836,7 @@ -

    Returns the floating point remainder X divided by Y.

    Examples

    1> math:fmod(10.5, 8.0).
    +

    Returns the floating point remainder X divided by Y.

    Examples

    1> math:fmod(10.5, 8.0).
     2.5
    @@ -867,11 +867,11 @@ -

    Returns logarithm of X to base 2.

    Examples

    1> math:log2(1.0).
    +

    Returns logarithm of X to base 2.

    Examples

    1> math:log2(1.0).
     0.0
    -2> math:log2(2.0).
    +2> math:log2(2.0).
     1.0
    -3> math:log2(64).
    +3> math:log2(64).
     6.0
    @@ -900,11 +900,11 @@ -

    Returns logarithm of X to base 10.

    Examples

    1> math:log10(1.0).
    +

    Returns logarithm of X to base 10.

    Examples

    1> math:log10(1.0).
     0.0
    -2> math:log10(10.0).
    +2> math:log10(10.0).
     1.0
    -3> math:log10(100).
    +3> math:log10(100).
     2.0
    @@ -933,9 +933,9 @@ -

    Returns the natural logarithm of X.

    Examples

    1> math:log(1.0).
    +

    Returns the natural logarithm of X.

    Examples

    1> math:log(1.0).
     0.0
    -2> math:log(2.718281828459045).
    +2> math:log(2.718281828459045).
     1.0
    @@ -964,7 +964,7 @@ /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ms_transform.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ms_transform.html 2026-04-20 17:48:56.241782697 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ms_transform.html 2026-04-20 17:48:56.241782697 +0000 @@ -113,31 +113,31 @@ table and construct a list of tuples containing relevant parts of the data in these rows. One can use ets:foldl/3 instead, but the ets:select/2 call is far more efficient. Without the translation provided by ms_transform, one must -struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
    +struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
                   surname,   %Surname of the employee
                   givenname, %Given name of employee
                   dept,      %Department, one of {dev,sales,prod,adm}
    -              empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    - {emp,"041231","Doe","John",prod,2001},
    - {emp,"052341","Smith","John",dev,1997},
    - {emp,"076324","Smith","Ella",sales,1995},
    - {emp,"122334","Weston","Anna",prod,2002},
    - {emp,"535216","Chalker","Samuel",adm,1998},
    - {emp,"789789","Harrysson","Joe",adm,1996},
    - {emp,"963721","Scott","Juliana",dev,2003},
    - {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, -there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    -[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still + empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    + {emp,"041231","Doe","John",prod,2001},
    + {emp,"052341","Smith","John",dev,1997},
    + {emp,"076324","Smith","Ella",sales,1995},
    + {emp,"122334","Weston","Anna",prod,2002},
    + {emp,"535216","Chalker","Samuel",adm,1998},
    + {emp,"789789","Harrysson","Joe",adm,1996},
    + {emp,"963721","Scott","Juliana",dev,2003},
    + {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, +there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    +[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still unreadable, and one has little control over the returned result. It is always a -list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    -             (_,Acc) -> Acc
    +list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    +             (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only + [], + emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only problem is that all the data from the table must be transferred from the table to the calling process for filtering. That is inefficient compared to the ets:match/2 call where the filtering can be done "inside" the emulator and -only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to +only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to write. The first element of the tuple, #emp{empno = '$1', dept = sales, _='_'}, tells what to match. Elements not matching this are not returned, as in the ets:match/2 example. The second @@ -148,12 +148,12 @@ hence the employee number is returned. The result is ["011103","076324"], as in the ets:foldr/3 example, but the result is retrieved much more efficiently in terms of execution speed and memory consumption.

    Using ets:fun2ms/1, we can combine the ease of use of the ets:foldr/3 and -the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, dept = sales}) ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, dept = sales}) ->
                                   E
    -                      end)).

    This example requires no special knowledge of match specifications to + end)).

    This example requires no special knowledge of match specifications to understand. The head of the fun matches what you want to filter out and the body returns what you want returned. As long as the fun can be kept within the limits of the match specifications, there is no need to transfer all table data to the @@ -169,28 +169,28 @@ specifications by hand.

    Example 2

    Assume that we want to get all the employee numbers of employees hired before year 2000. Using ets:match/2 is not an alternative here, as relational operators cannot be expressed there. Once again, ets:foldr/3 can do it -(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    -                  (_,Acc) -> Acc
    +(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    +                  (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The + [], + emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The equivalent expression using a handwritten match specification would look like -this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    -                     [{'<', '$2', 2000}],
    -                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and +this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    +                     [{'<', '$2', 2000}],
    +                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and therefore discards anything that does not have an empyear (bound to '$2' in -the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
                                E
    -                      end)).

    Example 3

    Assume that we want the whole object matching instead of only one element. One + end)).

    Example 3

    Assume that we want the whole object matching instead of only one element. One alternative is to assign a variable to every part of the record and build it up -once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(Obj = #emp{empno = E, empyear = Y})
    +once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(Obj = #emp{empno = E, empyear = Y})
                              when Y < 2000 ->
                                   Obj
    -                      end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched + end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched object using a "match inside the match", that is, a =. Unfortunately in funs translated to match specifications, it is allowed only at the "top-level", that is, matching the whole object arriving to be matched into a separate variable. @@ -199,34 +199,34 @@ object/0 also returns the whole matched object, see section Warnings and Restrictions.

    Example 4

    This example concerns the body of the fun. Assume that all employee numbers beginning with zero (0) must be changed to begin with one (1) instead, and -that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = [$0 | Rest] }) ->
    -                              {[$0|Rest],[$1|Rest]}
    -                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, +that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = [$0 | Rest] }) ->
    +                              {[$0|Rest],[$1|Rest]}
    +                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, so that not the whole table needs to be searched, only the part containing keys beginning with 0 is looked into.

    Example 5

    The fun can have many clauses. Assume that we want to do the following:

    • If an employee started before 1997, return the tuple {inventory, <employee number>}.
    • If an employee started 1997 or later, but before 2001, return {rookie, <employee number>}.
    • For all other employees, return {newbie, <employee number>}, except for those named Smith as they would be affronted by anything other than the tag guru and that is also what is returned for their numbers: -{guru, <employee number>}.

    This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, surname = "Smith" }) ->
    -                              {guru,E};
    -                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    -                              {inventory, E};
    -                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    -                              {newbie, E};
    -                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    -                              {rookie, E}
    -                      end)).

    The result is as follows:

    [{rookie,"011103"},
    - {rookie,"041231"},
    - {guru,"052341"},
    - {guru,"076324"},
    - {newbie,"122334"},
    - {rookie,"535216"},
    - {inventory,"789789"},
    - {newbie,"963721"},
    - {rookie,"989891"}]

    Useful BIFs

    What more can you do? A simple answer is: see the documentation of +{guru, <employee number>}.

    This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, surname = "Smith" }) ->
    +                              {guru,E};
    +                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    +                              {inventory, E};
    +                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    +                              {newbie, E};
    +                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    +                              {rookie, E}
    +                      end)).

    The result is as follows:

    [{rookie,"011103"},
    + {rookie,"041231"},
    + {guru,"052341"},
    + {guru,"076324"},
    + {newbie,"122334"},
    + {rookie,"535216"},
    + {inventory,"789789"},
    + {newbie,"963721"},
    + {rookie,"989891"}]

    Useful BIFs

    What more can you do? A simple answer is: see the documentation of match specifications in ERTS User's Guide. However, the following is a brief overview of the most useful "built-in functions" that you can use when the fun is to be translated into a match specification by @@ -261,18 +261,18 @@ more, as filtering using Erlang code is not a good idea when tracing (except afterwards, if you trace to file). The concept is similar to that of ets:fun2ms/1 except that you usually use it directly from the shell (which can -also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
    +also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
     
    --export([start/1, store/2, retrieve/1]).
    +-export([start/1, store/2, retrieve/1]).
     
    -start(Args) ->
    -    toy_table = ets:new(toy_table, Args).
    +start(Args) ->
    +    toy_table = ets:new(toy_table, Args).
     
    -store(Key, Value) ->
    -    ets:insert(toy_table, {Key,Value}).
    +store(Key, Value) ->
    +    ets:insert(toy_table, {Key,Value}).
     
    -retrieve(Key) ->
    -    [{Key, Value}] = ets:lookup(toy_table, Key),
    +retrieve(Key) ->
    +    [{Key, Value}] = ets:lookup(toy_table, Key),
         Value.

    During model testing, the first test results in {badmatch,16} in {toy,start,1}, why?

    We suspect the ets:new/2 call, as we match hard on the return value, but want only the particular new/2 call with toy_table as first parameter. So we @@ -281,32 +281,32 @@ trace pattern, so there is no need to call trace only a few processes (usually it is not):

    2> dbg:p(all,call).
     {ok,[{matched,nonode@nohost,25}]}

    We specify the filter, we want to view calls that resemble -ets:new(toy_table, <something>):

    3> dbg:tp(ets,new,dbg:fun2ms(fun([toy_table,_]) -> true end)).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/notes.html	2026-04-20 17:48:56.349783367 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/notes.html	2026-04-20 17:48:56.349783367 +0000
    @@ -89,49 +89,49 @@
       
     
     
    -

    This document describes the changes made to the STDLIB application.

    STDLIB 7.3

    Fixed Bugs and Malfunctions

    • Fixed functions ets:init_table/2, ets:tab2file/2,3, ets:table/1,2, ets:i/0,1, dets:from_ets/2, and dets:to_ets/2 to resolve named table arguments only once. This will prevent strange effects if the named table is deleted and recreated by a concurrent process.

      Own Id: OTP-19911 Aux Id: PR-10536

    • Corrected the af_zip_generator() type in the parser and syntax_tools.

      Own Id: OTP-19939

    • For a function that started with a bracket-only pattern (such as []), the ?FUNCTION_ARITY macro would evaluate to one less than the actual arity.

      Own Id: OTP-19988 Aux Id: GH-10705, PR-10708

    Improvements and New Features

    • Added support for zstd compression in the file module.

      Own Id: OTP-19860 Aux Id: PR-10385

    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

      make release_docs places the documentation in the released code under the doc folder.

      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

      Improves the source Software-Bill-of-Materials

      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

      Own Id: OTP-19886 Aux Id: PR-10434

    • The removal of the slave and slave modules have been postponed to Erlang/OTP 31.

      The partial removal of the archive feature has been postponed to Erlang/OTP 30.

      Own Id: OTP-19989 Aux Id: PR-10714

    STDLIB 7.2.1

    Fixed Bugs and Malfunctions

    • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

      Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

      Own Id: OTP-19962 Aux Id: PR-10616

    STDLIB 7.2

    Fixed Bugs and Malfunctions

    • When creating a tar archive using erl_tar, leading slashes would be kept for filenames with up to 100 characters. The slash would be dropped for longer filenames. This has been corrected to always keep the leading slash.

      Own Id: OTP-19066 Aux Id: PR-8309

    • For some function heads or case expressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code.

      Own Id: OTP-19797 Aux Id: PR-10252

    • Passing a type for a fun as a macro argument would result in a "badly formed argument" error message from the compiler. Example:

      -module(test).
      --define(FOO(X), X).
      --type foo() :: ?FOO(fun(() -> ok)).

      Compiling this module would result in the following error message:

      test.erl:3:17: badly formed argument for macro &#href_anchor"w">
      +

      This document describes the changes made to the STDLIB application.

      STDLIB 7.3

      Fixed Bugs and Malfunctions

      • Fixed functions ets:init_table/2, ets:tab2file/2,3, ets:table/1,2, ets:i/0,1, dets:from_ets/2, and dets:to_ets/2 to resolve named table arguments only once. This will prevent strange effects if the named table is deleted and recreated by a concurrent process.

        Own Id: OTP-19911 Aux Id: PR-10536

      • Corrected the af_zip_generator() type in the parser and syntax_tools.

        Own Id: OTP-19939

      • For a function that started with a bracket-only pattern (such as []), the ?FUNCTION_ARITY macro would evaluate to one less than the actual arity.

        Own Id: OTP-19988 Aux Id: GH-10705, PR-10708

      Improvements and New Features

      • Added support for zstd compression in the file module.

        Own Id: OTP-19860 Aux Id: PR-10385

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      • The removal of the slave and slave modules have been postponed to Erlang/OTP 31.

        The partial removal of the archive feature has been postponed to Erlang/OTP 30.

        Own Id: OTP-19989 Aux Id: PR-10714

      STDLIB 7.2.1

      Fixed Bugs and Malfunctions

      • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

        Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

        Own Id: OTP-19962 Aux Id: PR-10616

      STDLIB 7.2

      Fixed Bugs and Malfunctions

      • When creating a tar archive using erl_tar, leading slashes would be kept for filenames with up to 100 characters. The slash would be dropped for longer filenames. This has been corrected to always keep the leading slash.

        Own Id: OTP-19066 Aux Id: PR-8309

      • For some function heads or case expressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code.

        Own Id: OTP-19797 Aux Id: PR-10252

      • Passing a type for a fun as a macro argument would result in a "badly formed argument" error message from the compiler. Example:

        -module(test).
        +-define(FOO(X), X).
        +-type foo() :: ?FOO(fun(() -> ok)).

        Compiling this module would result in the following error message:

        test.erl:3:17: badly formed argument for macro &#href_anchor"w">
         %    5| -type foo() :: ?FOO(fun(() -> ok)).
        -%

        Own Id: OTP-19821 Aux Id: GH-10280, PR-10309

      • Fixed an issue that prohibited the use of user defined functions within a restricted shell.

        Own Id: OTP-19833 Aux Id: PR-10315

      • The deprecated function crypto:rand_uniform/2 has gotten a new replacement function crypto:strong_rand_range/1. When implementing this the documentation of crypto and rand has been rewritten a bit and improved.

        Own Id: OTP-19841 Aux Id: PR-10344

      • Fixed a bug in the shell where a reference to a locally defined function would cause a crash.

        Own Id: OTP-19850 Aux Id: GH-10294

      Improvements and New Features

      • You are now able to read the reference manual with man.

        Own Id: OTP-19787 Aux Id: PR-10237

      • Improved spec for ets:lookup_element/4.

        Own Id: OTP-19798 Aux Id: PR-10236

      • The mnesia_registry module will be removed in Erlang/OTP 29.

        Own Id: OTP-19808 Aux Id: PR-10275

      STDLIB 7.1

      Fixed Bugs and Malfunctions

      • The save_module/1 command in the shell now saves both the locally defined records and the imported records using the rr/1 command.

        Own Id: OTP-19647 Aux Id: GH-9816, PR-9897

      • It's now possible to write lists:map(fun is_atom/1, []) or lists:map(fun my_func/1, []) in the shell, instead of lists:map(fun erlang:is_atom/1, []) or lists:map(fun shell_default:my_func/1, []).

        Own Id: OTP-19649 Aux Id: GH-9771, PR-9898

      • The shell no longer crashes when requesting to auto-complete map keys containing non-atoms.

        Own Id: OTP-19659 Aux Id: PR-9896

      • A remote shell can now exit by closing the input stream, without terminating the remote node.

        Own Id: OTP-19667 Aux Id: PR-9912

      • Fixed guard check for is_record/2 in the linter.

        Own Id: OTP-19704 Aux Id: GH-10020, PR-10034

      Improvements and New Features

      • Added a flag option shell_hints and function shell:hints/1. You can now disable the warning in the shell when a command is taking longer than 5 seconds.

        Own Id: OTP-19759 Aux Id: PR-10121

      STDLIB 7.0.3

      Fixed Bugs and Malfunctions

      • Update PCRE2 from 10.45 to 10.46. Fixes potential buffer read overflow on regular expressions with (*scs:) and (*ACCEPT) syntax combined.

        Own Id: OTP-19755 Aux Id: CVE-2025-58050

      STDLIB 7.0.2

      Fixed Bugs and Malfunctions

      • A set of small bugs in sort stability for `lists:sort/1` and `lists:keysort/1` has been fixed. The bug happened for only some, seemingly random, element sequences. Most sorts were stable.

        Sort stability for `lists:sort/1` is only possible to observe when sorting lists with floating point and integer numbers of the same value.

        For `lists:keysort/1` the list had to start with two tuples where the keys or the whole tuples compared equal.

        Own Id: OTP-19673 Aux Id: ERIERL-1240

      • Fixed bug in io_lib:bformat/2 which crashed if format string contained unicode characters.

        Own Id: OTP-19680 Aux Id: PR-9952

      STDLIB 7.0.1

      Fixed Bugs and Malfunctions

      • Properly strip the leading / and drive letter from filepaths when zipping and unzipping archives.

        Thanks to Wander Nauta for finding and responsibly disclosing this vulnerability to the Erlang/OTP project.

        Own Id: OTP-19653 Aux Id: CVE-2025-4748, PR-9941

      STDLIB 7.0

      Fixed Bugs and Malfunctions

      • Shell help now orders the commands in alphabetical order.

        Own Id: OTP-19161 Aux Id: PR-8573

      • proc_lib:stop/1,3 (and in extension gen_server:stop/3, gen_statem:stop/3 and so on) have been updated to not throw an error if the process to be stopped exits with the same reason as given to proc_lib:stop/3.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19233 Aux Id: PR-8772

      • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

        While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

        External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19285 Aux Id: PR-8913

      • argparse:help/1 now accepts unicode:chardata/0.

        Own Id: OTP-19303 Aux Id: PR-8932

      • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

        This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

      • The previous digraph_utils:preorder/1 and digraph_utils:postorder/1 did not start the traversal from root nodes. This fix makes both traversals only start or restart from a root node in one of the components, or an arbitrary node if no root node can be visited.

        Own Id: OTP-19393 Aux Id: PR-9171

      • Auto-completion in the shell is now significantly faster for function parameters that uses complex custom types.

        Own Id: OTP-19413 Aux Id: PR-9271

      • Stringfying a non-latin1 atom will now produce a readable string instead of encoding each character using \x{...} escape sequences. Example:

        -define(S(T), ??T).
        +%

        Own Id: OTP-19821 Aux Id: GH-10280, PR-10309

      • Fixed an issue that prohibited the use of user defined functions within a restricted shell.

        Own Id: OTP-19833 Aux Id: PR-10315

      • The deprecated function crypto:rand_uniform/2 has gotten a new replacement function crypto:strong_rand_range/1. When implementing this the documentation of crypto and rand has been rewritten a bit and improved.

        Own Id: OTP-19841 Aux Id: PR-10344

      • Fixed a bug in the shell where a reference to a locally defined function would cause a crash.

        Own Id: OTP-19850 Aux Id: GH-10294

      Improvements and New Features

      • You are now able to read the reference manual with man.

        Own Id: OTP-19787 Aux Id: PR-10237

      • Improved spec for ets:lookup_element/4.

        Own Id: OTP-19798 Aux Id: PR-10236

      • The mnesia_registry module will be removed in Erlang/OTP 29.

        Own Id: OTP-19808 Aux Id: PR-10275

      STDLIB 7.1

      Fixed Bugs and Malfunctions

      • The save_module/1 command in the shell now saves both the locally defined records and the imported records using the rr/1 command.

        Own Id: OTP-19647 Aux Id: GH-9816, PR-9897

      • It's now possible to write lists:map(fun is_atom/1, []) or lists:map(fun my_func/1, []) in the shell, instead of lists:map(fun erlang:is_atom/1, []) or lists:map(fun shell_default:my_func/1, []).

        Own Id: OTP-19649 Aux Id: GH-9771, PR-9898

      • The shell no longer crashes when requesting to auto-complete map keys containing non-atoms.

        Own Id: OTP-19659 Aux Id: PR-9896

      • A remote shell can now exit by closing the input stream, without terminating the remote node.

        Own Id: OTP-19667 Aux Id: PR-9912

      • Fixed guard check for is_record/2 in the linter.

        Own Id: OTP-19704 Aux Id: GH-10020, PR-10034

      Improvements and New Features

      • Added a flag option shell_hints and function shell:hints/1. You can now disable the warning in the shell when a command is taking longer than 5 seconds.

        Own Id: OTP-19759 Aux Id: PR-10121

      STDLIB 7.0.3

      Fixed Bugs and Malfunctions

      • Update PCRE2 from 10.45 to 10.46. Fixes potential buffer read overflow on regular expressions with (*scs:) and (*ACCEPT) syntax combined.

        Own Id: OTP-19755 Aux Id: CVE-2025-58050

      STDLIB 7.0.2

      Fixed Bugs and Malfunctions

      • A set of small bugs in sort stability for `lists:sort/1` and `lists:keysort/1` has been fixed. The bug happened for only some, seemingly random, element sequences. Most sorts were stable.

        Sort stability for `lists:sort/1` is only possible to observe when sorting lists with floating point and integer numbers of the same value.

        For `lists:keysort/1` the list had to start with two tuples where the keys or the whole tuples compared equal.

        Own Id: OTP-19673 Aux Id: ERIERL-1240

      • Fixed bug in io_lib:bformat/2 which crashed if format string contained unicode characters.

        Own Id: OTP-19680 Aux Id: PR-9952

      STDLIB 7.0.1

      Fixed Bugs and Malfunctions

      • Properly strip the leading / and drive letter from filepaths when zipping and unzipping archives.

        Thanks to Wander Nauta for finding and responsibly disclosing this vulnerability to the Erlang/OTP project.

        Own Id: OTP-19653 Aux Id: CVE-2025-4748, PR-9941

      STDLIB 7.0

      Fixed Bugs and Malfunctions

      • Shell help now orders the commands in alphabetical order.

        Own Id: OTP-19161 Aux Id: PR-8573

      • proc_lib:stop/1,3 (and in extension gen_server:stop/3, gen_statem:stop/3 and so on) have been updated to not throw an error if the process to be stopped exits with the same reason as given to proc_lib:stop/3.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19233 Aux Id: PR-8772

      • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

        While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

        External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19285 Aux Id: PR-8913

      • argparse:help/1 now accepts unicode:chardata/0.

        Own Id: OTP-19303 Aux Id: PR-8932

      • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

        This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

      • The previous digraph_utils:preorder/1 and digraph_utils:postorder/1 did not start the traversal from root nodes. This fix makes both traversals only start or restart from a root node in one of the components, or an arbitrary node if no root node can be visited.

        Own Id: OTP-19393 Aux Id: PR-9171

      • Auto-completion in the shell is now significantly faster for function parameters that uses complex custom types.

        Own Id: OTP-19413 Aux Id: PR-9271

      • Stringfying a non-latin1 atom will now produce a readable string instead of encoding each character using \x{...} escape sequences. Example:

        -define(S(T), ??T).
         
        -atom() ->
        -    ?S(&#href_anchor"p" data-group-id="6437052783-4">).

        The atom/0 function now returns "'атом'" instead of "'\\x{430}\\x{442}\\x{43E}\\x{43C}'".

        Own Id: OTP-19421 Aux Id: GH-9173, PR-9276

      • A few minor issues were corrected in m:syntax_tools, as well in the erl_anno module.

        Own Id: OTP-19422 Aux Id: PR-9253

      • dets could print error messages to standard output when repairing DETS files. This has been changed to send the messages to logger.

        ets:fun2ms would print an error message to standard output as well as returning an error tuple. The printing of the message has been removed.

        Own Id: OTP-19427 Aux Id: PR-9232, PR-9446

      • The functions for converting to and from the RFC1339 date and time format would not properly handle fractional seconds for negative times.

        Own Id: OTP-19441 Aux Id: GH-9279, PR-9280

      • Replaced calls to deprecated crypto:start() with application:start(crypto).

        Own Id: OTP-19485 Aux Id: PR-8592

      • Fixed a bug when calling shell completion on a reserved word followed by a ( would crash the shell.

        Own Id: OTP-19511 Aux Id: GH-9470

      • Corrected the spec of ets:update_element/4.

        Own Id: OTP-19514 Aux Id: PR-9504

      • Corrected the spec for ets:info/1.

        Own Id: OTP-19515 Aux Id: PR-9514

      • Fixed crash when defining records with a string field in the shell

        Own Id: OTP-19533 Aux Id: GH-9557

      • Details in the hibernation implementation and time-out handling has been improved for gen_statem. In particular to avoid selective receive when cancelling a time-out.

        Own Id: OTP-19540 Aux Id: PR-9579

      • Fixed a bug when getting help on a module compiled without debug_info.

        Own Id: OTP-19583 Aux Id: PR-9654

      • Fix zip extraction to wrap invalid DOS timestamps to their correct value instead of returning the actual value. Before this fix the timestamp returned could have a second greater than 59. The bug has been present since Erlang/OTP 27.1.

        Own Id: OTP-19593 Aux Id: PR-9537, GH-9536

      • Enhance specs of timeout for improving documentation and dialyzer analysis.

        Own Id: OTP-19604 Aux Id: PR-9574

      Improvements and New Features

      • Singleton type variables in an union type do not make sense from Dialyzer's point of view. The following example is ill-typed:

        -spec run_test(Opts) -> term()
        -      when Opts :: {join_specs, Bool} | {test, Bool}.

        This used to be reported as a warning. In OTP-28, this is an error

        Own Id: OTP-19125 Aux Id: PR-8556

      • By default, sets created by the sets module will now be represented as maps.

        Own Id: OTP-19127 Aux Id: PR-8429

      • For various error types, the compiler now tries to suggest potential fixes by adding "did you mean ...?" at the end of error messages.

        When a function is used with wrong arity, the compiler will try to suggest a defined function with the same name but a different arity. For example, given the following module:

        -module(typos).
        --export([t/0]).
        -bar(A) -> A.
        -bar(A,A,A) -> A.
        -bar(A,A,A,A) -> A.
        -t() -> bar(0, 0).

        The compiler will emit the following message:

        typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
        +atom() ->
        +    ?S(&#href_anchor"p" data-group-id="7708001389-4">).

        The atom/0 function now returns "'атом'" instead of "'\\x{430}\\x{442}\\x{43E}\\x{43C}'".

        Own Id: OTP-19421 Aux Id: GH-9173, PR-9276

      • A few minor issues were corrected in m:syntax_tools, as well in the erl_anno module.

        Own Id: OTP-19422 Aux Id: PR-9253

      • dets could print error messages to standard output when repairing DETS files. This has been changed to send the messages to logger.

        ets:fun2ms would print an error message to standard output as well as returning an error tuple. The printing of the message has been removed.

        Own Id: OTP-19427 Aux Id: PR-9232, PR-9446

      • The functions for converting to and from the RFC1339 date and time format would not properly handle fractional seconds for negative times.

        Own Id: OTP-19441 Aux Id: GH-9279, PR-9280

      • Replaced calls to deprecated crypto:start() with application:start(crypto).

        Own Id: OTP-19485 Aux Id: PR-8592

      • Fixed a bug when calling shell completion on a reserved word followed by a ( would crash the shell.

        Own Id: OTP-19511 Aux Id: GH-9470

      • Corrected the spec of ets:update_element/4.

        Own Id: OTP-19514 Aux Id: PR-9504

      • Corrected the spec for ets:info/1.

        Own Id: OTP-19515 Aux Id: PR-9514

      • Fixed crash when defining records with a string field in the shell

        Own Id: OTP-19533 Aux Id: GH-9557

      • Details in the hibernation implementation and time-out handling has been improved for gen_statem. In particular to avoid selective receive when cancelling a time-out.

        Own Id: OTP-19540 Aux Id: PR-9579

      • Fixed a bug when getting help on a module compiled without debug_info.

        Own Id: OTP-19583 Aux Id: PR-9654

      • Fix zip extraction to wrap invalid DOS timestamps to their correct value instead of returning the actual value. Before this fix the timestamp returned could have a second greater than 59. The bug has been present since Erlang/OTP 27.1.

        Own Id: OTP-19593 Aux Id: PR-9537, GH-9536

      • Enhance specs of timeout for improving documentation and dialyzer analysis.

        Own Id: OTP-19604 Aux Id: PR-9574

      Improvements and New Features

      • Singleton type variables in an union type do not make sense from Dialyzer's point of view. The following example is ill-typed:

        -spec run_test(Opts) -> term()
        +      when Opts :: {join_specs, Bool} | {test, Bool}.

        This used to be reported as a warning. In OTP-28, this is an error

        Own Id: OTP-19125 Aux Id: PR-8556

      • By default, sets created by the sets module will now be represented as maps.

        Own Id: OTP-19127 Aux Id: PR-8429

      • For various error types, the compiler now tries to suggest potential fixes by adding "did you mean ...?" at the end of error messages.

        When a function is used with wrong arity, the compiler will try to suggest a defined function with the same name but a different arity. For example, given the following module:

        -module(typos).
        +-export([t/0]).
        +bar(A) -> A.
        +bar(A,A,A) -> A.
        +bar(A,A,A,A) -> A.
        +t() -> bar(0, 0).

        The compiler will emit the following message:

        typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
         %   6|     t() -> bar(0, 0).
        -%    |            ^

        For compiler errors that can easily be caused by typos, the compiler will try to suggest what the correct variable or function name, could be. For example, given the following module:

        -module(typos).
        --export([bar/2]).
        +%    |            ^

        For compiler errors that can easily be caused by typos, the compiler will try to suggest what the correct variable or function name, could be. For example, given the following module:

        -module(typos).
        +-export([bar/2]).
         
        -bar(A0, B0) ->
        +bar(A0, B0) ->
             A + B.

        the compiler will emit the following error messages:

        typos.erl:5:5: variable &#href_anchor"w"> is unbound, did you mean 'A0'?
         %    5|     A + B.
         %     |     ^
         
         typos.erl:5:9: variable 'B' is unbound, did you mean 'B0'?
         %    5|     A + B.
        -%     |         ^

        Error types that now suggest correct arities: bad_inline, undefined_nif, bad_nowarn_unused_function, bad_nowarn_bif_clash, undefined_function.

        Error types that now suggest correct names: bad_inline, undefined_nif, bad_nowarn_unused_function, undefined_on_load, undefined_function, undefined_record, undefined_field, unbound_var.

        Using a function with wrong arity has higher precedence than having a typo in the function name. If the compiler can find a defined function with the same name but a different arity, it will not suggest a defined function with a close-enough name, regardless of arity.

        Own Id: OTP-19180 Aux Id: PR-8699, PR-9094

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        -[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • Before restarting a child, a supervisor must check if the restart limit is reached. This adds a penalty to the overall restart time, which should be kept low. The algorithm +% | ^

      Error types that now suggest correct arities: bad_inline, undefined_nif, bad_nowarn_unused_function, bad_nowarn_bif_clash, undefined_function.

      Error types that now suggest correct names: bad_inline, undefined_nif, bad_nowarn_unused_function, undefined_on_load, undefined_function, undefined_record, undefined_field, unbound_var.

      Using a function with wrong arity has higher precedence than having a typo in the function name. If the compiler can find a defined function with the same name but a different arity, it will not suggest a defined function with a close-enough name, regardless of arity.

      Own Id: OTP-19180 Aux Id: PR-8699, PR-9094

    • Comprehensions have been extended with zip generators according to EEP 73.

      Example:

      1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
      +[5,7,9]

      Own Id: OTP-19184 Aux Id: PR-8926

    • Before restarting a child, a supervisor must check if the restart limit is reached. This adds a penalty to the overall restart time, which should be kept low. The algorithm has been optimized from 2*O(n) to O(n) behavior.

      Own Id: OTP-19204 Aux Id: PR-8261

    • Added the possibility to configure shell docs column width through the stdlib parameter shell_docs_columns.

      Own Id: OTP-19224 Aux Id: PR-8651

    • The io:setopts/2 function now accepts the line_history option for more explicit handling of when to save shell history.

      Own Id: OTP-19230 Aux Id: PR-8792

    • The shell now prints a help message explaining how to interrupt a running command when stuck executing a command for longer than 5 seconds.

      Own Id: OTP-19231 Aux Id: PR-8793

    • Binaries can now be used as input to calendar:rfc3339_to_system_time/2, and produced as output of calendar:system_time_to_rfc3339/2.

      Own Id: OTP-19250 Aux Id: PR-8812

    • The erl -noshell mode has been updated to have two sub modes called raw and cooked, where cooked is the old default behaviour and raw can be used to bypass the line-editing support of the native terminal. Using raw mode it is possible to read keystrokes as they happen without the user having to press Enter. Also, the raw mode does not echo the typed characters to stdout. An example of how to create a tic-tac-toe game using this mechanism is included in the documentation.

      Own Id: OTP-19314 Aux Id: PR-8962, GH-8037

    • Added io:get_password/0 that can read passwords from stdin when in "raw" -noshell mode.

      Own Id: OTP-19315 Aux Id: PR-8962, PR-9006

    • New strict generators have been added for comprehensions.

      The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

      The new strict generators fail with exception badmatch if a pattern doesn't match.

      Examples:

      Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

      1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
      -[{ok,1},{error,2}]

      If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

      1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
      +[{ok,1},{error,2}]

      If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

      2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
      +that term not matching will cause a crash:

      2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
       ** exception error: no match of right hand side value ok

      Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

      The strict version for bitstring generators is <:=.

      Own Id: OTP-19317 Aux Id: PR-8625

    • New options for suppressing behaviour warnings have been added:

      • nowarn_conflicting_behaviours
      • nowarn_undefined_behaviour_func
      • nowarn_undefined_behaviour
      • nowarn_undefined_behaviour_callbacks
      • nowarn_ill_defined_behaviour_callbacks
      • nowarn_ill_defined_optional_callbacks

      Own Id: OTP-19334 Aux Id: GH-8985, PR-9020

    • The join(Binaries, Separator) function that joins a list of binaries has been added to the binary module.

      Own Id: OTP-19337 Aux Id: GH-8099, PR-8100

    • The supervisor:which_child/2 function has been added to facilitate getting the pid of a sibling process; that is a process under same supervisor as the process that calls to call the new function.

      Own Id: OTP-19345 Aux Id: PR-8976

    • The function erl_anno:set_end_location/2 for setting the end location of a token has been added.

      Own Id: OTP-19354 Aux Id: PR-8966

    • Added a warning for calling non-exported functions with the remote function call syntax from the same module, and likewise for the remote fun syntax.

      Own Id: OTP-19371 Aux Id: GH-9092, PR-9095

    • The warn_deprecated_catch option enables warnings for use of old-style catch expressions on the form catch Expr instead of the modern try ... catch ... end. To prevent new uses of uses of old catches to be added, this compiler option can be enabled on the project level and -compile(nowarn_deprecated_catch). added to individual files that still contain old catches.

      Own Id: OTP-19425 Aux Id: PR-9154

    • Module re has been updated to use PCRE2, which is mostly backward compatible with PCRE.

      The most noticeable incompatibilities are

      • The default character encoding is pure ASCII and not Latin1. Unicode support is still available with options unicode and ucp.
      • Options bsr_anycrlf, bsr_unicode and {newline,_} are only set when a -regex is compiled and cannot be changed at matching for precompiled regex.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19431 Aux Id: PR-9299, PR-9610

    • Defining a fun in terms of an imported function is not allowed. Before this release, the compiler would not catch this kind of error if the name of the imported function happened to be a BIF. Consider this example:

      -module(fun_example).
      --export([foo/0, bar/0]).
      --import(m, [max/2, not_a_bif/0]).
      +regex is compiled and cannot be changed at matching for precompiled regex.

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-19431 Aux Id: PR-9299, PR-9610

  • Defining a fun in terms of an imported function is not allowed. Before this release, the compiler would not catch this kind of error if the name of the imported function happened to be a BIF. Consider this example:

    -module(fun_example).
    +-export([foo/0, bar/0]).
    +-import(m, [max/2, not_a_bif/0]).
     
    -foo() ->
    +foo() ->
         fun max/2.
     
    -bar() ->
    +bar() ->
         fun not_a_bif/0.

    The compiler in Erlang/OTP 27 would generate the following messages:

    fun_example.erl:9:5: function not_a_bif/0 undefined
     %    9|     fun not_a_bif/0.
     %     |     ^
    @@ -150,37 +150,37 @@
     fun_example.erl:3:2: Warning: import directive overrides auto-imported BIF max/2 --
     use "-compile({no_auto_import,[max/2]})." to resolve name clash
     %    3| -import(m, [max/2, not_a_bif/0]).
    -%     |  ^

    Also, attempting to call a local function having the same name as auto-imported BIF would result in an error if the BIF was added to Erlang/OTP before R14, and a warning for newer BIFs. This has been changed to always emit a warning. For example:

    -module(bif_example).
    --export([bar/1]).
    +%     |  ^

    Also, attempting to call a local function having the same name as auto-imported BIF would result in an error if the BIF was added to Erlang/OTP before R14, and a warning for newer BIFs. This has been changed to always emit a warning. For example:

    -module(bif_example).
    +-export([bar/1]).
     
    -bar(B) ->
    -    is_boolean(B).
    +bar(B) ->
    +    is_boolean(B).
     
    -is_boolean(B) ->
    +is_boolean(B) ->
             B =:= true orelse B =:= false.

    will now result in the following warning instead of an error:

    if_example.erl:5:5: Warning: ambiguous call of overridden auto-imported BIF is_boolean/1 --
     use erlang:is_boolean/1 or "-compile({no_auto_import,[is_boolean/1]})." to resolve name clash
     %    5|     is_boolean(B).
     %     |     ^

    Own Id: OTP-19432 Aux Id: PR-9246

  • It is now possible to use any base for floating point numbers as described in EEP 75: Based Floating Point Literals.

    Computers represent floating point numbers in binary, but such numbers are typically printed using base ten, for example 0.314159265e1. To maintain exact bit-level precision when converting numbers to and from text, it is better to use a base that matches the internally used base, such as 16 for a compact but still exact representation, or 2 for visualizing or writing down the exact internal format. One particular case where such exact representations are useful is in code generating tools.

    Examples:

    > 2#href_anchor"p">.111.
     0.875
     > 16#fefe.fefe#e16.
    -1.2041849337671418e24

    Own Id: OTP-19452 Aux Id: PR-9106

  • The callback function handle_continue/2 in gen_server callback modules is now cached like the others, thanks to code cleanup and optimization of the internal behaviour loop.

    This should only improve performance, not affect functionality.

    Own Id: OTP-19474 Aux Id: PR-9333

  • Encoding done by the json module has been optimized.

    Own Id: OTP-19476 Aux Id: PR-9251

  • There is a new zstd module that does Zstandard compression.

    Own Id: OTP-19477 Aux Id: PR-9316

  • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

    Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

  • Functions of a module can now be grouped in the shell code completion by using the group key in the -doc attribute e.g. -doc(#href_anchor"https://github.com/erlang/otp/pull/9408" title="">PR-9408

  • Added calendar:universal_time_to_system_time/1,2 and calendar:local_time_to_system_time/1,2

    Own Id: OTP-19505 Aux Id: PR-9445

  • Improve error messages for json:decode/1.

    Own Id: OTP-19508 Aux Id: PR-9484

  • ETS heir can be set without getting an ETS-TRANSFER message. Useful when the heir is a supervisor process that cannot handle custom messages.

    Own Id: OTP-19512 Aux Id: PR-7970

  • Added support for the Unicode 16 standard.

    Own Id: OTP-19516 Aux Id: PR-9518, PR-9141

  • When documenting a function or type that needs to deal with durations, usually we can document it as "time in milliseconds". Since the timer family of functions (hms, hours, seconds, ...) all return time in milliseconds, it is useful to be able to use this type in type specifications.

    Own Id: OTP-19526 Aux Id: PR-9515

  • A new event time-out has been implemented in gen_server, that behaves more like the one in gen_statem.

    See the type gen_server:action/0 for {timeout|hibernate,...}, and also related functions.

    Own Id: OTP-19537 Aux Id: PR-9287, PR-9615, PR-9621

  • Line numbers used to be reported in the following way:

    1> lists:last([]).
    -** exception error: no function clause matching lists:last([]) (lists.erl, line 389)

    Starting from Erlang/OTP 28, line numbers are now reported in the following way:

    1> lists:last([]).
    +1.2041849337671418e24

    Own Id: OTP-19452 Aux Id: PR-9106

  • The callback function handle_continue/2 in gen_server callback modules is now cached like the others, thanks to code cleanup and optimization of the internal behaviour loop.

    This should only improve performance, not affect functionality.

    Own Id: OTP-19474 Aux Id: PR-9333

  • Encoding done by the json module has been optimized.

    Own Id: OTP-19476 Aux Id: PR-9251

  • There is a new zstd module that does Zstandard compression.

    Own Id: OTP-19477 Aux Id: PR-9316

  • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

    Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

  • Functions of a module can now be grouped in the shell code completion by using the group key in the -doc attribute e.g. -doc(#href_anchor"https://github.com/erlang/otp/pull/9408" title="">PR-9408

  • Added calendar:universal_time_to_system_time/1,2 and calendar:local_time_to_system_time/1,2

    Own Id: OTP-19505 Aux Id: PR-9445

  • Improve error messages for json:decode/1.

    Own Id: OTP-19508 Aux Id: PR-9484

  • ETS heir can be set without getting an ETS-TRANSFER message. Useful when the heir is a supervisor process that cannot handle custom messages.

    Own Id: OTP-19512 Aux Id: PR-7970

  • Added support for the Unicode 16 standard.

    Own Id: OTP-19516 Aux Id: PR-9518, PR-9141

  • When documenting a function or type that needs to deal with durations, usually we can document it as "time in milliseconds". Since the timer family of functions (hms, hours, seconds, ...) all return time in milliseconds, it is useful to be able to use this type in type specifications.

    Own Id: OTP-19526 Aux Id: PR-9515

  • A new event time-out has been implemented in gen_server, that behaves more like the one in gen_statem.

    See the type gen_server:action/0 for {timeout|hibernate,...}, and also related functions.

    Own Id: OTP-19537 Aux Id: PR-9287, PR-9615, PR-9621

  • Line numbers used to be reported in the following way:

    1> lists:last([]).
    +** exception error: no function clause matching lists:last([]) (lists.erl, line 389)

    Starting from Erlang/OTP 28, line numbers are now reported in the following way:

    1> lists:last([]).
     ** exception error: no function clause matching lists:last([]) (lists.erl:389)

    Own Id: OTP-19538 Aux Id: PR-9468

  • Upgrade pcre2 to 10.45

    Own Id: OTP-19541 Aux Id: PR-9582

  • Added functions that produce utf-8 binaries instead of iolists. New functions are: io_lib:bformat/2, io_lib:bformat/3, io_lib:bfwrite/2, io_lib:bfwrite/3, io_lib:bwrite/2 and io_lib:bwrite_string/3.

    Own Id: OTP-19556 Aux Id: PR-9772

  • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

    Own Id: OTP-19575 Aux Id: PR-9670

  • A list of PCRE2 incompatibilities is documented in a user's guide for stdlib.

    Own Id: OTP-19578 Aux Id: PR-9705

  • Change automatic hibernation of static supervisors so that they will hibernate after being idle for 1 second instead of only after starting, dynamic supervisors (simple_one_for_one) will not be hibernated at all. An option to the supervisor is added to make it configurable for the application. This option defaults to 1 second for static supervisors and to infinity for the simple_one_for_one supervisors.

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-19597 Aux Id: PR-9680

  • STDLIB 6.2.2.3

    Fixed Bugs and Malfunctions

    • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

      Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

      Own Id: OTP-19962 Aux Id: PR-10616

    • For a function that started with a bracket-only pattern (such as []), the ?FUNCTION_ARITY macro would evaluate to one less than the actual arity.

      Own Id: OTP-19988 Aux Id: GH-10705, PR-10708

    STDLIB 6.2.2.2

    Fixed Bugs and Malfunctions

    • A set of small bugs in sort stability for `lists:sort/1` and `lists:keysort/1` has been fixed. The bug happened for only some, seemingly random, element sequences. Most sorts were stable.

      Sort stability for `lists:sort/1` is only possible to observe when sorting lists with floating point and integer numbers of the same value.

      For `lists:keysort/1` the list had to start with two tuples where the keys or the whole tuples compared equal.

      Own Id: OTP-19673 Aux Id: ERIERL-1240

    STDLIB 6.2.2.1

    Fixed Bugs and Malfunctions

    • The save_module/1 command in the shell now saves both the locally defined records and the imported records using the rr/1 command.

      Own Id: OTP-19647 Aux Id: GH-9816, PR-9897

    • It's now possible to write lists:map(fun is_atom/1, []) or lists:map(fun my_func/1, []), in the shell, instead of lists:map(fun erlang:is_atom/1, []) or lists:map(fun shell_default:my_func/1, []).

      Own Id: OTP-19649 Aux Id: GH-9771, PR-9898

    • Properly strip the leading / and drive letter from filepaths when zipping and unzipping archives.

      Thanks to Wander Nauta for finding and responsibly disclosing this vulnerability to the Erlang/OTP project.

      Own Id: OTP-19653 Aux Id: CVE-2025-4748, PR-9941

    • Shell no longer crashes when requesting to autocomplete map keys containing non-atoms.

      Own Id: OTP-19659 Aux Id: PR-9896

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    STDLIB 6.2.2

    Fixed Bugs and Malfunctions

    • Fixed crash when fetching initial_call when user code have modified the process_dictionary.

      Own Id: OTP-19546 Aux Id: ERIERL-1205, PR-9596

    STDLIB 6.2.1

    Fixed Bugs and Malfunctions

    • Fixed argparse:help/2 to accept the program name as part of the command path.

      Own Id: OTP-19397 Aux Id: PR-9160

    • Fixed argparse:format_help/2 crash on 'hidden' command.

      Own Id: OTP-19400 Aux Id: PR-9151, GH-9150

    • Fixed the type specification for timer:sleep/1 by adding the value infinity to its input type.

      Own Id: OTP-19442 Aux Id: PR-9303

    • Eliminated a crash in zip:unzip/1 while unzipping an archive where a directory within was read-only. This bug was introduced in Erlang/OTP 27.1.

      Own Id: OTP-19447 Aux Id: GH-9332, PR-9335

    • Fixed map comprehension result when a key value is replaced.

      Own Id: OTP-19459 Aux Id: GH-9348, PR-9358

    • Fixed string:jaro_similarity/1 for matching strings of length 1.

      Own Id: OTP-19468 Aux Id: PR-9371

    STDLIB 6.2

    Fixed Bugs and Malfunctions

    • Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.

      Own Id: OTP-19260 Aux Id: PR-8884

    • 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.
       #href_anchor"n">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).
      -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

    • Fixed a bug where completion of 'fun(' would cause the shell to crash.

      Own Id: OTP-19351 Aux Id: PR-9043

    • Fixed a bug causing the shell to crash while trying to complete an expression starting with a '/' or a variable followed by '(' or '/'. E.g. Foo/ and Foo(.

      Own Id: OTP-19361 Aux Id: PR-9078

    • zip:extract/2 with keep_old_files now respects the cwd option.

      Own Id: OTP-19370 Aux Id: PR-9097, GH-9087

    • Fixed an error in uri_string:percent_decode spec

      Own Id: OTP-19380 Aux Id: GH-8755

    Improvements and New Features

    • Updated shell docs to display the type spec, that is, h(erlang, min, 2)) now prints the type spec and documentation in the shell.

      > h(erlang,min,2).
      +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

    • Fixed a bug where completion of 'fun(' would cause the shell to crash.

      Own Id: OTP-19351 Aux Id: PR-9043

    • Fixed a bug causing the shell to crash while trying to complete an expression starting with a '/' or a variable followed by '(' or '/'. E.g. Foo/ and Foo(.

      Own Id: OTP-19361 Aux Id: PR-9078

    • zip:extract/2 with keep_old_files now respects the cwd option.

      Own Id: OTP-19370 Aux Id: PR-9097, GH-9087

    • Fixed an error in uri_string:percent_decode spec

      Own Id: OTP-19380 Aux Id: GH-8755

    Improvements and New Features

    • Updated shell docs to display the type spec, that is, h(erlang, min, 2)) now prints the type spec and documentation in the shell.

      > h(erlang,min,2).
       
      -  -spec min(Term1, Term2) -> Minimum
      -               when Term1 :: term(), Term2 :: term(), Minimum :: term().
      +  -spec min(Term1, Term2) -> Minimum
      +               when Term1 :: term(), Term2 :: term(), Minimum :: term().
       
         Returns the smallest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.

      Own Id: OTP-19234 Aux Id: GH-8544, PR-8833

    • The file:io_device/0 type has been updated to clearly show the difference between a raw and cooked IoDevice.

      Own Id: OTP-19301 Aux Id: PR-8956

    • Added json:format_key_value_list/3 and json:format_key_value_list_checked/3.

      Own Id: OTP-19320 Aux Id: PR-8889

    • Improved documentation of timers.

      Own Id: OTP-19360 Aux Id: ERIERL-1149, PR-9062

    • Added logging support to io:user/0, io:standard_io/0 and io:standard_error/0. See io:setopts/2 for more details.

      Own Id: OTP-19372 Aux Id: PR-8947

    STDLIB 6.1.2

    Fixed Bugs and Malfunctions

    • With this change, uri_string:normalize assumes empty path (do not crash) when no path is provided in the URI map.

      Own Id: OTP-19266 Aux Id: ERIERL-1127, PR-8890

    • Fixed spec for json:format/3.

      Own Id: OTP-19286 Aux Id: GH-8880, PR-8914

    STDLIB 6.1.1

    Fixed Bugs and Malfunctions

    • Remove whitespace stripping of returned binaries in json:decode/3.

      Own Id: OTP-19227 Aux Id: ERIERL-1130, PR-8809

    • Fix zip:unzip/2 to not crash when extracting zip files with garbage in the Zip64 extra header. This bug was introduced in Erlang 27.1 and has so far only been seen on some archives creates by MS Excel.

      Own Id: OTP-19241 Aux Id: PR-8836

    • With this change, shutdown procedure handles a race condition between supervisor executing a shutdown and child process termination from other reason.

      Own Id: OTP-19256 Aux Id: PR-8780

    STDLIB 6.1

    Fixed Bugs and Malfunctions

    • The help printout for incorrect io:format/0 strings now handles the k modifier correctly.

      Own Id: OTP-19146 Aux Id: PR-8611, GH-8568

    • Fixed a bug that caused the shell completion to crash when keyword and tuple appeared on the same line.

      Own Id: OTP-19157 Aux Id: PR-8638

    • Due to PR-7419/OTP-18671, the cached internal value of the callback_mode started leaking out to logger reports, which could cause logger handlers to crash. This has now been fixed to show the value that was set, as before caching.

      Own Id: OTP-19164 Aux Id: GH-8605, PR-7419, OTP-18671

    • Fixed an emulator crash relating to compressed ETS tables.

      Own Id: OTP-19176 Aux Id: PR-8683

    • The error description for maps:update/3 will no longer insist that the third argument is not a map when a key could not be found

      Own Id: OTP-19189

    • Multiple issues have been corrected in the markdown parser that creates documentation for the shell.

      The parser was incorrectly parsing formatted markdown (either bold or italics) within parenthesis. This used to not be shown correctly in the shell documentation (_Option._), which was displayed verbatim. This fix makes Option. to appear in italics.

      The markdown parser is also used in the creation of other documentation formats, so this was a bug that affected other generated documentation formats.

      Own Id: OTP-19200 Aux Id: GH-8738, PR-8739

    • Fixed category for some codepoint ranges in unicode_util.

      Own Id: OTP-19210 Aux Id: GH-8748

    • Fixed argparse to print sub-commands help when available.

      Own Id: OTP-19222 Aux Id: PR-8777

    Improvements and New Features

    • Class annotation to HTML from fenced blocks have been added.

      Own Id: OTP-19105 Aux Id: PR-8499

    • Added JSON formatting functions for indented output.

      Own Id: OTP-19112

    • Improved illegal pattern error for accidental map associations.

      Own Id: OTP-19128 Aux Id: PR-8555

    • Progress reports for a dynamically started supervisor will now be logged at debug level.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19202 Aux Id: PR-8261, GH-8715, PR-8741

    • The zip module has been updated with support for:

      • zip64 archives - Archives larger than 4GB or with more than 2^32 entries.
      • extended timestamps - Higher resolution and in UTC.
      • UID/GID - Save and extract the original UID/GID.
      • Fixes so that permission mode attributes are correctly read and set for files in archives.
      • zip:list_dir/2 now also returns directories, not only files. (You can disable this behaviour by using the option skip_directories).

      Various bugs in the original implementation have also been fixed, such as:

      • Correctly encode and decode the DOS timestamps for entries within an archive (that is the non-extended timestamp).
      • Fix DOS timestamps to be set to localtime instead of UTC (use extended timestamps for UTC timestamps).
      • Use the unix file attributes read from disk when creating archives instead of setting everything to 644.

      Own Id: OTP-19214 Aux Id: PR-8765

    STDLIB 6.0.1

    Fixed Bugs and Malfunctions

    STDLIB 6.0

    Fixed Bugs and Malfunctions

    • The specs in module binary has been updated to reflect what is allowed by the documentation.

      Own Id: OTP-18684 Aux Id: PR-7481

    • Several functions in the binary module would accept arguments of the wrong type under certain circumstances. In this release, they now raise an exception when incorrect types are given.

      The following functions would accept an invalid pattern if the subject binary was empty or if the {scope,{0,0}} option was given: @@ -188,8 +188,8 @@ binary:matches/2,3, binary:replace/3,4, and binary:split/2,3

      The call binary:copy(<<1:1>>, 0) would return an empty binary instead of raising an exception. Similarly, calls to binary:part/2,3 attempting to extract 0 bytes at position 0 of a bitstring would return an empty binary instead of raising an exception.

      Own Id: OTP-18743 Aux Id: PR-7607, PR-7628

    • 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

    • 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.

      Own Id: OTP-18930 Aux Id: PR-7993, GH-4992

    • The error handling the simple_one_for_one supervisor has been enhanced. A transient child returning ignore will no longer cause a crash.

      Also, automatic shutdown has been disabled because it does not make sense for this supervisor type. That is was allowed is considered a bug. Therefore, we don't consider this an incompatible change.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19029 Aux Id: PR-8230

    • Fix shell expansion to not crash when expanding a map with non-atom keys and to not list zero arity functions when an argument has been given.

      Own Id: OTP-19073 Aux Id: PR-8375, GH-8366, GH-8365, GH-8364

    Improvements and New Features

    • The functions is_equal/2, map/2, and filtermap/2 have been added to the modules sets, ordsets, and gb_sets.

      Own Id: OTP-18622 Aux Id: PR-7183, PR-7232

    • The compiler now emits nicer error message for function head mismatches. -For example, given:

      a() -> ok;
      -a(_) -> error.

      Erlang/OTP 26 and earlier would emit a diagnostic similar to:

      t.erl:6:1: head mismatch
      +For example, given:

      a() -> ok;
      +a(_) -> error.

      Erlang/OTP 26 and earlier would emit a diagnostic similar to:

      t.erl:6:1: head mismatch
       %    6| a(_) -> error.
       %     | ^

      while in Erlang/OTP 27 the diagnostic is similar to:

      t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted?
       %    6| a(_) -> error.
      @@ -212,22 +212,22 @@
       my_label              c:pinfo/2                               51
       4> proc_lib:get_label(self()).
       my_label

      Own Id: OTP-18789 Aux Id: PR-7720, PR-8003

    • -callback attributes has been added to modules sys and erl_error.

      Own Id: OTP-18793 Aux Id: PR-7703

    • Several new functions that accept funs have been added to module timer.

      Functions apply_after/2, apply_interval/2, and apply_repeatedly/2 accept a nullary fun as the second argument, while functions apply_after/3, apply_interval/3, and apply_repeatedly/3 accept an n-ary fun as the second and a list of n arguments for the fun as the third argument.

      Own Id: OTP-18808 Aux Id: PR-7649

    • Sigils on string literals have been implemented as per EEP 66, that is: binary and string sigils in verbatim and escape characters variants, as well as a default (vanilla) Sigil. All for ordinary strings and for triple-quoted strings (EEP 64). See Sigils in the Reference Manual.

      Examples:

      1> ~"Björn".
      -<<"Björn"/utf8>>
      +<<"Björn"/utf8>>
       2> ~b"Björn".
      -<<"Björn"/utf8>>
      +<<"Björn"/utf8>>
       3> ~S"\s*(\w+)".
       "\\s*(\\w+)"
       4> ~B"\s*(\w+)".
      -<<"\\s*(\\w+)">>

      Own Id: OTP-18825 Aux Id: OTP-18750, PR-7684

    • Functions shell:default_multiline_prompt/1, shell:inverted_space_prompt/1, and +<<"\\s*(\\w+)">>

    Own Id: OTP-18825 Aux Id: OTP-18750, PR-7684

  • Functions shell:default_multiline_prompt/1, shell:inverted_space_prompt/1, and shell:prompt_width/1 have been exported to help with custom prompt implementations.

    Own Id: OTP-18834 Aux Id: PR-7675, PR-7816

  • The shell now pages long output from the documentation help command (h(Module)), auto completions and the search command.

    Own Id: OTP-18846 Aux Id: PR-7845

  • The M-h hotkey (Alt/Option-h) now outputs help for the module or function directly before the cursor.

    Own Id: OTP-18847 Aux Id: PR-7846

  • Added support for adding a custom code formatter that formats your multi-line shell commands in your preferred formatting on submission. See shell:format_shell_func/ and shell:erl_pp_format_func/1.

    Own Id: OTP-18848 Aux Id: PR-7847

  • Added shell functions for viewing, forgetting and saving locally defined functions, types and records.

    Own Id: OTP-18852 Aux Id: PR-7844

  • Added string:jaro_similarity/2, which can be used to calculate the similarity between two strings.

    Own Id: OTP-18865 Aux Id: PR-7879

  • The new function ets:update_element/4 is similar to ets:update_element/3, but takes a default tuple as the fourth argument, which will be inserted if no previous record with that key exists.

    Own Id: OTP-18870 Aux Id: PR-7857

  • Added functions to retrieve the next higher or lower key/element from gb_trees and gb_sets, as well as returning iterators that start at given keys/elements.

    Own Id: OTP-18874 Aux Id: PR-7745

  • When the shell built-in function c/1,2 is used to re-compile a module, the current working directory of the original compilation is now added to the include path.

    Own Id: OTP-18908 Aux Id: PR-7957

  • The timer module now uses a private table for its internal state, slightly improving its performance.

    Own Id: OTP-18914 Aux Id: PR-7973

  • 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

  • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

    Own Id: OTP-18923 Aux Id: PR-6791

  • The maybe expression is now enabled by default.

    To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

    -feature(maybe_expr, disable).

    Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

    erlc -disable-feature maybe_expr some_file.erl

    Own Id: OTP-18944 Aux Id: PR-8067

  • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

    -module(t).
    --export([f/0]).
    --record(r, {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

  • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

    Own Id: OTP-18923 Aux Id: PR-6791

  • The maybe expression is now enabled by default.

    To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

    -feature(maybe_expr, disable).

    Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

    erlc -disable-feature maybe_expr some_file.erl

    Own Id: OTP-18944 Aux Id: PR-8067

  • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

    -module(t).
    +-export([f/0]).
    +-record(r, {a,b,c}).
     
    -f() ->
    -    #href_anchor"ss">r{a=1}#r{b=2}.

    The compiler raises the following warning:

    1> c(t).
    +f() ->
    +    #href_anchor"ss">r{a=1}#r{b=2}.

    The compiler raises the following warning:

    1> c(t).
     t.erl:6:12: Warning: expression updates a literal
     %    6|     #r{a=1}#r{b=2}.
     %     |            ^

    Own Id: OTP-18951 Aux Id: PR-8069

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • Optimized ets:foldl and ets:foldr to use new ets:next_lookup. Also made them immune against table renaming.

    Own Id: OTP-18993 Aux Id: PR-8048

  • Windows now supports all functions in math.

    Own Id: OTP-19001 Aux Id: PR-8164

  • 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

  • There is a new module json for encoding and decoding JSON.

    Both encoding and decoding can be customized. Decoding can be done in a SAX-like fashion and handle multiple documents and streams of data.

    Own Id: OTP-19020 Aux Id: PR-8111

  • STDLIB 5.2.3.6

    Fixed Bugs and Malfunctions

    • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

      Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

      Own Id: OTP-19962 Aux Id: PR-10616

    • For a function that started with a bracket-only pattern (such as []), the ?FUNCTION_ARITY macro would evaluate to one less than the actual arity.

      Own Id: OTP-19988 Aux Id: GH-10705, PR-10708

    STDLIB 5.2.3.5

    Fixed Bugs and Malfunctions

    • A set of small bugs in sort stability for `lists:sort/1` and `lists:keysort/1` has been fixed. The bug happened for only some, seemingly random, element sequences. Most sorts were stable.

      Sort stability for `lists:sort/1` is only possible to observe when sorting lists with floating point and integer numbers of the same value.

      For `lists:keysort/1` the list had to start with two tuples where the keys or the whole tuples compared equal.

      Own Id: OTP-19673 Aux Id: ERIERL-1240

    STDLIB 5.2.3.4

    Fixed Bugs and Malfunctions

    • It's now possible to write lists:map(fun is_atom/1, []) or lists:map(fun my_func/1, []), in the shell, instead of lists:map(fun erlang:is_atom/1, []) or lists:map(fun shell_default:my_func/1, []).

      Own Id: OTP-19649 Aux Id: GH-9771 PR-9898

    • Properly strip the leading / and drive letter from filepaths when zipping and unzipping archives.

      Thanks to Wander Nauta for finding and responsibly disclosing this vulnerability to the Erlang/OTP project.

      Own Id: OTP-19653 Aux Id: CVE-2025-4748 PR-9941

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    STDLIB 5.2.3.3

    Fixed Bugs and Malfunctions

    • Fixed an error in uri_string:percent_decode spec

      Own Id: OTP-19380 Aux Id: GH-8755

    STDLIB 5.2.3.2

    Fixed Bugs and Malfunctions

    • With this change, shutdown procedure handles a race condition between supervisor executing a shutdown and child process termination from other reason.

      Own Id: OTP-19256 Aux Id: PR-8780

    • With this change, uri_string:normalize assumes empty path (do not crash) when no path is provided in the URI map.

      Own Id: OTP-19266 Aux Id: ERIERL-1127, PR-8890

    STDLIB 5.2.3.1

    Fixed Bugs and Malfunctions

    • Fixed a bug that caused the shell completion to crash when keyword and tuple appeared on the same line.

      Own Id: OTP-19157 Aux Id: PR-8638

    STDLIB 5.2.3

    Fixed Bugs and Malfunctions

    • Fix shell expansion of -type a() :: $a. in the erlang shell.

      Own Id: OTP-19062

    • Fix the shell Job Control Mode to not crash when typing TAB or CTRL+R.

      Own Id: OTP-19072 Aux Id: PR-8391

    STDLIB 5.2.2

    Fixed Bugs and Malfunctions

    • Attempting to use the maybe construct in a macro argument could crash the compiler.

      Own Id: OTP-19031 Aux Id: GH-8268

    STDLIB 5.2.1

    Fixed Bugs and Malfunctions

    • The help texts shown by argparse will now display sub-command arguments in the correct order.

      Own Id: OTP-18900 Aux Id: PR-7945, GH-7934

    • Clarified the argparse documentation regarding the user-defined help template.

      Own Id: OTP-18937

    • Fix shell expansion to not crash when expanding invalid using invalid atoms.

      Own Id: OTP-18953 Aux Id: GH-8016 PR-8075

    STDLIB 5.2

    Fixed Bugs and Malfunctions

    • Make shell_docs correctly trim the newline at the end of code blocks.

      Own Id: OTP-18777 Aux Id: PR-7663

    • Replaced unintentional Erlang Public License 1.1 headers in some files with @@ -2363,7 +2363,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/orddict.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/orddict.html 2026-04-20 17:48:56.409783739 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/orddict.html 2026-04-20 17:48:56.409783739 +0000 @@ -101,13 +101,13 @@ as different if they do not match (=:=), this module considers two keys as different if and only if they do not compare equal (==).

      Notes

      Functions append/3 and append_list/3 are included so that keyed values can be stored in a list accumulator, for -example:

      > D0 = orddict:new(),
      -  D1 = orddict:store(files, [], D0),
      -  D2 = orddict:append(files, f1, D1),
      -  D3 = orddict:append(files, f2, D2),
      -  D4 = orddict:append(files, f3, D3),
      -  orddict:fetch(files, D4).
      -[f1,f2,f3]

      This saves the trouble of first fetching a keyed value, appending a new value to +example:

      > D0 = orddict:new(),
      +  D1 = orddict:store(files, [], D0),
      +  D2 = orddict:append(files, f1, D1),
      +  D3 = orddict:append(files, f2, D2),
      +  D4 = orddict:append(files, f3, D3),
      +  orddict:fetch(files, D4).
      +[f1,f2,f3]

      This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

      Function fetch/2 is to be used if the key is known to be in the dictionary, otherwise function find/2.

      See Also

      dict, gb_trees

      @@ -490,16 +490,16 @@

      Appends a new Value to the current list of values associated with Key. An exception is generated if the initial value associated with Key is not a list -of values.

      See also section Notes.

      Example 1:

      1> OrdDict1 = orddict:from_list([{x, []}]).
      -[{x,[]}]
      -2> OrdDict2 = orddict:append(x, 1, OrdDict1).
      -[{x,[1]}]
      -3> OrdDict3 = orddict:append(x, 2, OrdDict2).
      -[{x,[1,2]}]
      -4> orddict:append(y, 3, OrdDict3).
      -[{x,[1,2]},{y,[3]}]

      Example 2:

      1> OrdDict1 = orddict:from_list([{a, no_list}]).
      -[{a,no_list}]
      -2> orddict:append(a, 1, OrdDict1).
      +of values.

      See also section Notes.

      Example 1:

      1> OrdDict1 = orddict:from_list([{x, []}]).
      +[{x,[]}]
      +2> OrdDict2 = orddict:append(x, 1, OrdDict1).
      +[{x,[1]}]
      +3> OrdDict3 = orddict:append(x, 2, OrdDict2).
      +[{x,[1,2]}]
      +4> orddict:append(y, 3, OrdDict3).
      +[{x,[1,2]},{y,[3]}]

      Example 2:

      1> OrdDict1 = orddict:from_list([{a, no_list}]).
      +[{a,no_list}]
      +2> orddict:append(a, 1, OrdDict1).
       ** exception error: bad argument
            in operator  ++/2
               called as no_list ++ [1]
      @@ -536,12 +536,12 @@

      Appends a list of values ValList to the current list of values associated with Key. An exception is generated if the initial value associated with Key is -not a list of values.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{x, []}]).
      -[{x,[]}]
      -2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
      -[{x,[1,2]}]
      -3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
      -[{x,[1,2]},{y,[3,4]}]
      +not a list of values.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{x, []}]).
      +[{x,[]}]
      +2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
      +[{x,[1,2]}]
      +3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
      +[{x,[1,2]},{y,[3,4]}]
      @@ -570,10 +570,10 @@ -

      Erases all items with a specified key from a dictionary.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:erase(a, OrdDict1).
      -[{b,2}]
      +

      Erases all items with a specified key from a dictionary.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:erase(a, OrdDict1).
      +[{b,2}]
      @@ -603,11 +603,11 @@

      Returns the value associated with Key in dictionary Orddict. This function assumes that the Key is present in the dictionary. An exception is generated -if Key is not in the dictionary.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:fetch(a, OrdDict1).
      +if Key is not in the dictionary.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:fetch(a, OrdDict1).
       1
      -3> orddict:fetch(missing, OrdDict1).
      +3> orddict:fetch(missing, OrdDict1).
       ** exception error: no function clause matching orddict:fetch(missing,[])
      @@ -636,10 +636,10 @@ -

      Returns a list of all keys in a dictionary.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:fetch_keys(OrdDict1).
      -[a,b]
      +

      Returns a list of all keys in a dictionary.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:fetch_keys(OrdDict1).
      +[a,b]
      @@ -672,10 +672,10 @@

      Orddict2 is a dictionary of all keys and values in Orddict1 for which -Pred(Key, Value) is true.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
      -[{b,2}]
      +Pred(Key, Value) is true.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
      +[{b,2}]
      @@ -705,11 +705,11 @@

      Searches for a key in a dictionary. Returns {ok, Value}, where Value is the value associated with Key, or error if the key is not present in the -dictionary.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:find(a, OrdDict1).
      -{ok,1}
      -3> orddict:find(c, OrdDict1).
      +dictionary.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:find(a, OrdDict1).
      +{ok,1}
      +3> orddict:find(c, OrdDict1).
       error
      @@ -747,10 +747,10 @@

      Calls Fun on successive keys and values of Orddict together with an extra argument Acc (short for accumulator). Fun must return a new accumulator that -is passed to the next call. Acc0 is returned if the list is empty.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
      -[{b,102},{a,101}]
      +is passed to the next call. Acc0 is returned if the list is empty.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
      +[{b,102},{a,101}]
      @@ -869,10 +869,10 @@

      Calls Fun on successive keys and values of Orddict1 to return a new value -for each key.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
      -[{a,101},{b,102}]
      +for each key.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
      +[{a,101},{b,102}]
      @@ -908,15 +908,15 @@

      Merges two dictionaries, Orddict1 and Orddict2, to create a new dictionary. All the Key-Value pairs from both dictionaries are included in the new dictionary.

      If a key occurs in both dictionaries, Fun is called with the key -and both values to return a new value.

      merge/3 can be defined as follows, but is faster:

      merge(Fun, D1, D2) ->
      -    fold(fun (K, V1, D) ->
      -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
      -         end, D2, D1).

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
      -[{b,7},{c,8}]
      -3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
      -[{a,1},{b,14},{c,8}]
      +and both values to return a new value.

      merge/3 can be defined as follows, but is faster:

      merge(Fun, D1, D2) ->
      +    fold(fun (K, V1, D) ->
      +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
      +         end, D2, D1).

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
      +[{b,7},{c,8}]
      +3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
      +[{a,1},{b,14},{c,8}]
      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ordsets.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ordsets.html 2026-04-20 17:48:56.453784012 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/ordsets.html 2026-04-20 17:48:56.457784037 +0000 @@ -429,14 +429,14 @@ -

      Returns a new ordered set formed from Ordset1 with Element inserted.

      Examples

      1> S0 = ordsets:new().
      -[]
      -2> S1 = ordsets:add_element(7, S0).
      -[7]
      -3> S2 = ordsets:add_element(42, S1).
      -[7,42]
      -4> ordsets:add_element(42, S2).
      -[7,42]
      +

      Returns a new ordered set formed from Ordset1 with Element inserted.

      Examples

      1> S0 = ordsets:new().
      +[]
      +2> S1 = ordsets:add_element(7, S0).
      +[7]
      +3> S2 = ordsets:add_element(42, S1).
      +[7,42]
      +4> ordsets:add_element(42, S2).
      +[7,42]
      @@ -465,11 +465,11 @@ -

      Returns a copy of Ordset1 with Element removed.

      Examples

      1> S = ordsets:from_list([a,b,c]).
      -2> ordsets:del_element(c, S).
      -[a,b]
      -3> ordsets:del_element(x, S).
      -[a,b,c]
      +

      Returns a copy of Ordset1 with Element removed.

      Examples

      1> S = ordsets:from_list([a,b,c]).
      +2> ordsets:del_element(c, S).
      +[a,b]
      +3> ordsets:del_element(x, S).
      +[a,b,c]
      @@ -499,10 +499,10 @@ -

      Filters elements in Ordset1 using predicate function Pred.

      Examples

      1> S = ordsets:from_list([1,2,3,4,5,6,7]).
      -2> IsEven = fun(N) -> N rem 2 =:= 0 end.
      -3> ordsets:filter(IsEven, S).
      -[2,4,6]
      +

      Filters elements in Ordset1 using predicate function Pred.

      Examples

      1> S = ordsets:from_list([1,2,3,4,5,6,7]).
      +2> IsEven = fun(N) -> N rem 2 =:= 0 end.
      +3> ordsets:filter(IsEven, S).
      +[2,4,6]
      @@ -539,16 +539,16 @@

      Calls Fun(Elem) for each Elem of Ordset1 to update or remove elements from Ordset1.

      Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the set of elements for which Fun returns a new -value, with true being equivalent to {true, Elem}.

      ordsets:filtermap/2 behaves as if it were defined as follows:

      filtermap(Fun, Ordset1) ->
      -    ordsets:from_list(lists:filtermap(Fun, Ordset1)).

      Examples

      1> S = ordsets:from_list([2,4,5,6,8,9])
      -2> F = fun(X) ->
      +value, with true being equivalent to {true, Elem}.

      ordsets:filtermap/2 behaves as if it were defined as follows:

      filtermap(Fun, Ordset1) ->
      +    ordsets:from_list(lists:filtermap(Fun, Ordset1)).

      Examples

      1> S = ordsets:from_list([2,4,5,6,8,9])
      +2> F = fun(X) ->
                  case X rem 2 of
      -               0 -> {true, X div 2};
      +               0 -> {true, X div 2};
                      1 -> false
                  end
               end.
      -3> ordsets:filtermap(F, S).
      -[1,2,3,4]
      +3>
      ordsets:filtermap(F, S). +[1,2,3,4]
      @@ -582,9 +582,9 @@

      Folds Function over every element in Ordset and returns the final value of -the accumulator.

      Examples

      1> S = ordsets:from_list([1,2,3,4]).
      +the accumulator.

      Examples

      1> S = ordsets:from_list([1,2,3,4]).
       2> Plus = fun erlang:'+'/2.
      -3> ordsets:fold(Plus, 0, S).
      +3> ordsets:fold(Plus, 0, S).
       10
      @@ -613,8 +613,8 @@ -

      Returns an ordered set of the elements in List.

      Examples

      1> ordsets:from_list([a,b,a,b,b,c]).
      -[a,b,c]
      +

      Returns an ordered set of the elements in List.

      Examples

      1> ordsets:from_list([a,b,a,b,b,c]).
      +[a,b,c]
      @@ -643,15 +643,15 @@

      Returns the intersection of the non-empty list of sets.

      The intersection of multiple sets is a new set that contains only the -elements that are present in all sets.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      -2> S1 = ordsets:from_list([d,e,f]).
      -3> S2 = ordsets:from_list([q,r])
      -4> Sets = [S0, S1, S2].
      -5> ordsets:intersection([S0, S1, S2]).
      -[]
      -6> ordsets:intersection([S0, S1]).
      -[d]
      -7> ordsets:intersection([]).
      +elements that are present in all sets.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      +2> S1 = ordsets:from_list([d,e,f]).
      +3> S2 = ordsets:from_list([q,r])
      +4> Sets = [S0, S1, S2].
      +5> ordsets:intersection([S0, S1, S2]).
      +[]
      +6> ordsets:intersection([S0, S1]).
      +[d]
      +7> ordsets:intersection([]).
       ** exception error: no function clause matching ordsets:intersection([])
      @@ -682,13 +682,13 @@

      Returns the intersection of Ordset1 and Ordset2.

      The intersection of two sets is a new set that contains only the -elements that are present in both sets.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      -2> S1 = ordsets:from_list([c,d,e,f]).
      -3> S2 = ordsets:from_list([q,r]).
      -4> ordsets:intersection(S0, S1).
      -[c,d]
      -5> ordsets:intersection(S1, S2).
      -[]
      +elements that are present in both sets.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      +2> S1 = ordsets:from_list([c,d,e,f]).
      +3> S2 = ordsets:from_list([q,r]).
      +4> ordsets:intersection(S0, S1).
      +[c,d]
      +5> ordsets:intersection(S1, S2).
      +[]
      @@ -717,12 +717,12 @@

      Returns true if Ordset1 and Ordset2 are disjoint; otherwise, -returns false.

      Two sets are disjoint if they have no elements in common.

      This function is equivalent to ordsets:intersection(Ordset1, Ordset2) =:= [], but faster.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      -2> S1 = ordsets:from_list([d,e,f]).
      -3> S2 = ordsets:from_list([q,r])
      -4> ordsets:is_disjoint(S0, S1).
      +returns false.

      Two sets are disjoint if they have no elements in common.

      This function is equivalent to ordsets:intersection(Ordset1, Ordset2) =:= [], but faster.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      +2> S1 = ordsets:from_list([d,e,f]).
      +3> S2 = ordsets:from_list([q,r])
      +4> ordsets:is_disjoint(S0, S1).
       false
      -5> ordsets:is_disjoint(S1, S2).
      +5> ordsets:is_disjoint(S1, S2).
       true
      @@ -751,10 +751,10 @@ -

      Returns true if Element is an element of Ordset; otherwise, returns false.

      Examples

      1> S = ordsets:from_list([a,b,c]).
      -2> ordsets:is_element(42, S).
      +

      Returns true if Element is an element of Ordset; otherwise, returns false.

      Examples

      1> S = ordsets:from_list([a,b,c]).
      +2> ordsets:is_element(42, S).
       false
      -3> ordsets:is_element(b, S).
      +3> ordsets:is_element(b, S).
       true
      @@ -785,9 +785,9 @@ -

      Returns true if Ordset is an empty set; otherwise, returns false.

      Examples

      1> ordsets:is_empty(ordsets:new()).
      +

      Returns true if Ordset is an empty set; otherwise, returns false.

      Examples

      1> ordsets:is_empty(ordsets:new()).
       true
      -2> ordsets:is_empty(ordsets:from_list([1])).
      +2> ordsets:is_empty(ordsets:from_list([1])).
       false
      @@ -819,11 +819,11 @@

      Returns true if Ordset1 and Ordset2 are equal, that is, if every element -of one set is also a member of the other set; otherwise, returns false.

      Examples

      1> Empty = ordsets:new().
      -2> S = ordsets:from_list([a,b]).
      -3> ordsets:is_equal(S, S)
      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/peer.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/peer.html	2026-04-20 17:48:56.509784358 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/peer.html	2026-04-20 17:48:56.509784358 +0000
      @@ -120,127 +120,127 @@
       manual analysis. If the test case fails, the CRASH REPORT contains these
       arguments
    • multiple test cases can run concurrently speeding up overall testing process, peer node names are unique even when there are multiple instances of the same -test suite running in parallel
    -module(my_SUITE).
    --behaviour(ct_suite).
    --export([all/0, groups/0]).
    --export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
    +test suite running in parallel
    -module(my_SUITE).
    +-behaviour(ct_suite).
    +-export([all/0, groups/0]).
    +-export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -groups() ->
    -    [{quick, [parallel],
    -        [basic, args, named, restart_node, multi_node]}].
    +groups() ->
    +    [{quick, [parallel],
    +        [basic, args, named, restart_node, multi_node]}].
     
    -all() ->
    -    [{group, quick}].
    +all() ->
    +    [{group, quick}].
     
    -basic(Config) when is_list(Config) ->
    -    {ok, Peer, _Node} = ?CT_PEER(),
    -    peer:stop(Peer).
    +basic(Config) when is_list(Config) ->
    +    {ok, Peer, _Node} = ?CT_PEER(),
    +    peer:stop(Peer).
     
    -args(Config) when is_list(Config) ->
    +args(Config) when is_list(Config) ->
         %% specify additional arguments to the new node
    -    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    -    peer:stop(Peer).
    +    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    +    peer:stop(Peer).
     
    -named(Config) when is_list(Config) ->
    +named(Config) when is_list(Config) ->
         %% pass test case name down to function starting nodes
    -    Peer = start_node_impl(named_test),
    -    peer:stop(Peer).
    +    Peer = start_node_impl(named_test),
    +    peer:stop(Peer).
     
    -start_node_impl(ActualTestCase) ->
    -    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
    +start_node_impl(ActualTestCase) ->
    +    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
         %% extra setup needed for multiple test cases
    -    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
    +    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
         Peer.
     
    -restart_node(Config) when is_list(Config) ->
    -    Name = ?CT_PEER_NAME(),
    -    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    -    peer:stop(Peer),
    +restart_node(Config) when is_list(Config) ->
    +    Name = ?CT_PEER_NAME(),
    +    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    +    peer:stop(Peer),
         %% restart the node with the same name as before
    -    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    -    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    -    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    -        || _ <- lists:seq(1, 4)],
    +    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    +    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    +    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    +        || _ <- lists:seq(1, 4)],
         %% wait for all nodes to complete boot process, get their names:
    -    _Nodes = [receive {tag, {started, Node, Peer}} -> Node end
    -        || {ok, Peer} <- Peers],
    -    [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set -up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    -peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    -    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two + _Nodes = [receive {tag, {started, Node, Peer}} -> Node end + || {ok, Peer} <- Peers], + [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set +up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    +peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    +    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two containers with hostnames "one" and "two". In this example Erlang nodes running -inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    -    Docker = os:find_executable("docker"),
    -    PrivDir = proplists:get_value(priv_dir, Config),
    -    build_release(PrivDir),
    -    build_image(PrivDir),
    +inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    +    Docker = os:find_executable("docker"),
    +    PrivDir = proplists:get_value(priv_dir, Config),
    +    build_release(PrivDir),
    +    build_image(PrivDir),
     
         %% start two Docker containers
    -    {ok, Peer, Node} = peer:start_link(#{name => lambda,
    +    {ok, Peer, Node} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    -    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
    +        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    +    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
    +        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
     
         %% find IP address of the second node using alternative connection RPC
    -    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    -    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    -    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
    +    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    +    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    +    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
     
         %% make first node to discover second one
    -    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    -    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
    +    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    +    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
     
         %% join a cluster
    -    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
    +    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
         %% verify that second peer node has only the first node visible
    -    [Node] = peer:call(Peer2, erlang, nodes, []),
    +    [Node] = peer:call(Peer2, erlang, nodes, []),
     
         %% stop peers, causing containers to also stop
    -    peer:stop(Peer2),
    -    peer:stop(Peer).
    +    peer:stop(Peer2),
    +    peer:stop(Peer).
     
    -build_release(Dir) ->
    +build_release(Dir) ->
         %% load sasl.app file, otherwise application:get_key will fail
    -    application:load(sasl),
    +    application:load(sasl),
         %% create *.rel - release file
    -    RelFile = filename:join(Dir, "lambda.rel"),
    -    Release = {release, {"lambda", "1.0.0"},
    -        {erts, erlang:system_info(version)},
    -        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    -            || App <- [kernel, stdlib, sasl]]},
    -    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    -        io_lib:format("~tp.", [Release])))),
    -    RelFileNoExt = filename:join(Dir, "lambda"),
    +    RelFile = filename:join(Dir, "lambda.rel"),
    +    Release = {release, {"lambda", "1.0.0"},
    +        {erts, erlang:system_info(version)},
    +        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    +            || App <- [kernel, stdlib, sasl]]},
    +    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    +        io_lib:format("~tp.", [Release])))),
    +    RelFileNoExt = filename:join(Dir, "lambda"),
     
         %% create boot script
    -    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    -        [silent, {outdir, Dir}]),
    +    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    +        [silent, {outdir, Dir}]),
         %% package release into *.tar.gz
    -    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
    +    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
     
    -build_image(Dir) ->
    +build_image(Dir) ->
         %% Create Dockerfile example, working only for Ubuntu 20.04
         %% Expose port 4445, and make Erlang distribution to listen
         %%  on this port, and connect to it without EPMD
         %% Set cookie on both nodes to be the same.
    -    BuildScript = filename:join(Dir, "Dockerfile"),
    +    BuildScript = filename:join(Dir, "Dockerfile"),
         Dockerfile =
           "FROM ubuntu:20.04 as runner\n"
           "EXPOSE 4445\n"
           "WORKDIR /opt/lambda\n"
           "COPY lambda.tar.gz /tmp\n"
           "RUN tar -zxvf /tmp/lambda.tar.gz -C /opt/lambda\n"
    -      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
    +      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
           "/bin/dyn_erl\", \"-boot\", \"/opt/lambda/releases/1.0.0/start\","
           " \"-kernel\", \"inet_dist_listen_min\", \"4445\","
           " \"-erl_epmd_port\", \"4445\","
           " \"-setcookie\", \"secret\"]\n",
    -    ok = file:write_file(BuildScript, Dockerfile),
    -    os:cmd("docker build -t lambda " ++ Dir).
    +
    ok = file:write_file(BuildScript, Dockerfile), + os:cmd("docker build -t lambda " ++ Dir).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/pool.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/pool.html 2026-04-20 17:48:56.545784583 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/pool.html 2026-04-20 17:48:56.545784583 +0000 @@ -474,7 +474,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proc_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proc_lib.html 2026-04-20 17:48:56.601784930 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proc_lib.html 2026-04-20 17:48:56.601784930 +0000 @@ -944,21 +944,21 @@ failed. When doing so the start function can return before the failing process has exited, which may block VM resources required for a new start attempt to succeed. Use init_fail/2,3 for that purpose.

    The following example illustrates how this function and proc_lib:start_link/3 -are used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +are used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} ->
    -            exit(Reason)
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} ->
    +            exit(Reason)
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -1031,21 +1031,21 @@ started process, the start function returns an error tuple when the started process exits, or when the start function time-out (if used) has passed, see start/3,4,5.

    The following example illustrates how this function and proc_lib:start_link/3 -can be used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +can be used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} = Error ->
    -            proc_lib:init_fail(Parent, Error, {exit, normal})
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} = Error ->
    +            proc_lib:init_fail(Parent, Error, {exit, normal})
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -1979,7 +1979,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proplists.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proplists.html 2026-04-20 17:48:56.649785228 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/proplists.html 2026-04-20 17:48:56.649785228 +0000 @@ -497,7 +497,7 @@

    Similar to get_all_values/2, but each value is wrapped in a list unless it is already itself a list. The resulting list of lists is concatenated. This is -often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    +often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    @@ -591,10 +591,10 @@ first entry in ListIn with the same key as Property, and E and Property have equivalent normal forms, then E is replaced with the terms in Expansion, and any following entries with the same key are deleted from -ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} -shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when +ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} +shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when expanded, it must be included in the expansion list. The inserted terms are not expanded recursively. If Expansions contains more than one property with the same key, only the first occurrence is used.

    See also normalize/2.

    @@ -999,7 +999,7 @@

    Partitions List into a list of sublists and a remainder.

    Lists contains one sublist for each key in Keys, in the corresponding order. The relative order of the elements in each sublist is preserved from the original List. Rest contains the elements in List that are not associated with any of the -specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    +specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    @@ -1122,7 +1122,7 @@ an association of the form Key => Value. Anything else will be silently ignored.

    If the same key appears in List multiple times, the value of the one appearing nearest to the head of List will be in the result map, that is the value that -would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    +would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    @@ -1218,7 +1218,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/qlc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/qlc.html 2026-04-20 17:48:56.725785699 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/qlc.html 2026-04-20 17:48:56.717785650 +0000 @@ -214,24 +214,24 @@ If a tuple {finished} exists among the answers to QH, it is returned twice from append/2.

    As another example, consider concatenating the answers to two queries QH1 and QH2 while removing all duplicates. This is accomplished by using option -unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before +unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before returning an answer, it is looked up in the ETS table to check if it has already been returned. Without the unique option, all answers to QH1 would be returned followed by all answers to QH2. The unique option keeps the order between the remaining answers.

    If the order of the answers is not important, there is an alternative to the -unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many +unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many answers, temporary files are used. Notice that to get the first unique answer, all answers must be found and sorted. Both alternatives find duplicates by comparing answers, that is, if A1 and A2 are answers found in that order, then A2 is a removed if A1 == A2.

    To return only a few answers, cursors can be used. The following code returns no -more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    -R = qlc:next_answers(C, 5),
    -ok = qlc:delete_cursor(C),
    +more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    +R = qlc:next_answers(C, 5),
    +ok = qlc:delete_cursor(C),
     R.

    QLCs are convenient for stating constraints on data from two or more tables. The -following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 +following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 and QH2. If, for example, X2 is matched against the key of a QLC table, the lookup join method traverses the objects of QH2 while looking up key values in the table. However, if not X2 or Y2 is matched against the key or an indexed @@ -239,11 +239,11 @@ both sorted on position 2 and next do the join by traversing the objects one by one.

    Option join can be used to force the qlc module to use a certain join method. For the rest of this section it is assumed that the excessively slow -join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2],
    -      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 +join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2],
    +      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 and QH2, one at a time. If there are M answers to QH1 and N answers to QH2, the filter is run M*N times.

    If QH2 is a call to the function for gb_trees, as defined in section Implementing a QLC Table, then @@ -257,7 +257,7 @@ no side effects so that the meaning of the query does not change if QH2 is evaluated only once. One way of caching the answers is to evaluate QH2 first of all and substitute the list of answers for QH2 in the query. Another way is -to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first +to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first time, every answer is stored in an ETS table. When the next answer of QH1 is tried, answers to QH2' are copied from the ETS table, which is very fast. As for option unique the cost is a possibly substantial amount of RAM memory.

    Option {cache, list} offers the possibility to store the answers in a list on @@ -273,62 +273,62 @@ tables and lists on all levels of the query. This can be used for testing if caching would improve efficiency at all. If the answer is yes, further testing is needed to pinpoint the generators that are to be cached.

    Implementing a QLC Table

    As an example of how to use function table/2, the implementation of a QLC -table for the gb_trees module is given:

    -module(gb_table).
    +table for the gb_trees module is given:

    -module(gb_table).
     
    --export([table/1]).
    +-export([table/1]).
     
    -table(T) ->
    -    TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end,
    -    InfoFun = fun(num_of_objects) -> gb_trees:size(T);
    -                 (keypos) -> 1;
    -                 (is_sorted_key) -> true;
    -                 (is_unique_objects) -> true;
    -                 (_) -> undefined
    +table(T) ->
    +    TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end,
    +    InfoFun = fun(num_of_objects) -> gb_trees:size(T);
    +                 (keypos) -> 1;
    +                 (is_sorted_key) -> true;
    +                 (is_unique_objects) -> true;
    +                 (_) -> undefined
                   end,
         LookupFun =
    -        fun(1, Ks) ->
    -                lists:flatmap(fun(K) ->
    -                                      case gb_trees:lookup(K, T) of
    -                                          {value, V} -> [{K,V}];
    -                                          none -> []
    +        fun(1, Ks) ->
    +                lists:flatmap(fun(K) ->
    +                                      case gb_trees:lookup(K, T) of
    +                                          {value, V} -> [{K,V}];
    +                                          none -> []
                                           end
    -                              end, Ks)
    +                              end, Ks)
             end,
         FormatFun =
    -        fun({all, NElements, ElementFun}) ->
    -                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    -                                      [gb_nodes(T, NElements, ElementFun)]),
    -                io_lib:format("gb_table:table(~s)", [ValsS]);
    -           ({lookup, 1, KeyValues, _NElements, ElementFun}) ->
    -                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    -                                      [gb_nodes(T, infinity, ElementFun)]),
    -                io_lib:format("lists:flatmap(fun(K) -> "
    +        fun({all, NElements, ElementFun}) ->
    +                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    +                                      [gb_nodes(T, NElements, ElementFun)]),
    +                io_lib:format("gb_table:table(~s)", [ValsS]);
    +           ({lookup, 1, KeyValues, _NElements, ElementFun}) ->
    +                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    +                                      [gb_nodes(T, infinity, ElementFun)]),
    +                io_lib:format("lists:flatmap(fun(K) -> "
                                   "case gb_trees:lookup(K, ~s) of "
                                   "{value, V} -> [{K,V}];none -> [] end "
                                   "end, ~w)",
    -                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
    +                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
             end,
    -    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    -                   {lookup_fun, LookupFun},{key_equality,&#href_anchor"p" data-group-id="7792626127-44">}]).
    +    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    +                   {lookup_fun, LookupFun},{key_equality,&#href_anchor"p" data-group-id="6020824182-44">}]).
     
    -qlc_next({X, V, S}) ->
    -    [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end];
    -qlc_next(none) ->
    -    [].
    -
    -gb_nodes(T, infinity, ElementFun) ->
    -    gb_nodes(T, -1, ElementFun);
    -gb_nodes(T, NElements, ElementFun) ->
    -    gb_iter(gb_trees:iterator(T), NElements, ElementFun).
    +qlc_next({X, V, S}) ->
    +    [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end];
    +qlc_next(none) ->
    +    [].
    +
    +gb_nodes(T, infinity, ElementFun) ->
    +    gb_nodes(T, -1, ElementFun);
    +gb_nodes(T, NElements, ElementFun) ->
    +    gb_iter(gb_trees:iterator(T), NElements, ElementFun).
     
    -gb_iter(_I, 0, _EFun) ->
    +gb_iter(_I, 0, _EFun) ->
         '...';
    -gb_iter(I0, N, EFun) ->
    -    case gb_trees:next(I0) of
    -        {X, V, I} ->
    -            [EFun({X,V}) | gb_iter(I, N-1, EFun)];
    +gb_iter(I0, N, EFun) ->
    +    case gb_trees:next(I0) of
    +        {X, V, I} ->
    +            [EFun({X,V}) | gb_iter(I, N-1, EFun)];
             none ->
    -            []
    +            []
         end.

    TF is the traversal function. The qlc module requires that there is a way of traversing all objects of the data structure. gb_trees has an iterator function suitable for that purpose. Notice that for each object returned, a new @@ -358,49 +358,49 @@ example, 2 == 2.0 evaluates to true while 2 =:= 2.0 evaluates to false. Normally this is a minor issue, but the qlc module cannot ignore the difference, which affects the user's choice of operators in QLCs.

    If the qlc module at compile time can determine that some constant is free of -integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    -Q1 = qlc:q([K ||
    -{K} <- ets:table(E1),
    -K == 2.71 orelse K == a]),
    -io:format("~s~n", [qlc:info(Q1)]).
    -ets:match_spec_run(
    -       lists:flatmap(fun(V) ->
    -			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    -				       V)
    +integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    +Q1 = qlc:q([K ||
    +{K} <- ets:table(E1),
    +K == 2.71 orelse K == a]),
    +io:format("~s~n", [qlc:info(Q1)]).
    +ets:match_spec_run(
    +       lists:flatmap(fun(V) ->
    +			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    +				       V)
     		     end,
    -		     [a, 2.71]),
    -       ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have + [a, 2.71]), + ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have been handled. However, if it cannot be determined at compile time that some constant is free of integers, and the table uses =:=/2 when comparing keys for equality (see option key_equality), then the qlc module does not try to look up the constant. The reason is that there is in the general case no upper limit on the number of key values that can compare equal -to such a constant; every combination of integers and floats must be looked up:

    2> E2 = ets:new(t, [set]),
    -true = ets:insert(E2, [{{2,2},a},{{2,2.0},b},{{2.0,2},c}]),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/queue.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/queue.html	2026-04-20 17:48:56.773785997 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/queue.html	2026-04-20 17:48:56.777786022 +0000
    @@ -685,12 +685,12 @@
     
           
     
    -

    Returns a queue Q2 that is the result of removing the front item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue = queue:drop(Queue).
    -{[5,4,3],[2]}
    -3> queue:to_list(Queue1).
    -[2,3,4,5]
    +

    Returns a queue Q2 that is the result of removing the front item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue = queue:drop(Queue).
    +{[5,4,3],[2]}
    +3> queue:to_list(Queue1).
    +[2,3,4,5]
    @@ -718,12 +718,12 @@ -

    Returns a queue Q2 that is the result of removing the rear item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue = queue:drop_r(Queue).
    -{[4,3],[1,2]}
    -3> queue:to_list(Queue1).
    -[1,2,3,4]
    +

    Returns a queue Q2 that is the result of removing the rear item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue = queue:drop_r(Queue).
    +{[4,3],[1,2]}
    +3> queue:to_list(Queue1).
    +[1,2,3,4]
    @@ -751,9 +751,9 @@ -

    Returns Item at the front of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> 1 == queue:get(Queue).
    +

    Returns Item at the front of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> 1 == queue:get(Queue).
     true
    @@ -782,9 +782,9 @@ -

    Returns Item at the rear of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> 5 == queue:get_r(Queue).
    +

    Returns Item at the rear of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> 5 == queue:get_r(Queue).
     true
    @@ -814,12 +814,12 @@

    Returns tuple {value, Item}, where Item is the front item of Q, or empty -if Q is empty.

    Example 1:

    1> queue:peek(queue:new()).
    +if Q is empty.

    Example 1:

    1> queue:peek(queue:new()).
     empty
    -2> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -3> queue:peek(Queue).
    -{value, 1}
    +2>
    Queue = queue:from_list([1,2,3,4,5]). +{[5,4,3],[1,2]} +3> queue:peek(Queue). +{value, 1}
    @@ -848,12 +848,12 @@

    Returns tuple {value, Item}, where Item is the rear item of Q, or empty -if Q is empty.

    Example 1:

    1> queue:peek_r(queue:new()).
    +if Q is empty.

    Example 1:

    1> queue:peek_r(queue:new()).
     empty
    -2> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -3> queue:peek_r(Queue).
    -{value, 5}
    +2>
    Queue = queue:from_list([1,2,3,4,5]). +{[5,4,3],[1,2]} +3> queue:peek_r(Queue). +{value, 5}
    @@ -893,10 +893,10 @@ -

    Inserts Item at the head of queue Q1. Returns the new queue Q2.

    Example:

    1> Queue = queue:cons(0, queue:from_list([1,2,3])).
    -{[3,2],[0,1]}
    -2> queue:to_list(Queue).
    -[0,1,2,3]
    +

    Inserts Item at the head of queue Q1. Returns the new queue Q2.

    Example:

    1> Queue = queue:cons(0, queue:from_list([1,2,3])).
    +{[3,2],[0,1]}
    +2> queue:to_list(Queue).
    +[0,1,2,3]
    @@ -924,7 +924,7 @@ -

    Returns the tail item of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> queue:daeh(queue:from_list([1,2,3])).
    +

    Returns the tail item of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> queue:daeh(queue:from_list([1,2,3])).
     3
    @@ -953,7 +953,7 @@ -

    Returns Item from the head of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> queue:head(queue:from_list([1,2,3])).
    +

    Returns Item from the head of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> queue:head(queue:from_list([1,2,3])).
     1
    @@ -982,10 +982,10 @@ -

    Returns a queue Q2 that is the result of removing the tail item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:init(queue:from_list([1,2,3])).
    -{[2],[1]}
    -2> queue:to_list(Queue).
    -[1,2]
    +

    Returns a queue Q2 that is the result of removing the tail item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:init(queue:from_list([1,2,3])).
    +{[2],[1]}
    +2> queue:to_list(Queue).
    +[1,2]
    @@ -1045,7 +1045,7 @@ -

    Returns the tail item of queue Q.

    Fails with reason empty if Q is empty.

    Example:

    1> queue:last(queue:from_list([1,2,3])).
    +

    Returns the tail item of queue Q.

    Fails with reason empty if Q is empty.

    Example:

    1> queue:last(queue:from_list([1,2,3])).
     3
    @@ -1074,10 +1074,10 @@ -

    Returns a queue Q2 that is the result of removing the tail item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:liat(queue:from_list([1,2,3])).
    -{[2],[1]}
    -2> queue:to_list(Queue).
    -[1,2]
    +

    Returns a queue Q2 that is the result of removing the tail item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:liat(queue:from_list([1,2,3])).
    +{[2],[1]}
    +2> queue:to_list(Queue).
    +[1,2]
    @@ -1105,10 +1105,10 @@ -

    Inserts Item as the tail item of queue Q1. Returns the new queue Q2.

    Example:

    1> Queue = queue:snoc(queue:from_list([1,2,3]), 4).
    -{[4,3,2],[1]}
    -2> queue:to_list(Queue).
    -[1,2,3,4]
    +

    Inserts Item as the tail item of queue Q1. Returns the new queue Q2.

    Example:

    1> Queue = queue:snoc(queue:from_list([1,2,3]), 4).
    +{[4,3,2],[1]}
    +2> queue:to_list(Queue).
    +[1,2,3,4]
    @@ -1179,10 +1179,10 @@

    Returns true if Pred(Item) returns true for all items Item in Q, -otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -2> queue:all(fun (E) -> E > 3 end, Queue).
    +otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +2> queue:all(fun (E) -> E > 3 end, Queue).
     false
    -3> queue:all(fun (E) -> E > 0 end, Queue).
    +3> queue:all(fun (E) -> E > 0 end, Queue).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/rand.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/rand.html	2026-04-20 17:48:56.837786394 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/rand.html	2026-04-20 17:48:56.833786370 +0000
    @@ -154,40 +154,40 @@
     %% If there is no state there, [`seed(default)`](`seed/1`)
     %% is implicitly called first:
     %%
    -1> R0 = rand:uniform(),
    -   is_float(R0) andalso 0.0 =< R0 andalso R0 < 1.0.
    +1> R0 = rand:uniform(),
    +   is_float(R0) andalso 0.0 =< R0 andalso R0 < 1.0.
     true
    -2> R1 = rand:uniform(),
    -   is_float(R1) andalso 0.0 =< R1 andalso R1 < 1.0.
    +2> R1 = rand:uniform(),
    +   is_float(R1) andalso 0.0 =< R1 andalso R1 < 1.0.
     true
     
     %% Generate a uniformly distributed integer in the range 1..4711:
     %%
    -3> K0 = rand:uniform(4711),
    -   is_integer(K0) andalso 1 =< K0 andalso K0 =< 4711.
    +3> K0 = rand:uniform(4711),
    +   is_integer(K0) andalso 1 =< K0 andalso K0 =< 4711.
     true
     
     %% Generate a binary with 16 bytes, uniformly distributed:
     %%
    -4> B0 = rand:bytes(16),
    -   byte_size(B0) == 16.
    +4> B0 = rand:bytes(16),
    +   byte_size(B0) == 16.
     true
     
     %% Select and initialize a specified algorithm,
     %% with an automatic default seed, then generate
     %% a floating point number:
     %%
    -5> rand:seed(exro928ss).
    -6> R2 = rand:uniform(),
    -   is_float(R2) andalso 0.0 =< R2 andalso R2 < 1.0.
    +5> rand:seed(exro928ss).
    +6> R2 = rand:uniform(),
    +   is_float(R2) andalso 0.0 =< R2 andalso R2 < 1.0.
     true
     
     %% Select and initialize a specified algorithm
     %% with a specified seed, then generate
     %% a floating point number:
     %%
    -7> rand:seed(exro928ss, 123456789).
    -8> R3 = rand:uniform().
    +7> rand:seed(exro928ss, 123456789).
    +8> R3 = rand:uniform().
     0.48303622772415256
     
     %% Select and initialize a specific algorithm,
    @@ -195,28 +195,28 @@
     %% with explicit generator state, then generate
     %% two floating point numbers.
     %%
    -9>  S0 = rand:seed_s(exsss).
    -10> {R4, S1} = rand:uniform_s(S0),
    -    is_float(R4) andalso 0.0 =< R4 andalso R4 < 1.0.
    +9>  S0 = rand:seed_s(exsss).
    +10> {R4, S1} = rand:uniform_s(S0),
    +    is_float(R4) andalso 0.0 =< R4 andalso R4 < 1.0.
     true
    -11> {R5, S2} = rand:uniform_s(S1),
    -    is_float(R5) andalso 0.0 =< R5 andalso R5 < 1.0.
    +11> {R5, S2} = rand:uniform_s(S1),
    +    is_float(R5) andalso 0.0 =< R5 andalso R5 < 1.0.
     true
     %% Repeat the first after seed
    -12> {R4, _} = rand:uniform_s(S0).
    +12> {R4, _} = rand:uniform_s(S0).
     
     %% Generate a standard normal distribution number
     %% using the built-in fast Ziggurat Method:
     %%
    -13> {SND0, S3} = rand:normal_s(S2),
    -    is_float(SND0).
    +13> {SND0, S3} = rand:normal_s(S2),
    +    is_float(SND0).
     true
     
     %% Generate a normal distribution number
     %% with mean -3 and variance 0.5:
     %%
    -14> {ND0, S4} = rand:normal_s(-3, 0.5, S3),
    -    is_float(ND0).
    +14> {ND0, S4} = rand:normal_s(-3, 0.5, S3),
    +    is_float(ND0).
     true
     
     %% Generate a textbook basic form Box-Muller
    @@ -224,14 +224,14 @@
     %% distribution as the built-in Ziggurat method above,
     %% but is much slower:
     %%
    -15> R6 = rand:uniform_real(),
    -    is_float(R6) andalso 0.0 < R6 andalso R6 < 1.0.
    +15> R6 = rand:uniform_real(),
    +    is_float(R6) andalso 0.0 < R6 andalso R6 < 1.0.
     true
    -16> R7 = rand:uniform(),
    -    is_float(R7) andalso 0.0 =< R7 andalso R7 < 1.0.
    +16> R7 = rand:uniform(),
    +    is_float(R7) andalso 0.0 =< R7 andalso R7 < 1.0.
     true
     %% R6 cannot be equal to 0.0 so math:log/1 will never fail
    -17> SND1 = math:sqrt(-2 * math:log(R6)) * math:cos(math:pi() * R7).

    Algorithms

    The base generator algorithms implement the +17> SND1 = math:sqrt(-2 * math:log(R6)) * math:cos(math:pi() * R7).

    Algorithms

    The base generator algorithms implement the Xoroshiro and Xorshift algorithms by Sebastiano Vigna. During an iteration they generate an integer (at least 58-bit) and operate on a state of several integers. @@ -298,7 +298,7 @@ up to (and included) 16TB, with the exception of binary rank tests, which fail due to the lowest bit being an LFSR; all other bits pass all tests. We suggest to use a sign test to extract a random Boolean value.

    If this is a problem; to generate a boolean with these algorithms, -use something like this:

    (rand:uniform(256) > 128) % -> boolean()
    ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

    For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

    (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

    The floating point generating functions in this module waste the lowest bits +use something like this:

    (rand:uniform(256) > 128) % -> boolean()
    ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

    For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

    (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

    The floating point generating functions in this module waste the lowest bits when converting from an integer so they avoid this snag.

    Niche algorithms

    The niche algorithms API contains special purpose algorithms that do not use the plug-in framework, mainly for performance reasons.

    Since these algorithms lack the plug-in framework support, generating numbers @@ -1508,7 +1508,7 @@ 16#7fa6502 * 2^32 - 1, which have been selected, in collaboration with Sebastiano Vigna, to avoid bignum operations and still get good statistical quality. It has been named "MWC59" and can be written as:

    C = CX0 bsr 32
    -X = CX0 band ((1 bsl 32)-1))
    +X = CX0 band ((1 bsl 32)-1))
     CX1 = 16#7fa6502 * X + C

    Because the generator uses a multiplier that is a power of 2 it gets statistical flaws for collision tests and birthday spacings tests in 2 and 3 dimensions, and these caveats apply even when looking @@ -2416,10 +2416,10 @@ equally spaced in the interval.

    Warning

    This function may return exactly 0.0 which can be fatal for certain applications. If that is undesired you can use (1.0 - rand:uniform()) to get the interval 0.0 < X =< 1.0, or instead use uniform_real/0.

    If neither endpoint is desired you can achieve the range -0.0 < X < 1.0 using test and re-try like this:

    my_uniform() ->
    -    case rand:uniform() of
    +0.0 < X < 1.0 using test and re-try like this:

    my_uniform() ->
    +    case rand:uniform() of
             X when 0.0 < X -> X;
    -        _ -> my_uniform()
    +        _ -> my_uniform()
         end.
    @@ -2481,7 +2481,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/random.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/random.html 2026-04-20 17:48:56.873786618 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/random.html 2026-04-20 17:48:56.873786618 +0000 @@ -431,9 +431,9 @@

    Seeds random number generation with integer values in the process dictionary and -returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    -            erlang:monotonic_time(),
    -            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, +returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    +            erlang:monotonic_time(),
    +            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, and erlang:unique_integer/0.

    @@ -596,7 +596,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re.html 2026-04-20 17:48:56.941787039 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re.html 2026-04-20 17:48:56.937787014 +0000 @@ -2490,32 +2490,32 @@

    Takes a compiled regular expression and an item, and returns the relevant data from the regular expression.

    The only supported item is namelist, which returns the tuple {namelist, [binary()]}, -containing the names of all (unique) named subpatterns in the regular expression.

    For example:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    -{ok,{re_pattern,3,0,0,
    -                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -2> re:inspect(MP,namelist).
    -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    -3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
    -{ok,{re_pattern,3,0,0,
    -                <<69,82,67,80,119,0,0,0,0,0,8,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -4> re:inspect(MPD,namelist).
    -{namelist,[<<"B">>,<<"C">>]}

    Notice in the second example that the duplicate name only occurs once in the +containing the names of all (unique) named subpatterns in the regular expression.

    For example:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    +{ok,{re_pattern,3,0,0,
    +                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    +                  255,255,...>>}}
    +2> re:inspect(MP,namelist).
    +{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    +3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
    +{ok,{re_pattern,3,0,0,
    +                <<69,82,67,80,119,0,0,0,0,0,8,0,1,0,0,0,255,255,255,255,
    +                  255,255,...>>}}
    +4> re:inspect(MPD,namelist).
    +{namelist,[<<"B">>,<<"C">>]}

    Notice in the second example that the duplicate name only occurs once in the returned list, and that the list is in alphabetical order regardless of where the names are positioned in the regular expression. The order of the names is the same as the order of captured subexpressions if {capture, all_names} is specified as an option to run/3. You can therefore create a name-to-value -mapping from the result of run/3 like this:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    -{ok,{re_pattern,3,0,0,
    -                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -2> {namelist, N} = re:inspect(MP,namelist).
    -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    -3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]).
    -{match,[<<"A">>,<<>>,<<>>]}
    -4> NameMap = lists:zip(N,L).
    -[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
    +mapping from the result of run/3 like this:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    +{ok,{re_pattern,3,0,0,
    +                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    +                  255,255,...>>}}
    +2> {namelist, N} = re:inspect(MP,namelist).
    +{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    +3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]).
    +{match,[<<"A">>,<<>>,<<>>]}
    +4> NameMap = lists:zip(N,L).
    +[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
    @@ -2604,16 +2604,16 @@ subexpression number N, is inserted in the result. If no subexpression with that number is generated by the regular expression, nothing is inserted.

    To insert an & or a \ in the result, precede it with a \. Notice that Erlang already gives a special meaning to \ in literal strings, so a single \ must be -written as "\\" and therefore a double \ as "\\\\".

    Example:

    1> re:replace("abcd","c","[&]",[{return,list}]).
    -"ab[c]d"

    while

    2> re:replace("abcd","c","[\\&]",[{return,list}]).
    +written as "\\" and therefore a double \ as "\\\\".

    Example:

    1> re:replace("abcd","c","[&]",[{return,list}]).
    +"ab[c]d"

    while

    2> re:replace("abcd","c","[\\&]",[{return,list}]).
     "ab[&]d"

    If the replacement is given as a fun, it will be called with the whole matching expression as the first argument and a list of subexpression matches in the order in which they appear in the regular expression. The returned value will be -inserted in the result.

    Example:

    3> re:replace("abcd", ".(.)",
    -    fun(Whole, [<<C>>]) ->
    -         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
    +inserted in the result.

    Example:

    3> re:replace("abcd", ".(.)",
    +    fun(Whole, [<<C>>]) ->
    +         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
         end,
    -    [{return, list}]).
    +    [{return, list}]).
     "#ab-B#cd"

    Note

    Non-matching optional subexpressions will not be included in the list of subexpression matches if they are the last subexpressions in the regular expression.

    Example:

    The regular expression "(a)(b)?(c)?" ("a", optionally followed by "b", @@ -2734,7 +2734,7 @@ run/3 handles empty matches in the same way as Perl: a zero-length match at any point is also retried with options [anchored, notempty_atstart]. If that search gives a result of length > 0, -the result is included. Example:

    re:run("cat","(|at)",[global]).

    The following matchings are performed:

    • At offset 0 - The regular expression (|at) first match at the +the result is included. Example:

      re:run("cat","(|at)",[global]).

      The following matchings are performed:

      • At offset 0 - The regular expression (|at) first match at the initial position of string cat, giving the result set [{0,0},{0,0}] (the second {0,0} is because of the subexpression marked by the parentheses). As the length of the match is 0, we do not advance to the next position yet.

      • At offset 0 with [anchored, notempty_atstart] - The search is @@ -2746,7 +2746,7 @@ of results and the position in the search string is advanced two steps.

      • At offset 3 - The search once again matches the empty string, giving [{3,0},{3,0}].

      • At offset 1 with [anchored, notempty_atstart] - This gives no result of length > 0 and we are at the last position, so the global search is -complete.

      The result of the call is:

      {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
    • notempty - An empty string is not considered to be a valid match if this +complete.

    The result of the call is:

    {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
  • notempty - An empty string is not considered to be a valid match if this option is specified. If alternatives in the pattern exist, they are tried. If all the alternatives match the empty string, the entire match fails.

    Example:

    If the following pattern is applied to a string not beginning with "a" or "b", it would normally match the empty string at the start of the subject:

    a?b?

    With option notempty, this match is invalid, so run/3 searches @@ -2817,12 +2817,12 @@ instead of the stack, the amount of heap memory that can be used.

    The Erlang VM uses a PCRE library where heap memory is used when regular expression match recursion occurs. This therefore limits the use of machine heap, not C stack.

    Specifying a lower value can result in matches with deep recursion failing, -when they should have matched:

    1> re:run("aaaaaaaaaaaaaz","(a+)*z").
    -{match,[{0,14},{0,13}]}
    -2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
    +when they should have matched:

    1> re:run("aaaaaaaaaaaaaz","(a+)*z").
    +{match,[{0,14},{0,13}]}
    +2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
     nomatch
    -3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]).
    -{error,match_limit_recursion}

    This option and option match_limit are only to be used in rare cases. +3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]). +{error,match_limit_recursion}

    This option and option match_limit are only to be used in rare cases. Understanding of the PCRE library internals is recommended before tampering with these limits.

  • {offset, integer() >= 0} - Start matching at the offset (position) specified in the subject string. The offset is zero-based, so that the default @@ -2835,9 +2835,9 @@ capturing).

    As an example of the default behavior, the following call returns, as first and only captured string, the matching part of the subject ("abcd" in the middle) as an index pair {3,4}, where character positions are zero-based, -just as in offsets:

    re:run("ABCabcdABC","abcd",[]).

    The return value of this call is:

    {match,[{3,4}]}

    Another (and quite common) case is where the regular expression matches all of -the subject:

    re:run("ABCabcdABC",".*abcd.*",[]).

    Here the return value correspondingly points out all of the string, beginning -at index 0, and it is 10 characters long:

    {match,[{0,10}]}

    If the regular expression contains capturing subpatterns, like in:

    re:run("ABCabcdABC",".*(abcd).*",[]).

    all of the matched subject is captured, as well as the captured substrings:

    {match,[{0,10},{3,4}]}

    The complete matching pattern always gives the first return value in the list +just as in offsets:

    re:run("ABCabcdABC","abcd",[]).

    The return value of this call is:

    {match,[{3,4}]}

    Another (and quite common) case is where the regular expression matches all of +the subject:

    re:run("ABCabcdABC",".*abcd.*",[]).

    Here the return value correspondingly points out all of the string, beginning +at index 0, and it is 10 characters long:

    {match,[{0,10}]}

    If the regular expression contains capturing subpatterns, like in:

    re:run("ABCabcdABC",".*(abcd).*",[]).

    all of the matched subject is captured, as well as the captured substrings:

    {match,[{0,10},{3,4}]}

    The complete matching pattern always gives the first return value in the list and the remaining subpatterns are added in the order they occurred in the regular expression.

    The capture tuple is built up as follows:

    • ValueSpec - Specifies which captured (sub)patterns are to be returned. ValueSpec can either be an atom describing a predefined set of return @@ -2862,12 +2862,12 @@ subpatterns (see below) in the regular expression, one can use atom/0s or string/0s to specify the subpatterns to be returned. For example, consider the regular expression:

      ".*(abcd).*"

      matched against string "ABCabcdABC", capturing only the "abcd" part (the -first explicit subpattern):

      re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

      The call gives the following result, as the first explicitly captured +first explicit subpattern):

      re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

      The call gives the following result, as the first explicitly captured subpattern is "(abcd)", matching "abcd" in the subject, at (zero-based) -position 3, of length 4:

      {match,[{3,4}]}

      Consider the same regular expression, but with the subpattern explicitly +position 3, of length 4:

      {match,[{3,4}]}

      Consider the same regular expression, but with the subpattern explicitly named 'FOO':

      ".*(?<FOO>abcd).*"

      With this expression, we could still give the index of the subpattern with -the following call:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

      giving the same result as before. But, as the subpattern is named, we can -also specify its name in the value list:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

      This would give the same result as the earlier examples, namely:

      {match,[{3,4}]}

      The values list can specify indexes or names not present in the regular +the following call:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

      giving the same result as before. But, as the subpattern is named, we can +also specify its name in the value list:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

      This would give the same result as the earlier examples, namely:

      {match,[{3,4}]}

      The values list can specify indexes or names not present in the regular expression, in which case the return values vary depending on the type. If the type is index, the tuple {-1,0} is returned for values with no corresponding subpattern in the regular expression, but for the other types @@ -2902,12 +2902,12 @@ string:

      "ABCabcdABC"

      the subpattern at index 2 does not match, as "abdd" is not present in the string, but the complete pattern matches (because of the alternative a(..d)). The subpattern at index 2 is therefore unassigned and the default -return value is:

      {match,[{0,10},{3,4},{-1,0},{4,3}]}

      Setting the capture Type to binary gives:

      {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

      Here the empty binary (<<>>) represents the unassigned subpattern. In the +return value is:

      {match,[{0,10},{3,4},{-1,0},{4,3}]}

      Setting the capture Type to binary gives:

      {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

      Here the empty binary (<<>>) represents the unassigned subpattern. In the binary case, some information about the matching is therefore lost, as <<>> can also be an empty string captured.

      If differentiation between empty matches and non-existing subpatterns is necessary, use the type index and do the conversion to the final type in Erlang code.

      When option global is speciified, the capture specification affects each -match separately, so that:

      re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

      gives

      {match,[["a"],["b"]]}

    For a descriptions of options only affecting the compilation step, see +match separately, so that:

    re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

    gives

    {match,[["a"],["b"]]}
  • For a descriptions of options only affecting the compilation step, see compile/2.

    @@ -2994,7 +2994,7 @@ compilation option is specified to this function, both the regular expression and Subject are to be specified as valid Unicode charlist()s.

    The result is given as a list of "strings", the preferred data type specified in option return (default iodata).

    If subexpressions are specified in the regular expression, the matching -subexpressions are returned in the resulting list as well. For example:

    re:split("Erlang","[ln]",[{return,list}]).

    gives

    ["Er","a","g"]

    while

    re:split("Erlang","([ln])",[{return,list}]).

    gives

    ["Er","l","a","n","g"]

    The text matching the subexpression (marked by the parentheses in the regular +subexpressions are returned in the resulting list as well. For example:

    re:split("Erlang","[ln]",[{return,list}]).

    gives

    ["Er","a","g"]

    while

    re:split("Erlang","([ln])",[{return,list}]).

    gives

    ["Er","l","a","n","g"]

    The text matching the subexpression (marked by the parentheses in the regular expression) is inserted in the result list where it was found. This means that concatenating the result of a split where the whole regular expression is a single subexpression (as in the last example) always results in the original @@ -3002,21 +3002,21 @@ "g"), nothing is inserted after that. To make the group of strings and the parts matching the subexpressions more obvious, one can use option group, which groups together the part of the subject string with the parts matching the -subexpressions when the string was split:

    re:split("Erlang","([ln])",[{return,list},group]).

    gives

    [["Er","l"],["a","n"],["g"]]

    Here the regular expression first matched the "l", causing "Er" to be the first +subexpressions when the string was split:

    re:split("Erlang","([ln])",[{return,list},group]).

    gives

    [["Er","l"],["a","n"],["g"]]

    Here the regular expression first matched the "l", causing "Er" to be the first part in the result. When the regular expression matched, the (only) subexpression was bound to the "l", so the "l" is inserted in the group together with "Er". The next match is of the "n", making "a" the next part to be returned. As the subexpression is bound to substring "n" in this case, the "n" is inserted into this group. The last group consists of the remaining string, as no more matches are found.

    By default, all parts of the string, including the empty strings, are returned -from the function, for example:

    re:split("Erlang","[lg]",[{return,list}]).

    gives

    ["Er","an",[]]

    as the matching of the "g" in the end of the string leaves an empty rest, which +from the function, for example:

    re:split("Erlang","[lg]",[{return,list}]).

    gives

    ["Er","an",[]]

    as the matching of the "g" in the end of the string leaves an empty rest, which is also returned. This behavior differs from the default behavior of the split function in Perl, where empty strings at the end are by default removed. To get -the "trimming" default behavior of Perl, specify trim as an option:

    re:split("Erlang","[lg]",[{return,list},trim]).

    gives

    ["Er","an"]

    The "trim" option says; "give me as many parts as possible except the empty +the "trimming" default behavior of Perl, specify trim as an option:

    re:split("Erlang","[lg]",[{return,list},trim]).

    gives

    ["Er","an"]

    The "trim" option says; "give me as many parts as possible except the empty ones", which sometimes can be useful. You can also specify how many parts you -want, by specifying {parts,N}:

    re:split("Erlang","[lg]",[{return,list},{parts,2}]).

    gives

    ["Er","ang"]

    Notice that the last part is "ang", not "an", as splitting was specified into +want, by specifying {parts,N}:

    re:split("Erlang","[lg]",[{return,list},{parts,2}]).

    gives

    ["Er","ang"]

    Notice that the last part is "ang", not "an", as splitting was specified into two parts, and the splitting stops when enough parts are given, which is why the -result differs from that of trim.

    More than three parts are not possible with this indata, so

    re:split("Erlang","[lg]",[{return,list},{parts,4}]).

    gives the same result as the default, which is to be viewed as "an infinite +result differs from that of trim.

    More than three parts are not possible with this indata, so

    re:split("Erlang","[lg]",[{return,list},{parts,4}]).

    gives the same result as the default, which is to be viewed as "an infinite number of parts".

    Specifying 0 as the number of parts gives the same effect as option trim. If subexpressions are captured, empty subexpressions matched at the end are also stripped from the result if trim or {parts,0} is specified.

    The trim behavior corresponds exactly to the Perl default. {parts,N}, where @@ -3096,7 +3096,7 @@ Erlang programming language /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re_incompat.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re_incompat.html 2026-04-20 17:48:56.977787263 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/re_incompat.html 2026-04-20 17:48:56.977787263 +0000 @@ -182,7 +182,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/search.html 2026-04-20 17:48:57.009787461 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/search.html 2026-04-20 17:48:57.009787461 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sets.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sets.html 2026-04-20 17:48:57.053787734 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sets.html 2026-04-20 17:48:57.057787759 +0000 @@ -114,11 +114,11 @@ respect to the aforementioned functions, their overall behavior may differ. As mentioned, this module considers elements as different if and only if they do not match (=:=), while both ordsets and gb_sets consider elements -as different if and only if they do not compare equal (==).

    Examples

    1> sets:is_element(1.0, sets:from_list([1])).
    +as different if and only if they do not compare equal (==).

    Examples

    1> sets:is_element(1.0, sets:from_list([1])).
     false
    -2> ordsets:is_element(1.0, ordsets:from_list([1])).
    +2> ordsets:is_element(1.0, ordsets:from_list([1])).
     true
    -3> gb_sets:is_element(1.0, gb_sets:from_list([1])).
    +3> gb_sets:is_element(1.0, gb_sets:from_list([1])).
     true

    See Also

    gb_sets, ordsets

    @@ -503,16 +503,16 @@ -

    Returns a new set formed from Set1 with Element inserted.

    Examples

    1> S0 = sets:new().
    -2> S1 = sets:add_element(7, S0).
    -3> sets:to_list(S1).
    -[7]
    -4> S2 = sets:add_element(42, S1).
    -5> lists:sort(sets:to_list(S2)).
    -[7,42]
    -6> S2 = sets:add_element(42, S1).
    -7> lists:sort(sets:to_list(S2)).
    -[7,42]
    +

    Returns a new set formed from Set1 with Element inserted.

    Examples

    1> S0 = sets:new().
    +2> S1 = sets:add_element(7, S0).
    +3> sets:to_list(S1).
    +[7]
    +4> S2 = sets:add_element(42, S1).
    +5> lists:sort(sets:to_list(S2)).
    +[7,42]
    +6> S2 = sets:add_element(42, S1).
    +7> lists:sort(sets:to_list(S2)).
    +[7,42]
    @@ -540,12 +540,12 @@ -

    Returns a copy of Set1 with Element removed.

    Examples

    1> S = sets:from_list([a,b]).
    -2> sets:to_list(sets:del_element(b, S)).
    -[a]
    -3> S = sets:del_element(x, S).
    -4> lists:sort(sets:to_list(S)).
    -[a,b]
    +

    Returns a copy of Set1 with Element removed.

    Examples

    1> S = sets:from_list([a,b]).
    +2> sets:to_list(sets:del_element(b, S)).
    +[a]
    +3> S = sets:del_element(x, S).
    +4> lists:sort(sets:to_list(S)).
    +[a,b]
    @@ -574,11 +574,11 @@ -

    Filters elements in Set1 using predicate function Pred.

    Examples

    1> S = sets:from_list([1,2,3,4,5,6,7]).
    -2> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -3> Filtered = sets:filter(IsEven, S).
    -4> lists:sort(sets:to_list(Filtered)).
    -[2,4,6]
    +

    Filters elements in Set1 using predicate function Pred.

    Examples

    1> S = sets:from_list([1,2,3,4,5,6,7]).
    +2> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +3> Filtered = sets:filter(IsEven, S).
    +4> lists:sort(sets:to_list(Filtered)).
    +[2,4,6]
    @@ -615,17 +615,17 @@

    Calls Fun(Elem) for each Elem of Set1 to update or remove elements from Set1.

    Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the set of elements for which Fun returns a new -value, with true being equivalent to {true, Elem}.

    sets:filtermap/2 behaves as if it were defined as follows:

    filtermap(Fun, Set1) ->
    -    sets:from_list(lists:filtermap(Fun, Set1)).

    Examples

    1> S = sets:from_list([2,4,5,6,8,9])
    -2> F = fun(X) ->
    +value, with true being equivalent to {true, Elem}.

    sets:filtermap/2 behaves as if it were defined as follows:

    filtermap(Fun, Set1) ->
    +    sets:from_list(lists:filtermap(Fun, Set1)).

    Examples

    1> S = sets:from_list([2,4,5,6,8,9])
    +2> F = fun(X) ->
                case X rem 2 of
    -               0 -> {true, X div 2};
    +               0 -> {true, X div 2};
                    1 -> false
                end
             end.
    -3> Set = sets:filtermap(F, S).
    -4> lists:sort(sets:to_list(Set)).
    -[1,2,3,4]
    +3>
    Set = sets:filtermap(F, S). +4> lists:sort(sets:to_list(Set)). +[1,2,3,4]
    @@ -661,9 +661,9 @@

    Folds Function over every element in Set and returns the final value of -the accumulator.

    The evaluation order is undefined.

    Examples

    1> S = sets:from_list([1,2,3,4]).
    +the accumulator.

    The evaluation order is undefined.

    Examples

    1> S = sets:from_list([1,2,3,4]).
     2> Plus = fun erlang:'+'/2.
    -3> sets:fold(Plus, 0, S).
    +3> sets:fold(Plus, 0, S).
     10
    @@ -692,9 +692,9 @@ -

    Returns a set of the elements in List.

    Examples

    1> S = sets:from_list([a,b,c]).
    -2> lists:sort(sets:to_list(S)).
    -[a,b,c]
    +

    Returns a set of the elements in List.

    Examples

    1> S = sets:from_list([a,b,c]).
    +2> lists:sort(sets:to_list(S)).
    +[a,b,c]
    @@ -724,9 +724,9 @@ -

    Returns a set of the elements in List of the given version.

    Examples

    1> S = sets:from_list([a,b,c], [{version, 1}]).
    -2> lists:sort(sets:to_list(S)).
    -[a,b,c]
    +

    Returns a set of the elements in List of the given version.

    Examples

    1> S = sets:from_list([a,b,c], [{version, 1}]).
    +2> lists:sort(sets:to_list(S)).
    +[a,b,c]
    @@ -755,15 +755,15 @@

    Returns the intersection of the non-empty list of sets.

    The intersection of multiple sets is a new set that contains only the -elements that are present in all sets.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    -2> S1 = sets:from_list([d,e,f]).
    -3> S2 = sets:from_list([q,r])
    -4> Sets = [S0, S1, S2].
    -5> sets:to_list(sets:intersection([S0, S1, S2])).
    -[]
    -6> sets:to_list(sets:intersection([S0, S1])).
    -[d]
    -7> sets:intersection([]).
    +elements that are present in all sets.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    +2> S1 = sets:from_list([d,e,f]).
    +3> S2 = sets:from_list([q,r])
    +4> Sets = [S0, S1, S2].
    +5> sets:to_list(sets:intersection([S0, S1, S2])).
    +[]
    +6> sets:to_list(sets:intersection([S0, S1])).
    +[d]
    +7> sets:intersection([]).
     ** exception error: no function clause matching sets:intersection([])
    @@ -794,14 +794,14 @@

    Returns the intersection of Set1 and Set2.

    The intersection of two sets is a new set that contains only the -elements that are present in both sets.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    -2> S1 = sets:from_list([c,d,e,f]).
    -3> S2 = sets:from_list([q,r]).
    -4> Intersection = sets:intersection(S0, S1).
    -5> lists:sort(sets:to_list(Intersection)).
    -[c,d]
    -6> sets:to_list(sets:intersection(S1, S2)).
    -[]
    +elements that are present in both sets.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    +2> S1 = sets:from_list([c,d,e,f]).
    +3> S2 = sets:from_list([q,r]).
    +4> Intersection = sets:intersection(S0, S1).
    +5> lists:sort(sets:to_list(Intersection)).
    +[c,d]
    +6> sets:to_list(sets:intersection(S1, S2)).
    +[]
    @@ -831,12 +831,12 @@

    Returns true if Set1 and Set2 are disjoint; otherwise, returns false.

    Two sets are disjoint if they have no elements in common.

    This function is equivalent to sets:intersection(Set1, Set2) =:= [], -but faster.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    -2> S1 = sets:from_list([d,e,f]).
    -3> S2 = sets:from_list([q,r])
    -4> sets:is_disjoint(S0, S1).
    +but faster.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell.html	2026-04-20 17:48:57.101788032 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell.html	2026-04-20 17:48:57.105788056 +0000
    @@ -131,7 +131,7 @@
     definitions. To facilitate matters, record definitions in modules
     shell_default and user_default (if loaded) are read each time a new job is
     started. For example, adding the following line to user_default makes the
    -definition of file_info readily available in the shell:

    -include_lib("kernel/include/file.hrl").

    The shell runs in two modes:

    • Normal (possibly restricted) mode, in which commands can be edited and +definition of file_info readily available in the shell:

      -include_lib("kernel/include/file.hrl").

      The shell runs in two modes:

      • Normal (possibly restricted) mode, in which commands can be edited and expressions evaluated
      • Job Control Mode, JCL, in which jobs can be started, killed, detached, and connected

      Only the currently connected job can 'talk' to the shell.

      Shell Commands

      The commands below are the built-in shell commands that are always available. In most system the commands listed in the c module are also available in the @@ -187,30 +187,30 @@ records to a module file, where FilePath should include both the path to the file and the name of the module with .erl suffix.

      Example: src/my_module.erl

    Example

    The following example is a long dialog with the shell. Commands starting with > are inputs to the shell. All other lines are output from the shell.

    strider 1> erl
    -Erlang (BEAM) emulator version 5.3 [hipe] [threads:0]
    +Erlang (BEAM) emulator version 5.3 [hipe] [threads:0]
     
    -Eshell V5.3  (abort with ^G)
    +Eshell V5.3  (abort with ^G)
     1> Str = "abcd".
    -"abcd"

    Command 1 sets variable Str to string "abcd".

    2> L = length(Str).
    -4

    Command 2 sets L to the length of string Str.

    3> Descriptor = {L, list_to_atom(Str)}.
    -{4,abcd}

    Command 3 builds the tuple Descriptor, evaluating the BIF +"abcd"

    Command 1 sets variable Str to string "abcd".

    2> L = length(Str).
    +4

    Command 2 sets L to the length of string Str.

    3> Descriptor = {L, list_to_atom(Str)}.
    +{4,abcd}

    Command 3 builds the tuple Descriptor, evaluating the BIF list_to_atom/1 .

    4> L.
    -4

    Command 4 prints the value of variable L.

    5> b().
    -Descriptor = {4,abcd}
    +4

    Command 4 prints the value of variable L.

    5> b().
    +Descriptor = {4,abcd}
     L = 4
     Str = "abcd"
     ok

    Command 5 evaluates the internal shell command b(), which is an abbreviation of "bindings". This prints the current shell variables and their bindings. ok -at the end is the return value of function b().

    6> f(L).
    +at the end is the return value of function b().

    6> f(L).
     ok

    Command 6 evaluates the internal shell command f(L) (abbreviation of -"forget"). The value of variable L is removed.

    7> b().
    -Descriptor = {4,abcd}
    +"forget"). The value of variable L is removed.

    7> b().
    +Descriptor = {4,abcd}
     Str = "abcd"
    -ok

    Command 7 prints the new bindings.

    8> f(L).
    -ok

    Command 8 has no effect, as L has no value.

    9> {L, _} = Descriptor.
    -{4,abcd}

    Command 9 performs a pattern matching operation on Descriptor, binding a new +ok

    Command 7 prints the new bindings.

    8> f(L).
    +ok

    Command 8 has no effect, as L has no value.

    9> {L, _} = Descriptor.
    +{4,abcd}

    Command 9 performs a pattern matching operation on Descriptor, binding a new value to L.

    10> L.
    -4

    Command 10 prints the current value of L.

    11> {P, Q, R} = Descriptor.
    +4

    Command 10 prints the current value of L.

    11> {P, Q, R} = Descriptor.
     ** exception error: no match of right hand side value {4,abcd}

    Command 11 tries to match {P, Q, R} against Descriptor, which is {4, abc}. The match fails and none of the new variables become bound. The printout starting with "** exception error:" is not the value of the expression (the @@ -219,74 +219,74 @@ other variables (L, Str, and so on) are unchanged.

    12> P.
     * 1:1: variable 'P' is unbound
     13> Descriptor.
    -{4,abcd}

    Commands 12 and 13 show that P is unbound because the previous command failed, -and that Descriptor has not changed.

    14>{P, Q} = Descriptor.
    -{4,abcd}
    +{4,abcd}

    Commands 12 and 13 show that P is unbound because the previous command failed, +and that Descriptor has not changed.

    14>{P, Q} = Descriptor.
    +{4,abcd}
     15> P.
    -4

    Commands 14 and 15 show a correct match where P and Q are bound.

    16> f().
    -ok

    Command 16 clears all bindings.

    The next few commands assume that test1:demo(X) is defined as follows:

    demo(X) ->
    -    put(aa, worked),
    +4

    Commands 14 and 15 show a correct match where P and Q are bound.

    16> f().
    +ok

    Command 16 clears all bindings.

    The next few commands assume that test1:demo(X) is defined as follows:

    demo(X) ->
    +    put(aa, worked),
         X = 1,
    -    X + 10.
    17> put(aa, hello).
    +    X + 10.
    17> put(aa, hello).
     undefined
    -18> get(aa).
    +18> get(aa).
     hello

    Commands 17 and 18 set and inspect the value of item aa in the process -dictionary.

    19> Y = test1:demo(1).
    +dictionary.

    19> Y = test1:demo(1).
     11

    Command 19 evaluates test1:demo(1). The evaluation succeeds and the changes made in the process dictionary become visible to the shell. The new value of -dictionary item aa can be seen in command 20.

    20> get().
    -[{aa,worked}]
    -21> put(aa, hello).
    +dictionary item aa can be seen in command 20.

    20> get().
    +[{aa,worked}]
    +21> put(aa, hello).
     worked
    -22> Z = test1:demo(2).
    +22> Z = test1:demo(2).
     ** exception error: no match of right hand side value 1
          in function  test1:demo/1

    Commands 21 and 22 change the value of dictionary item aa to hello and call test1:demo(2). Evaluation fails and the changes made to the dictionary in test1:demo(2), before the error occurred, are discarded.

    23> Z.
     * 1:1: variable 'Z' is unbound
    -24> get(aa).
    +24> get(aa).
     hello

    Commands 23 and 24 show that Z was not bound and that dictionary item aa has -retained its original value.

    25> erase(), put(aa, hello).
    +retained its original value.

    25> erase(), put(aa, hello).
     undefined
    -26> spawn(test1, demo, [1]).
    +26> spawn(test1, demo, [1]).
     <0.57.0>
    -27> get(aa).
    +27> get(aa).
     hello

    Commands 25, 26, and 27 show the effect of evaluating test1:demo(1) in the background. In this case, the expression is evaluated in a newly spawned process. Any changes made in the process dictionary are local to the newly -spawned process and therefore not visible to the shell.

    28> io:format("hello hello\n").
    +spawned process and therefore not visible to the shell.

    28> io:format("hello hello\n").
     hello hello
     ok
    -29> e(28).
    +29> e(28).
     hello hello
     ok
    -30> v(28).
    +30> v(28).
     ok

    Commands 28, 29 and 30 use the history facilities of the shell. Command 29 re-evaluates command 28. Command 30 uses the value (result) of command 28. In the cases of a pure function (a function with no side effects), the result is the same. For a function with side effects, the result can be different.

    The next few commands show some record manipulation. It is assumed that ex.erl -defines a record as follows:

    -record(rec, {a, b = val()}).

    val() ->
        3.

    31> c(ex).
    -{ok,ex}
    -32> rr(ex).
    -[rec]

    Commands 31 and 32 compile file ex.erl and read the record definitions in +defines a record as follows:

    -record(rec, {a, b = val()}).

    val() ->
        3.

    31> c(ex).
    +{ok,ex}
    +32> rr(ex).
    +[rec]

    Commands 31 and 32 compile file ex.erl and read the record definitions in ex.beam. If the compiler did not output any record definitions on the BEAM -file, rr(ex) tries to read record definitions from the source file instead.

    33> rl(rec).
    --record(rec,{a,b = val()}).
    -ok

    Command 33 prints the definition of the record named rec.

    34> #rec{}.
    +file, rr(ex) tries to read record definitions from the source file instead.

    33> rl(rec).
    +-record(rec,{a,b = val()}).
    +ok

    Command 33 prints the definition of the record named rec.

    34> #rec{}.
     ** exception error: undefined shell command val/0

    Command 34 tries to create a rec record, but fails as function val/0 is -undefined.

    35> #rec{b = 3}.
    -#rec{a = undefined,b = 3}

    Command 35 shows the workaround: explicitly assign values to record fields that -cannot otherwise be initialized.

    36> rp(v(-1)).
    -#rec{a = undefined,b = 3}
    +undefined.

    35> #rec{b = 3}.
    +#rec{a = undefined,b = 3}

    Command 35 shows the workaround: explicitly assign values to record fields that +cannot otherwise be initialized.

    36> rp(v(-1)).
    +#rec{a = undefined,b = 3}
     ok

    Command 36 prints the newly created record using record definitions maintained -by the shell.

    37> rd(rec, {f = orddict:new()}).
    +by the shell.

    37> rd(rec, {f = orddict:new()}).
     rec

    Command 37 defines a record directly in the shell. The definition replaces the -one read from file ex.beam.

    38> #rec{}.
    -#rec{f = []}
    -ok

    Command 38 creates a record using the new definition, and prints the result.

    39> rd(rec, {c}), A.
    +one read from file ex.beam.

    38> #rec{}.
    +#rec{f = []}
    +ok

    Command 38 creates a record using the new definition, and prints the result.

    39> rd(rec, {c}), A.
     * 1:15: variable 'A' is unbound
    -40> #rec{}.
    -#rec{c = undefined}
    +40> #rec{}.
    +#rec{c = undefined}
     ok

    Command 39 and 40 show that record definitions are updated as side effects. The evaluation of the command fails, but the definition of rec has been carried out.

    For the next command, it is assumed that test1:loop(N) is defined as follows:

    loop(N) ->
        io:format("Hello Number: ~w~n", [N]),
        loop(N+1).

    41> test1:loop(0).
    @@ -312,31 +312,31 @@
     JCL mode the user can start and stop jobs.

    In this particular case, command i ("interrupt") terminates the looping program, and command c connects to the shell again. As the process was running in the background before we killed it, more printouts occur before message -"** exception exit: killed" is shown.

    42> E = ets:new(t, []).
    -#Ref<0.1662103692.2407923716.214192>

    Command 42 creates an ETS table.

    43> ets:insert({d,1,2}).
    +"** exception exit: killed" is shown.

    42> E = ets:new(t, []).
    +#Ref<0.1662103692.2407923716.214192>

    Command 42 creates an ETS table.

    43> ets:insert({d,1,2}).
     ** exception error: undefined function ets:insert/1

    Command 43 tries to insert a tuple into the ETS table, but the first argument -(the table) is missing. The exception kills the evaluator process.

    44> ets:insert(E, {d,1,2}).
    +(the table) is missing. The exception kills the evaluator process.

    44> ets:insert(E, {d,1,2}).
     ** exception error: argument is of wrong type
          in function  ets:insert/2
             called as ets:insert(16,{d,1,2})

    Command 44 corrects the mistake, but the ETS table has been destroyed as it was -owned by the killed evaluator process.

    45> f(E).
    +owned by the killed evaluator process.

    45> f(E).
     ok
    -46> catch_exception(true).
    +46> catch_exception(true).
     false

    Command 46 sets the exception handling of the evaluator process to true. The exception handling can also be set when starting Erlang by -erl -stdlib shell_catch_exception true.

    47> E = ets:new(t, []).
    +erl -stdlib shell_catch_exception true.

    47> E = ets:new(t, []).
     #Ref<0.1662103692.2407923716.214197>
    -48> ets:insert({d,1,2}).
    +48> ets:insert({d,1,2}).
     * exception error: undefined function ets:insert/1

    Command 48 makes the same mistake as in command 43, but this time the evaluator process lives on. The single star at the beginning of the printout signals that -the exception has been caught.

    49> ets:insert(E, {d,1,2}).
    -true

    Command 49 successfully inserts the tuple into the ETS table.

    50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
    +the exception has been caught.

    49> ets:insert(E, {d,1,2}).
    +true

    Command 49 successfully inserts the tuple into the ETS table.

    50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_default.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_default.html	2026-04-20 17:48:57.133788231 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_default.html	2026-04-20 17:48:57.133788231 +0000
    @@ -94,10 +94,10 @@
     
         

    Customizing the Erlang environment.

    The functions in this module are called when no module name is specified in a -shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
    +shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
     "cba"
    -2> c(foo).
    -{ok, foo}

    In command one, module lists is called. In command two, no module name is +2> c(foo). +{ok, foo}

    In command one, module lists is called. In command two, no module name is specified. The shell searches module user_default followed by module shell_default for function c/1.

    shell_default is intended for "system wide" customizations to the shell. user_default is intended for "local" or individual user customizations.

    Hint

    To add your own commands to the shell, create a module called user_default and @@ -196,7 +196,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_docs.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_docs.html 2026-04-20 17:48:57.169788454 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/shell_docs.html 2026-04-20 17:48:57.169788454 +0000 @@ -1261,7 +1261,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/slave.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/slave.html 2026-04-20 17:48:57.209788702 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/slave.html 2026-04-20 17:48:57.205788677 +0000 @@ -340,7 +340,7 @@ at a master node. A pseudo server is an intermediary that only has the same registered name as the real server.

    For example, if you have started a slave node N and want to execute pxw graphics code on this node, you can start server pxw_server as a pseudo server -at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
    +at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
    @@ -494,9 +494,9 @@ passed to the new node and can be used for a variety of purposes; see erl(1).

    As an example, suppose that you want to start a slave node at host H with node name Name@H and want the slave node to have the following properties:

    • Directory Dir is to be added to the code path.
    • The Mnesia directory is to be set to M.
    • The Unix DISPLAY environment variable is to be set to the display of the -master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
    +master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
     Arg = "-mnesia_dir " ++ M ++ " -pa " ++ Dir ++ E,
    -slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, +slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, otherwise {error, Reason}, where Reason can be one of:

    • timeout - The master node failed to get in contact with the slave node. This can occur in a number of circumstances:

      • Erlang/OTP is not installed on the remote host.
      • The file system on the other host has a different structure to the the master.
      • The Erlang nodes have different cookies.
    • no_rsh - No remote shell program was found on the computer. Note that @@ -675,7 +675,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sofs.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sofs.html 2026-04-20 17:48:57.301789273 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sofs.html 2026-04-20 17:48:57.301789273 +0000 @@ -227,16 +227,16 @@ selecting, duplicating, or rearranging parts of the elements.
    • Specifying a SetFun as an integer I is equivalent to specifying {external, fun(X) -> element(I, X) end}, but is to be preferred, as it makes it possible to handle this case even more efficiently.

    Examples of valid SetFuns:

    fun sofs:union/1
    -fun(S) -> sofs:partition(1, S) end
    -fun(S) -> sofs:from_term(sofs:no_elements(S)) end
    -{external, fun(A) -> A end}
    -{external, fun({A,_,C}) -> {C,A} end}
    -{external, fun({_,{_,C}}) -> C end}
    -{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
    +fun(S) -> sofs:partition(1, S) end
    +fun(S) -> sofs:from_term(sofs:no_elements(S)) end
    +{external, fun(A) -> A end}
    +{external, fun({A,_,C}) -> {C,A} end}
    +{external, fun({_,{_,C}}) -> C end}
    +{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
     2

    Examples of invalid SetFuns:

    fun sofs:no_elements/1
    -{external, fun(A) -> 2 * A end}
    -{external, fun({A,B,C}) -> A + B + C end}
    -{external, fun lists:sum/1}

    The order in which a SetFun is applied to the elements of an unordered set is +{external, fun(A) -> 2 * A end} +{external, fun({A,B,C}) -> A + B + C end} +{external, fun lists:sum/1}

    The order in which a SetFun is applied to the elements of an unordered set is not specified, and can change in future versions of this module.

    The execution time of the functions of this module is dominated by the time it takes to sort lists. When no sorting is needed, the execution time is in the worst case proportional to the sum of the sizes of the input arguments and the @@ -1742,9 +1742,9 @@

    Creates a function.

    a_function(F, T) is equivalent to -from_term(F, T) if the result is a function.

    Examples

    1> sofs:is_a_function(sofs:a_function([{1,a},{2,b},{3,c}])).
    +from_term(F, T) if the result is a function.

    Examples

    1> sofs:is_a_function(sofs:a_function([{1,a},{2,b},{3,c}])).
     true
    -2> sofs:a_function([{1,a},{1,b}]).
    +2> sofs:a_function([{1,a},{1,b}]).
     ** exception error: bad_function
          in function  sofs:a_function/1
    @@ -1779,10 +1779,10 @@ belongs to SetOfSets and E belongs to Set.

    If SetOfSets is a partition of a set X and R is the equivalence relation in X induced by SetOfSets, then the returned relation is the canonical map from X onto the equivalence classes with -respect to R.

    Examples

    1> Ss = sofs:from_term([[a,b],[b,c]]).
    -2> CR = sofs:canonical_relation(Ss).
    -3> sofs:to_external(CR).
    -[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    +respect to R.

    Examples

    1> Ss = sofs:from_term([[a,b],[b,c]]).
    +2> CR = sofs:canonical_relation(Ss).
    +3> sofs:to_external(CR).
    +[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    @@ -1812,12 +1812,12 @@

    Returns the composite of the functions Function1 and -Function2.

    Examples

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]).
    -2> F2 = sofs:a_function([{1,x},{2,y},{3,z}]).
    -3> F = sofs:composite(F1, F2).
    -4> sofs:to_external(F).
    -[{a,x},{b,y},{c,y}]
    -5> sofs:composite(F2, F1).
    +Function2.

    Examples

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]).
    +2> F2 = sofs:a_function([{1,x},{2,y},{3,z}]).
    +3> F = sofs:composite(F1, F2).
    +4> sofs:to_external(F).
    +[{a,x},{b,y},{c,y}]
    +5> sofs:composite(F2, F1).
     ** exception error: bad_function
          in function  sofs:composite/2
    @@ -1849,11 +1849,11 @@

    Creates the function that maps each element of set Set -onto AnySet.

    Examples

    1> S = sofs:set([a,b]).
    -2> E = sofs:from_term(1).
    -3> R = sofs:constant_function(S, E).
    -4> sofs:to_external(R).
    -[{a,1},{b,1}]
    +onto AnySet.

    Examples

    1> S = sofs:set([a,b]).
    +2> E = sofs:from_term(1).
    +3> R = sofs:constant_function(S, E).
    +4> sofs:to_external(R).
    +[{a,1},{b,1}]
    @@ -1882,10 +1882,10 @@

    Returns the converse of the binary relation BinRel1.

    See inverse/1 for a similar function that applies only to invertible -functions.

    Examples

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]).
    -2> R2 = sofs:converse(R1).
    -3> sofs:to_external(R2).
    -[{a,1},{a,3},{b,2}]
    +functions.

    Examples

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]).
    +2> R2 = sofs:converse(R1).
    +3> sofs:to_external(R2).
    +[{a,1},{a,3},{b,2}]
    @@ -1913,12 +1913,12 @@ -

    Returns the difference of the sets Set1 and Set2.

    Examples

    1> S0 = sofs:set([a,b,c,d]).
    -2> S1 = sofs:set([c,d,e,f]).
    -3> sofs:to_external(sofs:difference(S0, S1)).
    -[a,b]
    -4> sofs:to_external(sofs:difference(S1, S0)).
    -[e,f]
    +

    Returns the difference of the sets Set1 and Set2.

    Examples

    1> S0 = sofs:set([a,b,c,d]).
    +2> S1 = sofs:set([c,d,e,f]).
    +3> sofs:to_external(sofs:difference(S0, S1)).
    +[a,b]
    +4> sofs:to_external(sofs:difference(S1, S0)).
    +[e,f]
    @@ -1980,15 +1980,15 @@ a. It is assumed that Type is a valid type of the external set of the family.

    If G is a directed graph, it holds that the vertices and edges of G are the same as the vertices and edges of -family_to_digraph(digraph_to_family(G)).

    Examples

    1> G = digraph:new().
    -2> digraph:add_vertex(G, 1).
    -3> digraph:add_vertex(G, a).
    -4> digraph:add_vertex(G, b).
    -5> digraph:add_edge(G, 1, a).
    -6> digraph:add_edge(G, 1, b).
    -7> F = sofs:digraph_to_family(G).
    -8> sofs:to_external(F).
    -[{1,[a,b]},{a,[]},{b,[]}]
    +family_to_digraph(digraph_to_family(G)).

    Examples

    1> G = digraph:new().
    +2> digraph:add_vertex(G, 1).
    +3> digraph:add_vertex(G, a).
    +4> digraph:add_vertex(G, b).
    +5> digraph:add_edge(G, 1, a).
    +6> digraph:add_edge(G, 1, b).
    +7> F = sofs:digraph_to_family(G).
    +8> sofs:to_external(F).
    +[{1,[a,b]},{a,[]},{b,[]}]
    @@ -2016,10 +2016,10 @@ -

    Returns the domain of the binary relation BinRel.

    Examples

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]).
    -2> S = sofs:domain(R).
    -3> sofs:to_external(S).
    -[1,2]
    +

    Returns the domain of the binary relation BinRel.

    Examples

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]).
    +2> S = sofs:domain(R).
    +3> sofs:to_external(S).
    +[1,2]
    @@ -2049,11 +2049,11 @@

    Returns the difference between the binary relation BinRel1 and the -restriction of BinRel1 to Set.

    Examples

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]).
    -2> S = sofs:set([2,4,6]).
    -3> R2 = sofs:drestriction(R1, S).
    -4> sofs:to_external(R2).
    -[{1,a},{3,c}]

    drestriction(R, S) is equivalent to +restriction of BinRel1 to Set.

    Examples

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]).
    +2> S = sofs:set([2,4,6]).
    +3> R2 = sofs:drestriction(R1, S).
    +4> sofs:to_external(R2).
    +[{1,a},{3,c}]

    drestriction(R, S) is equivalent to difference(R, restriction(R, S)).

    @@ -2084,12 +2084,12 @@

    Returns a subset of Set1 containing those elements that do not give an element -in Set2 as the result of applying SetFun.

    Examples

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end}.
    -2> R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]).
    -3> R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]).
    -4> R3 = sofs:drestriction(SetFun, R1, R2).
    -5> sofs:to_external(R3).
    -[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to +in Set2 as the result of applying SetFun.

    Examples

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end}.
    +2> R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]).
    +3> R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]).
    +4> R3 = sofs:drestriction(SetFun, R1, R2).
    +5> sofs:to_external(R3).
    +[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to difference(S1, restriction(F, S1, S2)).

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/argparse.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -35,20 +35,20 @@ example below is a fully functioning Erlang program accepting two command line arguments and printing their product.

    #!/usr/bin/env escript
     
    -main(Args) ->
    -    argparse:run(Args, cli(), #{progname => mul}).
    +main(Args) ->
    +    argparse:run(Args, cli(), #{progname => mul}).
     
    -cli() ->
    -    #{
    -        arguments => [
    -            #{name => left, type => integer},
    -            #{name => right, type => integer}
    -        ],
    +cli() ->
    +    #{
    +        arguments => [
    +            #{name => left, type => integer},
    +            #{name => right, type => integer}
    +        ],
             handler =>
    -            fun (#{left := Left, right := Right}) ->
    -                io:format("~b~n", [Left * Right])
    +            fun (#{left := Left, right := Right}) ->
    +                io:format("~b~n", [Left * Right])
                 end
    -    }.

    Running this script with no arguments results in an error, accompanied by the + }.

    Running this script with no arguments results in an error, accompanied by the usage information.

    The cli function defines a single command with embedded handler accepting a map. Keys of the map are argument names as defined by the argument field of the command, left and right in the example. Values are taken from the @@ -56,25 +56,25 @@ specification. Both arguments in the example above are required (and therefore defined as positional).

    Command hierarchy

    A command may contain nested commands, forming a hierarchy. Arguments defined at the upper level command are automatically added to all nested commands. Nested -commands example (assuming progname is nested):

    cli() ->
    -  #{
    +commands example (assuming progname is nested):

    cli() ->
    +  #{
         %% top level argument applicable to all commands
    -    arguments => [#{name => top}],
    -      commands => #{
    -        "first" => #{
    +    arguments => [#{name => top}],
    +      commands => #{
    +        "first" => #{
               %% argument applicable to "first" command and
               %%  all commands nested into "first"
    -          arguments => [#{name => mid}],
    -          commands => #{
    -            "second" => #{
    +          arguments => [#{name => mid}],
    +          commands => #{
    +            "second" => #{
                   %% argument only applicable for "second" command
    -              arguments => [#{name => bottom}],
    -              handler => fun (A) -> io:format("~p~n", [A]) end
    -          }
    -        }
    -      }
    -    }
    -  }.

    In the example above, a 3-level hierarchy is defined. First is the script itself + arguments => [#{name => bottom}], + handler => fun (A) -> io:format("~p~n", [A]) end + } + } + } + } + }.

    In the example above, a 3-level hierarchy is defined. First is the script itself (nested), accepting the only argument top. Since it has no associated handler, run/3 will not accept user input omitting nested command selection. For this example, user has to supply 5 arguments in the command line, two being @@ -86,14 +86,14 @@ on all operating systems). Both options and positional arguments have 1 or more associated values. See argument specification to find more details about supported combinations.

    In the user input, short options may be concatenated with their values. Long -options support values separated by =. Consider this definition:

    cli() ->
    -  #{
    -    arguments => [
    -      #{name => long, long => "-long"},
    -      #{name => short, short => $s}
    -    ],
    -    handler => fun (Args) -> io:format("~p~n", [Args]) end
    -  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running +options support values separated by =. Consider this definition:

    cli() ->
    +  #{
    +    arguments => [
    +      #{name => long, long => "-long"},
    +      #{name => short, short => $s}
    +    ],
    +    handler => fun (Args) -> io:format("~p~n", [Args]) end
    +  }.

    Running ./args --long=VALUE prints #{long => "VALUE"}, running ./args -sVALUE prints #{short => "VALUE"}

    argparse supports boolean flags concatenation: it is possible to shorten -r -f -v to -rfv.

    Shortened option names are not supported: it is not possible to use --my-argum instead of --my-argument-name even when such option can be unambiguously @@ -513,111 +513,111 @@ which case resulting argument map will either contain the default value, or not have the key at all.

    • name - Sets the argument name in the parsed argument map. If help is not defined, name is also used to generate the default usage message.

    • short - Defines a short (single character) form of an optional argument.

      %% Define a command accepting argument named myarg, with short form $a:
      -1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
      +1> Cmd = #{arguments => [#{name => myarg, short => $a}]}.
       %% Parse command line "-a str":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-a", "str"], Cmd), ArgMap.
       
      -#{myarg => "str"}
      +#{myarg => "str"}
       
       %% Option value can be concatenated with the switch: "-astr"
      -3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-astr"], Cmd), ArgMap.
       
      -#{myarg => "str"}

      By default all options expect a single value following the option switch. The -only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
      +#{myarg => "str"}

      By default all options expect a single value following the option switch. The +only exception is an option of a boolean type.

    • long - Defines a long form of an optional argument.

      1> Cmd = #{arguments => [#{name => myarg, long => "name"}]}.
       %% Parse command line "-name Erlang":
      -2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
      +2> {ok, ArgMap, _, _} = argparse:parse(["-name", "Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}
      +#{myarg => "Erlang"}
       %% Or use "=" to separate the switch and the value:
      -3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
      +3> {ok, ArgMap, _, _} = argparse:parse(["-name=Erlang"], Cmd), ArgMap.
       
      -#{myarg => "Erlang"}

      If neither short not long is defined, the argument is treated as +#{myarg => "Erlang"}

    If neither short not long is defined, the argument is treated as positional.

  • required - Forces the parser to expect the argument to be present in the command line. By default, all positional argument are required, and all options are not.

  • default - Specifies the default value to put in the parsed argument map -if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
    +if the value is not supplied in the command line.

    1> argparse:parse([], #{arguments => [#{name => myarg, short => $m}]}).
     
    -{ok,#{}, ...
    -2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
    +{ok,#{}, ...
    +2> argparse:parse([], #{arguments => [#{name => myarg, short => $m, default => "def"}]}).
     
    -{ok,#{myarg => "def"}, ...
  • type - Defines type conversion and validation routine. The default is +{ok,#{myarg => "def"}, ...

  • type - Defines type conversion and validation routine. The default is string, assuming no conversion.

  • nargs - Defines the number of following arguments to consume from the command line. By default, the parser consumes the next argument and converts it into an Erlang term according to the specified type.

    • pos_integer/0 - Consume exactly this number of positional arguments, fail if there is not enough. Value in the argument map contains a list of exactly this length. Example, defining a positional argument expecting 3 -integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      -argparse:parse(["1", "2", "3"], Cmd).
      +integer values:

      1> Cmd = #{arguments => [#{name => ints, type => integer, nargs => 3}]},
      +argparse:parse(["1", "2", "3"], Cmd).
       
      -{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two -string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      -argparse:parse(["-env", "key", "value"], Cmd).
      +{ok, #{ints => [1, 2, 3]}, ...

      Another example defining an option accepted as -env and expecting two +string arguments:

      1> Cmd = #{arguments => [#{name => env, long => "env", nargs => 2}]},
      +argparse:parse(["-env", "key", "value"], Cmd).
       
      -{ok, #{env => ["key", "value"]}, ...
    • list - Consume all following arguments until hitting the next option +{ok, #{env => ["key", "value"]}, ...

  • list - Consume all following arguments until hitting the next option (starting with an option prefix). May result in an empty list added to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => nodes, long => "nodes", nargs => list},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => nodes, long => "nodes", nargs => list},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-nodes", "one", "two", "-v"], Cmd).
     
    -{ok, #{nodes => ["one", "two"], verbose => true}, ...
  • nonempty_list - Same as list, but expects at least one argument. +{ok, #{nodes => ["one", "two"], verbose => true}, ...

  • nonempty_list - Same as list, but expects at least one argument. Returns an error if the following command line argument is an option switch (starting with the prefix).

  • 'maybe' - Consumes the next argument from the command line, if it does not start with an option prefix. Otherwise, adds a default value to the -arguments map.

    1> Cmd = #{arguments => [
    -  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    -  #{name => verbose, short => $v, type => boolean}
    -]},
    -argparse:parse(["-l", "info", "-v"], Cmd).
    +arguments map.

    1> Cmd = #{arguments => [
    +  #{name => level, short => $l, nargs => 'maybe', default => "error"},
    +  #{name => verbose, short => $v, type => boolean}
    +]},
    +argparse:parse(["-l", "info", "-v"], Cmd).
     
    -{ok,#{level => "info",verbose => true}, ...
    +{ok,#{level => "info",verbose => true}, ...
     
     %% When "info" is omitted, argument maps receives the default "error"
    -2> argparse:parse(["-l", "-v"], Cmd).
    +2> argparse:parse(["-l", "-v"], Cmd).
     
    -{ok,#{level => "error",verbose => true}, ...
  • {'maybe', term()} - Consumes the next argument from the command line, +{ok,#{level => "error",verbose => true}, ...

  • {'maybe', term()} - Consumes the next argument from the command line, /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/array.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/array.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/array.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -30,14 +30,14 @@ reset/2). If you need to differentiate between unset and set entries, ensure that the default value cannot be confused with the values of set entries.

    The array never shrinks automatically. If an index I has been used to set an entry successfully, all indices in the range [0,I] stay accessible unless the -array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    -10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow -automatically:

    A1 = array:set(17, true, array:new()).
    -18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if -the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    -[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses -beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    -{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    +array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    +10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow +automatically:

    A1 = array:set(17, true, array:new()).
    +18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if +the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    +[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses +beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    +{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    @@ -1062,7 +1062,7 @@ array size; this also implies {fixed, true}. If N is not a non-negative integer, the call fails with reason badarg.

  • fixed or {fixed, true} - Creates a fixed-size array. See also fix/1.

  • {fixed, false} - Creates an extendible (non-fixed-size) array.

  • {default, Value} - Sets the default value for the array to Value.

  • Options are processed in the order they occur in the list, that is, later options have higher precedence.

    The default value is used as the value of uninitialized entries, and cannot be -changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    +changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    @@ -1095,7 +1095,7 @@ Options override parameter Size.

    If Options is a list, this is equivalent to new([{size, Size} | Options]), otherwise it is equivalent to new([{size, Size} | [Options]]). However, using this function -directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    +directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -18,7 +18,7 @@

    assert.hrl

    Assert macros.

    Description

    The include file assert.hrl provides macros for inserting assertions in your -program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an +program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an assertion fails, an exception of type error is generated. The associated error term has the form {Macro, Info}. Macro is the macro name, for example, assertEqual. Info is a list of tagged values, such as @@ -40,7 +40,7 @@ use ASSERT/NOASSERT to control only the assert macros.

    Macros

    • assert(BoolExpr)

    • assert(BoolExpr, Comment) - Tests that BoolExpr completes normally returning true.

    • assertNot(BoolExpr)

    • assertNot(BoolExpr, Comment) - Tests that BoolExpr completes normally returning false.

    • assertMatch(GuardedPattern, Expr)

    • assertMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes -normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr +normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes normally yielding a value that does not match GuardedPattern.

      As in assertMatch, GuardedPattern can have a when part.

    • assertEqual(ExpectedValue, Expr)

    • assertEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is exactly equal to ExpectedValue.

    • assertNotEqual(ExpectedValue, Expr)

    • assertNotEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is not exactly equal to /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/base64.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/base64.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/base64.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -549,16 +549,16 @@

      Decodes a base64 string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

      The function will strip away any whitespace characters and check for the -the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
      -<<1,2,3,4>>
      -2> base64:decode("AQ ID BA==").
      -<<1,2,3,4>>
      -3> base64:decode("AQIDBA=").
      +the correct number of = padding characters at the end of the encoded string.

      See decode_options/0 for details on which options can be passed.

      Example:

      1> base64:decode("AQIDBA==").
      +<<1,2,3,4>>
      +2> base64:decode("AQ ID BA==").
      +<<1,2,3,4>>
      +3> base64:decode("AQIDBA=").
       ** exception error: missing_padding
            in function  base64:decode_list/7 (base64.erl, line 734)
               *** data to decode is missing final = padding characters, if this is intended, use the `padding => false` option
      -4> base64:decode("AQIDBA=", #{ padding => false }).
      -<<1,2,3,4>>
      +4>
      base64:decode("AQIDBA=", #{ padding => false }). +<<1,2,3,4>>
    @@ -812,10 +812,10 @@

    Decodes a base64 "mime" string encoded using the standard alphabet according to RFC 4648 Section 4 to plain ASCII.

    The function will strip away any illegal characters. It does not check for the -the correct number of = padding characters at the end of the encoded string.

    See decode_options/0 for details on which options can be passed.

    Example:

    1> base64:mime_decode("AQIDBA==").
    -<<1,2,3,4>>
    -2> base64:mime_decode("AQIDB=A=").
    -<<1,2,3,4>>
    +the correct number of = padding characters at the end of the encoded string.

    See decode_options/0 for details on which options can be passed.

    Example:

    1> base64:mime_decode("AQIDBA==").
    +<<1,2,3,4>>
    +2> base64:mime_decode("AQIDB=A=").
    +<<1,2,3,4>>
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -33,8 +33,8 @@ Tools such as Debugger and Xref require the debug information to be included.

    Warning

    Source code can be reconstructed from the debug information. To prevent this, use encrypted debug information (see below).

    The debug information can also be removed from BEAM files using strip/1, strip_files/1, and/or strip_release/1.

    Reconstruct Source Code

    The following example shows how to reconstruct Erlang source code from the debug -information in a BEAM file Beam:

    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
    -io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

    Encrypted Debug Information

    The debug information can be encrypted to keep the source code secret, but still +information in a BEAM file Beam:

    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
    +io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

    Encrypted Debug Information

    The debug information can be encrypted to keep the source code secret, but still be able to use tools such as Debugger or Xref.

    To use encrypted debug information, a key must be provided to the compiler and beam_lib. The key is specified as a string. It is recommended that the string contains at least 32 characters and that both upper and lower case letters as @@ -54,13 +54,13 @@ user's home directory and then filename:basedir(user_config, "erlang"). If the file is found and contains a key, beam_lib implicitly creates a crypto key fun -and registers it.

    File .erlang.crypt is to contain a single list of tuples:

    {debug_info, Mode, Module, Key}

    Mode is the type of crypto algorithm; currently, the only allowed value is +and registers it.

    File .erlang.crypt is to contain a single list of tuples:

    {debug_info, Mode, Module, Key}

    Mode is the type of crypto algorithm; currently, the only allowed value is des3_cbc. Module is either an atom, in which case Key is only used for the module Module, or [], in which case Key is used for all modules. Key is the non-empty key string.

    Key in the first tuple where both Mode and Module match is used.

    The following is an example of an .erlang.crypt file that returns the same key -for all modules:

    [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    The following is a slightly more complicated example of an .erlang.crypt -providing one key for module t and another key for all other modules:

    [{debug_info, des3_cbc, t, "My KEY"},
    - {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    Note

    Do not use any of the keys in these examples. Use your own keys.

    +for all modules:

    [{debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    The following is a slightly more complicated example of an .erlang.crypt +providing one key for module t and another key for all other modules:

    [{debug_info, des3_cbc, t, "My KEY"},
    + {debug_info, des3_cbc, [], "%>7}|pc/DM6Cga*68$Mw]L#&_Gejr]G^"}].

    Note

    Do not use any of the keys in these examples. Use your own keys.

    @@ -1451,11 +1451,11 @@

    Registers an unary fun that is called if beam_lib must read an debug_info chunk that has been encrypted. The fun is held in a process that is started by the function.

    If a fun is already registered when attempting to register a fun, -{error, exists} is returned.

    The fun must handle the following arguments:

    CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

    Called when the fun is registered, in the process that holds the fun. Here the +{error, exists} is returned.

    The fun must handle the following arguments:

    CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

    Called when the fun is registered, in the process that holds the fun. Here the crypto key fun can do any necessary initializations. If {ok, NewCryptoKeyFun} is returned, NewCryptoKeyFun is registered instead of CryptoKeyFun. If {error, Term} is returned, the registration is aborted and -crypto_key_fun/1 also returns {error, Term}.

    CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for module Module in the file named Filename. +crypto_key_fun/1 also returns {error, Term}.

    CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for module Module in the file named Filename. Mode is the type of crypto algorithm; currently, the only possible value is des3_cbc. The call is to fail (raise an exception) if no key is available.

    CryptoKeyFun(clear) -> term()

    Called before the fun is unregistered. Here any cleaning up can be done. The return value is not important, but is passed back to the caller of @@ -1822,14 +1822,14 @@ -vsn(Vsn).

    If this attribute is not specified, the version defaults to the checksum of the module. Notice that if version Vsn is not a list, it is made into one, that is {ok,{Module,[Vsn]}} is returned. If there are many -vsn -module attributes, the result is the concatenated list of versions.

    Examples:

    1> beam_lib:version(a). % -vsn(1).
    -{ok,{a,[1]}}
    -2> beam_lib:version(b). % -vsn([1]).
    -{ok,{b,[1]}}
    -3> beam_lib:version(c). % -vsn([1]). -vsn(2).
    -{ok,{c,[1,2]}}
    -4> beam_lib:version(d). % no -vsn attribute
    -{ok,{d,[275613208176997377698094100858909383631]}}
    +module attributes, the result is the concatenated list of versions.

    Examples:

    1> beam_lib:version(a). % -vsn(1).
    +{ok,{a,[1]}}
    +2> beam_lib:version(b). % -vsn([1]).
    +{ok,{b,[1]}}
    +3> beam_lib:version(c). % -vsn([1]). -vsn(2).
    +{ok,{c,[1,2]}}
    +4> beam_lib:version(d). % no -vsn attribute
    +{ok,{d,[275613208176997377698094100858909383631]}}
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/binary.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/binary.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/binary.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -502,11 +502,11 @@

    Returns the byte at position Pos (zero-based) in binary Subject as an integer.

    If Pos >= byte_size(Subject), a badarg exception -is raised.

    Examples

    1> binary:at(<<5,19,72,33>>, 0).
    +is raised.

    Examples

    1> binary:at(<<5,19,72,33>>, 0).
     5
    -2> binary:at(<<5,19,72,33>>, 1).
    +2> binary:at(<<5,19,72,33>>, 1).
     19
    -3> binary:at(<<5,19,72,33>>, 4).
    +3> binary:at(<<5,19,72,33>>, 4).
     ** exception error: bad argument
          in function  binary:at/2
             called as binary:at(<<5,19,72,33>>,4)
    @@ -540,8 +540,8 @@

    Converts Subject to a list of byte()s, each -representing the value of one byte.

    Examples

    1> binary:bin_to_list(<<"erlang",0>>).
    -[101,114,108,97,110,103,0]
    +representing the value of one byte.

    Examples

    1> binary:bin_to_list(<<"erlang",0>>).
    +[101,114,108,97,110,103,0]
    @@ -603,10 +603,10 @@

    Converts part of Subject to a list of byte/0s, each representing -the value of one byte.

    Pos and Len denote which part of the Subject binary to convert.

    Examples

    1> binary:bin_to_list(<<"erlang">>, 1, 3).
    +the value of one byte.

    Pos and Len denote which part of the Subject binary to convert.

    Examples

    1> binary:bin_to_list(<<"erlang">>, 1, 3).
     "rla"
     %% or [114,108,97] in list notation.
    -2> binary:bin_to_list(<<"erlang">>, 5, 3).
    +2> binary:bin_to_list(<<"erlang">>, 5, 3).
     ** exception error: bad argument
          in function  binary:bin_to_list/3
             called as binary:bin_to_list(<<"erlang">>,5,3)
    @@ -653,9 +653,9 @@
     binary is specified, the set has only one element. The order of alternatives in
     a pattern is not significant.

    The list of binaries used for search alternatives must be flat, proper, and non-empty.

    If Pattern is not a binary or a flat proper non-empty list of binaries with -length greater than 0, a badarg exception is raised.

    Examples

    1> Pat = binary:compile_pattern(~"rain").
    -2> binary:match(~"the rain in spain", Pat).
    -{4,4}
    +length greater than 0, a badarg exception is raised.

    Examples

    1> Pat = binary:compile_pattern(~"rain").
    +2> binary:match(~"the rain in spain", Pat).
    +{4,4}
    @@ -692,13 +692,13 @@ more binary data than needed. In general, sharing binary data is beneficial.

    Only in special cases — when small parts reference large binaries and the large binaries are no longer used in any process — can deliberate copying be -beneficial.

    Examples

    1> HugeBinary = <<0:100_000/unit:8>>.
    -2> byte_size(HugeBinary).
    +beneficial.

    Examples

    1> HugeBinary = <<0:100_000/unit:8>>.
    +2> byte_size(HugeBinary).
     100000
    -3> Part = binary:part(HugeBinary, 0, 5).
    -<<0,0,0,0,0>>
    -4> Copy = binary:copy(Part).
    -<<0,0,0,0,0>>
    +3>
    Part = binary:part(HugeBinary, 0, 5). +<<0,0,0,0,0>> +4> Copy = binary:copy(Part). +<<0,0,0,0,0>>
    @@ -728,8 +728,8 @@ -

    Creates a binary with the content of Subject duplicated N times.

    This function always creates a new binary, even when N is 1.

    Examples

    1> binary:copy(~"-", 10).
    -<<"----------">>
    +

    Creates a binary with the content of Subject duplicated N times.

    This function always creates a new binary, even when N is 1.

    Examples

    1> binary:copy(~"-", 10).
    +<<"----------">>
    @@ -760,9 +760,9 @@

    Decodes a hex-encoded binary into a binary.

    An exception is raised if the size of the binary is not evenly divisble by two, -or if the binary contains any characters that do not represent hex digits.

    Examples

    1> binary:decode_hex(<<"666f6f">>).
    -<<"foo">>
    -2> binary:decode_hex(<<"A">>).
    +or if the binary contains any characters that do not represent hex digits.

    Examples

    1> binary:decode_hex(<<"666f6f">>).
    +<<"foo">>
    +2> binary:decode_hex(<<"A">>).
     ** exception error: bad argument
          in function  binary:decode_hex/1
             called as binary:decode_hex(<<"A">>)
    @@ -831,15 +831,15 @@
           
     
     

    Converts the binary digit representation, in big endian or little endian, of a -positive integer in Subject to an Erlang integer/0.

    Examples

    1> binary:decode_unsigned(<<7>>).
    +positive integer in Subject to an Erlang integer/0.

    Examples

    1> binary:decode_unsigned(<<7>>).
     7
    -2> binary:decode_unsigned(<<1,0>>).
    +2> binary:decode_unsigned(<<1,0>>).
     256
    -3> binary:decode_unsigned(<<169,138,199>>).
    +3> binary:decode_unsigned(<<169,138,199>>).
     11111111
    -4> binary:decode_unsigned(<<169,138,199>>, big).
    +4> binary:decode_unsigned(<<169,138,199>>, big).
     11111111
    -5> binary:decode_unsigned(<<169,138,199>>, little).
    +5> binary:decode_unsigned(<<169,138,199>>, little).
     13077161
    @@ -902,12 +902,12 @@

    Encodes a binary into a hex-encoded binary using the specified case for the -hexadecimal digits "a" to "f".

    Examples

    1> binary:encode_hex(<<"foo">>, uppercase).
    -<<"666F6F">>
    -2> binary:encode_hex(<<"/">>, uppercase).
    -<<"2F">>
    -3> binary:encode_hex(<<"/">>, lowercase).
    -<<"2f">>
    +hexadecimal digits "a" to "f".

    Examples

    1> binary:encode_hex(<<"foo">>, uppercase).
    +<<"666F6F">>
    +2> binary:encode_hex(<<"/">>, uppercase).
    +<<"2F">>
    +3> binary:encode_hex(<<"/">>, lowercase).
    +<<"2f">>
    @@ -970,18 +970,18 @@

    Converts a non-negative integer into the smallest possible unsigned binary representation, using either big-endian or little-endian format.

    If Unsigned is not a non-negative integer, a badarg exception is -raised.

    Examples

    1> binary:encode_unsigned(0, big).
    -<<0>>
    -2> binary:encode_unsigned(255, big).
    -<<255>>
    -3> binary:encode_unsigned(256, big).
    -<<1,0>>
    -4> binary:encode_unsigned(256, little).
    -<<0,1>>
    -5> binary:encode_unsigned(11111111, big).
    -<<169,138,199>>
    -6> binary:encode_unsigned(11111111, little).
    -<<199,138,169>>
    +raised.

    Examples

    1> binary:encode_unsigned(0, big).
    +<<0>>
    +2> binary:encode_unsigned(255, big).
    +<<255>>
    +3> binary:encode_unsigned(256, big).
    +<<1,0>>
    +4> binary:encode_unsigned(256, little).
    +<<0,1>>
    +5> binary:encode_unsigned(11111111, big).
    +<<169,138,199>>
    +6> binary:encode_unsigned(11111111, little).
    +<<199,138,169>>
    @@ -1011,9 +1011,9 @@ -

    Returns the first byte of binary Subject as an integer.

    If the size of Subject is zero, a badarg exception is raised.

    Examples

    1> binary:first(<<42,99,100>>).
    +

    Returns the first byte of binary Subject as an integer.

    If the size of Subject is zero, a badarg exception is raised.

    Examples

    1> binary:first(<<42,99,100>>).
     42
    -2> binary:first(<<>>).
    +2> binary:first(<<>>).
     ** exception error: bad argument
          in function  binary:first/1
             called as binary:first(<<>>)
    @@ -1047,8 +1047,8 @@
     
           
     
    -

    Joins a list of binaries together by a specified Separator.

    Equivalent to iolist_to_binary(lists:join(Separator, Binaries)), but faster.

    Examples

    1> binary:join([<<"a">>, <<"b">>, <<"c">>], <<", ">>).
    -<<"a, b, c">>
    +

    Joins a list of binaries together by a specified Separator.

    Equivalent to iolist_to_binary(lists:join(Separator, Binaries)), but faster.

    Examples

    1> binary:join([<<"a">>, <<"b">>, <<"c">>], <<", ">>).
    +<<"a, b, c">>
    @@ -1078,9 +1078,9 @@ -

    Returns the last byte of binary Subject as an integer.

    If the size of Subject is zero, a badarg exception is raised.

    Examples

    1> binary:last(<<42,99,100>>).
    +

    Returns the last byte of binary Subject as an integer.

    If the size of Subject is zero, a badarg exception is raised.

    Examples

    1> binary:last(<<42,99,100>>).
     100
    -2> binary:last(<<>>).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/calendar.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/calendar.xhtml	2026-04-20 15:17:37.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/calendar.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -1816,13 +1816,13 @@
     

    Converts an RFC 3339 timestamp into system time. The data format of RFC 3339 timestamps is described by RFC 3339. Starting from OTP 25.1, the minutes part of the time zone is optional.

    Valid option:

    • {unit, Unit} - The time unit of the return value. The default is -second.
    1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
    +second.
    1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
     1517498278
    -2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
    -   [{unit, nanosecond}]).
    +2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
    +   [{unit, nanosecond}]).
     1517498282088000000
    -3> calendar:rfc3339_to_system_time(<<"2018-02-01 15:18:02.088Z">>,
    -   [{unit, nanosecond}]).
    +3> calendar:rfc3339_to_system_time(<<"2018-02-01 15:18:02.088Z">>,
    +   [{unit, nanosecond}]).
     1517498282088000000
    @@ -1994,20 +1994,20 @@ second digits is three, six, or nine depending on what time unit is chosen. For native three fractional digits are included. Notice that trailing zeros are not removed from the fraction.

  • {return, Return} - The desired encoding type for the output, -whether a string or a binary is desired. Defaults to string.

  • 1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
    +whether a string or a binary is desired. Defaults to string.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
     "2018-04-23T14:56:28+02:00"
    -2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, "-02:00"}]).
    +2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, "-02:00"}]).
     "2018-04-23T10:56:52-02:00"
    -3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, -7200}]).
    +3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, -7200}]).
     "2018-04-23T10:57:05-02:00"
    -4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
    +4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    +   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
     "2018-04-23 12:57:20.482Z"
    -5> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}, {return, binary}]).
    -<<"2018-04-23 12:57:20.482Z">>
    +5>
    calendar:system_time_to_rfc3339(erlang:system_time(millisecond), + [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}, {return, binary}]). +<<"2018-04-23 12:57:20.482Z">>
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/content.opf 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/content.opf 2042-05-23 04:35:58.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> stdlib - 7.3 - urn:uuid:b390887f-39e7-473b-37f5-f45a19d5950f + urn:uuid:ebbdfe8b-1f2a-53b6-2bc8-b321bca5ffc3 en - 2026-04-20T15:17:36Z + 2042-05-23T04:35:57Z /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/custom_shell.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/custom_shell.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/custom_shell.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -32,20 +32,20 @@ started by default in -noshell mode, so we don't have to do anything special here. To start the custom shell we then call shell:start_interactive/1.

    #!/usr/bin/env escript
     %% pshell.es
    --export([start/0]).
    -main(_Args) ->
    -    shell:start_interactive({?MODULE, start, []}),
    -    timer:sleep(infinity). %% Make sure the escript does not exit
    +-export([start/0]).
    +main(_Args) ->
    +    shell:start_interactive({?MODULE, start, []}),
    +    timer:sleep(infinity). %% Make sure the escript does not exit
     
    --spec start() -> pid().
    -start() ->
    -    spawn(fun() ->
    -                  io:format(~"Starting process inspection shell~n"),
    -                  loop()
    -          end).
    +-spec start() -> pid().
    +start() ->
    +    spawn(fun() ->
    +                  io:format(~"Starting process inspection shell~n"),
    +                  loop()
    +          end).
     
    -loop() ->
    -    receive _M -> loop() end.

    If we run the above we will get this:

    $ ./pshell.es
    +loop() ->
    +    receive _M -> loop() end.

    If we run the above we will get this:

    $ ./pshell.es
     Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Starting process inspection shell
    @@ -56,32 +56,32 @@
     io:standard_io/0 as this shell will be line based. However, for a more complex
     shell it is better to send get_until I/O requests
     as commands read that way can span multiple lines. So we expand our loop/0 with
    -a io:get_line/1 and pass the results to our parser.

    loop() ->
    -    case io:get_line("> ") of
    +a io:get_line/1 and pass the results to our parser.

    loop() ->
    +    case io:get_line("> ") of
             eof -> ok;
    -        {error, Reason} -> exit(Reason);
    -        Data -> eval(string:trim(Data))
    +        {error, Reason} -> exit(Reason);
    +        Data -> eval(string:trim(Data))
         end,
    -    loop().
    +    loop().
     
    -eval("list") ->
    +eval("list") ->
         Format = " ~.10ts | ~.10ts | ~.10ts~n",
    -    io:format(Format,["Pid", "Name", "MsgQ Len"]),
    -    [begin
    -         [{registered_name,Name},{message_queue_len,Len}]
    -             = erlang:process_info(Pid, [registered_name, message_queue_len]),
    -         io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)])
    -     end || Pid <- processes()];
    -eval(Unknown) ->
    -    io:format("Unknown command: '~ts'~n",[Unknown]).
    +    io:format(Format,["Pid", "Name", "MsgQ Len"]),
    +    [begin
    +         [{registered_name,Name},{message_queue_len,Len}]
    +             = erlang:process_info(Pid, [registered_name, message_queue_len]),
    +         io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)])
    +     end || Pid <- processes()];
    +eval(Unknown) ->
    +    io:format("Unknown command: '~ts'~n",[Unknown]).
     
    -to_list(Pid) when is_pid(Pid) ->
    -    pid_to_list(Pid);
    -to_list(Atom) when is_atom(Atom) ->
    -    atom_to_list(Atom);
    -to_list(Int) when is_integer(Int) ->
    -    integer_to_list(Int);
    -to_list(List) when is_list(List) ->
    +to_list(Pid) when is_pid(Pid) ->
    +    pid_to_list(Pid);
    +to_list(Atom) when is_atom(Atom) ->
    +    atom_to_list(Atom);
    +to_list(Int) when is_integer(Int) ->
    +    integer_to_list(Int);
    +to_list(List) when is_list(List) ->
         List.

    If we run the above we will get this:

    $ ./pshell.es
     Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
    @@ -101,56 +101,56 @@
      <0.11.0>   | erl_prim_l | 0         
      <0.43.0>   | logger     | 0         
      <0.45.0>   | applicatio | 0
    -...

    With this all in place we can now easily add inspect, suspend and resume as well.

    eval("inspect " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +...

    With this all in place we can now easily add inspect, suspend and resume as well.

    eval("inspect " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] =
    -                erlang:process_info(Pid, [registered_name, memory, messages, status]),
    -            io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n",
    -                      [Pid, to_list(Name), Status, Memory, Messages])
    +            [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] =
    +                erlang:process_info(Pid, [registered_name, memory, messages, status]),
    +            io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n",
    +                      [Pid, to_list(Name), Status, Memory, Messages])
         end;
    -eval("suspend " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +eval("suspend " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            erlang:suspend_process(Pid),
    -            io:format("Suspeneded ~ts~n")
    +            erlang:suspend_process(Pid),
    +            io:format("Suspeneded ~ts~n")
         end;
    -eval("resume " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +eval("resume " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            erlang:resumne_process(Pid),
    -            io:format("Resumed ~ts~n")
    +            erlang:resumne_process(Pid),
    +            io:format("Resumed ~ts~n")
         end;

    Adding autocompletion

    Wouldn't it be great if we could add some simple auto-completion for our shell? We can do that by setting a edlin_expand fun for our shell. This is done by calling io:setopts([{expand_fun, Fun}]). The fun that we provide is will receive the reversed current line from edlin and is expected to return possible expansions. Let's start by adding a simple fun to -expand our commands.

    -spec start() -> pid().
    -start() ->
    -    spawn(fun() ->
    -                  io:setopts([{expand_fun, fun expand_fun/1}]),
    -                  io:format(~"Starting process inspection shell~n"),
    -                  loop()
    -          end).
    +expand our commands.

    -spec start() -> pid().
    +start() ->
    +    spawn(fun() ->
    +                  io:setopts([{expand_fun, fun expand_fun/1}]),
    +                  io:format(~"Starting process inspection shell~n"),
    +                  loop()
    +          end).
     
    --spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} |
    -          {no, nil(), nil()}.
    -expand_fun("") -> %% If line is empty, we list all available commands
    -    {yes, "", ["list", "inspect", "suspend", "resume"]};
    -expand_fun(Curr) ->
    -    expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]).
    +-spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} |
    +          {no, nil(), nil()}.
    +expand_fun("") -> %% If line is empty, we list all available commands
    +    {yes, "", ["list", "inspect", "suspend", "resume"]};
    +expand_fun(Curr) ->
    +    expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]).
     
    -expand_fun(_Curr, []) ->
    -    {no, "", []};
    -expand_fun(Curr, [Cmd | T]) ->
    -    case lists:prefix(Curr, Cmd) of
    +expand_fun(_Curr, []) ->
    +    {no, "", []};
    +expand_fun(Curr, [Cmd | T]) ->
    +    case lists:prefix(Curr, Cmd) of
             true ->
                 %% If Curr is a prefix of Cmd we subtract Curr from Cmd to get the
                 %% characters we need to complete with.
    -            {yes, lists:reverse(lists:reverse(Cmd) -- lists:reverse(Curr)), []};
    +            {yes, lists:reverse(lists:reverse(Cmd) -- lists:reverse(Curr)), []};
             false ->
    -            expand_fun(Curr, T)
    +            expand_fun(Curr, T)
         end.

    With the above code we will get expansions of our commands if we hit <TAB> in the shell. Its possible to make very complex completion algorithms, for example the Erlang shell has completions based on the function specifications of your code. It is important though that /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/c.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/c.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/c.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -1630,7 +1630,7 @@

    Compiles and then loads the code for a file on all nodes. Options defaults to -[]. Compilation is equivalent to:

    compile:file(File, Options ++ [report_errors, report_warnings])
    +[]. Compilation is equivalent to:

    compile:file(File, Options ++ [report_errors, report_warnings])
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/dets.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/dets.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/dets.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -1786,14 +1786,14 @@

    Returns a list of all objects with key Key stored in table Name, for -example:

    2> dets:open_file(abc, [{type, bag}]).
    -{ok,abc}
    -3> dets:insert(abc, {1,2,3}).
    +example:

    2> dets:open_file(abc, [{type, bag}]).
    +{ok,abc}
    +3> dets:insert(abc, {1,2,3}).
     ok
    -4> dets:insert(abc, {1,3,4}).
    +4> dets:insert(abc, {1,3,4}).
     ok
    -5> dets:lookup(abc, 1).
    -[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list +5> dets:lookup(abc, 1). +[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list with one object, as there cannot be more than one object with a given key. If the table type is bag or duplicate_bag, the function returns a list of arbitrary length.

    Notice that the order of objects returned is unspecified. In particular, the @@ -2650,11 +2650,11 @@ specification is specified explicitly. This is how to state match specifications that cannot easily be expressed within the syntax provided by qlc.

    The following example uses an explicit match specification to traverse the -table:

    1> dets:open_file(t, []),
    -ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    -MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    -QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using -function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
    +table:

    1> dets:open_file(t, []),
    +ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    +MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    +QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using +function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
     true

    qlc:info/1 returns information about a query handle. In this case identical information is returned for the two query handles.

    @@ -2728,7 +2728,7 @@

    Applies Fun to each object stored in table Name in some unspecified order. Different actions are taken depending on the return value of Fun. The following Fun return values are allowed:

    • continue - Continue to perform the traversal. For example, the following -function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The +function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The following function is supplied to collect all objects of a table in a list:

      fun(X) -> {continue, X} end.
    • {done, Value} - Terminate the traversal and return [Value | Acc].

    Any other value OtherValue returned by Fun terminates the traversal and is returned immediately.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/dict.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/dict.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/dict.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -26,13 +26,13 @@ difference is that while this module considers two keys as different if they do not match (=:=), orddict considers two keys as different if and only if they do not compare equal (==).

    Notes

    Functions append and append_list are included so that keyed values can be -stored in a list accumulator, for example:

    > D0 = dict:new(),
    -  D1 = dict:store(files, [], D0),
    -  D2 = dict:append(files, f1, D1),
    -  D3 = dict:append(files, f2, D2),
    -  D4 = dict:append(files, f3, D3),
    -  dict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +stored in a list accumulator, for example:

    > D0 = dict:new(),
    +  D1 = dict:store(files, [], D0),
    +  D2 = dict:append(files, f1, D1),
    +  D3 = dict:append(files, f2, D2),
    +  D4 = dict:append(files, f3, D3),
    +  dict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch is to be used if the key is known to be in the dictionary, otherwise function find.

    See Also

    gb_trees, orddict

    @@ -771,10 +771,10 @@ the Key-Value pairs from both dictionaries are included in the new dictionary. If a key occurs in both dictionaries, Fun is called with the key and both values to return a new value. merge can be defined as follows, but is -faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).
    +faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).
    @@ -987,8 +987,8 @@

    Updates a value in a dictionary by calling Fun on the value to get a new value. If Key is not present in the dictionary, Initial is stored as the -first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    -    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    +first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    +    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    @@ -1019,8 +1019,8 @@

    Adds Increment to the value associated with Key and stores this value. If Key is not present in the dictionary, Increment is stored as the first -value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    -    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    +value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    +    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/epp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/epp.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/epp.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -28,7 +28,7 @@ expression coding\s*[:=]\s*([-a-zA-Z0-9])+ selects the encoding. If the matching string is not a valid encoding, it is ignored. The valid encodings are Latin-1 and UTF-8, where the case of the characters can be chosen freely.

    Examples:

    %% coding: utf-8
    %% For this file we have chosen encoding = Latin-1
    %% -*- coding: latin-1 -*-

    Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    See Also

    erl_parse

    +modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    See Also

    erl_parse

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_error.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -194,7 +194,7 @@

    A fun used to format function arguments for BIF and function calls. By default -the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    +the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    @@ -310,23 +310,23 @@ caused the error starting at 1.

  • general - An error that is not associated with any argument caused the error.

  • reason - If the Reason should be printed differently than the default way.

  • If the text returned includes new-lines, format_exception/4 will indent the -text correctly.

    Example:

    -module(my_error_module).
    --export([atom_to_string/1, format_error/2]).
    +text correctly.

    Example:

    -module(my_error_module).
    +-export([atom_to_string/1, format_error/2]).
     
    -atom_to_string(Arg) when is_atom(Arg) ->
    -  atom_to_list(Arg);
    -atom_to_string(Arg) ->
    -  erlang:error(badarg,[Arg],
    -               [{error_info,#{ module => ?MODULE,
    -                               cause => #{ 1 => "should be an atom" }}}]).
    -
    -format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    -  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    -  ErrorMap = maps:get(cause, ErrorInfo),
    -  ErrorMap#{ general => "optional general information",
    -             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    -{ok,my_error_module}
    -2> my_error_module:atom_to_string(1).
    +atom_to_string(Arg) when is_atom(Arg) ->
    +  atom_to_list(Arg);
    +atom_to_string(Arg) ->
    +  erlang:error(badarg,[Arg],
    +               [{error_info,#{ module => ?MODULE,
    +                               cause => #{ 1 => "should be an atom" }}}]).
    +
    +format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    +  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    +  ErrorMap = maps:get(cause, ErrorInfo),
    +  ErrorMap#{ general => "optional general information",
    +             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    +{ok,my_error_module}
    +2> my_error_module:atom_to_string(1).
     ** exception error: my_error_module: badarg
          in function  my_error_module:atom_to_string/1
             called as my_error_module:atom_to_string(1)
    @@ -409,18 +409,18 @@
     
     

    Format the error reason and stack back-trace caught using try ... catch in the same style as the shell formats them.

    Example:

    try
    -    do_something()
    +    do_something()
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    If error_info is provided with the exception, format_exception will use that information to provide additional information about the exception.

    Example:

    try
    -  erlang:raise(badarg,[],[{error_info,#{}}])
    +  erlang:raise(badarg,[],[{error_info,#{}}])
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    See erlang:error/3 for details on how to raise an exception with error_info included.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -29,13 +29,13 @@ LocalFunctionHandler can be used to define a function that is called when there is a call to a local function. The argument can have the following formats:

    • {value,Func} - This defines a local function handler that is called -with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list +with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list of the evaluated arguments. The function handler returns the value of the local function. In this case, the current bindings cannot be accessed. To signal an error, the function handler calls exit/1 with a -suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of +suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of the unevaluated arguments, and Bindings are the current variable bindings. -The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated +The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated variable bindings. In this case, the function handler must itself evaluate all the function arguments and manage the bindings. To signal an error, the function handler calls exit/1 with a suitable exit value.

    • none - There is no local function handler.

    Non-Local Function Handler

    The optional argument NonLocalFunctionHandler can be used to define a function @@ -43,7 +43,7 @@ expressions.

  • An operator Op/A is called (this is handled as a call to function erlang:Op/A).
  • Exceptions are calls to erlang:apply/2,3; neither of the function handlers are called for such calls. The argument can have the following formats:

    • {value,Func} - This defines a non-local function handler. The function -may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec +may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec is the name of the function of the form {Module,Function} or a fun, and Arguments is a list of the evaluated arguments. The function handler returns the value of the function. To signal an error, the function handler /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -27,7 +27,7 @@ appropriate option, described below.

      The functions in this module are invoked automatically by the Erlang compiler. There is no reason to invoke these functions separately unless you have written your own Erlang compiler.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      epp, erl_parse

      +modules. The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      epp, erl_parse

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -26,7 +26,7 @@ form of either forms (that is, top-level constructs), expressions, or terms.

      The Abstract Format is described in the ERTS User's Guide. Notice that a token list must end with the dot token to be acceptable to the parse functions (see the erl_scan) module.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O modules. -The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      erl_anno, erl_scan, io, section The Abstract Format +The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      erl_anno, erl_scan, io, section The Abstract Format in the ERTS User's Guide.

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -24,7 +24,7 @@

      The Erlang token scanner.

      This module contains functions for tokenizing (scanning) characters into Erlang tokens.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

      {ErrorLocation, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      Notes

      The continuation of the first call to the re-entrant input functions must be +modules. The format is as follows:

      {ErrorLocation, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      Notes

      The continuation of the first call to the re-entrant input functions must be []. For a complete description of how the re-entrant input scheme works, see Armstrong, Virding and Williams: 'Concurrent Programming in Erlang', Chapter 13.

      See Also

      erl_anno, erl_parse, io

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -1151,14 +1151,14 @@ Notice that there is only an arity-2 read function, not an arity-1 function.

    • (position,{UserData,Position}) - Sets the position of UserData as defined for files in file:position/2

    Example:

    The following is a complete Fun parameter for reading and writing on files using the file module:

    ExampleFun =
    -   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    -      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    -      (read2, {Fd,Size}) -> file:read(Fd, Size);
    -      (close, Fd) -> file:close(Fd)
    -   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    -{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
    +   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    +      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    +      (read2, {Fd,Size}) -> file:read(Fd, Size);
    +      (close, Fd) -> file:close(Fd)
    +   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    +{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
     ...,
    -erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would +erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would call ExampleFun(write, {UserData,Data}).

    Note

    This example with the file module operations is not necessary to use directly, as that is what function open/2 in principle does.

    Warning

    The TarDescriptor term is not a file descriptor. You are advised not to rely on the specific contents of this term, as it can change in future Erlang/OTP /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/escript.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/escript.xhtml 2026-04-20 15:17:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/escript.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -400,67 +400,67 @@ number of schedulers with +S3. We also extract the different sections from the newly created script:

    > Source = "%% Demo\nmain(_Args) ->\n    io:format(\"~p\",[erlang:system_info(schedulers)]).\n".
     "%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedulers)).\n"
    -> io:format("~s\n", [Source]).
    +> io:format("~s\n", [Source]).
     %% Demo
    -main(_Args) ->
    -    io:format(erlang:system_info(schedulers)).
    +main(_Args) ->
    +    io:format(erlang:system_info(schedulers)).
     
     ok
    -> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    -                                      {source, list_to_binary(Source)}]).
    -{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    -> file:write_file("demo.escript", Bin).
    +> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    +                                      {source, list_to_binary(Source)}]).
    +{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    +> file:write_file("demo.escript", Bin).
     ok
    -> os:cmd("escript demo.escript").
    +> os:cmd("escript demo.escript").
     "3"
    -> escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    -     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    -                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    -ok
    -> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    -{ok,demo,
    -    <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    -      79,0,0,0,9,4,100,...>>}
    -> escript:create("demo.beam", [{beam, BeamCode}]).
    -ok
    -> escript:extract("demo.beam", []).
    -{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    -     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    -             111,109,0,0,0,83,0,0,0,9,...>>}]}
    -> os:cmd("escript demo.beam").
    +> escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    +     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    +                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    +ok
    +> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    +{ok,demo,
    +    <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    +      79,0,0,0,9,4,100,...>>}
    +> escript:create("demo.beam", [{beam, BeamCode}]).
    +ok
    +> escript:extract("demo.beam", []).
    +{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    +     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    +             111,109,0,0,0,83,0,0,0,9,...>>}]}
    +> os:cmd("escript demo.beam").
     "true"

    Here we create an archive script containing both Erlang code and Beam code, then we iterate over all files in the archive and collect their contents and some -information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    -{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    -> escript:create("demo.escript",
    -                 [shebang,
    -                  {archive, [{"demo.erl", SourceCode},
    -                             {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}]}
    -> file:write_file("demo.zip", ArchiveBin).
    -ok
    -> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    -{ok,[{"demo.beam",
    -      {file_info,748,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    -        83,0,0,...>>},
    -     {"demo.erl",
    -      {file_info,118,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    +information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    +{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    +> escript:create("demo.escript",
    +                 [shebang,
    +                  {archive, [{"demo.erl", SourceCode},
    +                             {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}]}
    +> file:write_file("demo.zip", ArchiveBin).
    +ok
    +> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    +{ok,[{"demo.beam",
    +      {file_info,748,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
    +      <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    +        83,0,0,...>>},
    +     {"demo.erl",
    +      {file_info,118,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
    +      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    @@ -493,16 +493,16 @@ extracted value is set to the atom default. If a section is missing, the extracted value is set to the atom undefined.

    Option compile_source only affects the result if the escript contains source code. In this case the Erlang code is automatically compiled and -{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    -                 [shebang, {archive, [{"demo.erl", SourceCode},
    -                                      {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} =
    -              escript:extract("demo.escript", []).
    -{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}
    -     {emu_args,undefined}]}
    +{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    +                 [shebang, {archive, [{"demo.erl", SourceCode},
    +                                      {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} =
    +              escript:extract("demo.escript", []).
    +{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}
    +     {emu_args,undefined}]}
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ets.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ets.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ets.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -96,10 +96,10 @@ find the next key is not done with such guarantees. This is often not a problem, but may cause rare subtle "unexpected" effects if a concurrent process inserts objects during a traversal. For example, consider one process -doing

    ets:new(t, [ordered_set, named_table]),
    -ets:insert(t, {1}),
    -ets:insert(t, {2}),
    -ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare +doing

    ets:new(t, [ordered_set, named_table]),
    +ets:insert(t, {1}),
    +ets:insert(t, {2}),
    +ets:insert(t, {3}),

    A concurrent call to ets:first(t), done by another process, may then in rare cases return 2 even though 2 has never existed in the table ordered as the first key. In the same way, a concurrent call to ets:next(t, 1) may return 3 even though 3 never existed in the table ordered directly after 1.

    Effects like this are improbable but possible. The probability will further be @@ -112,11 +112,11 @@ lookup without any table traversal at all. For ordered_set a partially bound key will limit the traversal to only scan a subset of the table based on term order. A partially bound key is either a list or a tuple with a prefix that is -fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
    +fully bound. Example:

    1> T = ets:new(t,[ordered_set]), ets:insert(T, {"555-1234", "John Smith"}).
     true
     2> %% Efficient search of all with area code 555
    -2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}).
    -[["1234","John Smith"]]

    Match Specifications

    Some of the functions use a match specification, match_spec. For a brief +2> ets:match(T,{[$5,$5,$5,$- |'$1'],'$2'}). +[["1234","John Smith"]]

    Match Specifications

    Some of the functions use a match specification, match_spec. For a brief explanation, see select/2. For a detailed description, see section Match Specifications in Erlang in ERTS User's Guide.

    A match specifications with excessive nesting will cause a system_limit error exception to be raised.

    @@ -1790,19 +1790,19 @@ -include_lib("stdlib/include/ms_transform.hrl"). to the source file.

    The fun is very restricted, it can take only a single parameter (the object to match): a sole variable or a tuple. It must use the is_ guard tests. Language constructs that have no representation in a match specification (if, case, -receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    -[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
    +receive, and so on) are not allowed.

    The return value is the resulting match specification.

    Example:

    1> ets:fun2ms(fun({M,N}) when N > 3 -> M end).
    +[{{'$1','$2'},[{'>','$2',3}],['$1']}]

    Variables from the environment can be imported, so that the following works:

    2> X=3.
     3
    -3> ets:fun2ms(fun({M,N}) when N > X -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, +3> ets:fun2ms(fun({M,N}) when N > X -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}}],['$1']}]

    The imported variables are replaced by match specification const expressions, which is consistent with the static scoping for Erlang funs. However, local or global function calls cannot be in the guard or body of the fun. Calls to -built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
    +built-in match specification functions is of course allowed:

    4> ets:fun2ms(fun({M,N}) when N > X, my_fun(M) -> M end).
     Error: fun containing local Erlang function calls
    -('my_fun' called in guard) cannot be translated into match_spec
    -{error,transform_error}
    -5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end).
    -[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun +('my_fun' called in guard) cannot be translated into match_spec +{error,transform_error} +5> ets:fun2ms(fun({M,N}) when N > X, is_atom(M) -> M end). +[{{'$1','$2'},[{'>','$2',{const,3}},{is_atom,'$1'}],['$1']}]

    As shown by the example, the function can be called from the shell also. The fun must be literally in the call when used from the shell as well.

    Warning

    If the parse_transform is not applied to a module that calls this pseudo function, the call fails in runtime (with a badarg). The ets module exports a function with this name, but it is never to be called except when @@ -2427,12 +2427,12 @@

    Matches the objects in table Table against pattern Pattern.

    A pattern is a term that can contain:

    • Bound parts (Erlang terms)
    • '_' that matches any Erlang term
    • Pattern variables '$N', where N=0,1,...

    The function returns a list with one element for each matching object, where -each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    -[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    -7> ets:match(T, {'_',dog,'$1'}).
    -[[7],[5]]
    -8> ets:match(T, {'_',cow,'$1'}).
    -[]

    If the key is specified in the pattern, the match is very efficient. If the key +each element is an ordered list of pattern variable bindings, for example:

    6> ets:match(T, '$1'). % Matches every object in table
    +[[{rufsen,dog,7}],[{brunte,horse,5}],[{ludde,dog,5}]]
    +7> ets:match(T, {'_',dog,'$1'}).
    +[[7],[5]]
    +8> ets:match(T, {'_',cow,'$1'}).
    +[]

    If the key is specified in the pattern, the match is very efficient. If the key is not specified, that is, if it is a variable or an underscore, the entire table must be searched. The search time can be substantial if the table is very large.

    For tables of type ordered_set, the result is in the same order as in a @@ -2684,10 +2684,10 @@ execution time):

    Table = ets:new...
     MatchSpec = ...
     % The following call...
    -ets:match_spec_run(ets:tab2list(Table),
    -                   ets:match_spec_compile(MatchSpec)),
    +ets:match_spec_run(ets:tab2list(Table),
    +                   ets:match_spec_compile(MatchSpec)),
     % ...gives the same result as the more common (and more efficient)
    -ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets +ets:select(Table, MatchSpec),

    Note

    This function has limited use in normal code. It is used by the dets module to perform the dets:select/1 operations and by Mnesia during transactions.

    @@ -3055,19 +3055,19 @@ format. Given that the original match specification is kept intact, the continuation can be restored, meaning it can once again be used in subsequent select/1 calls even though it has been stored on disk or on -another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
    +another node.

    Examples:

    The following sequence of calls may fail:

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T, MS, 10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(MaybeBroken).

    The following sequence works, as the call to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T, MS, 10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(MaybeBroken).

    The following sequence works, as the call to repair_continuation/2 reestablishes the -MaybeBroken continuation.

    T=ets:new(x,[]),
    +MaybeBroken continuation.

    T=ets:new(x,[]),
     ...
    -MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end),
    -{_,C} = ets:select(T,MS,10),
    -MaybeBroken = binary_to_term(term_to_binary(C)),
    -ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to +MS = ets:fun2ms(fun({N,_}=A) when (N rem 10) =:= 0 -> A end), +{_,C} = ets:select(T,MS,10), +MaybeBroken = binary_to_term(term_to_binary(C)), +ets:select(ets:repair_continuation(MaybeBroken,MS)).

    Note

    This function is rarely needed in application code. It is used by Mnesia to provide distributed select/3 and select/1 sequences. A normal application would either use Mnesia or keep the continuation from being converted to external format.

    The actual behavior of compiled match specifications when recreated from @@ -3112,21 +3112,21 @@ to succeed even if keys are removed during the traversal. The keys for objects inserted or deleted during a traversal may or may not be returned by next/2 depending on the ordering of keys within the table and if -the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    -    safe_fixtable(Table,true),
    -    clean_all_with_value(Table,X,ets:first(Table)),
    -    safe_fixtable(Table,false).
    +the key exists at the time next/2 is called.

    Example:

    clean_all_with_value(Table,X) ->
    +    safe_fixtable(Table,true),
    +    clean_all_with_value(Table,X,ets:first(Table)),
    +    safe_fixtable(Table,false).
     
    -clean_all_with_value(Table,X,'$end_of_table') ->
    +clean_all_with_value(Table,X,'$end_of_table') ->
         true;
    -clean_all_with_value(Table,X,Key) ->
    -    case ets:lookup(Table,Key) of
    -        [{Key,X}] ->
    -            ets:delete(Table,Key);
    +clean_all_with_value(Table,X,Key) ->
    +    case ets:lookup(Table,Key) of
    +        [{Key,X}] ->
    +            ets:delete(Table,Key);
             _ ->
                 true
         end,
    -    clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been + clean_all_with_value(Table,X,ets:next(Table,Key)).

    Notice that deleted objects are not freed from a fixed table until it has been released. If a process fixes a table but never releases it, the memory used by the deleted objects is never freed. The performance of operations on the table also degrades significantly.

    To retrieve information about which processes have fixed which tables, use @@ -3210,11 +3210,11 @@ object.

    The return value is constructed using the "match variables" bound in MatchHead or using the special match variables '$_' (the whole matching object) and '$$' (all match variables in a list), so that the following -match/2 expression:

    ets:match(Table,{'$1','$2','$3'})

    is exactly equivalent to:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    And that the following match_object/2 call:

    ets:match_object(Table,{'$1','$2','$1'})

    is exactly equivalent to

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    Composite terms can be constructed in the Result part either by simply writing -a list, so that the following code:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

    That is, all the bound variables in the match head as a list. If tuples are to +match/2 expression:

    ets:match(Table,{'$1','$2','$3'})

    is exactly equivalent to:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    And that the following match_object/2 call:

    ets:match_object(Table,{'$1','$2','$1'})

    is exactly equivalent to

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    Composite terms can be constructed in the Result part either by simply writing +a list, so that the following code:

    ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

    That is, all the bound variables in the match head as a list. If tuples are to be constructed, one has to write a tuple of arity 1 where the single element in the tuple is the tuple one wants to construct (as an ordinary tuple can be -mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the +mistaken for a Guard).

    Therefore the following call:

    ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

    gives the same output as:

    ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

    This syntax is equivalent to the syntax used in the trace patterns (see the dbg) module in Runtime_Tools.

    The Guards are constructed as tuples, where the first element is the test name and the remaining elements are the test parameters. To check for a specific type (say a list) of the element bound to the match variable '$1', one would write @@ -3223,7 +3223,7 @@ present in Erlang can be used, but only the new versions prefixed is_ are allowed (is_float, is_atom, and so on).

    The Guard section can also contain logic and arithmetic operations, which are written with the same syntax as the guard tests (prefix notation), so that the -following guard test written in Erlang:

    is_integer(X), is_integer(Y), X + Y < 4711

    is expressed as follows (X replaced with '$1' and Y with '$2'):

    [{is_integer, '$1'}, {is_integer, '$2'}, {'<', {'+', '$1', '$2'}, 4711}]

    For tables of type ordered_set, objects are visited in the same order as in a +following guard test written in Erlang:

    is_integer(X), is_integer(Y), X + Y < 4711

    is expressed as follows (X replaced with '$1' and Y with '$2'):

    [{is_integer, '$1'}, {is_integer, '$2'}, {'<', {'+', '$1', '$2'}, 4711}]

    For tables of type ordered_set, objects are visited in the same order as in a first/next traversal. This means that the match specification is executed against objects with keys in the first/next order and the corresponding result list is in the order of that execution.

    @@ -3375,16 +3375,16 @@ object. If not, select_replace will fail with badarg without updating any objects.

    For the moment, due to performance and semantic constraints, tables of type bag are not yet supported.

    The function returns the total number of replaced objects.

    Example

    For all 2-tuples with a list in second position, add atom 'marker' first in -the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
    +the list:

    1> T = ets:new(x,[]), ets:insert(T, {key, [1, 2, 3]}).
     true
    -2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    -[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    -3> ets:select_replace(T, MS).
    +2> MS = ets:fun2ms(fun({K, L}) when is_list(L) -> {K, [marker | L]} end).
    +[{{'$1','$2'},[{is_list,'$2'}],[{{'$1',[marker|'$2']}}]}]
    +3> ets:select_replace(T, MS).
     1
    -4> ets:tab2list(T).
    -[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    -New = update_object(Old),
    -Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
    +4>
    ets:tab2list(T). +[{key,[marker,1,2,3]}]

    A generic single object compare-and-swap operation:

    [Old] = ets:lookup(T, Key),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/filelib.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/filelib.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/filelib.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -908,15 +908,15 @@
     
     

    Sanitizes the relative path by eliminating ".." and "." components to protect against directory traversal attacks.

    Either returns the sanitized path name, or the atom unsafe if the path is unsafe. -The path is considered unsafe in the following circumstances:

    • The path is not relative.
    • A ".." component would climb up above the root of the relative path.
    • A symbolic link in the path points above the root of the relative path.

    Examples:

    1> {ok, Cwd} = file:get_cwd().
    +The path is considered unsafe in the following circumstances:

    • The path is not relative.
    • A ".." component would climb up above the root of the relative path.
    • A symbolic link in the path points above the root of the relative path.

    Examples:

    1> {ok, Cwd} = file:get_cwd().
     ...
    -2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
    +2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
     "dir"
    -3> filelib:safe_relative_path("dir/..", Cwd).
    -[]
    -4> filelib:safe_relative_path("dir/../..", Cwd).
    +3> filelib:safe_relative_path("dir/..", Cwd).
    +[]
    +4> filelib:safe_relative_path("dir/../..", Cwd).
     unsafe
    -5> filelib:safe_relative_path("/abs/path", Cwd).
    +5> filelib:safe_relative_path("/abs/path", Cwd).
     unsafe
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/filename.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/filename.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/filename.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -404,20 +404,20 @@

    Converts a relative Filename and returns an absolute name. No attempt is made to create the shortest absolute name, as this can give incorrect results on file -systems that allow links.

    Unix examples:

    1> pwd().
    +systems that allow links.

    Unix examples:

    1> pwd().
     "/usr/local"
    -2> filename:absname("foo").
    +2> filename:absname("foo").
     "/usr/local/foo"
    -3> filename:absname("../x").
    +3> filename:absname("../x").
     "/usr/local/../x"
    -4> filename:absname("/").
    -"/"

    Windows examples:

    1> pwd().
    +4> filename:absname("/").
    +"/"

    Windows examples:

    1> pwd().
     "D:/usr/local"
    -2> filename:absname("foo").
    +2> filename:absname("foo").
     "D:/usr/local/foo"
    -3> filename:absname("../x").
    +3> filename:absname("../x").
     "D:/usr/local/../x"
    -4> filename:absname("/").
    +4> filename:absname("/").
     "D:/"
    @@ -556,58 +556,58 @@

    Returns a suitable path, or paths, for a given type.

    If os is not set in Opts the function will default to the native option, that is 'linux', 'darwin' or 'windows', as understood by os:type/0. Anything not recognized as 'darwin' or 'windows' is interpreted as 'linux'.

    The options 'author' and 'version' are only used with 'windows' option -mode.

    • user_cache

      The path location is intended for transient data files on a local machine.

      On Linux: Respects the os environment variable XDG_CACHE_HOME.

      1> filename:basedir(user_cache, "my_application", #{os=>linux}).
      -"/home/otptest/.cache/my_application"

      On Darwin:

      1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
      -"/home/otptest/Library/Caches/my_application"

      On Windows:

      1> filename:basedir(user_cache, "My App").
      +mode.

      • user_cache

        The path location is intended for transient data files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        1> filename:basedir(user_cache, "my_application", #{os=>linux}).
        +"/home/otptest/.cache/my_application"

        On Darwin:

        1> filename:basedir(user_cache, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Caches/my_application"

        On Windows:

        1> filename:basedir(user_cache, "My App").
         "c:/Users/otptest/AppData/Local/My App/Cache"
        -2> filename:basedir(user_cache, "My App").
        +2> filename:basedir(user_cache, "My App").
         "c:/Users/otptest/AppData/Local/My App/Cache"
        -3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
        +3> filename:basedir(user_cache, "My App", #{author=>"Erlang"}).
         "c:/Users/otptest/AppData/Local/Erlang/My App/Cache"
        -4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
        +4> filename:basedir(user_cache, "My App", #{version=>"1.2"}).
         "c:/Users/otptest/AppData/Local/My App/1.2/Cache"
        -5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
      • user_config

        The path location is intended for persistent configuration files.

        On Linux: Respects the os environment variable XDG_CONFIG_HOME.

        2> filename:basedir(user_config, "my_application", #{os=>linux}).
        -"/home/otptest/.config/my_application"

        On Darwin:

        2> filename:basedir(user_config, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Application Support/my_application"

        On Windows:

        1> filename:basedir(user_config, "My App").
        +5> filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"
      • user_config

        The path location is intended for persistent configuration files.

        On Linux: Respects the os environment variable XDG_CONFIG_HOME.

        2> filename:basedir(user_config, "my_application", #{os=>linux}).
        +"/home/otptest/.config/my_application"

        On Darwin:

        2> filename:basedir(user_config, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Application Support/my_application"

        On Windows:

        1> filename:basedir(user_config, "My App").
         "c:/Users/otptest/AppData/Roaming/My App"
        -2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
        -"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
      • user_data

        The path location is intended for persistent data files.

        On Linux: Respects the os environment variable XDG_DATA_HOME.

        3> filename:basedir(user_data, "my_application", #{os=>linux}).
        -"/home/otptest/.local/my_application"

        On Darwin:

        3> filename:basedir(user_data, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Application Support/my_application"

        On Windows:

        8> filename:basedir(user_data, "My App").
        +2> filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).
        +"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"
      • user_data

        The path location is intended for persistent data files.

        On Linux: Respects the os environment variable XDG_DATA_HOME.

        3> filename:basedir(user_data, "my_application", #{os=>linux}).
        +"/home/otptest/.local/my_application"

        On Darwin:

        3> filename:basedir(user_data, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Application Support/my_application"

        On Windows:

        8> filename:basedir(user_data, "My App").
         "c:/Users/otptest/AppData/Local/My App"
        -9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
      • user_log

        The path location is intended for transient log files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        4> filename:basedir(user_log, "my_application", #{os=>linux}).
        -"/home/otptest/.cache/my_application/log"

        On Darwin:

        4> filename:basedir(user_log, "my_application", #{os=>darwin}).
        -"/home/otptest/Library/Logs/my_application"

        On Windows:

        12> filename:basedir(user_log, "My App").
        +9> filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"
      • user_log

        The path location is intended for transient log files on a local machine.

        On Linux: Respects the os environment variable XDG_CACHE_HOME.

        4> filename:basedir(user_log, "my_application", #{os=>linux}).
        +"/home/otptest/.cache/my_application/log"

        On Darwin:

        4> filename:basedir(user_log, "my_application", #{os=>darwin}).
        +"/home/otptest/Library/Logs/my_application"

        On Windows:

        12> filename:basedir(user_log, "My App").
         "c:/Users/otptest/AppData/Local/My App/Logs"
        -13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
        -"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
      • site_config

        On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

        5> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/usr/local/share/my_application",
        - "/usr/share/my_application"]
        -6> os:getenv("XDG_CONFIG_DIRS").
        +13> filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).
        +"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"
      • site_config

        On Linux: Respects the os environment variable XDG_CONFIG_DIRS.

        5> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/usr/local/share/my_application",
        + "/usr/share/my_application"]
        +6> os:getenv("XDG_CONFIG_DIRS").
         "/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg"
        -7> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/etc/xdg/xdg-ubuntu/my_application",
        +7> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/etc/xdg/xdg-ubuntu/my_application",
          "/usr/share/upstart/xdg/my_application",
        - "/etc/xdg/my_application"]
        -8> os:unsetenv("XDG_CONFIG_DIRS").
        + "/etc/xdg/my_application"]
        +8> os:unsetenv("XDG_CONFIG_DIRS").
         true
        -9> filename:basedir(site_config, "my_application", #{os=>linux}).
        -["/etc/xdg/my_application"]

        On Darwin:

        5> filename:basedir(site_config, "my_application", #{os=>darwin}).
        -["/Library/Application Support/my_application"]
      • site_data

        On Linux: Respects the os environment variable XDG_DATA_DIRS.

        10> os:getenv("XDG_DATA_DIRS").
        +9> filename:basedir(site_config, "my_application", #{os=>linux}).
        +["/etc/xdg/my_application"]

        On Darwin:

        5> filename:basedir(site_config, "my_application", #{os=>darwin}).
        +["/Library/Application Support/my_application"]
      • site_data

        On Linux: Respects the os environment variable XDG_DATA_DIRS.

        10> os:getenv("XDG_DATA_DIRS").
         "/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/"
        -11> filename:basedir(site_data, "my_application", #{os=>linux}).
        -["/usr/share/ubuntu/my_application",
        +11> filename:basedir(site_data, "my_application", #{os=>linux}).
        +["/usr/share/ubuntu/my_application",
          "/usr/share/gnome/my_application",
          "/usr/local/share/my_application",
        - "/usr/share/my_application"]
        -12> os:unsetenv("XDG_DATA_DIRS").
        + "/usr/share/my_application"]
        +12> os:unsetenv("XDG_DATA_DIRS").
         true
        -13> filename:basedir(site_data, "my_application", #{os=>linux}).
        -["/usr/local/share/my_application",
        - "/usr/share/my_application"]

        On Darwin:

        5> filename:basedir(site_data, "my_application", #{os=>darwin}).
        -["/Library/Application Support/my_application"]
      +13>
      filename:basedir(site_data, "my_application", #{os=>linux}). +["/usr/local/share/my_application", + "/usr/share/my_application"]

      On Darwin:

      5> filename:basedir(site_data, "my_application", #{os=>darwin}).
      +["/Library/Application Support/my_application"]
    @@ -636,12 +636,12 @@

    Returns the last component of Filename, or Filename itself if it does not -contain any directory separators.

    Examples:

    5> filename:basename("foo").
    +contain any directory separators.

    Examples:

    5> filename:basename("foo").
     "foo"
    -6> filename:basename("/usr/foo").
    +6> filename:basename("/usr/foo").
     "foo"
    -7> filename:basename("/").
    -[]
    +7>
    filename:basename("/"). +[]
    @@ -672,15 +672,15 @@

    Returns the last component of Filename with extension Ext stripped.

    This function is to be used to remove a (possible) specific extension. To remove an existing extension when you are unsure which one it is, use -rootname(basename(Filename)).

    Examples:

    8> filename:basename("~/src/kalle.erl", ".erl").
    +rootname(basename(Filename)).

    Examples:

    8> filename:basename("~/src/kalle.erl", ".erl").
     "kalle"
    -9> filename:basename("~/src/kalle.beam", ".erl").
    +9> filename:basename("~/src/kalle.beam", ".erl").
     "kalle.beam"
    -10> filename:basename("~/src/kalle.old.erl", ".erl").
    +10> filename:basename("~/src/kalle.old.erl", ".erl").
     "kalle.old"
    -11> filename:rootname(filename:basename("~/src/kalle.erl")).
    +11> filename:rootname(filename:basename("~/src/kalle.erl")).
     "kalle"
    -12> filename:rootname(filename:basename("~/src/kalle.beam")).
    +12> filename:rootname(filename:basename("~/src/kalle.beam")).
     "kalle"
    @@ -709,10 +709,10 @@ -

    Returns the directory part of Filename.

    Examples:

    13> filename:dirname("/usr/src/kalle.erl").
    +

    Returns the directory part of Filename.

    Examples:

    13> filename:dirname("/usr/src/kalle.erl").
     "/usr/src"
    -14> filename:dirname("kalle.erl").
    -"."
    5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
    +14> filename:dirname("kalle.erl").
    +"."
    5> filename:dirname("\\usr\\src/kalle.erl"). % Windows
     "/usr/src"
    @@ -742,10 +742,10 @@

    Returns the file extension of Filename, including the period. Returns an empty -string if no extension exists.

    Examples:

    15> filename:extension("foo.erl").
    +string if no extension exists.

    Examples:

    15> filename:extension("foo.erl").
     ".erl"
    -16> filename:extension("beam.src/kalle").
    -[]
    +16>
    filename:extension("beam.src/kalle"). +[]
    @@ -805,10 +805,10 @@

    Joins a list of filename Components with directory separators. If one of the elements of Components includes an absolute path, such as "/xxx", the preceding elements, if any, are removed from the result.

    The result is "normalized":

    • Redundant directory separators are removed.
    • In Windows, all directory separators are forward slashes and the drive letter -is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
    +is in lower case.

    Examples:

    17> filename:join(["/usr", "local", "bin"]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -89,35 +89,35 @@
     argument {value, Value}. This makes it easy to initiate the sequence of output
     functions with a value calculated by the input functions.

    As an example, consider sorting the terms on a disk log file. A function that reads chunks from the disk log and returns a list of binaries is used as input. -The results are collected in a list of terms.

    sort(Log) ->
    -    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    -    Input = input(Log, start),
    -    Output = output([]),
    -    Reply = file_sorter:sort(Input, Output, {format,term}),
    -    ok = disk_log:close(Log),
    +The results are collected in a list of terms.

    sort(Log) ->
    +    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    +    Input = input(Log, start),
    +    Output = output([]),
    +    Reply = file_sorter:sort(Input, Output, {format,term}),
    +    ok = disk_log:close(Log),
         Reply.
     
    -input(Log, Cont) ->
    -    fun(close) ->
    +input(Log, Cont) ->
    +    fun(close) ->
                 ok;
    -       (read) ->
    -            case disk_log:chunk(Log, Cont) of
    -                {error, Reason} ->
    -                    {error, Reason};
    -                {Cont2, Terms} ->
    -                    {Terms, input(Log, Cont2)};
    -                {Cont2, Terms, _Badbytes} ->
    -                    {Terms, input(Log, Cont2)};
    +       (read) ->
    +            case disk_log:chunk(Log, Cont) of
    +                {error, Reason} ->
    +                    {error, Reason};
    +                {Cont2, Terms} ->
    +                    {Terms, input(Log, Cont2)};
    +                {Cont2, Terms, _Badbytes} ->
    +                    {Terms, input(Log, Cont2)};
                     eof ->
                         end_of_input
                 end
         end.
     
    -output(L) ->
    -    fun(close) ->
    -            lists:append(lists:reverse(L));
    -       (Terms) ->
    -            output([Terms | L])
    +output(L) ->
    +    fun(close) ->
    +            lists:append(lists:reverse(L));
    +       (Terms) ->
    +            output([Terms | L])
         end.

    For more examples of functions as input and output, see the end of the file_sorter module; the term format is implemented with functions.

    The possible values of Reason returned when an error occurs are:

    • bad_object, {bad_object, FileName} - Applying the format function failed for some binary, or the key(s) could not be extracted from some term.
    • {bad_term, FileName} - io:read/2 failed to read some term.
    • {file_error, FileName, file:posix()} - For an explanation of /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gb_sets.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gb_sets.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gb_sets.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -712,14 +712,14 @@ -

      Returns a new set formed from Set1 with Element inserted.

      If Element is already an element in Set1, nothing is changed.

      Examples

      1> S0 = gb_sets:new().
      -2> S1 = gb_sets:add_element(7, S0).
      -3> gb_sets:to_list(S1).
      -[7]
      -4> S2 = gb_sets:add_element(42, S1).
      -5> S2 = gb_sets:add_element(42, S1).
      -6> gb_sets:to_list(S2).
      -[7,42]
      +

      Returns a new set formed from Set1 with Element inserted.

      If Element is already an element in Set1, nothing is changed.

      Examples

      1> S0 = gb_sets:new().
      +2> S1 = gb_sets:add_element(7, S0).
      +3> gb_sets:to_list(S1).
      +[7]
      +4> S2 = gb_sets:add_element(42, S1).
      +5> S2 = gb_sets:add_element(42, S1).
      +6> gb_sets:to_list(S2).
      +[7,42]
    @@ -750,12 +750,12 @@

    Rebalances the tree representation of Set1.

    This is rarely necessary, but can be motivated when a large number of elements have been deleted from the tree without further insertions. Forcing rebalancing can minimize lookup times, as deletion -does not rebalance the tree.

    Examples

    1> S0 = gb_sets:from_ordset(lists:seq(1, 100)).
    -2> Delete = fun(E, Set) -> gb_sets:delete(E, Set) end.
    -3> S1 = lists:foldl(Delete, S0, lists:seq(1, 50)).
    -4> gb_sets:size(S1).
    +does not rebalance the tree.

    Examples

    1> S0 = gb_sets:from_ordset(lists:seq(1, 100)).
    +2> Delete = fun(E, Set) -> gb_sets:delete(E, Set) end.
    +3> S1 = lists:foldl(Delete, S0, lists:seq(1, 50)).
    +4> gb_sets:size(S1).
     50
    -5> S2 = gb_sets:balance(S1).
    +5>
    S2 = gb_sets:balance(S1).
    @@ -813,9 +813,9 @@

    Returns a new set formed from Set1 with Element removed, assuming Element is present in Set1.

    Use delete_any/2 when deleting from a set where Element is potentially -missing.

    Examples

    1> S = gb_sets:from_list([a,b]).
    -2> gb_sets:to_list(gb_sets:delete(b, S)).
    -[a]
    +missing.

    Examples

    1> S = gb_sets:from_list([a,b]).
    +2> gb_sets:to_list(gb_sets:delete(b, S)).
    +[a]
    @@ -843,10 +843,10 @@ -

    Returns a new set formed from Set1 with Element removed.

    If Element is not an element in Set1, nothing is changed.

    Examples

    1> S = gb_sets:from_list([a,b]).
    -2> gb_sets:to_list(gb_sets:delete_any(b, S)).
    -[a]
    -3> S = gb_sets:delete_any(x, S).
    +

    Returns a new set formed from Set1 with Element removed.

    If Element is not an element in Set1, nothing is changed.

    Examples

    1> S = gb_sets:from_list([a,b]).
    +2> gb_sets:to_list(gb_sets:delete_any(b, S)).
    +[a]
    +3> S = gb_sets:delete_any(x, S).
    @@ -903,8 +903,8 @@ -

    Returns a new empty set.

    Examples

    1> gb_sets:to_list(gb_sets:empty()).
    -[]
    +

    Returns a new empty set.

    Examples

    1> gb_sets:to_list(gb_sets:empty()).
    +[]
    @@ -933,11 +933,11 @@ -

    Filters elements in Set1 using predicate function Pred.

    Examples

    1> S = gb_sets:from_list([1,2,3,4,5,6,7]).
    -2> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -3> Filtered = gb_sets:filter(IsEven, S).
    -4> gb_sets:to_list(Filtered).
    -[2,4,6]
    +

    Filters elements in Set1 using predicate function Pred.

    Examples

    1> S = gb_sets:from_list([1,2,3,4,5,6,7]).
    +2> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +3> Filtered = gb_sets:filter(IsEven, S).
    +4> gb_sets:to_list(Filtered).
    +[2,4,6]
    @@ -974,17 +974,17 @@

    Calls Fun(Elem) for each Elem of Set1 to update or remove elements from Set1.

    Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the set of elements for which Fun returns a new -value, with true being equivalent to {true, Elem}.

    gb_sets:filtermap/2 behaves as if it were defined as follows:

    filtermap(Fun, Set1) ->
    -    gb_sets:from_list(lists:filtermap(Fun, Set1)).

    Examples

    1> S = gb_sets:from_list([2,4,5,6,8,9])
    -2> F = fun(X) ->
    +value, with true being equivalent to {true, Elem}.

    gb_sets:filtermap/2 behaves as if it were defined as follows:

    filtermap(Fun, Set1) ->
    +    gb_sets:from_list(lists:filtermap(Fun, Set1)).

    Examples

    1> S = gb_sets:from_list([2,4,5,6,8,9])
    +2> F = fun(X) ->
                case X rem 2 of
    -               0 -> {true, X div 2};
    +               0 -> {true, X div 2};
                    1 -> false
                end
             end.
    -3> Set = gb_sets:filtermap(F, S).
    -4> gb_sets:to_list(Set).
    -[1,2,3,4]
    +3>
    Set = gb_sets:filtermap(F, S). +4> gb_sets:to_list(Set). +[1,2,3,4]
    @@ -1020,9 +1020,9 @@

    Folds Function over every element in Set and returns the final value of -the accumulator.

    Examples

    1> S = gb_sets:from_list([1,2,3,4]).
    +the accumulator.

    Examples

    1> S = gb_sets:from_list([1,2,3,4]).
     2> Plus = fun erlang:'+'/2.
    -3> gb_sets:fold(Plus, 0, S).
    +3> gb_sets:fold(Plus, 0, S).
     10
    @@ -1052,9 +1052,9 @@

    Returns a set of the elements in List, where List can be unordered and -contain duplicates.

    Examples

    1> Unordered = [x,y,a,x,y,b,b,z]
    -2> gb_sets:to_list(gb_sets:from_list(Unordered)).
    -[a,b,x,y,z]
    +contain duplicates.

    Examples

    1> Unordered = [x,y,a,x,y,b,b,z]
    +2> gb_sets:to_list(gb_sets:from_list(Unordered)).
    +[a,b,x,y,z]
    @@ -1083,9 +1083,9 @@

    Turns an ordered list without duplicates List into a set.

    See from_list/1 for a function that accepts unordered lists with -duplicates.

    Examples

    1> Ordset = [1,2,3].
    -2> gb_sets:to_list(gb_sets:from_ordset(Ordset)).
    -[1,2,3]
    +duplicates.

    Examples

    1> Ordset = [1,2,3].
    +2> gb_sets:to_list(gb_sets:from_ordset(Ordset)).
    +[1,2,3]
    @@ -1115,13 +1115,13 @@

    Returns a new set formed from Set1 with Element inserted, assuming Element is not already present.

    Use add/2 for inserting into a set where Element is potentially -already present.

    Examples

    1> S0 = gb_sets:new().
    -2> S1 = gb_sets:insert(7, S0).
    -3> gb_sets:to_list(S1).
    -[7]
    -4> S2 = gb_sets:insert(42, S1).
    -5> gb_sets:to_list(S2).
    -[7,42]
    +already present.

    Examples

    1> S0 = gb_sets:new().
    +2> S1 = gb_sets:insert(7, S0).
    +3> gb_sets:to_list(S1).
    +[7]
    +4> S2 = gb_sets:insert(42, S1).
    +5> gb_sets:to_list(S2).
    +[7,42]
    @@ -1150,15 +1150,15 @@

    Returns the intersection of the non-empty list of sets.

    The intersection of multiple sets is a new set that contains only the -elements that are present in all sets.

    Examples

    1> S0 = gb_sets:from_list([a,b,c,d]).
    -2> S1 = gb_sets:from_list([d,e,f]).
    -3> S2 = gb_sets:from_list([q,r])
    -4> Sets = [S0, S1, S2].
    -5> gb_sets:to_list(gb_sets:intersection([S0, S1, S2])).
    -[]
    -6> gb_sets:to_list(gb_sets:intersection([S0, S1])).
    -[d]
    -7> gb_sets:intersection([]).
    +elements that are present in all sets.

    Examples

    1> S0 = gb_sets:from_list([a,b,c,d]).
    +2> S1 = gb_sets:from_list([d,e,f]).
    +3> S2 = gb_sets:from_list([q,r])
    +4> Sets = [S0, S1, S2].
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_event.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -1175,15 +1175,15 @@
     but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so event handler modules need not export it. + end, Status).

    Note

    This callback is optional, so event handler modules need not export it. If a handler does not export this function, the gen_event module uses the handler state directly for the purposes described below.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return the fact that /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -23,163 +23,163 @@

    Deprecated and replaced by gen_statem in OTP 20.

    Migration to gen_statem

    Here follows a simple example of turning a gen_fsm into a gen_statem. -The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    --define(NAME, code_lock).
    +The example comes from the previous User's Guide for gen_fsm

    -module(code_lock).
    +-define(NAME, code_lock).
     %-define(BEFORE_REWRITE, true).
     
    --ifdef(BEFORE_REWRITE).
    --behaviour(gen_fsm).
    +-ifdef(BEFORE_REWRITE).
    +-behaviour(gen_fsm).
     -else.
    --behaviour(gen_statem).
    +-behaviour(gen_statem).
     -endif.
     
    --export([start_link/1, button/1, stop/0]).
    +-export([start_link/1, button/1, stop/0]).
     
    --ifdef(BEFORE_REWRITE).
    --export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    -     handle_info/3, terminate/3, code_change/4]).
    +-ifdef(BEFORE_REWRITE).
    +-export([init/1, locked/2, open/2, handle_sync_event/4, handle_event/3,
    +     handle_info/3, terminate/3, code_change/4]).
     -else.
    --export([init/1, callback_mode/0, locked/3, open/3,
    -     terminate/3, code_change/4]).
    +-export([init/1, callback_mode/0, locked/3, open/3,
    +     terminate/3, code_change/4]).
     %% Add callback__mode/0
     %% Change arity of the state functions
     %% Remove handle_info/3
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -start_link(Code) ->
    -    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
    +-ifdef(BEFORE_REWRITE).
    +start_link(Code) ->
    +    gen_fsm:start_link({local, ?NAME}, ?MODULE, Code, []).
     -else.
    -start_link(Code) ->
    -    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
    +start_link(Code) ->
    +    gen_statem:start_link({local,?NAME}, ?MODULE, Code, []).
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -button(Digit) ->
    -    gen_fsm:send_event(?NAME, {button, Digit}).
    +-ifdef(BEFORE_REWRITE).
    +button(Digit) ->
    +    gen_fsm:send_event(?NAME, {button, Digit}).
     -else.
    -button(Digit) ->
    -    gen_statem:cast(?NAME, {button,Digit}).
    +button(Digit) ->
    +    gen_statem:cast(?NAME, {button,Digit}).
         %% send_event is asynchronous and becomes a cast
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -stop() ->
    -    gen_fsm:sync_send_all_state_event(?NAME, stop).
    +-ifdef(BEFORE_REWRITE).
    +stop() ->
    +    gen_fsm:sync_send_all_state_event(?NAME, stop).
     -else.
    -stop() ->
    -    gen_statem:call(?NAME, stop).
    +stop() ->
    +    gen_statem:call(?NAME, stop).
         %% sync_send is synchronous and becomes call
         %% all_state is handled by callback code in gen_statem
     -endif.
     
    -init(Code) ->
    -    do_lock(),
    -    Data = #{code => Code, remaining => Code},
    -    {ok, locked, Data}.
    +init(Code) ->
    +    do_lock(),
    +    Data = #{code => Code, remaining => Code},
    +    {ok, locked, Data}.
     
    --ifdef(BEFORE_REWRITE).
    +-ifdef(BEFORE_REWRITE).
     -else.
    -callback_mode() ->
    +callback_mode() ->
         state_functions.
     %% state_functions mode is the mode most similar to
     %% gen_fsm. There is also handle_event mode which is
     %% a fairly different concept.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -locked({button, Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +-ifdef(BEFORE_REWRITE).
    +locked({button, Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end.
     -else.
    -locked(cast, {button,Digit}, Data0) ->
    -    case analyze_lock(Digit, Data0) of
    -    {open = StateName, Data} ->
    -        {next_state, StateName, Data, 10000};
    -    {StateName, Data} ->
    -        {next_state, StateName, Data}
    +locked(cast, {button,Digit}, Data0) ->
    +    case analyze_lock(Digit, Data0) of
    +    {open = StateName, Data} ->
    +        {next_state, StateName, Data, 10000};
    +    {StateName, Data} ->
    +        {next_state, StateName, Data}
         end;
    -locked({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -locked({info, Msg}, StateName, Data) ->
    -    handle_info(Msg, StateName, Data).
    +locked({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +locked({info, Msg}, StateName, Data) ->
    +    handle_info(Msg, StateName, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -open(timeout, State) ->
    -     do_lock(),
    -    {next_state, locked, State};
    -open({button,_}, Data) ->
    -    {next_state, locked, Data}.
    --else.
    -open(timeout, _, Data) ->
    -    do_lock(),
    -    {next_state, locked, Data};
    -open(cast, {button,_}, Data) ->
    -    {next_state, locked, Data};
    -open({call, From}, Msg, Data) ->
    -    handle_call(From, Msg, Data);
    -open(info, Msg, Data) ->
    -    handle_info(Msg, open, Data).
    +-ifdef(BEFORE_REWRITE).
    +open(timeout, State) ->
    +     do_lock(),
    +    {next_state, locked, State};
    +open({button,_}, Data) ->
    +    {next_state, locked, Data}.
    +-else.
    +open(timeout, _, Data) ->
    +    do_lock(),
    +    {next_state, locked, Data};
    +open(cast, {button,_}, Data) ->
    +    {next_state, locked, Data};
    +open({call, From}, Msg, Data) ->
    +    handle_call(From, Msg, Data);
    +open(info, Msg, Data) ->
    +    handle_info(Msg, open, Data).
     %% Arity differs
     %% All state events are dispatched to handle_call and handle_info help
     %% functions. If you want to handle a call or cast event specifically
     %% for this state you would add a special clause for it above.
     -endif.
     
    --ifdef(BEFORE_REWRITE).
    -handle_sync_event(stop, _From, _StateName, Data) ->
    -    {stop, normal, ok, Data}.
    +-ifdef(BEFORE_REWRITE).
    +handle_sync_event(stop, _From, _StateName, Data) ->
    +    {stop, normal, ok, Data}.
     
    -handle_event(Event, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
    +handle_event(Event, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Event, StateName}}, Data}.
     
    -handle_info(Info, StateName, Data) ->
    -    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
    +handle_info(Info, StateName, Data) ->
    +    {stop, {shutdown, {unexpected, Info, StateName}}, StateName, Data}.
     -else.
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_server.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -1273,15 +1273,15 @@
     but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so callback modules need not export it. The + end, Status).

    Note

    This callback is optional, so callback modules need not export it. The gen_server module provides a default implementation of this function that returns the callback module state.

    If this callback is exported but fails, to hide possibly sensitive data, /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -70,7 +70,7 @@ depending on callback mode Release upgrade/downgrade -(code change) +(code change) -----> Module:code_change/4

    State callback

    The state callback for a specific state in a gen_statem is the callback function that is called for all events in this state. It is selected depending on which callback mode @@ -178,97 +178,97 @@ on --> off : push\n* Reply 'off'

    Not shown in the state diagram:

    • The API function push() generates an event push of type call.
    • The API function get_count() generates an event get_count of type call that is handled in all states by replying with the current count value.
    • Unknown events are ignored and discarded.
    • There is boilerplate code for start, stop, terminate, code change, -init, to set the callback mode to state_functions, etc...

    Pushbutton Code

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    --behaviour(gen_statem).
    +init, to set the callback mode to state_functions, etc...

    Pushbutton Code

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    +-behaviour(gen_statem).
     
    --export([start/0,push/0,get_count/0,stop/0]).
    --export([terminate/3,code_change/4,init/1,callback_mode/0]).
    --export([on/3,off/3]).
    +-export([start/0,push/0,get_count/0,stop/0]).
    +-export([terminate/3,code_change/4,init/1,callback_mode/0]).
    +-export([on/3,off/3]).
     
    -name() -> pushbutton_statem. % The registered server name
    +name() -> pushbutton_statem. % The registered server name
     
     %% API.  This example uses a registered name name()
     %% and does not link to the caller.
    -start() ->
    -    gen_statem:start({local,name()}, ?MODULE, [], []).
    -push() ->
    -    gen_statem:call(name(), push).
    -get_count() ->
    -    gen_statem:call(name(), get_count).
    -stop() ->
    -    gen_statem:stop(name()).
    +start() ->
    +    gen_statem:start({local,name()}, ?MODULE, [], []).
    +push() ->
    +    gen_statem:call(name(), push).
    +get_count() ->
    +    gen_statem:call(name(), get_count).
    +stop() ->
    +    gen_statem:stop(name()).
     
     %% Mandatory callback functions
    -terminate(_Reason, _State, _Data) ->
    +terminate(_Reason, _State, _Data) ->
         void.
    -code_change(_Vsn, State, Data, _Extra) ->
    -    {ok,State,Data}.
    -init([]) ->
    +code_change(_Vsn, State, Data, _Extra) ->
    +    {ok,State,Data}.
    +init([]) ->
         %% Set the initial state + data.  Data is used only as a counter.
         State = off, Data = 0,
    -    {ok,State,Data}.
    -callback_mode() -> state_functions.
    +    {ok,State,Data}.
    +callback_mode() -> state_functions.
     
     %%% state callback(s)
     
    -off({call,From}, push, Data) ->
    +off({call,From}, push, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -off(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +off(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
    -on({call,From}, push, Data) ->
    +on({call,From}, push, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    -on(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,off,Data,[{reply,From,off}]};
    +on(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
     %% Handle events common to all states
    -handle_event({call,From}, get_count, Data) ->
    +handle_event({call,From}, get_count, Data) ->
         %% Reply with the current count
    -    {keep_state,Data,[{reply,From,Data}]};
    -handle_event(_, _, Data) ->
    +    {keep_state,Data,[{reply,From,Data}]};
    +handle_event(_, _, Data) ->
         %% Ignore all other events
    -    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    -{ok,<0.36.0>}
    -2> pushbutton:get_count().
    +    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    +{ok,<0.36.0>}
    +2> pushbutton:get_count().
     0
    -3> pushbutton:push().
    +3> pushbutton:push().
     on
    -4> pushbutton:get_count().
    +4> pushbutton:get_count().
     1
    -5> pushbutton:push().
    +5> pushbutton:push().
     off
    -6> pushbutton:get_count().
    +6> pushbutton:get_count().
     1
    -7> pushbutton:stop().
    +7> pushbutton:stop().
     ok
    -8> pushbutton:push().
    +8> pushbutton:push().
     ** exception exit: {noproc,{gen_statem,call,[pushbutton_statem,push,infinity]}}
          in function  gen:do_for_proc/2 (gen.erl, line 261)
          in call from gen_statem:call/3 (gen_statem.erl, line 386)

    To compare styles, here follows the same example using callback mode handle_event_function, or rather, the code to replace after function init/1 -of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
    +of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
     
     %%% state callback(s)
     
    -handle_event({call,From}, push, off, Data) ->
    +handle_event({call,From}, push, off, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -handle_event({call,From}, push, on, Data) ->
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +handle_event({call,From}, push, on, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    +    {next_state,off,Data,[{reply,From,off}]};
     %%
     %% Event handling common to all states
    -handle_event({call,From}, get_count, State, Data) ->
    +handle_event({call,From}, get_count, State, Data) ->
         %% Reply with the current count
    -    {next_state,State,Data,[{reply,From,Data}]};
    -handle_event(_, _, State, Data) ->
    +    {next_state,State,Data,[{reply,From,Data}]};
    +handle_event(_, _, State, Data) ->
         %% Ignore all other events
    -    {next_state,State,Data}.

    Note

    API changes

    • This behavior appeared in Erlang/OTP 19.0 as experimental.
    • In OTP 19.1 a backwards incompatible change of the return tuple from + {next_state,State,Data}.

    Note

    API changes

    • This behavior appeared in Erlang/OTP 19.0 as experimental.
    • In OTP 19.1 a backwards incompatible change of the return tuple from Module:init/1 was made, the mandatory callback function Module:callback_mode/0 was introduced, @@ -3025,15 +3025,15 @@ containing the same keys as the input map, but it may transform some values.

      One use case for this function is to return compact alternative state representations to avoid having large state terms printed in log files. -Another is to hide sensitive data from being written to the error log.

      Example:

      format_status(Status) ->
      -  maps:map(
      -    fun(state,State) ->
      -            maps:remove(private_key, State);
      -       (message,{password, _Pass}) ->
      -            {password, removed};
      -       (_,Value) ->
      +Another is to hide sensitive data from being written to the error log.

      Example:

      format_status(Status) ->
      +  maps:map(
      +    fun(state,State) ->
      +            maps:remove(private_key, State);
      +       (message,{password, _Pass}) ->
      +            {password, removed};
      +       (_,Value) ->
                   Value
      -    end, Status).

      Note

      This callback is optional, so a callback module does not need + end, Status).

      Note

      This callback is optional, so a callback module does not need to export it. The gen_statem module provides a default implementation of this function that returns {State, Data}.

      If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return {State, Info}, @@ -3207,8 +3207,8 @@ to initialize the implementation state and server data.

      Args is the Args argument provided to that start function.

      Note

      Note that if the gen_statem is started through proc_lib and enter_loop/4,5,6, this callback will never be called. Since this callback is not optional -it can in that case be implemented as:

      -spec init(_) -> no_return().
      -init(Args) -> erlang:error(not_implemented, [Args]).
      +it can in that case be implemented as:

      -spec init(_) -> no_return().
      +init(Args) -> erlang:error(not_implemented, [Args]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io_lib.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io_lib.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io_lib.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -1176,8 +1176,8 @@ input is needed to complete the original format string. RestFormat is the remaining format string, Nchars is the number of characters scanned, and InputStack is the reversed list of inputs matched up to that point.

  • {error, What} - The read operation failed and parameter What gives a -hint about the error.

  • Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    -{ok,[15.6,1.73e-5,24.5],[]}
    +hint about the error.

    Example:

    3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
    +{ok,[15.6,1.73e-5,24.5],[]}
    @@ -1686,11 +1686,11 @@ "...".

    Depth defaults to -1, which means no limitation. Option CharsLimit puts a soft limit on the number of characters returned. When the number of characters is reached, remaining structures are replaced by "...". CharsLimit defaults to -1, -which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
    +which means no limit on the number of characters returned.

    Example:

    1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
     "{1,[2],[3],[4,5],6,7,8,9}"
    -2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
    +2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
     "{1,[2],[3],[...],...}"
    -3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
    +3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
     "{[1,2|...],[4|...],...}"
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -32,8 +32,8 @@ ever present in the client. Any I/O server can be used together with any client code, and the client code does not need to be aware of the I/O device that the I/O server communicates with.

    Protocol Basics

    As described in Robert's paper, I/O servers and clients communicate using -io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    -{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server +io_request/io_reply tuples as follows:

    {io_request, From, ReplyAs, Request}
    +{io_reply, ReplyAs, Reply}

    The client sends an io_request tuple to the I/O server and the server eventually sends a corresponding io_reply tuple.

    • From is the pid/0 of the client, the process which the I/O server sends the I/O reply to.

    • ReplyAs can be any datum and is returned in the corresponding io_reply. The io module monitors the I/O server and uses the monitor reference as @@ -44,8 +44,8 @@ io_reply. The reply can be sent from any process, not necessarily the actual I/O server.

    • Request and Reply are described below.

    When an I/O server receives an io_request tuple, it acts upon the Request part and eventually sends an io_reply tuple with the corresponding Reply -part.

    Output Requests

    To output characters on an I/O device, the following Requests exist:

    {put_chars, Encoding, Characters}
    -{put_chars, Encoding, Module, Function, Args}
    • Encoding is unicode or latin1, meaning that the characters are (in case +part.

      Output Requests

      To output characters on an I/O device, the following Requests exist:

      {put_chars, Encoding, Characters}
      +{put_chars, Encoding, Module, Function, Args}
      • Encoding is unicode or latin1, meaning that the characters are (in case of binaries) encoded as UTF-8 or ISO Latin-1 (pure bytes). A well-behaved I/O server is also to return an error indication if list elements contain integers > 255 when Encoding is set to latin1.

        Notice that this does not in any way tell how characters are to be put on the @@ -64,8 +64,8 @@ the function returns anything else than a binary or list, or throws an exception, an error is to be sent back to the client.

      The I/O server replies to the client with an io_reply tuple, where element Reply is one of:

      ok
      -{error, Error}
      • Error describes the error to the client, which can do whatever it wants with -it. The io module typically returns it "as is".

      Input Requests

      To read characters from an I/O device, the following Requests exist:

      {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
      • Encoding denotes how data is to be sent back to the client and what data is +{error, Error}

    • Error describes the error to the client, which can do whatever it wants with +it. The io module typically returns it "as is".

    Input Requests

    To read characters from an I/O device, the following Requests exist:

    {get_until, Encoding, Prompt, Module, Function, ExtraArgs}
    • Encoding denotes how data is to be sent back to the client and what data is sent to the function denoted by Module/Function/ExtraArgs. If the function supplied returns data as a list, the data is converted to this encoding. If the function supplied returns data in some other format, no @@ -81,8 +81,8 @@ nothing being written to the I/O device).

    • Module, Function, and ExtraArgs denote a function and arguments to determine when enough data is written. The function is to take two more arguments, the last state, and a list of characters. The function is to return -one of:

      {done, Result, RestChars}
      -{more, Continuation}

      Result can be any Erlang term, but if it is a list/0, the I/O server can +one of:

      {done, Result, RestChars}
      +{more, Continuation}

      Result can be any Erlang term, but if it is a list/0, the I/O server can convert it to a binary/0 of appropriate format before returning it to the client, if the I/O server is set in binary mode (see below).

      The function is called with the data the I/O server finds on its I/O device, returning one of:

      • {done, Result, RestChars} when enough data is read. In this case Result @@ -92,38 +92,38 @@ characters are available. When no more characters are available, the function must return {done, eof, Rest}. The initial state is the empty list. The data when an end of file is reached on the IO device is the atom eof.

        An emulation of the get_line request can be (inefficiently) implemented -using the following functions:

        -module(demo).
        --export([until_newline/3, get_line/1]).
        +using the following functions:

        -module(demo).
        +-export([until_newline/3, get_line/1]).
         
        -until_newline(_ThisFar,eof,_MyStopCharacter) ->
        -    {done,eof,[]};
        -until_newline(ThisFar,CharList,MyStopCharacter) ->
        +until_newline(_ThisFar,eof,_MyStopCharacter) ->
        +    {done,eof,[]};
        +until_newline(ThisFar,CharList,MyStopCharacter) ->
             case
        -        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
        +        lists:splitwith(fun(X) -> X =/= MyStopCharacter end,  CharList)
             of
        -  {L,[]} ->
        -            {more,ThisFar++L};
        -  {L2,[MyStopCharacter|Rest]} ->
        -      {done,ThisFar++L2++[MyStopCharacter],Rest}
        +  {L,[]} ->
        +            {more,ThisFar++L};
        +  {L2,[MyStopCharacter|Rest]} ->
        +      {done,ThisFar++L2++[MyStopCharacter],Rest}
             end.
         
        -get_line(IoServer) ->
        -    IoServer ! {io_request,
        -                self(),
        +get_line(IoServer) ->
        +    IoServer ! {io_request,
        +                self(),
                         IoServer,
        -                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
        +                {get_until, unicode, '', ?MODULE, until_newline, [$\n]}},
             receive
        -        {io_reply, IoServer, Data} ->
        +        {io_reply, IoServer, Data} ->
               Data
             end.

        Notice that the last element in the Request tuple ([$\n]) is appended to the argument list when the function is called. The function is to be called like apply(Module, Function, [ State, Data | ExtraArgs ]) by -the I/O server.

      A fixed number of characters is requested using the following Request:

      {get_chars, Encoding, Prompt, N}
      • Encoding and Prompt as for get_until.
      • N is the number of characters to be read from the I/O device.

      A single line (as in former example) is requested with the following Request:

      {get_line, Encoding, Prompt}
      • Encoding and Prompt as for get_until.

      Clearly, get_chars and get_line could be implemented with the get_until +the I/O server.

    A fixed number of characters is requested using the following Request:

    {get_chars, Encoding, Prompt, N}
    • Encoding and Prompt as for get_until.
    • N is the number of characters to be read from the I/O device.

    A single line (as in former example) is requested with the following Request:

    {get_line, Encoding, Prompt}
    • Encoding and Prompt as for get_until.

    Clearly, get_chars and get_line could be implemented with the get_until request (and indeed they were originally), but demands for efficiency have made these additions necessary.

    The I/O server replies to the client with an io_reply tuple, where element Reply is one of:

    Data
     eof
    -{error, Error}
    • Data is the characters read, in list or binary form (depending on the I/O +{error, Error}
    • Data is the characters read, in list or binary form (depending on the I/O server mode, see the next section).
    • eof is returned when input end is reached and no more data is available to the client process.
    • Error describes the error to the client, which can do whatever it wants with it. The io module typically returns it as is.

    I/O Server Modes

    Demands for efficiency when reading data from an I/O server has not only lead to @@ -143,164 +143,164 @@ This is done in the example in section An Annotated and Working Example I/O Server.

    An I/O server in binary mode affects the data sent to the client, so that it must be able to handle binary data. For convenience, the modes of an I/O server -can be set and retrieved using the following I/O requests:

    {setopts, Opts}
    • Opts is a list of options in the format recognized by the proplists +can be set and retrieved using the following I/O requests:

      {setopts, Opts}
      • Opts is a list of options in the format recognized by the proplists module (and by the I/O server).

      As an example, the I/O server for the interactive shell (in group.erl) -understands the following options:

      {binary, boolean()} (or binary/list)
      -{echo, boolean()}
      -{expand_fun, fun()}
      -{encoding, unicode/latin1} (or unicode/latin1)

      Options binary and encoding are common for all I/O servers in OTP, while +understands the following options:

      {binary, boolean()} (or binary/list)
      +{echo, boolean()}
      +{expand_fun, fun()}
      +{encoding, unicode/latin1} (or unicode/latin1)

      Options binary and encoding are common for all I/O servers in OTP, while echo and expand are valid only for this I/O server. Option unicode notifies how characters are put on the physical I/O device, that is, if the terminal itself is Unicode-aware. It does not affect how characters are sent in the I/O protocol, where each request contains encoding information for the provided or returned data.

      The I/O server is to send one of the following as Reply:

      ok
      -{error, Error}

      An error (preferably enotsup) is to be expected if the option is not supported +{error, Error}

    An error (preferably enotsup) is to be expected if the option is not supported by the I/O server (like if an echo option is sent in a setopts request to a plain file).

    To retrieve options, the following request is used:

    getopts

    This request asks for a complete list of all options supported by the I/O server as well as their current values.

    The I/O server replies:

    OptList
    -{error, Error}
    • OptList is a list of tuples {Option, Value}, where Option always is an +{error, Error}
    • OptList is a list of tuples {Option, Value}, where Option always is an atom.

    Multiple I/O Requests

    The Request element can in itself contain many Requests by using the -following format:

    {requests, Requests}
    • Requests is a list of valid io_request tuples for the protocol. They must +following format:

      {requests, Requests}
      • Requests is a list of valid io_request tuples for the protocol. They must be executed in the order that they appear in the list. The execution is to continue until one of the requests results in an error or the list is consumed. The result of the last request is sent back to the client.

      The I/O server can, for a list of requests, send any of the following valid results in the reply, depending on the requests in the list:

      ok
      -{ok, Data}
      -{ok, Options}
      -{error, Error}

      Optional I/O Request

      The following I/O request is optional to implement and a client is to be -prepared for an error return:

      {get_geometry, Geometry}
      • Geometry is the atom rows or the atom columns.

      The I/O server is to send one of the following as Reply:

      N
      -{error, Error}
      • N is the number of character rows or columns that the I/O device has, if +{ok, Data} +{ok, Options} +{error, Error}

    Optional I/O Request

    The following I/O request is optional to implement and a client is to be +prepared for an error return:

    {get_geometry, Geometry}
    • Geometry is the atom rows or the atom columns.

    The I/O server is to send one of the following as Reply:

    N
    +{error, Error}
    • N is the number of character rows or columns that the I/O device has, if applicable to the I/O device handled by the I/O server, otherwise {error, enotsup} is a good answer.

    Unimplemented Request Types

    If an I/O server encounters a request that it does not recognize (that is, the io_request tuple has the expected format, but the Request is unknown), the -I/O server is to send a valid reply with the error tuple:

    {error, request}

    This makes it possible to extend the protocol with optional requests and for the +I/O server is to send a valid reply with the error tuple:

    {error, request}

    This makes it possible to extend the protocol with optional requests and for the clients to be somewhat backward compatible.

    An Annotated and Working Example I/O Server

    An I/O server is any process capable of handling the I/O protocol. There is no generic I/O server behavior, but could well be. The framework is simple, a process handling incoming requests, usually both I/O-requests and other I/O device-specific requests (positioning, closing, and so on).

    The example I/O server stores characters in an ETS table, making up a fairly crude RAM file.

    The module begins with the usual directives, a function to start the I/O server -and a main loop handling the requests:

    -module(ets_io_server).
    +and a main loop handling the requests:

    -module(ets_io_server).
     
    --export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
    +-export([start_link/0, init/0, loop/1, until_newline/3, until_enough/3]).
     
    --define(CHARS_PER_REC, 10).
    +-define(CHARS_PER_REC, 10).
     
    --record(state, {
    +-record(state, {
     	  table,
     	  position, % absolute
     	  mode % binary | list
    -	 }).
    +	 }).
     
    -start_link() ->
    -    spawn_link(?MODULE,init,[]).
    +start_link() ->
    +    spawn_link(?MODULE,init,[]).
     
    -init() ->
    -    Table = ets:new(noname,[ordered_set]),
    -    ?MODULE:loop(#state{table = Table, position = 0, mode=list}).
    +init() ->
    +    Table = ets:new(noname,[ordered_set]),
    +    ?MODULE:loop(#state{table = Table, position = 0, mode=list}).
     
    -loop(State) ->
    +loop(State) ->
         receive
    -	{io_request, From, ReplyAs, Request} ->
    -	    case request(Request,State) of
    -		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
    -		    reply(From, ReplyAs, Reply),
    -		    ?MODULE:loop(NewState);
    -		{stop, Reply, _NewState} ->
    -		    reply(From, ReplyAs, Reply),
    -		    exit(Reply)
    +	{io_request, From, ReplyAs, Request} ->
    +	    case request(Request,State) of
    +		{Tag, Reply, NewState} when Tag =:= ok; Tag =:= error ->
    +		    reply(From, ReplyAs, Reply),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/io.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -36,7 +36,7 @@
     binaries instead of lists. The binaries are encoded in UTF-8.

    To work with binaries in ISO Latin-1 encoding, use the file module instead.

    For conversion functions between character encodings, see the unicode module.

    Error Information

    The ErrorInfo mentioned in this module is the standard ErrorInfo structure -that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    +that is returned from all I/O modules. It has the following format:

    {ErrorLocation, Module, ErrorDescriptor}

    A string that describes the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)
    @@ -1077,12 +1077,12 @@ no IoDevice argument is specified in the function calls in this module.

    It is sometimes desirable to use an explicit IoDevice argument that refers to the default I/O device. This is the case with functions that can access either a file or the default I/O device. The atom standard_io has this -special meaning. The following example illustrates this:

    27> io:read('enter>').
    +special meaning. The following example illustrates this:

    27> io:read('enter>').
     enter>foo.
    -{ok,foo}
    -28> io:read(standard_io, 'enter>').
    +{ok,foo}
    +28> io:read(standard_io, 'enter>').
     enter>bar.
    -{ok,bar}

    By default all I/O sent to standard_io will end up in the user +{ok,bar}

    By default all I/O sent to standard_io will end up in the user I/O device of the node that spawned the calling process.

    standard_io is an alias for group_leader/0, so in order to change where the default input/output requests are sent you can change the group leader of the current process using @@ -1352,33 +1352,33 @@ whitespace characters are stripped. An Erlang string (list of characters) is returned.

    If Unicode translation is in effect (~ts), characters > 255 are accepted, otherwise not. With the translation modifier, the returned list can as a -consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
    +consequence also contain integers > 255:

    1> io:fread("Prompt> ","~s").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~ts").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~ts").
     Prompt> <Characters beyond latin1 range not printable in this medium>
    -{ok,[[1091,1085,1080,1094,1086,1076,1077]]}
  • a - Similar to s, but the resulting string is converted into an +{ok,[[1091,1085,1080,1094,1086,1076,1077]]}

  • a - Similar to s, but the resulting string is converted into an atom.

  • c - The number of characters equal to the field width are read (default is 1) and returned as an Erlang string. However, leading and trailing whitespace characters are not omitted as they are with s. All -characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
    +characters are returned.

    The Unicode translation modifier works as with s:

    1> io:fread("Prompt> ","~c").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{error,{fread,string}}
    -2> io:fread("Prompt> ","~tc").
    +{error,{fread,string}}
    +2> io:fread("Prompt> ","~tc").
     Prompt> <Character beyond latin1 range not printable in this medium>
    -{ok,[[1091]]}
  • l - Returns the number of characters that have been scanned up to that +{ok,[[1091]]}

  • l - Returns the number of characters that have been scanned up to that point, including whitespace characters.

  • The function returns:
    • {ok, Terms} - The read was successful and Terms is the list of successfully matched and read items.

    • eof - End of file was encountered.

    • {error, FreadError} - The reading failed and FreadError gives a hint about the error.

    • {error, ErrorDescription} - The read operation failed and parameter -ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
    +ErrorDescription gives a hint about the error.

    Examples:

    20> io:fread('enter>', "~f~f~f").
     enter>1.9 35.5e3 15.0
    -{ok,[1.9,3.55e4,15.0]}
    -21> io:fread('enter>', "~10f~d").
    +{ok,[1.9,3.55e4,15.0]}
    +21> io:fread('enter>', "~10f~d").
     enter>     5.67899
    -{ok,[5.678,99]}
    -22> io:fread('enter>', ":~10s:~10c:").
    +{ok,[5.678,99]}
    +22> io:fread('enter>', ":~10s:~10c:").
     enter>:   alan   :   joe    :
    -{ok, ["alan", "   joe    "]}
    +
    {ok, ["alan", " joe "]}
    @@ -1467,7 +1467,7 @@ the output device, and control sequences for formatting, see below. If Format is an atom or a binary, it is first converted to a list with the aid of atom_to_list/1 or -binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
    +binary_to_list/1. Example:

    1> io:fwrite("Hello world!~n", []).
     Hello world!
     ok

    The general format of a control sequence is ~F.P.PadModC.

    The character C determines the type of control sequence to be used. It is the only required field. All of F, P, Pad, and Mod are optional. For @@ -1485,25 +1485,25 @@ padding character is ' ' (space).

  • Mod is the control sequence modifier. This is one or more characters that change the interpretation of Data.

    The current modifiers are:

    • t - For Unicode translation.

    • l - For stopping p and P from detecting printable characters.

    • k - For use with p, P, w, and W to format maps in map-key ordered order (see maps:iterator_order/0).

    • K - Similar to k, for formatting maps in map-key order, but takes an -extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      -#{a => 1,b => 2}
      -> io:format("~Kp~n", [reversed, M]).
      -#{b => 2,a => 1}
      +extra argument that specifies the maps:iterator_order/0.

      For example:

      > M = #{ a => 1, b => 2 }.
      +#{a => 1,b => 2}
      +> io:format("~Kp~n", [reversed, M]).
      +#{b => 2,a => 1}
       ok
  • If F, P, or Pad is a * character, the next argument in Data is used as -the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
    +the value. For example:

    1> io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]).
     003.14159
    -ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
    +ok

    To use a literal * character as Pad, it must be passed as an argument:

    2> io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]).
     **3.14159
     ok

    Available control sequences:

    • ~ - Character ~ is written.

    • c - The argument is a number that is interpreted as an ASCII code. The precision is the number of times the character is printed and defaults to the -field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
      +field width, which in turn defaults to 1. Example:

      1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
       |     aaaaa|bbbbb     |ccccc|
       ok

      If the Unicode translation modifier (t) is in effect, the integer argument can be any number representing a valid Unicode codepoint, otherwise it is to -be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      -\x{400}
      +be an integer less than or equal to 255, otherwise it is masked with 16#FF:

      2> io:fwrite("~tc~n",[1024]).
      +\x{400}
       ok
      -3> io:fwrite("~c~n",[1024]).
      +3> io:fwrite("~c~n",[1024]).
       ^@
       ok
    • f - The argument is a float that is written as [-]ddd.ddd, where the precision is the number of digits after the decimal point. The default @@ -1521,18 +1521,18 @@ binaries are in UTF-8. The characters are printed without quotes. The string is first truncated by the specified precision and then padded and justified to the specified field width. The default precision is the field width.

      This format can be used for printing any object and truncating the output so -it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
      +it fits a specified field:

      1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
       |**********|
       ok
      -2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey,h|
      -3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      -|{hey,hey  |
      +2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey,h|
      +3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
      +|{hey,hey  |
       ok

      A list with integers > 255 is considered an error if the Unicode translation -modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      -\x{400}
      +modifier is not specified:

      4> io:fwrite("~ts~n",[[1024]]).
      +\x{400}
       ok
      -5> io:fwrite("~s~n",[[1024]]).
      +5> io:fwrite("~s~n",[[1024]]).
       ** exception error: bad argument
            in function  io:format/3
               called as io:format(<0.53.0>,"~s~n",[[1024]])
    • w - Writes data with the standard syntax. This is used to output Erlang @@ -1543,122 +1543,122 @@ breaks terms whose printed representation is longer than one line into many lines and indents each line sensibly. Left-justification is not supported. It also tries to detect flat lists of printable characters and output these as -strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      -{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      -{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
      +strings. For example:

      1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
      +{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      +{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
       ...
      -2> io:fwrite("~w~n", [T]).
      -[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      -[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      -me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      -,implicit}]
      +2> io:fwrite("~w~n", [T]).
      +[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
      +[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
      +me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
      +,implicit}]
       ok
      -3> io:fwrite("~62p~n", [T]).
      -[{attributes,[[{id,age,1.5},
      -               {mode,explicit},
      -               {typename,"INTEGER"}],
      -              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      - {typename,'Person'},
      - {tag,{'PRIVATE',3}},
      - {mode,implicit}]
      +3> io:fwrite("~62p~n", [T]).
      +[{attributes,[[{id,age,1.5},
      +               {mode,explicit},
      +               {typename,"INTEGER"}],
      +              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
      + {typename,'Person'},
      + {tag,{'PRIVATE',3}},
      + {mode,implicit}]
       ok

      The field width specifies the maximum line length. It defaults to 80. The precision specifies the initial indentation of the term. It defaults to the number of characters printed on this line in the same call to write/1 or -format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      -Here T = [{attributes,[[{id,age,1.5},
      -                        {mode,explicit},
      -                        {typename,"INTEGER"}],
      -                       [{id,cho},
      -                        {mode,explicit},
      -                        {typename,'Cho'}]]},
      -          {typename,'Person'},
      -          {tag,{'PRIVATE',3}},
      -          {mode,implicit}]
      +format/1,2,3. For example, using T above:

      4> io:fwrite("Here T = ~62p~n", [T]).
      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/json.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/json.xhtml	2026-04-20 15:17:36.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/json.xhtml	2042-05-23 04:35:58.000000000 +0000
      @@ -877,8 +877,8 @@
       
             
       
      -

      Parses a JSON value from Binary.

      Supports basic data mapping:

      JSONErlang
      Numberinteger() | float()
      Booleantrue | false
      Nullnull
      Stringbinary()
      Object#{binary() => _}

      Errors

      • error(unexpected_end) if Binary contains incomplete JSON value
      • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
      • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape

      Example

      > json:decode(<<"{\"foo\": 1}">>).
      -#{<<"foo">> => 1}
      +

      Parses a JSON value from Binary.

      Supports basic data mapping:

      JSONErlang
      Numberinteger() | float()
      Booleantrue | false
      Nullnull
      Stringbinary()
      Object#{binary() => _}

      Errors

      • error(unexpected_end) if Binary contains incomplete JSON value
      • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
      • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape

      Example

      > json:decode(<<"{\"foo\": 1}">>).
      +#{<<"foo">> => 1}
    @@ -912,9 +912,9 @@ can be customized with the callbacks specified in Decoders. The callbacks will use the Acc value as the initial accumulator.

    Any leftover, unparsed data in Binary will be returned.

    Default callbacks

    All callbacks are optional. If not provided, they will fall back to -implementations used by the decode/1 function:

    • for array_start: fun(_) -> [] end
    • for array_push: fun(Elem, Acc) -> [Elem | Acc] end

    • for array_finish: fun(Acc, OldAcc) -> {lists:reverse(Acc), OldAcc} end
    • for object_start: fun(_) -> [] end
    • for object_push: fun(Key, Value, Acc) -> [{Key, Value} | Acc] end

    • for object_finish: fun(Acc, OldAcc) -> {maps:from_list(Acc), OldAcc} end
    • for float: fun erlang:binary_to_float/1
    • for integer: fun erlang:binary_to_integer/1
    • for string: fun (Value) -> Value end
    • for null: the atom null

    Errors

    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape
    • error(unexpected_end) if Binary contains incomplete JSON value

    Example

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    -> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    -{#{foo => 1},ok,<<>>}
    +implementations used by the decode/1 function:

    • for array_start: fun(_) -> [] end
    • for array_push: fun(Elem, Acc) -> [Elem | Acc] end

    • for array_finish: fun(Acc, OldAcc) -> {lists:reverse(Acc), OldAcc} end
    • for object_start: fun(_) -> [] end
    • for object_push: fun(Key, Value, Acc) -> [{Key, Value} | Acc] end

    • for object_finish: fun(Acc, OldAcc) -> {maps:from_list(Acc), OldAcc} end
    • for float: fun erlang:binary_to_float/1
    • for integer: fun erlang:binary_to_integer/1
    • for string: fun (Value) -> Value end
    • for null: the atom null

    Errors

    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape
    • error(unexpected_end) if Binary contains incomplete JSON value

    Example

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    +> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    +{#{foo => 1},ok,<<>>}
    @@ -947,11 +947,11 @@

    Continue parsing a stream of bytes of a JSON value.

    Similar to decode_start/3, if the function returns {continue, State} and -there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    -> json:decode_continue(<<"1}">>, State).
    -{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    -> json:decode_continue(end_of_input, State).
    -{123,ok,<<>>}
    +there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    +> json:decode_continue(<<"1}">>, State).
    +{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    +> json:decode_continue(end_of_input, State).
    +{123,ok,<<>>}
    @@ -1015,8 +1015,8 @@ -

    Generates JSON corresponding to Term.

    Supports basic data mapping:

    ErlangJSON
    integer() | float()Number
    true | falseBoolean
    nullNull
    binary()String
    atom()String
    list()Array
    #{binary() => _}Object
    #{atom() => _}Object
    #{integer() => _}Object

    This is equivalent to encode(Term, fun json:encode_value/2).

    Examples

    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
    -<<"{\"foo\":\"bar\"}">>
    +

    Generates JSON corresponding to Term.

    Supports basic data mapping:

    ErlangJSON
    integer() | float()Number
    true | falseBoolean
    nullNull
    binary()String
    atom()String
    list()Array
    #{binary() => _}Object
    #{atom() => _}Object
    #{integer() => _}Object

    This is equivalent to encode(Term, fun json:encode_value/2).

    Examples

    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
    +<<"{\"foo\":\"bar\"}">>
    @@ -1051,11 +1051,11 @@ to be encoded and is expected to return the corresponding encoded JSON as iodata.

    Various encode_* functions in this module can be used to help in constructing such callbacks.

    Examples

    An encoder that uses a heuristic to differentiate object-like -lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    -> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    -> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    -> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
    -<<"{\"a\":[],\"b\":1}">>
    +lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    +> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    +> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    +> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
    +<<"{\"a\":[],\"b\":1}">>
    @@ -1422,11 +1422,11 @@ -

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    -{
    +

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    +{
       "baz": 52,
       "foo": "bar"
    -}
    +}
     ok
    @@ -1491,20 +1491,20 @@

    Generates formatted JSON corresponding to Term.

    Similar to encode/2, can be customised with the Encoder callback and Options.

    Options can include 'indent' to specify number of spaces per level and 'max' which loosely limits the width of lists.

    The Encoder will get a 'State' argument which contains the 'Options' maps merged with other data when recursing through 'Term'.

    format_value/3 or various encode_* functions in this module can be used -to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    -    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    -    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    -> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
    +to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    +    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    +    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    +> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
     >
    -> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    -> Options = #{indent => 4}.
    -> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
    +> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    +> Options = #{indent => 4}.
    +> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
     >
    -> io:put_chars(json:format(Term, Fun, Options)).
    -{
    +> io:put_chars(json:format(Term, Fun, Options)).
    +{
         "id": 1,
         "time": "2024-05-23T16:07:48Z"
    -}
    +}
     ok
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/lists.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/lists.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/lists.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -956,10 +956,10 @@

    Returns true if Pred(Elem) returns true for all elements Elem in List; -otherwise, returns false.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -2> lists:all(IsEven, [2,4,5]).
    +otherwise, returns false.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +2> lists:all(IsEven, [2,4,5]).
     false
    -3> lists:all(IsEven, [2,4,6]).
    +3> lists:all(IsEven, [2,4,6]).
     true
    @@ -989,10 +989,10 @@

    Returns true if Pred(Elem) returns true for at least one element Elem in -List; otherwise, returns false.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -2> lists:any(IsEven, [3,5,7]).
    +List; otherwise, returns false.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +2> lists:any(IsEven, [3,5,7]).
     false
    -3> lists:any(IsEven, [2,3,5,7]).
    +3> lists:any(IsEven, [2,3,5,7]).
     true
    @@ -1021,8 +1021,8 @@ -

    Returns a list in which all sublists of ListOfLists have been concatenated.

    Examples

    1> lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    -[1,2,3,a,b,4,5,6]
    +

    Returns a list in which all sublists of ListOfLists have been concatenated.

    Examples

    1> lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    +[1,2,3,a,b,4,5,6]
    @@ -1051,7 +1051,7 @@

    Returns a new list, List3, consisting of the elements of -List1, followed by the elements of List2.

    Examples

    1> lists:append("abc", "def").
    +List1, followed by the elements of List2.

    Examples

    1> lists:append("abc", "def").
     "abcdef"

    lists:append(A, B) is equivalent to A ++ B.

    @@ -1081,7 +1081,7 @@ -

    Concatenates the text representation of the elements of Things.

    The elements of Things can be atoms, integers, floats, or strings.

    Examples

    1> lists:concat([doc, '/', file, '.', 3]).
    +

    Concatenates the text representation of the elements of Things.

    The elements of Things can be atoms, integers, floats, or strings.

    Examples

    1> lists:concat([doc, '/', file, '.', 3]).
     "doc/file.3"
    @@ -1111,10 +1111,10 @@

    Returns a copy of List1 where the first element matching Elem is removed, if -there is such an element.

    Examples

    1> lists:delete(b, [a,b,c]).
    -[a,c]
    -2> lists:delete(x, [a,b,c]).
    -[a,b,c]
    +there is such an element.

    Examples

    1> lists:delete(b, [a,b,c]).
    +[a,c]
    +2> lists:delete(x, [a,b,c]).
    +[a,b,c]
    @@ -1145,11 +1145,11 @@

    Drops the last element of a List.

    The list must be non-empty; otherwise, the function raises a -function_clause exception.

    Examples

    1> lists:droplast([1]).
    -[]
    -2> lists:droplast([1,2,3]).
    -[1,2]
    -3> lists:droplast([]).
    +function_clause exception.

    Examples

    1> lists:droplast([1]).
    +[]
    +2> lists:droplast([1,2,3]).
    +[1,2]
    +3> lists:droplast([]).
     ** exception error: no function clause matching lists:droplast([])
    @@ -1180,10 +1180,10 @@

    Drops elements Elem from List1 while Pred(Elem) returns true, -and then returns the remaining list.

    Examples

    1> lists:dropwhile(fun is_atom/1, [a,b,c,1,2,3,x,y,z]).
    -[1,2,3,x,y,z]
    -2> lists:dropwhile(fun is_integer/1, [a,b,c,1,2,3,x,y,z]).
    -[a,b,c,1,2,3,x,y,z]
    +and then returns the remaining list.

    Examples

    1> lists:dropwhile(fun is_atom/1, [a,b,c,1,2,3,x,y,z]).
    +[1,2,3,x,y,z]
    +2> lists:dropwhile(fun is_integer/1, [a,b,c,1,2,3,x,y,z]).
    +[a,b,c,1,2,3,x,y,z]
    @@ -1211,8 +1211,8 @@ -

    Returns a list containing N copies of term Elem.

    Examples

    1> lists:duplicate(5, xx).
    -[xx,xx,xx,xx,xx]
    +

    Returns a list containing N copies of term Elem.

    Examples

    1> lists:duplicate(5, xx).
    +[xx,xx,xx,xx,xx]
    @@ -1313,14 +1313,14 @@

    Returns List1 with each element H replaced by a tuple of form {I, H}, where I is the position of H in List1.

    The enumeration starts with Index and increases by Step in each step.

    That is, enumerate/3 behaves as if it were defined as -follows:

    enumerate(I, S, List) ->
    -  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
    -  List1.

    The default values for Index and Step are both 1.

    Examples

    1> lists:enumerate([a,b,c]).
    -[{1,a},{2,b},{3,c}]
    -2> lists:enumerate(10, [a,b,c]).
    -[{10,a},{11,b},{12,c}]
    -3> lists:enumerate(0, -2, [a,b,c]).
    -[{0,a},{-2,b},{-4,c}]
    +follows:

    enumerate(I, S, List) ->
    +  {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+S} end, I, List),
    +  List1.

    The default values for Index and Step are both 1.

    Examples

    1> lists:enumerate([a,b,c]).
    +[{1,a},{2,b},{3,c}]
    +2> lists:enumerate(10, [a,b,c]).
    +[{10,a},{11,b},{12,c}]
    +3> lists:enumerate(0, -2, [a,b,c]).
    +[{0,a},{-2,b},{-4,c}]
    @@ -1350,9 +1350,9 @@

    Returns a list of elements Elem in List1 for which Pred(Elem) -returns true.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -2> lists:filter(IsEven, [1,2,3,4,5]).
    -[2,4]
    +returns true.

    Examples

    1> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +2> lists:filter(IsEven, [1,2,3,4,5]).
    +[2,4]
    @@ -1391,20 +1391,20 @@

    Calls Fun(Elem) on successive elements Elem of List1 to update or remove elements from List1.

    Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the list of elements for which Fun returns a new -value, with true being equivalent to {true, Elem}.

    That is, filtermap behaves as if it were defined as follows:

    filtermap(Fun, List1) ->
    -    lists:flatmap(fun(Elem) ->
    -                          case Fun(Elem) of
    -                              false -> [];
    -                              true -> [Elem];
    -                              {true,Value} -> [Value]
    +value, with true being equivalent to {true, Elem}.

    That is, filtermap behaves as if it were defined as follows:

    filtermap(Fun, List1) ->
    +    lists:flatmap(fun(Elem) ->
    +                          case Fun(Elem) of
    +                              false -> [];
    +                              true -> [Elem];
    +                              {true,Value} -> [Value]
                               end
    -                  end, List1).

    Examples

    1> lists:filtermap(fun(X) ->
    +                  end, List1).

    Examples

    1> lists:filtermap(fun(X) ->
                                case X rem 2 of
    -                               0 -> {true, X div 2};
    +                               0 -> {true, X div 2};
                                    1 -> false
                                end
    -                   end, [1,2,3,4,5]).
    -[1,2]
    +
    end, [1,2,3,4,5]). +[1,2]
    @@ -1432,9 +1432,9 @@ -

    Equivalent to length(flatten(DeepList)), but more efficient.

    Examples

    1> lists:flatlength([a,[b,c,[d,e]],f,[[g,h,i]]]).
    +

    Equivalent to length(flatten(DeepList)), but more efficient.

    Examples

    1> lists:flatlength([a,[b,c,[d,e]],f,[[g,h,i]]]).
     9
    -2> lists:flatlength([[[]]]).
    +2> lists:flatlength([[[]]]).
     0
    @@ -1466,14 +1466,14 @@

    Takes a function from As to lists of Bs, and a list of As (List1), producing a list of Bs by applying the function to each element in List1 and /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/maps.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/maps.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/maps.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -612,10 +612,10 @@

    Returns a map Map where each key-value pair from MapOrIter satisfies the predicate Pred(Key, Value).

    Unless MapOrIter is an ordered iterator returned by iterator/2, the order of the Pred(Key, Value) calls is not defined.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Pred is not a function of arity 2.

    Examples

    1> M = #{a => 2, b => 3, "a" => 1, "b" => 2}.
    -2> Pred = fun(K, V) -> is_atom(K) andalso V rem 2 =:= 0 end.
    -3> maps:filter(Pred, M).
    -#{a => 2}
    +valid iterator, or with badarg if Pred is not a function of arity 2.

    Examples

    1> M = #{a => 2, b => 3, "a" => 1, "b" => 2}.
    +2> Pred = fun(K, V) -> is_atom(K) andalso V rem 2 =:= 0 end.
    +3> maps:filter(Pred, M).
    +#{a => 2}
    @@ -655,12 +655,12 @@ {true, NewValue}, the value for Key is replaced with NewValue in the result map.

    Unless MapOrIter is an ordered iterator returned by iterator/2, the order of the Fun(Key, Value1) calls is not defined.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 2.

    Examples

    1> Fun = fun(K, V) when is_atom(K) -> {true, V*2};
    -            (_, V) -> V rem 2 =:= 0
    +valid iterator, or with badarg if Fun is not a function of arity 2.

    Examples

    1> Fun = fun(K, V) when is_atom(K) -> {true, V*2};
    +            (_, V) -> V rem 2 =:= 0
        end.
    -2> Map = #{k1 => 1, "k2" => 2, "k3" => 3}.
    -3> maps:filtermap(Fun, Map).
    -#{k1 => 2,"k2" => 2}
    +2>
    Map = #{k1 => 1, "k2" => 2, "k3" => 3}. +3> maps:filtermap(Fun, Map). +#{k1 => 2,"k2" => 2}
    @@ -691,10 +691,10 @@

    Returns a tuple {ok, Value}, where Value is the value associated with Key, -or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Examples

    1> Map = #{"hi" => 42}.
    +or error if no value is associated with Key in Map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Examples

    1> Map = #{"hi" => 42}.
     2> Key = "hi".
    -3> maps:find(Key, Map).
    -{ok,42}
    +3>
    maps:find(Key, Map). +{ok,42}
    @@ -737,9 +737,9 @@ map is empty.

    Unless MapOrIter is an ordered iterator returned by iterator/2, the order of the Fun(Key, Value, AccIn) calls is not defined.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or valid iterator, or with badarg if Fun is not a function of -arity 3.

    Examples

    1> Fun = fun(K, V, AccIn) -> AccIn + V end.
    -2> Map = #{k1 => 1, k2 => 2, k3 => 3}.
    -3> maps:fold(Fun, 0, Map).
    +arity 3.

    Examples

    1> Fun = fun(K, V, AccIn) -> AccIn + V end.
    +2> Map = #{k1 => 1, k2 => 2, k3 => 3}.
    +3> maps:fold(Fun, 0, Map).
     6
    @@ -776,12 +776,12 @@

    Calls Fun(Key, Value) for every Key to Value association in MapOrIter.

    Unless MapOrIter is an ordered iterator returned by iterator/2, the order of the Fun(Key, Value) calls is not defined.

    The call fails with a {badmap,Map} exception if MapOrIter is not a map or -valid iterator, or with badarg if Fun is not a function of arity 2.

    Examples

    1> Fun = fun(K, V) -> self() ! {K,V} end.
    -2> Map = #{p => 1, q => 2,x => 10, y => 20, z => 30}.
    -3> maps:foreach(Fun, maps:iterator(Map, ordered)).
    +valid iterator, or with badarg if Fun is not a function of arity 2.

    Examples

    1> Fun = fun(K, V) -> self() ! {K,V} end.
    +2> Map = #{p => 1, q => 2,x => 10, y => 20, z => 30}.
    +3> maps:foreach(Fun, maps:iterator(Map, ordered)).
     ok
    -4> [receive X -> X end || _ <- [1,2,3,4,5]].
    -[{p,1},{q,2},{x,10},{y,20},{z,30}]
    +4>
    [receive X -> X end || _ <- [1,2,3,4,5]]. +[{p,1},{q,2},{x,10},{y,20},{z,30}]
    @@ -812,9 +812,9 @@

    Takes a list of keys and a value and builds a map where all keys are -associated with the same value.

    Examples

    1> Keys = ["a", "b", "c"].
    -2> maps:from_keys(Keys, ok).
    -#{"a" => ok,"b" => ok,"c" => ok}
    +associated with the same value.

    Examples

    1> Keys = ["a", "b", "c"].
    +2> maps:from_keys(Keys, ok).
    +#{"a" => ok,"b" => ok,"c" => ok}
    @@ -845,9 +845,9 @@

    Takes a list of key-value tuples and builds a map.

    If the same key appears more than once, the last (rightmost) value is -used, and previous values are ignored.

    Examples

    1> List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}].
    -2> maps:from_list(List).
    -#{42 => value_three,1337 => "value two","a" => 1}
    +used, and previous values are ignored.

    Examples

    1> List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}].
    +2> maps:from_list(List).
    +#{42 => value_three,1337 => "value two","a" => 1}
    @@ -879,8 +879,8 @@

    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.

    Examples

    1> Key = 1337.
    -2> Map = #{42 => value_two,1337 => "value one","a" => 1}.
    -3> maps:get(Key, Map).
    +2> Map = #{42 => value_two,1337 => "value one","a" => 1}.
    +3> maps:get(Key, Map).
     "value one"
    @@ -912,11 +912,11 @@

    Returns the value associated with key Key in Map, or Default if -Key is not present in the map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Examples

    1> Map = #{key1 => val1, key2 => val2}.
    -#{key1 => val1,key2 => val2}
    -2> maps:get(key1, Map, "Default value").
    +Key is not present in the map.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Examples

    1> Map = #{key1 => val1, key2 => val2}.
    +#{key1 => val1,key2 => val2}
    +2> maps:get(key1, Map, "Default value").
     val1
    -3> maps:get(key3, Map, "Default value").
    +3> maps:get(key3, Map, "Default value").
     "Default value"
    @@ -956,13 +956,13 @@

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples

    1> EvenOdd = fun(X) when X rem 2 =:= 0 -> even;
    -                (_) -> odd
    +list.

    Examples

    1> EvenOdd = fun(X) when X rem 2 =:= 0 -> even;
    +                (_) -> odd
                  end.
    -2> maps:groups_from_list(EvenOdd, [1, 2, 3]).
    -#{even => [2], odd => [1, 3]}
    -3> maps:groups_from_list(fun length/1, ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    +2>
    maps:groups_from_list(EvenOdd, [1, 2, 3]). +#{even => [2], odd => [1, 3]} +3> maps:groups_from_list(fun length/1, ["ant", "buffalo", "cat", "dingo"]). +#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
    @@ -1004,15 +1004,15 @@

    Partitions the given List into a map of groups.

    The result is a map where each key is given by KeyFun and each value is a list of elements from the given List, mapped via ValueFun, for which KeyFun returned the same key.

    The order of elements within each group list is preserved from the original -list.

    Examples

    1> EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end.
    -2> Square = fun(X) -> X * X end.
    -3> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    -#{even => [4], odd => [1, 9]}
    -4> maps:groups_from_list(
    +list.

    Examples

    1> EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end.
    +2> Square = fun(X) -> X * X end.
    +3> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
    +#{even => [4], odd => [1, 9]}
    +4> maps:groups_from_list(
         fun length/1,
         fun lists:reverse/1,
    -    ["ant", "buffalo", "cat", "dingo"]).
    -#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    +
    ["ant", "buffalo", "cat", "dingo"]). +#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
    @@ -1046,10 +1046,10 @@

    Computes the intersection of maps Map1 and Map2, producing a single map Map3.

    If a key exists in both maps, the value in Map1 is superseded by the value in Map2. Keys existing in only one of the maps are discarded -along with their values.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Examples

    1> Map1 = #{a => "one", b => "two"}.
    -2> Map2 = #{a => 1, c => 3}.
    -3> maps:intersect(Map1, Map2).
    -#{a => 1}
    +along with their values.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map.

    Examples

    1> Map1 = #{a => "one", b => "two"}.
    +2> Map2 = #{a => 1, c => 3}.
    +3> maps:intersect(Map1, Map2).
    +#{a => 1}
    @@ -1090,10 +1090,10 @@ first parameter, the value from Map1 is the second parameter, and the value from Map2 is the third parameter.

    The call fails with a {badmap,Map} exception if Map1 or Map2 is not a map. The call fails with a badarg exception if Combiner is not a fun that takes -three arguments.

    Examples

    1> Map1 = #{a => "one", b => "two"}.
    -2> Map2 = #{a => 1, c => 3}.
    -3> maps:intersect_with(fun(_Key, Val1, Val2) -> {Val1, Val2} end, Map1, Map2).
    -#{a => {"one",1}}
    +three arguments.

    Examples

    1> Map1 = #{a => "one", b => "two"}.
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/math.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/math.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/math.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -328,7 +328,7 @@
     
           
     
    -

    Returns the arc cosine of X in radians.

    Examples

    1> math:acos(1.0).
    +

    Returns the arc cosine of X in radians.

    Examples

    1> math:acos(1.0).
     0.0
    @@ -357,7 +357,7 @@ -

    Returns the inverse hyperbolic cosine of X.

    Examples

    1> math:acosh(1.0).
    +

    Returns the inverse hyperbolic cosine of X.

    Examples

    1> math:acosh(1.0).
     0.0
    @@ -386,7 +386,7 @@ -

    Returns the arc cosine of X in radians.

    Examples

    1> math:asin(0.0).
    +

    Returns the arc cosine of X in radians.

    Examples

    1> math:asin(0.0).
     0.0
    @@ -415,7 +415,7 @@ -

    Returns the inverse hyperbolic sine of X.

    Examples

    1> math:asinh(0.0).
    +

    Returns the inverse hyperbolic sine of X.

    Examples

    1> math:asinh(0.0).
     0.0
    @@ -445,7 +445,7 @@

    Returns the arc tangent of Y/X in radians, using the signs of both -arguments to determine the quadrant of the return value.

    Examples

    1> math:atan2(0.0, -10.0).
    +arguments to determine the quadrant of the return value.

    Examples

    1> math:atan2(0.0, -10.0).
     3.141592653589793
    @@ -474,7 +474,7 @@ -

    Returns the arc tangent of X in radians.

    Examples

    1> math:atan(0.0).
    +

    Returns the arc tangent of X in radians.

    Examples

    1> math:atan(0.0).
     0.0
    @@ -503,7 +503,7 @@ -

    Returns the inverse hyperbolic tangent of X.

    Examples

    1> math:atanh(0.0).
    +

    Returns the inverse hyperbolic tangent of X.

    Examples

    1> math:atanh(0.0).
     0.0
    @@ -534,11 +534,11 @@ -

    Returns the ceiling of X.

    Examples

    1> math:ceil(7.5).
    +

    Returns the ceiling of X.

    Examples

    1> math:ceil(7.5).
     8.0
    -2> math:ceil(-5.5).
    +2> math:ceil(-5.5).
     -5.0
    -3> math:ceil(1.0).
    +3> math:ceil(1.0).
     1.0
    @@ -567,7 +567,7 @@ -

    Returns the cosine of X in radians.

    Examples

    1> math:cos(0.0)
    +

    Returns the cosine of X in radians.

    Examples

    1> math:cos(0.0)
     1.0
    @@ -596,7 +596,7 @@ -

    Returns the hyperbolic cosine of X.

    Examples

    1> math:cosh(0.0)
    +

    Returns the hyperbolic cosine of X.

    Examples

    1> math:cosh(0.0)
     1.0
    @@ -625,9 +625,9 @@ -

    Returns the error function of X.

    See Error function (Wikipedia).

    Examples

    1> math:erf(0.0).
    +

    Returns the error function of X.

    See Error function (Wikipedia).

    Examples

    1> math:erf(0.0).
     0.0
    -2> math:erf(10.0).
    +2> math:erf(10.0).
     1.0
    @@ -657,7 +657,7 @@

    Returns 1.0 - erf(X), computed using methods -that avoid cancellation for large X.

    Examples

    1> math:erfc(0.0).
    +that avoid cancellation for large X.

    Examples

    1> math:erfc(0.0).
     1.0
    @@ -686,9 +686,9 @@ -

    Returns e raised to the power of X.

    Examples

    1> math:exp(0).
    +

    Returns e raised to the power of X.

    Examples

    1> math:exp(0).
     1.0
    -2> trunc(100 * math:exp(1)).
    +2> trunc(100 * math:exp(1)).
     271
    @@ -719,11 +719,11 @@ -

    Returns the floor of X.

    Examples

    1> math:floor(9.1).
    +

    Returns the floor of X.

    Examples

    1> math:floor(9.1).
     9.0
    -2> math:floor(-1.5).
    +2> math:floor(-1.5).
     -2.0
    -3> math:floor(1.0)
    +3> math:floor(1.0)
     1.0
    @@ -754,7 +754,7 @@ -

    Returns the floating point remainder X divided by Y.

    Examples

    1> math:fmod(10.5, 8.0).
    +

    Returns the floating point remainder X divided by Y.

    Examples

    1> math:fmod(10.5, 8.0).
     2.5
    @@ -785,11 +785,11 @@ -

    Returns logarithm of X to base 2.

    Examples

    1> math:log2(1.0).
    +

    Returns logarithm of X to base 2.

    Examples

    1> math:log2(1.0).
     0.0
    -2> math:log2(2.0).
    +2> math:log2(2.0).
     1.0
    -3> math:log2(64).
    +3> math:log2(64).
     6.0
    @@ -818,11 +818,11 @@ -

    Returns logarithm of X to base 10.

    Examples

    1> math:log10(1.0).
    +

    Returns logarithm of X to base 10.

    Examples

    1> math:log10(1.0).
     0.0
    -2> math:log10(10.0).
    +2> math:log10(10.0).
     1.0
    -3> math:log10(100).
    +3> math:log10(100).
     2.0
    @@ -851,9 +851,9 @@ -

    Returns the natural logarithm of X.

    Examples

    1> math:log(1.0).
    +

    Returns the natural logarithm of X.

    Examples

    1> math:log(1.0).
     0.0
    -2> math:log(2.718281828459045).
    +2> math:log(2.718281828459045).
     1.0
    @@ -882,7 +882,7 @@ /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -42,31 +42,31 @@ table and construct a list of tuples containing relevant parts of the data in these rows. One can use ets:foldl/3 instead, but the ets:select/2 call is far more efficient. Without the translation provided by ms_transform, one must -struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
    +struggle with writing match specifications terms to accommodate this.

    Consider a simple table of employees:

    -record(emp, {empno,     %Employee number as a string, the key
                   surname,   %Surname of the employee
                   givenname, %Given name of employee
                   dept,      %Department, one of {dev,sales,prod,adm}
    -              empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    - {emp,"041231","Doe","John",prod,2001},
    - {emp,"052341","Smith","John",dev,1997},
    - {emp,"076324","Smith","Ella",sales,1995},
    - {emp,"122334","Weston","Anna",prod,2002},
    - {emp,"535216","Chalker","Samuel",adm,1998},
    - {emp,"789789","Harrysson","Joe",adm,1996},
    - {emp,"963721","Scott","Juliana",dev,2003},
    - {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, -there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    -[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still + empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab, [{keypos,#emp.empno},named_table,ordered_set]).

    We fill the table with randomly chosen data:

    [{emp,"011103","Black","Alfred",sales,2000},
    + {emp,"041231","Doe","John",prod,2001},
    + {emp,"052341","Smith","John",dev,1997},
    + {emp,"076324","Smith","Ella",sales,1995},
    + {emp,"122334","Weston","Anna",prod,2002},
    + {emp,"535216","Chalker","Samuel",adm,1998},
    + {emp,"789789","Harrysson","Joe",adm,1996},
    + {emp,"963721","Scott","Juliana",dev,2003},
    + {emp,"989891","Brown","Gabriel",prod,1999}]

    Assuming that we want the employee numbers of everyone in the sales department, +there are several ways.

    ets:match/2 can be used:

    1> ets:match(emp_tab, {'_', '$1', '_', '_', sales, '_'}).
    +[["011103"],["076324"]]

    ets:match/2 uses a simpler type of match specification, but it is still unreadable, and one has little control over the returned result. It is always a -list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    -             (_,Acc) -> Acc
    +list of lists.

    ets:foldl/3 or ets:foldr/3 can be used to avoid the nested lists:

    ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc];
    +             (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only + [], + emp_tab).

    The result is ["011103","076324"]. The fun is straightforward, so the only problem is that all the data from the table must be transferred from the table to the calling process for filtering. That is inefficient compared to the ets:match/2 call where the filtering can be done "inside" the emulator and -only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to +only the result is transferred to the process.

    Consider a "pure" ets:select/2 call that does what ets:foldr does:

    ets:select(emp_tab, [{#emp{empno = '$1', dept = sales, _='_'},[],['$1']}]).

    Although the record syntax is used, it is still hard to read and even harder to write. The first element of the tuple, #emp{empno = '$1', dept = sales, _='_'}, tells what to match. Elements not matching this are not returned, as in the ets:match/2 example. The second @@ -77,12 +77,12 @@ hence the employee number is returned. The result is ["011103","076324"], as in the ets:foldr/3 example, but the result is retrieved much more efficiently in terms of execution speed and memory consumption.

    Using ets:fun2ms/1, we can combine the ease of use of the ets:foldr/3 and -the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the efficiency of the pure ets:select/2 example:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, dept = sales}) ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, dept = sales}) ->
                                   E
    -                      end)).

    This example requires no special knowledge of match specifications to + end)).

    This example requires no special knowledge of match specifications to understand. The head of the fun matches what you want to filter out and the body returns what you want returned. As long as the fun can be kept within the limits of the match specifications, there is no need to transfer all table data to the @@ -98,28 +98,28 @@ specifications by hand.

    Example 2

    Assume that we want to get all the employee numbers of employees hired before year 2000. Using ets:match/2 is not an alternative here, as relational operators cannot be expressed there. Once again, ets:foldr/3 can do it -(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    -                  (_,Acc) -> Acc
    +(slowly, but correct):

    ets:foldr(fun(#emp{empno = E, empyear = Y},Acc) when Y < 2000 -> [E | Acc];
    +                  (_,Acc) -> Acc
               end,
    -          [],
    -          emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The + [], + emp_tab).

    The result is ["052341","076324","535216","789789","989891"], as expected. The equivalent expression using a handwritten match specification would look like -this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    -                     [{'<', '$2', 2000}],
    -                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and +this:

    ets:select(emp_tab, [{#emp{empno = '$1', empyear = '$2', _='_'},
    +                     [{'<', '$2', 2000}],
    +                     ['$1']}]).

    This gives the same result. [{'<', '$2', 2000}] is in the guard part and therefore discards anything that does not have an empyear (bound to '$2' in -the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
    +the head) less than 2000, as the guard in the foldr/3 example.

    We write it using ets:fun2ms/1:

    -include_lib("stdlib/include/ms_transform.hrl").
     
    -ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
    +ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, empyear = Y}) when Y < 2000 ->
                                E
    -                      end)).

    Example 3

    Assume that we want the whole object matching instead of only one element. One + end)).

    Example 3

    Assume that we want the whole object matching instead of only one element. One alternative is to assign a variable to every part of the record and build it up -once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(Obj = #emp{empno = E, empyear = Y})
    +once again in the body of the fun, but the following is easier:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(Obj = #emp{empno = E, empyear = Y})
                              when Y < 2000 ->
                                   Obj
    -                      end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched + end)).

    As in ordinary Erlang matching, you can bind a variable to the whole matched object using a "match inside the match", that is, a =. Unfortunately in funs translated to match specifications, it is allowed only at the "top-level", that is, matching the whole object arriving to be matched into a separate variable. @@ -128,34 +128,34 @@ object/0 also returns the whole matched object, see section Warnings and Restrictions.

    Example 4

    This example concerns the body of the fun. Assume that all employee numbers beginning with zero (0) must be changed to begin with one (1) instead, and -that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = [$0 | Rest] }) ->
    -                              {[$0|Rest],[$1|Rest]}
    -                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, +that we want to create the list [{<Old empno>,<New empno>}]:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = [$0 | Rest] }) ->
    +                              {[$0|Rest],[$1|Rest]}
    +                      end)).

    This query hits the feature of partially bound keys in table type ordered_set, so that not the whole table needs to be searched, only the part containing keys beginning with 0 is looked into.

    Example 5

    The fun can have many clauses. Assume that we want to do the following:

    • If an employee started before 1997, return the tuple {inventory, <employee number>}.
    • If an employee started 1997 or later, but before 2001, return {rookie, <employee number>}.
    • For all other employees, return {newbie, <employee number>}, except for those named Smith as they would be affronted by anything other than the tag guru and that is also what is returned for their numbers: -{guru, <employee number>}.

    This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    -                      fun(#emp{empno = E, surname = "Smith" }) ->
    -                              {guru,E};
    -                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    -                              {inventory, E};
    -                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    -                              {newbie, E};
    -                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    -                              {rookie, E}
    -                      end)).

    The result is as follows:

    [{rookie,"011103"},
    - {rookie,"041231"},
    - {guru,"052341"},
    - {guru,"076324"},
    - {newbie,"122334"},
    - {rookie,"535216"},
    - {inventory,"789789"},
    - {newbie,"963721"},
    - {rookie,"989891"}]

    Useful BIFs

    What more can you do? A simple answer is: see the documentation of +{guru, <employee number>}.

    This is accomplished as follows:

    ets:select(emp_tab, ets:fun2ms(
    +                      fun(#emp{empno = E, surname = "Smith" }) ->
    +                              {guru,E};
    +                         (#emp{empno = E, empyear = Y}) when Y < 1997  ->
    +                              {inventory, E};
    +                         (#emp{empno = E, empyear = Y}) when Y > 2001  ->
    +                              {newbie, E};
    +                         (#emp{empno = E, empyear = Y}) -> % 1997 -- 2001
    +                              {rookie, E}
    +                      end)).

    The result is as follows:

    [{rookie,"011103"},
    + {rookie,"041231"},
    + {guru,"052341"},
    + {guru,"076324"},
    + {newbie,"122334"},
    + {rookie,"535216"},
    + {inventory,"789789"},
    + {newbie,"963721"},
    + {rookie,"989891"}]

    Useful BIFs

    What more can you do? A simple answer is: see the documentation of match specifications in ERTS User's Guide. However, the following is a brief overview of the most useful "built-in functions" that you can use when the fun is to be translated into a match specification by @@ -190,18 +190,18 @@ more, as filtering using Erlang code is not a good idea when tracing (except afterwards, if you trace to file). The concept is similar to that of ets:fun2ms/1 except that you usually use it directly from the shell (which can -also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
    +also be done with ets:fun2ms/1).

    The following is an example module to trace on:

    -module(toy).
     
    --export([start/1, store/2, retrieve/1]).
    +-export([start/1, store/2, retrieve/1]).
     
    -start(Args) ->
    -    toy_table = ets:new(toy_table, Args).
    +start(Args) ->
    +    toy_table = ets:new(toy_table, Args).
     
    -store(Key, Value) ->
    -    ets:insert(toy_table, {Key,Value}).
    +store(Key, Value) ->
    +    ets:insert(toy_table, {Key,Value}).
     
    -retrieve(Key) ->
    -    [{Key, Value}] = ets:lookup(toy_table, Key),
    +retrieve(Key) ->
    +    [{Key, Value}] = ets:lookup(toy_table, Key),
         Value.

    During model testing, the first test results in {badmatch,16} in {toy,start,1}, why?

    We suspect the ets:new/2 call, as we match hard on the return value, but want only the particular new/2 call with toy_table as first parameter. So we @@ -210,32 +210,32 @@ trace pattern, so there is no need to call trace only a few processes (usually it is not):

    2> dbg:p(all,call).
     {ok,[{matched,nonode@nohost,25}]}

    We specify the filter, we want to view calls that resemble -ets:new(toy_table, <something>):

    3> dbg:tp(ets,new,dbg:fun2ms(fun([toy_table,_]) -> true end)).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/notes.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/notes.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -17,49 +17,49 @@
       
     
         

    STDLIB Release Notes

    -

    This document describes the changes made to the STDLIB application.

    STDLIB 7.3

    Fixed Bugs and Malfunctions

    • Fixed functions ets:init_table/2, ets:tab2file/2,3, ets:table/1,2, ets:i/0,1, dets:from_ets/2, and dets:to_ets/2 to resolve named table arguments only once. This will prevent strange effects if the named table is deleted and recreated by a concurrent process.

      Own Id: OTP-19911 Aux Id: PR-10536

    • Corrected the af_zip_generator() type in the parser and syntax_tools.

      Own Id: OTP-19939

    • For a function that started with a bracket-only pattern (such as []), the ?FUNCTION_ARITY macro would evaluate to one less than the actual arity.

      Own Id: OTP-19988 Aux Id: GH-10705, PR-10708

    Improvements and New Features

    • Added support for zstd compression in the file module.

      Own Id: OTP-19860 Aux Id: PR-10385

    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

      make release_docs places the documentation in the released code under the doc folder.

      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

      Improves the source Software-Bill-of-Materials

      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

      Own Id: OTP-19886 Aux Id: PR-10434

    • The removal of the slave and slave modules have been postponed to Erlang/OTP 31.

      The partial removal of the archive feature has been postponed to Erlang/OTP 30.

      Own Id: OTP-19989 Aux Id: PR-10714

    STDLIB 7.2.1

    Fixed Bugs and Malfunctions

    • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

      Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

      Own Id: OTP-19962 Aux Id: PR-10616

    STDLIB 7.2

    Fixed Bugs and Malfunctions

    • When creating a tar archive using erl_tar, leading slashes would be kept for filenames with up to 100 characters. The slash would be dropped for longer filenames. This has been corrected to always keep the leading slash.

      Own Id: OTP-19066 Aux Id: PR-8309

    • For some function heads or case expressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code.

      Own Id: OTP-19797 Aux Id: PR-10252

    • Passing a type for a fun as a macro argument would result in a "badly formed argument" error message from the compiler. Example:

      -module(test).
      --define(FOO(X), X).
      --type foo() :: ?FOO(fun(() -> ok)).

      Compiling this module would result in the following error message:

      test.erl:3:17: badly formed argument for macro 'FOO'
      +

      This document describes the changes made to the STDLIB application.

      STDLIB 7.3

      Fixed Bugs and Malfunctions

      • Fixed functions ets:init_table/2, ets:tab2file/2,3, ets:table/1,2, ets:i/0,1, dets:from_ets/2, and dets:to_ets/2 to resolve named table arguments only once. This will prevent strange effects if the named table is deleted and recreated by a concurrent process.

        Own Id: OTP-19911 Aux Id: PR-10536

      • Corrected the af_zip_generator() type in the parser and syntax_tools.

        Own Id: OTP-19939

      • For a function that started with a bracket-only pattern (such as []), the ?FUNCTION_ARITY macro would evaluate to one less than the actual arity.

        Own Id: OTP-19988 Aux Id: GH-10705, PR-10708

      Improvements and New Features

      • Added support for zstd compression in the file module.

        Own Id: OTP-19860 Aux Id: PR-10385

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      • The removal of the slave and slave modules have been postponed to Erlang/OTP 31.

        The partial removal of the archive feature has been postponed to Erlang/OTP 30.

        Own Id: OTP-19989 Aux Id: PR-10714

      STDLIB 7.2.1

      Fixed Bugs and Malfunctions

      • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

        Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

        Own Id: OTP-19962 Aux Id: PR-10616

      STDLIB 7.2

      Fixed Bugs and Malfunctions

      • When creating a tar archive using erl_tar, leading slashes would be kept for filenames with up to 100 characters. The slash would be dropped for longer filenames. This has been corrected to always keep the leading slash.

        Own Id: OTP-19066 Aux Id: PR-8309

      • For some function heads or case expressions with a huge number of clauses, the compiler could spend an inordinate amount of time compiling the code.

        Own Id: OTP-19797 Aux Id: PR-10252

      • Passing a type for a fun as a macro argument would result in a "badly formed argument" error message from the compiler. Example:

        -module(test).
        +-define(FOO(X), X).
        +-type foo() :: ?FOO(fun(() -> ok)).

        Compiling this module would result in the following error message:

        test.erl:3:17: badly formed argument for macro 'FOO'
         %    5| -type foo() :: ?FOO(fun(() -> ok)).
        -%

        Own Id: OTP-19821 Aux Id: GH-10280, PR-10309

      • Fixed an issue that prohibited the use of user defined functions within a restricted shell.

        Own Id: OTP-19833 Aux Id: PR-10315

      • The deprecated function crypto:rand_uniform/2 has gotten a new replacement function crypto:strong_rand_range/1. When implementing this the documentation of crypto and rand has been rewritten a bit and improved.

        Own Id: OTP-19841 Aux Id: PR-10344

      • Fixed a bug in the shell where a reference to a locally defined function would cause a crash.

        Own Id: OTP-19850 Aux Id: GH-10294

      Improvements and New Features

      • You are now able to read the reference manual with man.

        Own Id: OTP-19787 Aux Id: PR-10237

      • Improved spec for ets:lookup_element/4.

        Own Id: OTP-19798 Aux Id: PR-10236

      • The mnesia_registry module will be removed in Erlang/OTP 29.

        Own Id: OTP-19808 Aux Id: PR-10275

      STDLIB 7.1

      Fixed Bugs and Malfunctions

      • The save_module/1 command in the shell now saves both the locally defined records and the imported records using the rr/1 command.

        Own Id: OTP-19647 Aux Id: GH-9816, PR-9897

      • It's now possible to write lists:map(fun is_atom/1, []) or lists:map(fun my_func/1, []) in the shell, instead of lists:map(fun erlang:is_atom/1, []) or lists:map(fun shell_default:my_func/1, []).

        Own Id: OTP-19649 Aux Id: GH-9771, PR-9898

      • The shell no longer crashes when requesting to auto-complete map keys containing non-atoms.

        Own Id: OTP-19659 Aux Id: PR-9896

      • A remote shell can now exit by closing the input stream, without terminating the remote node.

        Own Id: OTP-19667 Aux Id: PR-9912

      • Fixed guard check for is_record/2 in the linter.

        Own Id: OTP-19704 Aux Id: GH-10020, PR-10034

      Improvements and New Features

      • Added a flag option shell_hints and function shell:hints/1. You can now disable the warning in the shell when a command is taking longer than 5 seconds.

        Own Id: OTP-19759 Aux Id: PR-10121

      STDLIB 7.0.3

      Fixed Bugs and Malfunctions

      • Update PCRE2 from 10.45 to 10.46. Fixes potential buffer read overflow on regular expressions with (*scs:) and (*ACCEPT) syntax combined.

        Own Id: OTP-19755 Aux Id: CVE-2025-58050

      STDLIB 7.0.2

      Fixed Bugs and Malfunctions

      • A set of small bugs in sort stability for `lists:sort/1` and `lists:keysort/1` has been fixed. The bug happened for only some, seemingly random, element sequences. Most sorts were stable.

        Sort stability for `lists:sort/1` is only possible to observe when sorting lists with floating point and integer numbers of the same value.

        For `lists:keysort/1` the list had to start with two tuples where the keys or the whole tuples compared equal.

        Own Id: OTP-19673 Aux Id: ERIERL-1240

      • Fixed bug in io_lib:bformat/2 which crashed if format string contained unicode characters.

        Own Id: OTP-19680 Aux Id: PR-9952

      STDLIB 7.0.1

      Fixed Bugs and Malfunctions

      • Properly strip the leading / and drive letter from filepaths when zipping and unzipping archives.

        Thanks to Wander Nauta for finding and responsibly disclosing this vulnerability to the Erlang/OTP project.

        Own Id: OTP-19653 Aux Id: CVE-2025-4748, PR-9941

      STDLIB 7.0

      Fixed Bugs and Malfunctions

      • Shell help now orders the commands in alphabetical order.

        Own Id: OTP-19161 Aux Id: PR-8573

      • proc_lib:stop/1,3 (and in extension gen_server:stop/3, gen_statem:stop/3 and so on) have been updated to not throw an error if the process to be stopped exits with the same reason as given to proc_lib:stop/3.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19233 Aux Id: PR-8772

      • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

        While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

        External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19285 Aux Id: PR-8913

      • argparse:help/1 now accepts unicode:chardata/0.

        Own Id: OTP-19303 Aux Id: PR-8932

      • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

        This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

      • The previous digraph_utils:preorder/1 and digraph_utils:postorder/1 did not start the traversal from root nodes. This fix makes both traversals only start or restart from a root node in one of the components, or an arbitrary node if no root node can be visited.

        Own Id: OTP-19393 Aux Id: PR-9171

      • Auto-completion in the shell is now significantly faster for function parameters that uses complex custom types.

        Own Id: OTP-19413 Aux Id: PR-9271

      • Stringfying a non-latin1 atom will now produce a readable string instead of encoding each character using \x{...} escape sequences. Example:

        -define(S(T), ??T).
        +%

        Own Id: OTP-19821 Aux Id: GH-10280, PR-10309

      • Fixed an issue that prohibited the use of user defined functions within a restricted shell.

        Own Id: OTP-19833 Aux Id: PR-10315

      • The deprecated function crypto:rand_uniform/2 has gotten a new replacement function crypto:strong_rand_range/1. When implementing this the documentation of crypto and rand has been rewritten a bit and improved.

        Own Id: OTP-19841 Aux Id: PR-10344

      • Fixed a bug in the shell where a reference to a locally defined function would cause a crash.

        Own Id: OTP-19850 Aux Id: GH-10294

      Improvements and New Features

      • You are now able to read the reference manual with man.

        Own Id: OTP-19787 Aux Id: PR-10237

      • Improved spec for ets:lookup_element/4.

        Own Id: OTP-19798 Aux Id: PR-10236

      • The mnesia_registry module will be removed in Erlang/OTP 29.

        Own Id: OTP-19808 Aux Id: PR-10275

      STDLIB 7.1

      Fixed Bugs and Malfunctions

      • The save_module/1 command in the shell now saves both the locally defined records and the imported records using the rr/1 command.

        Own Id: OTP-19647 Aux Id: GH-9816, PR-9897

      • It's now possible to write lists:map(fun is_atom/1, []) or lists:map(fun my_func/1, []) in the shell, instead of lists:map(fun erlang:is_atom/1, []) or lists:map(fun shell_default:my_func/1, []).

        Own Id: OTP-19649 Aux Id: GH-9771, PR-9898

      • The shell no longer crashes when requesting to auto-complete map keys containing non-atoms.

        Own Id: OTP-19659 Aux Id: PR-9896

      • A remote shell can now exit by closing the input stream, without terminating the remote node.

        Own Id: OTP-19667 Aux Id: PR-9912

      • Fixed guard check for is_record/2 in the linter.

        Own Id: OTP-19704 Aux Id: GH-10020, PR-10034

      Improvements and New Features

      • Added a flag option shell_hints and function shell:hints/1. You can now disable the warning in the shell when a command is taking longer than 5 seconds.

        Own Id: OTP-19759 Aux Id: PR-10121

      STDLIB 7.0.3

      Fixed Bugs and Malfunctions

      • Update PCRE2 from 10.45 to 10.46. Fixes potential buffer read overflow on regular expressions with (*scs:) and (*ACCEPT) syntax combined.

        Own Id: OTP-19755 Aux Id: CVE-2025-58050

      STDLIB 7.0.2

      Fixed Bugs and Malfunctions

      • A set of small bugs in sort stability for `lists:sort/1` and `lists:keysort/1` has been fixed. The bug happened for only some, seemingly random, element sequences. Most sorts were stable.

        Sort stability for `lists:sort/1` is only possible to observe when sorting lists with floating point and integer numbers of the same value.

        For `lists:keysort/1` the list had to start with two tuples where the keys or the whole tuples compared equal.

        Own Id: OTP-19673 Aux Id: ERIERL-1240

      • Fixed bug in io_lib:bformat/2 which crashed if format string contained unicode characters.

        Own Id: OTP-19680 Aux Id: PR-9952

      STDLIB 7.0.1

      Fixed Bugs and Malfunctions

      • Properly strip the leading / and drive letter from filepaths when zipping and unzipping archives.

        Thanks to Wander Nauta for finding and responsibly disclosing this vulnerability to the Erlang/OTP project.

        Own Id: OTP-19653 Aux Id: CVE-2025-4748, PR-9941

      STDLIB 7.0

      Fixed Bugs and Malfunctions

      • Shell help now orders the commands in alphabetical order.

        Own Id: OTP-19161 Aux Id: PR-8573

      • proc_lib:stop/1,3 (and in extension gen_server:stop/3, gen_statem:stop/3 and so on) have been updated to not throw an error if the process to be stopped exits with the same reason as given to proc_lib:stop/3.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19233 Aux Id: PR-8772

      • The size of an atom in the Erlang source code was limited to 255 bytes in previous releases, meaning that an atom containing only emojis could contain only 63 emojis.

        While atoms are still only allowed to contain 255 characters, the number of bytes is no longer limited.

        External tools that parse the AtU8 chunk of a BEAM file directly need to be updated. Tools that use beam_lib:chunks(Beam, [atoms]) to read the atom table will continue to work.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19285 Aux Id: PR-8913

      • argparse:help/1 now accepts unicode:chardata/0.

        Own Id: OTP-19303 Aux Id: PR-8932

      • The literals chunk in BEAM is no longer compressed, resulting in slightly smaller BEAM files when a BEAM file is stripped using beam_lib:strip_files/1.

        This is a potential incompatibility for tools that read and interpret the contents of the literal chunk. One way to update such tools to work with the new format is to retrieve the chunk using beam_lib:chunks(Beam, [literals]).

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-19323 Aux Id: GH-8967, PR-8988

      • The previous digraph_utils:preorder/1 and digraph_utils:postorder/1 did not start the traversal from root nodes. This fix makes both traversals only start or restart from a root node in one of the components, or an arbitrary node if no root node can be visited.

        Own Id: OTP-19393 Aux Id: PR-9171

      • Auto-completion in the shell is now significantly faster for function parameters that uses complex custom types.

        Own Id: OTP-19413 Aux Id: PR-9271

      • Stringfying a non-latin1 atom will now produce a readable string instead of encoding each character using \x{...} escape sequences. Example:

        -define(S(T), ??T).
         
        -atom() ->
        -    ?S('атом').

        The atom/0 function now returns "'атом'" instead of "'\\x{430}\\x{442}\\x{43E}\\x{43C}'".

        Own Id: OTP-19421 Aux Id: GH-9173, PR-9276

      • A few minor issues were corrected in m:syntax_tools, as well in the erl_anno module.

        Own Id: OTP-19422 Aux Id: PR-9253

      • dets could print error messages to standard output when repairing DETS files. This has been changed to send the messages to logger.

        ets:fun2ms would print an error message to standard output as well as returning an error tuple. The printing of the message has been removed.

        Own Id: OTP-19427 Aux Id: PR-9232, PR-9446

      • The functions for converting to and from the RFC1339 date and time format would not properly handle fractional seconds for negative times.

        Own Id: OTP-19441 Aux Id: GH-9279, PR-9280

      • Replaced calls to deprecated crypto:start() with application:start(crypto).

        Own Id: OTP-19485 Aux Id: PR-8592

      • Fixed a bug when calling shell completion on a reserved word followed by a ( would crash the shell.

        Own Id: OTP-19511 Aux Id: GH-9470

      • Corrected the spec of ets:update_element/4.

        Own Id: OTP-19514 Aux Id: PR-9504

      • Corrected the spec for ets:info/1.

        Own Id: OTP-19515 Aux Id: PR-9514

      • Fixed crash when defining records with a string field in the shell

        Own Id: OTP-19533 Aux Id: GH-9557

      • Details in the hibernation implementation and time-out handling has been improved for gen_statem. In particular to avoid selective receive when cancelling a time-out.

        Own Id: OTP-19540 Aux Id: PR-9579

      • Fixed a bug when getting help on a module compiled without debug_info.

        Own Id: OTP-19583 Aux Id: PR-9654

      • Fix zip extraction to wrap invalid DOS timestamps to their correct value instead of returning the actual value. Before this fix the timestamp returned could have a second greater than 59. The bug has been present since Erlang/OTP 27.1.

        Own Id: OTP-19593 Aux Id: PR-9537, GH-9536

      • Enhance specs of timeout for improving documentation and dialyzer analysis.

        Own Id: OTP-19604 Aux Id: PR-9574

      Improvements and New Features

      • Singleton type variables in an union type do not make sense from Dialyzer's point of view. The following example is ill-typed:

        -spec run_test(Opts) -> term()
        -      when Opts :: {join_specs, Bool} | {test, Bool}.

        This used to be reported as a warning. In OTP-28, this is an error

        Own Id: OTP-19125 Aux Id: PR-8556

      • By default, sets created by the sets module will now be represented as maps.

        Own Id: OTP-19127 Aux Id: PR-8429

      • For various error types, the compiler now tries to suggest potential fixes by adding "did you mean ...?" at the end of error messages.

        When a function is used with wrong arity, the compiler will try to suggest a defined function with the same name but a different arity. For example, given the following module:

        -module(typos).
        --export([t/0]).
        -bar(A) -> A.
        -bar(A,A,A) -> A.
        -bar(A,A,A,A) -> A.
        -t() -> bar(0, 0).

        The compiler will emit the following message:

        typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
        +atom() ->
        +    ?S('атом').

        The atom/0 function now returns "'атом'" instead of "'\\x{430}\\x{442}\\x{43E}\\x{43C}'".

        Own Id: OTP-19421 Aux Id: GH-9173, PR-9276

      • A few minor issues were corrected in m:syntax_tools, as well in the erl_anno module.

        Own Id: OTP-19422 Aux Id: PR-9253

      • dets could print error messages to standard output when repairing DETS files. This has been changed to send the messages to logger.

        ets:fun2ms would print an error message to standard output as well as returning an error tuple. The printing of the message has been removed.

        Own Id: OTP-19427 Aux Id: PR-9232, PR-9446

      • The functions for converting to and from the RFC1339 date and time format would not properly handle fractional seconds for negative times.

        Own Id: OTP-19441 Aux Id: GH-9279, PR-9280

      • Replaced calls to deprecated crypto:start() with application:start(crypto).

        Own Id: OTP-19485 Aux Id: PR-8592

      • Fixed a bug when calling shell completion on a reserved word followed by a ( would crash the shell.

        Own Id: OTP-19511 Aux Id: GH-9470

      • Corrected the spec of ets:update_element/4.

        Own Id: OTP-19514 Aux Id: PR-9504

      • Corrected the spec for ets:info/1.

        Own Id: OTP-19515 Aux Id: PR-9514

      • Fixed crash when defining records with a string field in the shell

        Own Id: OTP-19533 Aux Id: GH-9557

      • Details in the hibernation implementation and time-out handling has been improved for gen_statem. In particular to avoid selective receive when cancelling a time-out.

        Own Id: OTP-19540 Aux Id: PR-9579

      • Fixed a bug when getting help on a module compiled without debug_info.

        Own Id: OTP-19583 Aux Id: PR-9654

      • Fix zip extraction to wrap invalid DOS timestamps to their correct value instead of returning the actual value. Before this fix the timestamp returned could have a second greater than 59. The bug has been present since Erlang/OTP 27.1.

        Own Id: OTP-19593 Aux Id: PR-9537, GH-9536

      • Enhance specs of timeout for improving documentation and dialyzer analysis.

        Own Id: OTP-19604 Aux Id: PR-9574

      Improvements and New Features

      • Singleton type variables in an union type do not make sense from Dialyzer's point of view. The following example is ill-typed:

        -spec run_test(Opts) -> term()
        +      when Opts :: {join_specs, Bool} | {test, Bool}.

        This used to be reported as a warning. In OTP-28, this is an error

        Own Id: OTP-19125 Aux Id: PR-8556

      • By default, sets created by the sets module will now be represented as maps.

        Own Id: OTP-19127 Aux Id: PR-8429

      • For various error types, the compiler now tries to suggest potential fixes by adding "did you mean ...?" at the end of error messages.

        When a function is used with wrong arity, the compiler will try to suggest a defined function with the same name but a different arity. For example, given the following module:

        -module(typos).
        +-export([t/0]).
        +bar(A) -> A.
        +bar(A,A,A) -> A.
        +bar(A,A,A,A) -> A.
        +t() -> bar(0, 0).

        The compiler will emit the following message:

        typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
         %   6|     t() -> bar(0, 0).
        -%    |            ^

        For compiler errors that can easily be caused by typos, the compiler will try to suggest what the correct variable or function name, could be. For example, given the following module:

        -module(typos).
        --export([bar/2]).
        +%    |            ^

        For compiler errors that can easily be caused by typos, the compiler will try to suggest what the correct variable or function name, could be. For example, given the following module:

        -module(typos).
        +-export([bar/2]).
         
        -bar(A0, B0) ->
        +bar(A0, B0) ->
             A + B.

        the compiler will emit the following error messages:

        typos.erl:5:5: variable 'A' is unbound, did you mean 'A0'?
         %    5|     A + B.
         %     |     ^
         
         typos.erl:5:9: variable 'B' is unbound, did you mean 'B0'?
         %    5|     A + B.
        -%     |         ^

        Error types that now suggest correct arities: bad_inline, undefined_nif, bad_nowarn_unused_function, bad_nowarn_bif_clash, undefined_function.

        Error types that now suggest correct names: bad_inline, undefined_nif, bad_nowarn_unused_function, undefined_on_load, undefined_function, undefined_record, undefined_field, unbound_var.

        Using a function with wrong arity has higher precedence than having a typo in the function name. If the compiler can find a defined function with the same name but a different arity, it will not suggest a defined function with a close-enough name, regardless of arity.

        Own Id: OTP-19180 Aux Id: PR-8699, PR-9094

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        -[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • Before restarting a child, a supervisor must check if the restart limit is reached. This adds a penalty to the overall restart time, which should be kept low. The algorithm +% | ^

      Error types that now suggest correct arities: bad_inline, undefined_nif, bad_nowarn_unused_function, bad_nowarn_bif_clash, undefined_function.

      Error types that now suggest correct names: bad_inline, undefined_nif, bad_nowarn_unused_function, undefined_on_load, undefined_function, undefined_record, undefined_field, unbound_var.

      Using a function with wrong arity has higher precedence than having a typo in the function name. If the compiler can find a defined function with the same name but a different arity, it will not suggest a defined function with a close-enough name, regardless of arity.

      Own Id: OTP-19180 Aux Id: PR-8699, PR-9094

    • Comprehensions have been extended with zip generators according to EEP 73.

      Example:

      1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
      +[5,7,9]

      Own Id: OTP-19184 Aux Id: PR-8926

    • Before restarting a child, a supervisor must check if the restart limit is reached. This adds a penalty to the overall restart time, which should be kept low. The algorithm has been optimized from 2*O(n) to O(n) behavior.

      Own Id: OTP-19204 Aux Id: PR-8261

    • Added the possibility to configure shell docs column width through the stdlib parameter shell_docs_columns.

      Own Id: OTP-19224 Aux Id: PR-8651

    • The io:setopts/2 function now accepts the line_history option for more explicit handling of when to save shell history.

      Own Id: OTP-19230 Aux Id: PR-8792

    • The shell now prints a help message explaining how to interrupt a running command when stuck executing a command for longer than 5 seconds.

      Own Id: OTP-19231 Aux Id: PR-8793

    • Binaries can now be used as input to calendar:rfc3339_to_system_time/2, and produced as output of calendar:system_time_to_rfc3339/2.

      Own Id: OTP-19250 Aux Id: PR-8812

    • The erl -noshell mode has been updated to have two sub modes called raw and cooked, where cooked is the old default behaviour and raw can be used to bypass the line-editing support of the native terminal. Using raw mode it is possible to read keystrokes as they happen without the user having to press Enter. Also, the raw mode does not echo the typed characters to stdout. An example of how to create a tic-tac-toe game using this mechanism is included in the documentation.

      Own Id: OTP-19314 Aux Id: PR-8962, GH-8037

    • Added io:get_password/0 that can read passwords from stdin when in "raw" -noshell mode.

      Own Id: OTP-19315 Aux Id: PR-8962, PR-9006

    • New strict generators have been added for comprehensions.

      The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

      The new strict generators fail with exception badmatch if a pattern doesn't match.

      Examples:

      Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

      1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
      -[{ok,1},{error,2}]

      If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

      1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
      +[{ok,1},{error,2}]

      If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

      2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
      +that term not matching will cause a crash:

      2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
       ** exception error: no match of right hand side value ok

      Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

      The strict version for bitstring generators is <:=.

      Own Id: OTP-19317 Aux Id: PR-8625

    • New options for suppressing behaviour warnings have been added:

      • nowarn_conflicting_behaviours
      • nowarn_undefined_behaviour_func
      • nowarn_undefined_behaviour
      • nowarn_undefined_behaviour_callbacks
      • nowarn_ill_defined_behaviour_callbacks
      • nowarn_ill_defined_optional_callbacks

      Own Id: OTP-19334 Aux Id: GH-8985, PR-9020

    • The join(Binaries, Separator) function that joins a list of binaries has been added to the binary module.

      Own Id: OTP-19337 Aux Id: GH-8099, PR-8100

    • The supervisor:which_child/2 function has been added to facilitate getting the pid of a sibling process; that is a process under same supervisor as the process that calls to call the new function.

      Own Id: OTP-19345 Aux Id: PR-8976

    • The function erl_anno:set_end_location/2 for setting the end location of a token has been added.

      Own Id: OTP-19354 Aux Id: PR-8966

    • Added a warning for calling non-exported functions with the remote function call syntax from the same module, and likewise for the remote fun syntax.

      Own Id: OTP-19371 Aux Id: GH-9092, PR-9095

    • The warn_deprecated_catch option enables warnings for use of old-style catch expressions on the form catch Expr instead of the modern try ... catch ... end. To prevent new uses of uses of old catches to be added, this compiler option can be enabled on the project level and -compile(nowarn_deprecated_catch). added to individual files that still contain old catches.

      Own Id: OTP-19425 Aux Id: PR-9154

    • Module re has been updated to use PCRE2, which is mostly backward compatible with PCRE.

      The most noticeable incompatibilities are

      • The default character encoding is pure ASCII and not Latin1. Unicode support is still available with options unicode and ucp.
      • Options bsr_anycrlf, bsr_unicode and {newline,_} are only set when a -regex is compiled and cannot be changed at matching for precompiled regex.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19431 Aux Id: PR-9299, PR-9610

    • Defining a fun in terms of an imported function is not allowed. Before this release, the compiler would not catch this kind of error if the name of the imported function happened to be a BIF. Consider this example:

      -module(fun_example).
      --export([foo/0, bar/0]).
      --import(m, [max/2, not_a_bif/0]).
      +regex is compiled and cannot be changed at matching for precompiled regex.

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-19431 Aux Id: PR-9299, PR-9610

  • Defining a fun in terms of an imported function is not allowed. Before this release, the compiler would not catch this kind of error if the name of the imported function happened to be a BIF. Consider this example:

    -module(fun_example).
    +-export([foo/0, bar/0]).
    +-import(m, [max/2, not_a_bif/0]).
     
    -foo() ->
    +foo() ->
         fun max/2.
     
    -bar() ->
    +bar() ->
         fun not_a_bif/0.

    The compiler in Erlang/OTP 27 would generate the following messages:

    fun_example.erl:9:5: function not_a_bif/0 undefined
     %    9|     fun not_a_bif/0.
     %     |     ^
    @@ -78,37 +78,37 @@
     fun_example.erl:3:2: Warning: import directive overrides auto-imported BIF max/2 --
     use "-compile({no_auto_import,[max/2]})." to resolve name clash
     %    3| -import(m, [max/2, not_a_bif/0]).
    -%     |  ^

    Also, attempting to call a local function having the same name as auto-imported BIF would result in an error if the BIF was added to Erlang/OTP before R14, and a warning for newer BIFs. This has been changed to always emit a warning. For example:

    -module(bif_example).
    --export([bar/1]).
    +%     |  ^

    Also, attempting to call a local function having the same name as auto-imported BIF would result in an error if the BIF was added to Erlang/OTP before R14, and a warning for newer BIFs. This has been changed to always emit a warning. For example:

    -module(bif_example).
    +-export([bar/1]).
     
    -bar(B) ->
    -    is_boolean(B).
    +bar(B) ->
    +    is_boolean(B).
     
    -is_boolean(B) ->
    +is_boolean(B) ->
             B =:= true orelse B =:= false.

    will now result in the following warning instead of an error:

    if_example.erl:5:5: Warning: ambiguous call of overridden auto-imported BIF is_boolean/1 --
     use erlang:is_boolean/1 or "-compile({no_auto_import,[is_boolean/1]})." to resolve name clash
     %    5|     is_boolean(B).
     %     |     ^

    Own Id: OTP-19432 Aux Id: PR-9246

  • It is now possible to use any base for floating point numbers as described in EEP 75: Based Floating Point Literals.

    Computers represent floating point numbers in binary, but such numbers are typically printed using base ten, for example 0.314159265e1. To maintain exact bit-level precision when converting numbers to and from text, it is better to use a base that matches the internally used base, such as 16 for a compact but still exact representation, or 2 for visualizing or writing down the exact internal format. One particular case where such exact representations are useful is in code generating tools.

    Examples:

    > 2#0.111.
     0.875
     > 16#fefe.fefe#e16.
    -1.2041849337671418e24

    Own Id: OTP-19452 Aux Id: PR-9106

  • The callback function handle_continue/2 in gen_server callback modules is now cached like the others, thanks to code cleanup and optimization of the internal behaviour loop.

    This should only improve performance, not affect functionality.

    Own Id: OTP-19474 Aux Id: PR-9333

  • Encoding done by the json module has been optimized.

    Own Id: OTP-19476 Aux Id: PR-9251

  • There is a new zstd module that does Zstandard compression.

    Own Id: OTP-19477 Aux Id: PR-9316

  • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

    Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

  • Functions of a module can now be grouped in the shell code completion by using the group key in the -doc attribute e.g. -doc(#{group=><<"Public API">>). fetch()->....

    Functions, callbacks and types in the module reference documentation of OTP is now grouped using this feature.

    Own Id: OTP-19483 Aux Id: PR-9408

  • Added calendar:universal_time_to_system_time/1,2 and calendar:local_time_to_system_time/1,2

    Own Id: OTP-19505 Aux Id: PR-9445

  • Improve error messages for json:decode/1.

    Own Id: OTP-19508 Aux Id: PR-9484

  • ETS heir can be set without getting an ETS-TRANSFER message. Useful when the heir is a supervisor process that cannot handle custom messages.

    Own Id: OTP-19512 Aux Id: PR-7970

  • Added support for the Unicode 16 standard.

    Own Id: OTP-19516 Aux Id: PR-9518, PR-9141

  • When documenting a function or type that needs to deal with durations, usually we can document it as "time in milliseconds". Since the timer family of functions (hms, hours, seconds, ...) all return time in milliseconds, it is useful to be able to use this type in type specifications.

    Own Id: OTP-19526 Aux Id: PR-9515

  • A new event time-out has been implemented in gen_server, that behaves more like the one in gen_statem.

    See the type gen_server:action/0 for {timeout|hibernate,...}, and also related functions.

    Own Id: OTP-19537 Aux Id: PR-9287, PR-9615, PR-9621

  • Line numbers used to be reported in the following way:

    1> lists:last([]).
    -** exception error: no function clause matching lists:last([]) (lists.erl, line 389)

    Starting from Erlang/OTP 28, line numbers are now reported in the following way:

    1> lists:last([]).
    +1.2041849337671418e24

    Own Id: OTP-19452 Aux Id: PR-9106

  • The callback function handle_continue/2 in gen_server callback modules is now cached like the others, thanks to code cleanup and optimization of the internal behaviour loop.

    This should only improve performance, not affect functionality.

    Own Id: OTP-19474 Aux Id: PR-9333

  • Encoding done by the json module has been optimized.

    Own Id: OTP-19476 Aux Id: PR-9251

  • There is a new zstd module that does Zstandard compression.

    Own Id: OTP-19477 Aux Id: PR-9316

  • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

    Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

  • Functions of a module can now be grouped in the shell code completion by using the group key in the -doc attribute e.g. -doc(#{group=><<"Public API">>). fetch()->....

    Functions, callbacks and types in the module reference documentation of OTP is now grouped using this feature.

    Own Id: OTP-19483 Aux Id: PR-9408

  • Added calendar:universal_time_to_system_time/1,2 and calendar:local_time_to_system_time/1,2

    Own Id: OTP-19505 Aux Id: PR-9445

  • Improve error messages for json:decode/1.

    Own Id: OTP-19508 Aux Id: PR-9484

  • ETS heir can be set without getting an ETS-TRANSFER message. Useful when the heir is a supervisor process that cannot handle custom messages.

    Own Id: OTP-19512 Aux Id: PR-7970

  • Added support for the Unicode 16 standard.

    Own Id: OTP-19516 Aux Id: PR-9518, PR-9141

  • When documenting a function or type that needs to deal with durations, usually we can document it as "time in milliseconds". Since the timer family of functions (hms, hours, seconds, ...) all return time in milliseconds, it is useful to be able to use this type in type specifications.

    Own Id: OTP-19526 Aux Id: PR-9515

  • A new event time-out has been implemented in gen_server, that behaves more like the one in gen_statem.

    See the type gen_server:action/0 for {timeout|hibernate,...}, and also related functions.

    Own Id: OTP-19537 Aux Id: PR-9287, PR-9615, PR-9621

  • Line numbers used to be reported in the following way:

    1> lists:last([]).
    +** exception error: no function clause matching lists:last([]) (lists.erl, line 389)

    Starting from Erlang/OTP 28, line numbers are now reported in the following way:

    1> lists:last([]).
     ** exception error: no function clause matching lists:last([]) (lists.erl:389)

    Own Id: OTP-19538 Aux Id: PR-9468

  • Upgrade pcre2 to 10.45

    Own Id: OTP-19541 Aux Id: PR-9582

  • Added functions that produce utf-8 binaries instead of iolists. New functions are: io_lib:bformat/2, io_lib:bformat/3, io_lib:bfwrite/2, io_lib:bfwrite/3, io_lib:bwrite/2 and io_lib:bwrite_string/3.

    Own Id: OTP-19556 Aux Id: PR-9772

  • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

    Own Id: OTP-19575 Aux Id: PR-9670

  • A list of PCRE2 incompatibilities is documented in a user's guide for stdlib.

    Own Id: OTP-19578 Aux Id: PR-9705

  • Change automatic hibernation of static supervisors so that they will hibernate after being idle for 1 second instead of only after starting, dynamic supervisors (simple_one_for_one) will not be hibernated at all. An option to the supervisor is added to make it configurable for the application. This option defaults to 1 second for static supervisors and to infinity for the simple_one_for_one supervisors.

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-19597 Aux Id: PR-9680

  • STDLIB 6.2.2.3

    Fixed Bugs and Malfunctions

    • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

      Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

      Own Id: OTP-19962 Aux Id: PR-10616

    • For a function that started with a bracket-only pattern (such as []), the ?FUNCTION_ARITY macro would evaluate to one less than the actual arity.

      Own Id: OTP-19988 Aux Id: GH-10705, PR-10708

    STDLIB 6.2.2.2

    Fixed Bugs and Malfunctions

    • A set of small bugs in sort stability for `lists:sort/1` and `lists:keysort/1` has been fixed. The bug happened for only some, seemingly random, element sequences. Most sorts were stable.

      Sort stability for `lists:sort/1` is only possible to observe when sorting lists with floating point and integer numbers of the same value.

      For `lists:keysort/1` the list had to start with two tuples where the keys or the whole tuples compared equal.

      Own Id: OTP-19673 Aux Id: ERIERL-1240

    STDLIB 6.2.2.1

    Fixed Bugs and Malfunctions

    • The save_module/1 command in the shell now saves both the locally defined records and the imported records using the rr/1 command.

      Own Id: OTP-19647 Aux Id: GH-9816, PR-9897

    • It's now possible to write lists:map(fun is_atom/1, []) or lists:map(fun my_func/1, []), in the shell, instead of lists:map(fun erlang:is_atom/1, []) or lists:map(fun shell_default:my_func/1, []).

      Own Id: OTP-19649 Aux Id: GH-9771, PR-9898

    • Properly strip the leading / and drive letter from filepaths when zipping and unzipping archives.

      Thanks to Wander Nauta for finding and responsibly disclosing this vulnerability to the Erlang/OTP project.

      Own Id: OTP-19653 Aux Id: CVE-2025-4748, PR-9941

    • Shell no longer crashes when requesting to autocomplete map keys containing non-atoms.

      Own Id: OTP-19659 Aux Id: PR-9896

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    STDLIB 6.2.2

    Fixed Bugs and Malfunctions

    • Fixed crash when fetching initial_call when user code have modified the process_dictionary.

      Own Id: OTP-19546 Aux Id: ERIERL-1205, PR-9596

    STDLIB 6.2.1

    Fixed Bugs and Malfunctions

    • Fixed argparse:help/2 to accept the program name as part of the command path.

      Own Id: OTP-19397 Aux Id: PR-9160

    • Fixed argparse:format_help/2 crash on 'hidden' command.

      Own Id: OTP-19400 Aux Id: PR-9151, GH-9150

    • Fixed the type specification for timer:sleep/1 by adding the value infinity to its input type.

      Own Id: OTP-19442 Aux Id: PR-9303

    • Eliminated a crash in zip:unzip/1 while unzipping an archive where a directory within was read-only. This bug was introduced in Erlang/OTP 27.1.

      Own Id: OTP-19447 Aux Id: GH-9332, PR-9335

    • Fixed map comprehension result when a key value is replaced.

      Own Id: OTP-19459 Aux Id: GH-9348, PR-9358

    • Fixed string:jaro_similarity/1 for matching strings of length 1.

      Own Id: OTP-19468 Aux Id: PR-9371

    STDLIB 6.2

    Fixed Bugs and Malfunctions

    • Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.

      Own Id: OTP-19260 Aux Id: PR-8884

    • 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).
      -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

    • Fixed a bug where completion of 'fun(' would cause the shell to crash.

      Own Id: OTP-19351 Aux Id: PR-9043

    • Fixed a bug causing the shell to crash while trying to complete an expression starting with a '/' or a variable followed by '(' or '/'. E.g. Foo/ and Foo(.

      Own Id: OTP-19361 Aux Id: PR-9078

    • zip:extract/2 with keep_old_files now respects the cwd option.

      Own Id: OTP-19370 Aux Id: PR-9097, GH-9087

    • Fixed an error in uri_string:percent_decode spec

      Own Id: OTP-19380 Aux Id: GH-8755

    Improvements and New Features

    • Updated shell docs to display the type spec, that is, h(erlang, min, 2)) now prints the type spec and documentation in the shell.

      > h(erlang,min,2).
      +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

    • Fixed a bug where completion of 'fun(' would cause the shell to crash.

      Own Id: OTP-19351 Aux Id: PR-9043

    • Fixed a bug causing the shell to crash while trying to complete an expression starting with a '/' or a variable followed by '(' or '/'. E.g. Foo/ and Foo(.

      Own Id: OTP-19361 Aux Id: PR-9078

    • zip:extract/2 with keep_old_files now respects the cwd option.

      Own Id: OTP-19370 Aux Id: PR-9097, GH-9087

    • Fixed an error in uri_string:percent_decode spec

      Own Id: OTP-19380 Aux Id: GH-8755

    Improvements and New Features

    • Updated shell docs to display the type spec, that is, h(erlang, min, 2)) now prints the type spec and documentation in the shell.

      > h(erlang,min,2).
       
      -  -spec min(Term1, Term2) -> Minimum
      -               when Term1 :: term(), Term2 :: term(), Minimum :: term().
      +  -spec min(Term1, Term2) -> Minimum
      +               when Term1 :: term(), Term2 :: term(), Minimum :: term().
       
         Returns the smallest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.

      Own Id: OTP-19234 Aux Id: GH-8544, PR-8833

    • The file:io_device/0 type has been updated to clearly show the difference between a raw and cooked IoDevice.

      Own Id: OTP-19301 Aux Id: PR-8956

    • Added json:format_key_value_list/3 and json:format_key_value_list_checked/3.

      Own Id: OTP-19320 Aux Id: PR-8889

    • Improved documentation of timers.

      Own Id: OTP-19360 Aux Id: ERIERL-1149, PR-9062

    • Added logging support to io:user/0, io:standard_io/0 and io:standard_error/0. See io:setopts/2 for more details.

      Own Id: OTP-19372 Aux Id: PR-8947

    STDLIB 6.1.2

    Fixed Bugs and Malfunctions

    • With this change, uri_string:normalize assumes empty path (do not crash) when no path is provided in the URI map.

      Own Id: OTP-19266 Aux Id: ERIERL-1127, PR-8890

    • Fixed spec for json:format/3.

      Own Id: OTP-19286 Aux Id: GH-8880, PR-8914

    STDLIB 6.1.1

    Fixed Bugs and Malfunctions

    • Remove whitespace stripping of returned binaries in json:decode/3.

      Own Id: OTP-19227 Aux Id: ERIERL-1130, PR-8809

    • Fix zip:unzip/2 to not crash when extracting zip files with garbage in the Zip64 extra header. This bug was introduced in Erlang 27.1 and has so far only been seen on some archives creates by MS Excel.

      Own Id: OTP-19241 Aux Id: PR-8836

    • With this change, shutdown procedure handles a race condition between supervisor executing a shutdown and child process termination from other reason.

      Own Id: OTP-19256 Aux Id: PR-8780

    STDLIB 6.1

    Fixed Bugs and Malfunctions

    • The help printout for incorrect io:format/0 strings now handles the k modifier correctly.

      Own Id: OTP-19146 Aux Id: PR-8611, GH-8568

    • Fixed a bug that caused the shell completion to crash when keyword and tuple appeared on the same line.

      Own Id: OTP-19157 Aux Id: PR-8638

    • Due to PR-7419/OTP-18671, the cached internal value of the callback_mode started leaking out to logger reports, which could cause logger handlers to crash. This has now been fixed to show the value that was set, as before caching.

      Own Id: OTP-19164 Aux Id: GH-8605, PR-7419, OTP-18671

    • Fixed an emulator crash relating to compressed ETS tables.

      Own Id: OTP-19176 Aux Id: PR-8683

    • The error description for maps:update/3 will no longer insist that the third argument is not a map when a key could not be found

      Own Id: OTP-19189

    • Multiple issues have been corrected in the markdown parser that creates documentation for the shell.

      The parser was incorrectly parsing formatted markdown (either bold or italics) within parenthesis. This used to not be shown correctly in the shell documentation (_Option._), which was displayed verbatim. This fix makes Option. to appear in italics.

      The markdown parser is also used in the creation of other documentation formats, so this was a bug that affected other generated documentation formats.

      Own Id: OTP-19200 Aux Id: GH-8738, PR-8739

    • Fixed category for some codepoint ranges in unicode_util.

      Own Id: OTP-19210 Aux Id: GH-8748

    • Fixed argparse to print sub-commands help when available.

      Own Id: OTP-19222 Aux Id: PR-8777

    Improvements and New Features

    • Class annotation to HTML from fenced blocks have been added.

      Own Id: OTP-19105 Aux Id: PR-8499

    • Added JSON formatting functions for indented output.

      Own Id: OTP-19112

    • Improved illegal pattern error for accidental map associations.

      Own Id: OTP-19128 Aux Id: PR-8555

    • Progress reports for a dynamically started supervisor will now be logged at debug level.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19202 Aux Id: PR-8261, GH-8715, PR-8741

    • The zip module has been updated with support for:

      • zip64 archives - Archives larger than 4GB or with more than 2^32 entries.
      • extended timestamps - Higher resolution and in UTC.
      • UID/GID - Save and extract the original UID/GID.
      • Fixes so that permission mode attributes are correctly read and set for files in archives.
      • zip:list_dir/2 now also returns directories, not only files. (You can disable this behaviour by using the option skip_directories).

      Various bugs in the original implementation have also been fixed, such as:

      • Correctly encode and decode the DOS timestamps for entries within an archive (that is the non-extended timestamp).
      • Fix DOS timestamps to be set to localtime instead of UTC (use extended timestamps for UTC timestamps).
      • Use the unix file attributes read from disk when creating archives instead of setting everything to 644.

      Own Id: OTP-19214 Aux Id: PR-8765

    STDLIB 6.0.1

    Fixed Bugs and Malfunctions

    STDLIB 6.0

    Fixed Bugs and Malfunctions

    • The specs in module binary has been updated to reflect what is allowed by the documentation.

      Own Id: OTP-18684 Aux Id: PR-7481

    • Several functions in the binary module would accept arguments of the wrong type under certain circumstances. In this release, they now raise an exception when incorrect types are given.

      The following functions would accept an invalid pattern if the subject binary was empty or if the {scope,{0,0}} option was given: @@ -116,8 +116,8 @@ binary:matches/2,3, binary:replace/3,4, and binary:split/2,3

      The call binary:copy(<<1:1>>, 0) would return an empty binary instead of raising an exception. Similarly, calls to binary:part/2,3 attempting to extract 0 bytes at position 0 of a bitstring would return an empty binary instead of raising an exception.

      Own Id: OTP-18743 Aux Id: PR-7607, PR-7628

    • 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

    • 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.

      Own Id: OTP-18930 Aux Id: PR-7993, GH-4992

    • The error handling the simple_one_for_one supervisor has been enhanced. A transient child returning ignore will no longer cause a crash.

      Also, automatic shutdown has been disabled because it does not make sense for this supervisor type. That is was allowed is considered a bug. Therefore, we don't consider this an incompatible change.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19029 Aux Id: PR-8230

    • Fix shell expansion to not crash when expanding a map with non-atom keys and to not list zero arity functions when an argument has been given.

      Own Id: OTP-19073 Aux Id: PR-8375, GH-8366, GH-8365, GH-8364

    Improvements and New Features

    • The functions is_equal/2, map/2, and filtermap/2 have been added to the modules sets, ordsets, and gb_sets.

      Own Id: OTP-18622 Aux Id: PR-7183, PR-7232

    • The compiler now emits nicer error message for function head mismatches. -For example, given:

      a() -> ok;
      -a(_) -> error.

      Erlang/OTP 26 and earlier would emit a diagnostic similar to:

      t.erl:6:1: head mismatch
      +For example, given:

      a() -> ok;
      +a(_) -> error.

      Erlang/OTP 26 and earlier would emit a diagnostic similar to:

      t.erl:6:1: head mismatch
       %    6| a(_) -> error.
       %     | ^

      while in Erlang/OTP 27 the diagnostic is similar to:

      t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted?
       %    6| a(_) -> error.
      @@ -140,22 +140,22 @@
       my_label              c:pinfo/2                               51
       4> proc_lib:get_label(self()).
       my_label

      Own Id: OTP-18789 Aux Id: PR-7720, PR-8003

    • -callback attributes has been added to modules sys and erl_error.

      Own Id: OTP-18793 Aux Id: PR-7703

    • Several new functions that accept funs have been added to module timer.

      Functions apply_after/2, apply_interval/2, and apply_repeatedly/2 accept a nullary fun as the second argument, while functions apply_after/3, apply_interval/3, and apply_repeatedly/3 accept an n-ary fun as the second and a list of n arguments for the fun as the third argument.

      Own Id: OTP-18808 Aux Id: PR-7649

    • Sigils on string literals have been implemented as per EEP 66, that is: binary and string sigils in verbatim and escape characters variants, as well as a default (vanilla) Sigil. All for ordinary strings and for triple-quoted strings (EEP 64). See Sigils in the Reference Manual.

      Examples:

      1> ~"Björn".
      -<<"Björn"/utf8>>
      +<<"Björn"/utf8>>
       2> ~b"Björn".
      -<<"Björn"/utf8>>
      +<<"Björn"/utf8>>
       3> ~S"\s*(\w+)".
       "\\s*(\\w+)"
       4> ~B"\s*(\w+)".
      -<<"\\s*(\\w+)">>

      Own Id: OTP-18825 Aux Id: OTP-18750, PR-7684

    • Functions shell:default_multiline_prompt/1, shell:inverted_space_prompt/1, and +<<"\\s*(\\w+)">>

    Own Id: OTP-18825 Aux Id: OTP-18750, PR-7684

  • Functions shell:default_multiline_prompt/1, shell:inverted_space_prompt/1, and shell:prompt_width/1 have been exported to help with custom prompt implementations.

    Own Id: OTP-18834 Aux Id: PR-7675, PR-7816

  • The shell now pages long output from the documentation help command (h(Module)), auto completions and the search command.

    Own Id: OTP-18846 Aux Id: PR-7845

  • The M-h hotkey (Alt/Option-h) now outputs help for the module or function directly before the cursor.

    Own Id: OTP-18847 Aux Id: PR-7846

  • Added support for adding a custom code formatter that formats your multi-line shell commands in your preferred formatting on submission. See shell:format_shell_func/ and shell:erl_pp_format_func/1.

    Own Id: OTP-18848 Aux Id: PR-7847

  • Added shell functions for viewing, forgetting and saving locally defined functions, types and records.

    Own Id: OTP-18852 Aux Id: PR-7844

  • Added string:jaro_similarity/2, which can be used to calculate the similarity between two strings.

    Own Id: OTP-18865 Aux Id: PR-7879

  • The new function ets:update_element/4 is similar to ets:update_element/3, but takes a default tuple as the fourth argument, which will be inserted if no previous record with that key exists.

    Own Id: OTP-18870 Aux Id: PR-7857

  • Added functions to retrieve the next higher or lower key/element from gb_trees and gb_sets, as well as returning iterators that start at given keys/elements.

    Own Id: OTP-18874 Aux Id: PR-7745

  • When the shell built-in function c/1,2 is used to re-compile a module, the current working directory of the original compilation is now added to the include path.

    Own Id: OTP-18908 Aux Id: PR-7957

  • The timer module now uses a private table for its internal state, slightly improving its performance.

    Own Id: OTP-18914 Aux Id: PR-7973

  • 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

  • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

    Own Id: OTP-18923 Aux Id: PR-6791

  • The maybe expression is now enabled by default.

    To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

    -feature(maybe_expr, disable).

    Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

    erlc -disable-feature maybe_expr some_file.erl

    Own Id: OTP-18944 Aux Id: PR-8067

  • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

    -module(t).
    --export([f/0]).
    --record(r, {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

  • New ets functions ets:first_lookup/1, ets:next_lookup/2, ets:prev_lookup/2 and ets:last_lookup/1. Example: ets:next_lookup/1 is equivalent to ets:next/2 followed by ets:lookup/2 with the next key. The new combined functions are more efficient and with guaranteed atomicity.

    Own Id: OTP-18923 Aux Id: PR-6791

  • The maybe expression is now enabled by default.

    To use maybe as an atom, it needs to be single-quoted. Alternatively, the maybe expression can be disabled by disabling the maybe_expr feature. That can be done by placing the following the line at the beginning of an Erlang source file:

    -feature(maybe_expr, disable).

    Another way to disable the maybe_expr feature is by passing the -disable-feature option to erlc:

    erlc -disable-feature maybe_expr some_file.erl

    Own Id: OTP-18944 Aux Id: PR-8067

  • The compiler will now raise a warning when updating record/map literals. As an example, consider this module:

    -module(t).
    +-export([f/0]).
    +-record(r, {a,b,c}).
     
    -f() ->
    -    #r{a=1}#r{b=2}.

    The compiler raises the following warning:

    1> c(t).
    +f() ->
    +    #r{a=1}#r{b=2}.

    The compiler raises the following warning:

    1> c(t).
     t.erl:6:12: Warning: expression updates a literal
     %    6|     #r{a=1}#r{b=2}.
     %     |            ^

    Own Id: OTP-18951 Aux Id: PR-8069

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • Optimized ets:foldl and ets:foldr to use new ets:next_lookup. Also made them immune against table renaming.

    Own Id: OTP-18993 Aux Id: PR-8048

  • Windows now supports all functions in math.

    Own Id: OTP-19001 Aux Id: PR-8164

  • 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

  • There is a new module json for encoding and decoding JSON.

    Both encoding and decoding can be customized. Decoding can be done in a SAX-like fashion and handle multiple documents and streams of data.

    Own Id: OTP-19020 Aux Id: PR-8111

  • STDLIB 5.2.3.6

    Fixed Bugs and Malfunctions

    • Fixed bug in ets:update_counter/4 and ets:update_element/4 accepting and inserting a default tuple smaller than the keypos of the table. Such a tuple without a key element would make the table internally inconsistent and might lead to bad behavior at table access, like ERTS runtime crash.

      Now a call to ets:update_counter/4 or ets:update_element/4 will fail with badarg if the key does not exist in the table and the default tuple is too small.

      Own Id: OTP-19962 Aux Id: PR-10616

    • For a function that started with a bracket-only pattern (such as []), the ?FUNCTION_ARITY macro would evaluate to one less than the actual arity.

      Own Id: OTP-19988 Aux Id: GH-10705, PR-10708

    STDLIB 5.2.3.5

    Fixed Bugs and Malfunctions

    • A set of small bugs in sort stability for `lists:sort/1` and `lists:keysort/1` has been fixed. The bug happened for only some, seemingly random, element sequences. Most sorts were stable.

      Sort stability for `lists:sort/1` is only possible to observe when sorting lists with floating point and integer numbers of the same value.

      For `lists:keysort/1` the list had to start with two tuples where the keys or the whole tuples compared equal.

      Own Id: OTP-19673 Aux Id: ERIERL-1240

    STDLIB 5.2.3.4

    Fixed Bugs and Malfunctions

    • It's now possible to write lists:map(fun is_atom/1, []) or lists:map(fun my_func/1, []), in the shell, instead of lists:map(fun erlang:is_atom/1, []) or lists:map(fun shell_default:my_func/1, []).

      Own Id: OTP-19649 Aux Id: GH-9771 PR-9898

    • Properly strip the leading / and drive letter from filepaths when zipping and unzipping archives.

      Thanks to Wander Nauta for finding and responsibly disclosing this vulnerability to the Erlang/OTP project.

      Own Id: OTP-19653 Aux Id: CVE-2025-4748 PR-9941

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    STDLIB 5.2.3.3

    Fixed Bugs and Malfunctions

    • Fixed an error in uri_string:percent_decode spec

      Own Id: OTP-19380 Aux Id: GH-8755

    STDLIB 5.2.3.2

    Fixed Bugs and Malfunctions

    • With this change, shutdown procedure handles a race condition between supervisor executing a shutdown and child process termination from other reason.

      Own Id: OTP-19256 Aux Id: PR-8780

    • With this change, uri_string:normalize assumes empty path (do not crash) when no path is provided in the URI map.

      Own Id: OTP-19266 Aux Id: ERIERL-1127, PR-8890

    STDLIB 5.2.3.1

    Fixed Bugs and Malfunctions

    • Fixed a bug that caused the shell completion to crash when keyword and tuple appeared on the same line.

      Own Id: OTP-19157 Aux Id: PR-8638

    STDLIB 5.2.3

    Fixed Bugs and Malfunctions

    • Fix shell expansion of -type a() :: $a. in the erlang shell.

      Own Id: OTP-19062

    • Fix the shell Job Control Mode to not crash when typing TAB or CTRL+R.

      Own Id: OTP-19072 Aux Id: PR-8391

    STDLIB 5.2.2

    Fixed Bugs and Malfunctions

    • Attempting to use the maybe construct in a macro argument could crash the compiler.

      Own Id: OTP-19031 Aux Id: GH-8268

    STDLIB 5.2.1

    Fixed Bugs and Malfunctions

    • The help texts shown by argparse will now display sub-command arguments in the correct order.

      Own Id: OTP-18900 Aux Id: PR-7945, GH-7934

    • Clarified the argparse documentation regarding the user-defined help template.

      Own Id: OTP-18937

    • Fix shell expansion to not crash when expanding invalid using invalid atoms.

      Own Id: OTP-18953 Aux Id: GH-8016 PR-8075

    STDLIB 5.2

    Fixed Bugs and Malfunctions

    • Make shell_docs correctly trim the newline at the end of code blocks.

      Own Id: OTP-18777 Aux Id: PR-7663

    • Replaced unintentional Erlang Public License 1.1 headers in some files with /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/orddict.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -30,13 +30,13 @@ as different if they do not match (=:=), this module considers two keys as different if and only if they do not compare equal (==).

      Notes

      Functions append/3 and append_list/3 are included so that keyed values can be stored in a list accumulator, for -example:

      > D0 = orddict:new(),
      -  D1 = orddict:store(files, [], D0),
      -  D2 = orddict:append(files, f1, D1),
      -  D3 = orddict:append(files, f2, D2),
      -  D4 = orddict:append(files, f3, D3),
      -  orddict:fetch(files, D4).
      -[f1,f2,f3]

      This saves the trouble of first fetching a keyed value, appending a new value to +example:

      > D0 = orddict:new(),
      +  D1 = orddict:store(files, [], D0),
      +  D2 = orddict:append(files, f1, D1),
      +  D3 = orddict:append(files, f2, D2),
      +  D4 = orddict:append(files, f3, D3),
      +  orddict:fetch(files, D4).
      +[f1,f2,f3]

      This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

      Function fetch/2 is to be used if the key is known to be in the dictionary, otherwise function find/2.

      See Also

      dict, gb_trees

      @@ -403,16 +403,16 @@

      Appends a new Value to the current list of values associated with Key. An exception is generated if the initial value associated with Key is not a list -of values.

      See also section Notes.

      Example 1:

      1> OrdDict1 = orddict:from_list([{x, []}]).
      -[{x,[]}]
      -2> OrdDict2 = orddict:append(x, 1, OrdDict1).
      -[{x,[1]}]
      -3> OrdDict3 = orddict:append(x, 2, OrdDict2).
      -[{x,[1,2]}]
      -4> orddict:append(y, 3, OrdDict3).
      -[{x,[1,2]},{y,[3]}]

      Example 2:

      1> OrdDict1 = orddict:from_list([{a, no_list}]).
      -[{a,no_list}]
      -2> orddict:append(a, 1, OrdDict1).
      +of values.

      See also section Notes.

      Example 1:

      1> OrdDict1 = orddict:from_list([{x, []}]).
      +[{x,[]}]
      +2> OrdDict2 = orddict:append(x, 1, OrdDict1).
      +[{x,[1]}]
      +3> OrdDict3 = orddict:append(x, 2, OrdDict2).
      +[{x,[1,2]}]
      +4> orddict:append(y, 3, OrdDict3).
      +[{x,[1,2]},{y,[3]}]

      Example 2:

      1> OrdDict1 = orddict:from_list([{a, no_list}]).
      +[{a,no_list}]
      +2> orddict:append(a, 1, OrdDict1).
       ** exception error: bad argument
            in operator  ++/2
               called as no_list ++ [1]
      @@ -449,12 +449,12 @@

      Appends a list of values ValList to the current list of values associated with Key. An exception is generated if the initial value associated with Key is -not a list of values.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{x, []}]).
      -[{x,[]}]
      -2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
      -[{x,[1,2]}]
      -3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
      -[{x,[1,2]},{y,[3,4]}]
      +not a list of values.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{x, []}]).
      +[{x,[]}]
      +2> OrdDict2 = orddict:append_list(x, [1,2], OrdDict1).
      +[{x,[1,2]}]
      +3> OrdDict3 = orddict:append_list(y, [3,4], OrdDict2).
      +[{x,[1,2]},{y,[3,4]}]
      @@ -483,10 +483,10 @@ -

      Erases all items with a specified key from a dictionary.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:erase(a, OrdDict1).
      -[{b,2}]
      +

      Erases all items with a specified key from a dictionary.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:erase(a, OrdDict1).
      +[{b,2}]
      @@ -516,11 +516,11 @@

      Returns the value associated with Key in dictionary Orddict. This function assumes that the Key is present in the dictionary. An exception is generated -if Key is not in the dictionary.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:fetch(a, OrdDict1).
      +if Key is not in the dictionary.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:fetch(a, OrdDict1).
       1
      -3> orddict:fetch(missing, OrdDict1).
      +3> orddict:fetch(missing, OrdDict1).
       ** exception error: no function clause matching orddict:fetch(missing,[])
      @@ -549,10 +549,10 @@ -

      Returns a list of all keys in a dictionary.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:fetch_keys(OrdDict1).
      -[a,b]
      +

      Returns a list of all keys in a dictionary.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:fetch_keys(OrdDict1).
      +[a,b]
      @@ -585,10 +585,10 @@

      Orddict2 is a dictionary of all keys and values in Orddict1 for which -Pred(Key, Value) is true.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
      -[{b,2}]
      +Pred(Key, Value) is true.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:filter(fun (K, V) -> V > 1 end, OrdDict1).
      +[{b,2}]
      @@ -618,11 +618,11 @@

      Searches for a key in a dictionary. Returns {ok, Value}, where Value is the value associated with Key, or error if the key is not present in the -dictionary.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:find(a, OrdDict1).
      -{ok,1}
      -3> orddict:find(c, OrdDict1).
      +dictionary.

      See also section Notes.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:find(a, OrdDict1).
      +{ok,1}
      +3> orddict:find(c, OrdDict1).
       error
      @@ -660,10 +660,10 @@

      Calls Fun on successive keys and values of Orddict together with an extra argument Acc (short for accumulator). Fun must return a new accumulator that -is passed to the next call. Acc0 is returned if the list is empty.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
      -[{b,102},{a,101}]
      +is passed to the next call. Acc0 is returned if the list is empty.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:fold(fun (K, V, Acc) -> [{K, V+100} | Acc] end, [], OrdDict1).
      +[{b,102},{a,101}]
      @@ -782,10 +782,10 @@

      Calls Fun on successive keys and values of Orddict1 to return a new value -for each key.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
      -[{a,101},{b,102}]
      +for each key.

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> orddict:map(fun (_K, V) -> V + 100 end, OrdDict1).
      +[{a,101},{b,102}]
      @@ -821,15 +821,15 @@

      Merges two dictionaries, Orddict1 and Orddict2, to create a new dictionary. All the Key-Value pairs from both dictionaries are included in the new dictionary.

      If a key occurs in both dictionaries, Fun is called with the key -and both values to return a new value.

      merge/3 can be defined as follows, but is faster:

      merge(Fun, D1, D2) ->
      -    fold(fun (K, V1, D) ->
      -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
      -         end, D2, D1).

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      -[{a,1},{b,2}]
      -2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
      -[{b,7},{c,8}]
      -3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
      -[{a,1},{b,14},{c,8}]
      +and both values to return a new value.

      merge/3 can be defined as follows, but is faster:

      merge(Fun, D1, D2) ->
      +    fold(fun (K, V1, D) ->
      +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
      +         end, D2, D1).

      Example:

      1> OrdDict1 = orddict:from_list([{a, 1}, {b, 2}]).
      +[{a,1},{b,2}]
      +2> OrdDict2 = orddict:from_list([{b, 7}, {c, 8}]).
      +[{b,7},{c,8}]
      +3> orddict:merge(fun (K, V1, V2) -> V1 * V2 end, OrdDict1, OrdDict2).
      +[{a,1},{b,14},{c,8}]
      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ordsets.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ordsets.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/ordsets.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -342,14 +342,14 @@ -

      Returns a new ordered set formed from Ordset1 with Element inserted.

      Examples

      1> S0 = ordsets:new().
      -[]
      -2> S1 = ordsets:add_element(7, S0).
      -[7]
      -3> S2 = ordsets:add_element(42, S1).
      -[7,42]
      -4> ordsets:add_element(42, S2).
      -[7,42]
      +

      Returns a new ordered set formed from Ordset1 with Element inserted.

      Examples

      1> S0 = ordsets:new().
      +[]
      +2> S1 = ordsets:add_element(7, S0).
      +[7]
      +3> S2 = ordsets:add_element(42, S1).
      +[7,42]
      +4> ordsets:add_element(42, S2).
      +[7,42]
      @@ -378,11 +378,11 @@ -

      Returns a copy of Ordset1 with Element removed.

      Examples

      1> S = ordsets:from_list([a,b,c]).
      -2> ordsets:del_element(c, S).
      -[a,b]
      -3> ordsets:del_element(x, S).
      -[a,b,c]
      +

      Returns a copy of Ordset1 with Element removed.

      Examples

      1> S = ordsets:from_list([a,b,c]).
      +2> ordsets:del_element(c, S).
      +[a,b]
      +3> ordsets:del_element(x, S).
      +[a,b,c]
      @@ -412,10 +412,10 @@ -

      Filters elements in Ordset1 using predicate function Pred.

      Examples

      1> S = ordsets:from_list([1,2,3,4,5,6,7]).
      -2> IsEven = fun(N) -> N rem 2 =:= 0 end.
      -3> ordsets:filter(IsEven, S).
      -[2,4,6]
      +

      Filters elements in Ordset1 using predicate function Pred.

      Examples

      1> S = ordsets:from_list([1,2,3,4,5,6,7]).
      +2> IsEven = fun(N) -> N rem 2 =:= 0 end.
      +3> ordsets:filter(IsEven, S).
      +[2,4,6]
      @@ -452,16 +452,16 @@

      Calls Fun(Elem) for each Elem of Ordset1 to update or remove elements from Ordset1.

      Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the set of elements for which Fun returns a new -value, with true being equivalent to {true, Elem}.

      ordsets:filtermap/2 behaves as if it were defined as follows:

      filtermap(Fun, Ordset1) ->
      -    ordsets:from_list(lists:filtermap(Fun, Ordset1)).

      Examples

      1> S = ordsets:from_list([2,4,5,6,8,9])
      -2> F = fun(X) ->
      +value, with true being equivalent to {true, Elem}.

      ordsets:filtermap/2 behaves as if it were defined as follows:

      filtermap(Fun, Ordset1) ->
      +    ordsets:from_list(lists:filtermap(Fun, Ordset1)).

      Examples

      1> S = ordsets:from_list([2,4,5,6,8,9])
      +2> F = fun(X) ->
                  case X rem 2 of
      -               0 -> {true, X div 2};
      +               0 -> {true, X div 2};
                      1 -> false
                  end
               end.
      -3> ordsets:filtermap(F, S).
      -[1,2,3,4]
      +3>
      ordsets:filtermap(F, S). +[1,2,3,4]
      @@ -495,9 +495,9 @@

      Folds Function over every element in Ordset and returns the final value of -the accumulator.

      Examples

      1> S = ordsets:from_list([1,2,3,4]).
      +the accumulator.

      Examples

      1> S = ordsets:from_list([1,2,3,4]).
       2> Plus = fun erlang:'+'/2.
      -3> ordsets:fold(Plus, 0, S).
      +3> ordsets:fold(Plus, 0, S).
       10
      @@ -526,8 +526,8 @@ -

      Returns an ordered set of the elements in List.

      Examples

      1> ordsets:from_list([a,b,a,b,b,c]).
      -[a,b,c]
      +

      Returns an ordered set of the elements in List.

      Examples

      1> ordsets:from_list([a,b,a,b,b,c]).
      +[a,b,c]
      @@ -556,15 +556,15 @@

      Returns the intersection of the non-empty list of sets.

      The intersection of multiple sets is a new set that contains only the -elements that are present in all sets.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      -2> S1 = ordsets:from_list([d,e,f]).
      -3> S2 = ordsets:from_list([q,r])
      -4> Sets = [S0, S1, S2].
      -5> ordsets:intersection([S0, S1, S2]).
      -[]
      -6> ordsets:intersection([S0, S1]).
      -[d]
      -7> ordsets:intersection([]).
      +elements that are present in all sets.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      +2> S1 = ordsets:from_list([d,e,f]).
      +3> S2 = ordsets:from_list([q,r])
      +4> Sets = [S0, S1, S2].
      +5> ordsets:intersection([S0, S1, S2]).
      +[]
      +6> ordsets:intersection([S0, S1]).
      +[d]
      +7> ordsets:intersection([]).
       ** exception error: no function clause matching ordsets:intersection([])
      @@ -595,13 +595,13 @@

      Returns the intersection of Ordset1 and Ordset2.

      The intersection of two sets is a new set that contains only the -elements that are present in both sets.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      -2> S1 = ordsets:from_list([c,d,e,f]).
      -3> S2 = ordsets:from_list([q,r]).
      -4> ordsets:intersection(S0, S1).
      -[c,d]
      -5> ordsets:intersection(S1, S2).
      -[]
      +elements that are present in both sets.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      +2> S1 = ordsets:from_list([c,d,e,f]).
      +3> S2 = ordsets:from_list([q,r]).
      +4> ordsets:intersection(S0, S1).
      +[c,d]
      +5> ordsets:intersection(S1, S2).
      +[]
      @@ -630,12 +630,12 @@

      Returns true if Ordset1 and Ordset2 are disjoint; otherwise, -returns false.

      Two sets are disjoint if they have no elements in common.

      This function is equivalent to ordsets:intersection(Ordset1, Ordset2) =:= [], but faster.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      -2> S1 = ordsets:from_list([d,e,f]).
      -3> S2 = ordsets:from_list([q,r])
      -4> ordsets:is_disjoint(S0, S1).
      +returns false.

      Two sets are disjoint if they have no elements in common.

      This function is equivalent to ordsets:intersection(Ordset1, Ordset2) =:= [], but faster.

      Examples

      1> S0 = ordsets:from_list([a,b,c,d]).
      +2> S1 = ordsets:from_list([d,e,f]).
      +3> S2 = ordsets:from_list([q,r])
      +4> ordsets:is_disjoint(S0, S1).
       false
      -5> ordsets:is_disjoint(S1, S2).
      +5> ordsets:is_disjoint(S1, S2).
       true
      @@ -664,10 +664,10 @@ -

      Returns true if Element is an element of Ordset; otherwise, returns false.

      Examples

      1> S = ordsets:from_list([a,b,c]).
      -2> ordsets:is_element(42, S).
      +

      Returns true if Element is an element of Ordset; otherwise, returns false.

      Examples

      1> S = ordsets:from_list([a,b,c]).
      +2> ordsets:is_element(42, S).
       false
      -3> ordsets:is_element(b, S).
      +3> ordsets:is_element(b, S).
       true
      @@ -698,9 +698,9 @@ -

      Returns true if Ordset is an empty set; otherwise, returns false.

      Examples

      1> ordsets:is_empty(ordsets:new()).
      +

      Returns true if Ordset is an empty set; otherwise, returns false.

      Examples

      1> ordsets:is_empty(ordsets:new()).
       true
      -2> ordsets:is_empty(ordsets:from_list([1])).
      +2> ordsets:is_empty(ordsets:from_list([1])).
       false
      @@ -732,11 +732,11 @@

      Returns true if Ordset1 and Ordset2 are equal, that is, if every element -of one set is also a member of the other set; otherwise, returns false.

      Examples

      1> Empty = ordsets:new().
      -2> S = ordsets:from_list([a,b]).
      -3> ordsets:is_equal(S, S)
      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/peer.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/peer.xhtml	2026-04-20 15:17:36.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/peer.xhtml	2042-05-23 04:35:58.000000000 +0000
      @@ -49,127 +49,127 @@
       manual analysis. If the test case fails, the CRASH REPORT contains these
       arguments
    • multiple test cases can run concurrently speeding up overall testing process, peer node names are unique even when there are multiple instances of the same -test suite running in parallel
    -module(my_SUITE).
    --behaviour(ct_suite).
    --export([all/0, groups/0]).
    --export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
    +test suite running in parallel
    -module(my_SUITE).
    +-behaviour(ct_suite).
    +-export([all/0, groups/0]).
    +-export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -groups() ->
    -    [{quick, [parallel],
    -        [basic, args, named, restart_node, multi_node]}].
    +groups() ->
    +    [{quick, [parallel],
    +        [basic, args, named, restart_node, multi_node]}].
     
    -all() ->
    -    [{group, quick}].
    +all() ->
    +    [{group, quick}].
     
    -basic(Config) when is_list(Config) ->
    -    {ok, Peer, _Node} = ?CT_PEER(),
    -    peer:stop(Peer).
    +basic(Config) when is_list(Config) ->
    +    {ok, Peer, _Node} = ?CT_PEER(),
    +    peer:stop(Peer).
     
    -args(Config) when is_list(Config) ->
    +args(Config) when is_list(Config) ->
         %% specify additional arguments to the new node
    -    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    -    peer:stop(Peer).
    +    {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
    +    peer:stop(Peer).
     
    -named(Config) when is_list(Config) ->
    +named(Config) when is_list(Config) ->
         %% pass test case name down to function starting nodes
    -    Peer = start_node_impl(named_test),
    -    peer:stop(Peer).
    +    Peer = start_node_impl(named_test),
    +    peer:stop(Peer).
     
    -start_node_impl(ActualTestCase) ->
    -    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
    +start_node_impl(ActualTestCase) ->
    +    {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
         %% extra setup needed for multiple test cases
    -    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
    +    ok = rpc:call(Node, application, set_env, [kernel, key, value]),
         Peer.
     
    -restart_node(Config) when is_list(Config) ->
    -    Name = ?CT_PEER_NAME(),
    -    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    -    peer:stop(Peer),
    +restart_node(Config) when is_list(Config) ->
    +    Name = ?CT_PEER_NAME(),
    +    {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
    +    peer:stop(Peer),
         %% restart the node with the same name as before
    -    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    -    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    -    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    -        || _ <- lists:seq(1, 4)],
    +    {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
    +    peer:stop(Peer2).

    The next example demonstrates how to start multiple nodes concurrently:

    multi_node(Config) when is_list(Config) ->
    +    Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
    +        || _ <- lists:seq(1, 4)],
         %% wait for all nodes to complete boot process, get their names:
    -    _Nodes = [receive {tag, {started, Node, Peer}} -> Node end
    -        || {ok, Peer} <- Peers],
    -    [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set -up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    -peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    -    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two + _Nodes = [receive {tag, {started, Node, Peer}} -> Node end + || {ok, Peer} <- Peers], + [peer:stop(Peer) || {ok, Peer} <- Peers].

    Start a peer on a different host. Requires ssh key-based authentication set +up, allowing "another_host" connection without password prompt.

    Ssh = os:find_executable("ssh"),
    +peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
    +    connection => standard_io}),

    The following Common Test case demonstrates Docker integration, starting two containers with hostnames "one" and "two". In this example Erlang nodes running -inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    -    Docker = os:find_executable("docker"),
    -    PrivDir = proplists:get_value(priv_dir, Config),
    -    build_release(PrivDir),
    -    build_image(PrivDir),
    +inside containers form an Erlang cluster.

    docker(Config) when is_list(Config) ->
    +    Docker = os:find_executable("docker"),
    +    PrivDir = proplists:get_value(priv_dir, Config),
    +    build_release(PrivDir),
    +    build_image(PrivDir),
     
         %% start two Docker containers
    -    {ok, Peer, Node} = peer:start_link(#{name => lambda,
    +    {ok, Peer, Node} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    -    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
    +        exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
    +    {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
             connection => standard_io,
    -        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
    +        exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
     
         %% find IP address of the second node using alternative connection RPC
    -    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    -    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    -    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
    +    {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
    +    {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
    +    {addr, Ip} = lists:keyfind(addr, 1, Eth0),
     
         %% make first node to discover second one
    -    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    -    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
    +    ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
    +    ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
     
         %% join a cluster
    -    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
    +    true = peer:call(Peer, net_kernel, connect_node, [Node2]),
         %% verify that second peer node has only the first node visible
    -    [Node] = peer:call(Peer2, erlang, nodes, []),
    +    [Node] = peer:call(Peer2, erlang, nodes, []),
     
         %% stop peers, causing containers to also stop
    -    peer:stop(Peer2),
    -    peer:stop(Peer).
    +    peer:stop(Peer2),
    +    peer:stop(Peer).
     
    -build_release(Dir) ->
    +build_release(Dir) ->
         %% load sasl.app file, otherwise application:get_key will fail
    -    application:load(sasl),
    +    application:load(sasl),
         %% create *.rel - release file
    -    RelFile = filename:join(Dir, "lambda.rel"),
    -    Release = {release, {"lambda", "1.0.0"},
    -        {erts, erlang:system_info(version)},
    -        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    -            || App <- [kernel, stdlib, sasl]]},
    -    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    -        io_lib:format("~tp.", [Release])))),
    -    RelFileNoExt = filename:join(Dir, "lambda"),
    +    RelFile = filename:join(Dir, "lambda.rel"),
    +    Release = {release, {"lambda", "1.0.0"},
    +        {erts, erlang:system_info(version)},
    +        [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
    +            || App <- [kernel, stdlib, sasl]]},
    +    ok = file:write_file(RelFile, list_to_binary(lists:flatten(
    +        io_lib:format("~tp.", [Release])))),
    +    RelFileNoExt = filename:join(Dir, "lambda"),
     
         %% create boot script
    -    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    -        [silent, {outdir, Dir}]),
    +    {ok, systools_make, []} = systools:make_script(RelFileNoExt,
    +        [silent, {outdir, Dir}]),
         %% package release into *.tar.gz
    -    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
    +    ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
     
    -build_image(Dir) ->
    +build_image(Dir) ->
         %% Create Dockerfile example, working only for Ubuntu 20.04
         %% Expose port 4445, and make Erlang distribution to listen
         %%  on this port, and connect to it without EPMD
         %% Set cookie on both nodes to be the same.
    -    BuildScript = filename:join(Dir, "Dockerfile"),
    +    BuildScript = filename:join(Dir, "Dockerfile"),
         Dockerfile =
           "FROM ubuntu:20.04 as runner\n"
           "EXPOSE 4445\n"
           "WORKDIR /opt/lambda\n"
           "COPY lambda.tar.gz /tmp\n"
           "RUN tar -zxvf /tmp/lambda.tar.gz -C /opt/lambda\n"
    -      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
    +      "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
           "/bin/dyn_erl\", \"-boot\", \"/opt/lambda/releases/1.0.0/start\","
           " \"-kernel\", \"inet_dist_listen_min\", \"4445\","
           " \"-erl_epmd_port\", \"4445\","
           " \"-setcookie\", \"secret\"]\n",
    -    ok = file:write_file(BuildScript, Dockerfile),
    -    os:cmd("docker build -t lambda " ++ Dir).
    +
    ok = file:write_file(BuildScript, Dockerfile), + os:cmd("docker build -t lambda " ++ Dir).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -857,21 +857,21 @@ failed. When doing so the start function can return before the failing process has exited, which may block VM resources required for a new start attempt to succeed. Use init_fail/2,3 for that purpose.

    The following example illustrates how this function and proc_lib:start_link/3 -are used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +are used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} ->
    -            exit(Reason)
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} ->
    +            exit(Reason)
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -944,21 +944,21 @@ started process, the start function returns an error tuple when the started process exits, or when the start function time-out (if used) has passed, see start/3,4,5.

    The following example illustrates how this function and proc_lib:start_link/3 -can be used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +can be used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} = Error ->
    -            proc_lib:init_fail(Parent, Error, {exit, normal})
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} = Error ->
    +            proc_lib:init_fail(Parent, Error, {exit, normal})
         end,
    -    loop().
    +    loop().
     
     ...
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/proplists.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -410,7 +410,7 @@

    Similar to get_all_values/2, but each value is wrapped in a list unless it is already itself a list. The resulting list of lists is concatenated. This is -often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    +often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    @@ -504,10 +504,10 @@ first entry in ListIn with the same key as Property, and E and Property have equivalent normal forms, then E is replaced with the terms in Expansion, and any following entries with the same key are deleted from -ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} -shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when +ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} +shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when expanded, it must be included in the expansion list. The inserted terms are not expanded recursively. If Expansions contains more than one property with the same key, only the first occurrence is used.

    See also normalize/2.

    @@ -912,7 +912,7 @@

    Partitions List into a list of sublists and a remainder.

    Lists contains one sublist for each key in Keys, in the corresponding order. The relative order of the elements in each sublist is preserved from the original List. Rest contains the elements in List that are not associated with any of the -specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    +specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    @@ -1035,7 +1035,7 @@ an association of the form Key => Value. Anything else will be silently ignored.

    If the same key appears in List multiple times, the value of the one appearing nearest to the head of List will be in the result map, that is the value that -would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    +would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/qlc.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -143,24 +143,24 @@ If a tuple {finished} exists among the answers to QH, it is returned twice from append/2.

    As another example, consider concatenating the answers to two queries QH1 and QH2 while removing all duplicates. This is accomplished by using option -unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before +unique:

    qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})

    The cost is substantial: every returned answer is stored in an ETS table. Before returning an answer, it is looked up in the ETS table to check if it has already been returned. Without the unique option, all answers to QH1 would be returned followed by all answers to QH2. The unique option keeps the order between the remaining answers.

    If the order of the answers is not important, there is an alternative to the -unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many +unique option, namely to sort the answers uniquely:

    qlc:sort(qlc:q([X || X <- qlc:append(QH1, QH2)], {unique, true})).

    This query also removes duplicates but the answers are sorted. If there are many answers, temporary files are used. Notice that to get the first unique answer, all answers must be found and sorted. Both alternatives find duplicates by comparing answers, that is, if A1 and A2 are answers found in that order, then A2 is a removed if A1 == A2.

    To return only a few answers, cursors can be used. The following code returns no -more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    -R = qlc:next_answers(C, 5),
    -ok = qlc:delete_cursor(C),
    +more than five answers using an ETS table for storing the unique answers:

    C = qlc:cursor(qlc:q([X || X <- qlc:append(QH1, QH2)],{unique,true})),
    +R = qlc:next_answers(C, 5),
    +ok = qlc:delete_cursor(C),
     R.

    QLCs are convenient for stating constraints on data from two or more tables. The -following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 +following example does a natural join on two query handles on position 2:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2])

    The qlc module evaluates this differently depending on the query handles QH1 and QH2. If, for example, X2 is matched against the key of a QLC table, the lookup join method traverses the objects of QH2 while looking up key values in the table. However, if not X2 or Y2 is matched against the key or an indexed @@ -168,11 +168,11 @@ both sorted on position 2 and next do the join by traversing the objects one by one.

    Option join can be used to force the qlc module to use a certain join method. For the rest of this section it is assumed that the excessively slow -join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    -          {X1,X2,X3} <- QH1,
    -          {Y1,Y2} <- QH2,
    -          X2 =:= Y2],
    -      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 +join method called "nested loop" has been chosen:

    qlc:q([{X1,X2,X3,Y1} ||
    +          {X1,X2,X3} <- QH1,
    +          {Y1,Y2} <- QH2,
    +          X2 =:= Y2],
    +      {join, nested_loop})

    In this case the filter is applied to every possible pair of answers to QH1 and QH2, one at a time. If there are M answers to QH1 and N answers to QH2, the filter is run M*N times.

    If QH2 is a call to the function for gb_trees, as defined in section Implementing a QLC Table, then @@ -186,7 +186,7 @@ no side effects so that the meaning of the query does not change if QH2 is evaluated only once. One way of caching the answers is to evaluate QH2 first of all and substitute the list of answers for QH2 in the query. Another way is -to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first +to use option cache. It is expressed like this:

    QH2' = qlc:q([X || X <- QH2], {cache, ets})

    or only

    QH2' = qlc:q([X || X <- QH2], cache)

    The effect of option cache is that when generator QH2' is run the first time, every answer is stored in an ETS table. When the next answer of QH1 is tried, answers to QH2' are copied from the ETS table, which is very fast. As for option unique the cost is a possibly substantial amount of RAM memory.

    Option {cache, list} offers the possibility to store the answers in a list on @@ -202,62 +202,62 @@ tables and lists on all levels of the query. This can be used for testing if caching would improve efficiency at all. If the answer is yes, further testing is needed to pinpoint the generators that are to be cached.

    Implementing a QLC Table

    As an example of how to use function table/2, the implementation of a QLC -table for the gb_trees module is given:

    -module(gb_table).
    +table for the gb_trees module is given:

    -module(gb_table).
     
    --export([table/1]).
    +-export([table/1]).
     
    -table(T) ->
    -    TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end,
    -    InfoFun = fun(num_of_objects) -> gb_trees:size(T);
    -                 (keypos) -> 1;
    -                 (is_sorted_key) -> true;
    -                 (is_unique_objects) -> true;
    -                 (_) -> undefined
    +table(T) ->
    +    TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end,
    +    InfoFun = fun(num_of_objects) -> gb_trees:size(T);
    +                 (keypos) -> 1;
    +                 (is_sorted_key) -> true;
    +                 (is_unique_objects) -> true;
    +                 (_) -> undefined
                   end,
         LookupFun =
    -        fun(1, Ks) ->
    -                lists:flatmap(fun(K) ->
    -                                      case gb_trees:lookup(K, T) of
    -                                          {value, V} -> [{K,V}];
    -                                          none -> []
    +        fun(1, Ks) ->
    +                lists:flatmap(fun(K) ->
    +                                      case gb_trees:lookup(K, T) of
    +                                          {value, V} -> [{K,V}];
    +                                          none -> []
                                           end
    -                              end, Ks)
    +                              end, Ks)
             end,
         FormatFun =
    -        fun({all, NElements, ElementFun}) ->
    -                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    -                                      [gb_nodes(T, NElements, ElementFun)]),
    -                io_lib:format("gb_table:table(~s)", [ValsS]);
    -           ({lookup, 1, KeyValues, _NElements, ElementFun}) ->
    -                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    -                                      [gb_nodes(T, infinity, ElementFun)]),
    -                io_lib:format("lists:flatmap(fun(K) -> "
    +        fun({all, NElements, ElementFun}) ->
    +                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    +                                      [gb_nodes(T, NElements, ElementFun)]),
    +                io_lib:format("gb_table:table(~s)", [ValsS]);
    +           ({lookup, 1, KeyValues, _NElements, ElementFun}) ->
    +                ValsS = io_lib:format("gb_trees:from_orddict(~w)",
    +                                      [gb_nodes(T, infinity, ElementFun)]),
    +                io_lib:format("lists:flatmap(fun(K) -> "
                                   "case gb_trees:lookup(K, ~s) of "
                                   "{value, V} -> [{K,V}];none -> [] end "
                                   "end, ~w)",
    -                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
    +                              [ValsS, [ElementFun(KV) || KV <- KeyValues]])
             end,
    -    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    -                   {lookup_fun, LookupFun},{key_equality,'=='}]).
    +    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    +                   {lookup_fun, LookupFun},{key_equality,'=='}]).
     
    -qlc_next({X, V, S}) ->
    -    [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end];
    -qlc_next(none) ->
    -    [].
    -
    -gb_nodes(T, infinity, ElementFun) ->
    -    gb_nodes(T, -1, ElementFun);
    -gb_nodes(T, NElements, ElementFun) ->
    -    gb_iter(gb_trees:iterator(T), NElements, ElementFun).
    +qlc_next({X, V, S}) ->
    +    [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end];
    +qlc_next(none) ->
    +    [].
    +
    +gb_nodes(T, infinity, ElementFun) ->
    +    gb_nodes(T, -1, ElementFun);
    +gb_nodes(T, NElements, ElementFun) ->
    +    gb_iter(gb_trees:iterator(T), NElements, ElementFun).
     
    -gb_iter(_I, 0, _EFun) ->
    +gb_iter(_I, 0, _EFun) ->
         '...';
    -gb_iter(I0, N, EFun) ->
    -    case gb_trees:next(I0) of
    -        {X, V, I} ->
    -            [EFun({X,V}) | gb_iter(I, N-1, EFun)];
    +gb_iter(I0, N, EFun) ->
    +    case gb_trees:next(I0) of
    +        {X, V, I} ->
    +            [EFun({X,V}) | gb_iter(I, N-1, EFun)];
             none ->
    -            []
    +            []
         end.

    TF is the traversal function. The qlc module requires that there is a way of traversing all objects of the data structure. gb_trees has an iterator function suitable for that purpose. Notice that for each object returned, a new @@ -287,49 +287,49 @@ example, 2 == 2.0 evaluates to true while 2 =:= 2.0 evaluates to false. Normally this is a minor issue, but the qlc module cannot ignore the difference, which affects the user's choice of operators in QLCs.

    If the qlc module at compile time can determine that some constant is free of -integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    -Q1 = qlc:q([K ||
    -{K} <- ets:table(E1),
    -K == 2.71 orelse K == a]),
    -io:format("~s~n", [qlc:info(Q1)]).
    -ets:match_spec_run(
    -       lists:flatmap(fun(V) ->
    -			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    -				       V)
    +integers, it does not matter which one of ==/2 or =:=/2 is used:

    1> E1 = ets:new(t, [set]), % uses =:=/2 for key equality
    +Q1 = qlc:q([K ||
    +{K} <- ets:table(E1),
    +K == 2.71 orelse K == a]),
    +io:format("~s~n", [qlc:info(Q1)]).
    +ets:match_spec_run(
    +       lists:flatmap(fun(V) ->
    +			    ets:lookup(#Ref<0.3098908599.2283929601.256025>,
    +				       V)
     		     end,
    -		     [a, 2.71]),
    -       ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have + [a, 2.71]), + ets:match_spec_compile([{{'$1'}, [], ['$1']}]))

    In the example, operator ==/2 has been handled exactly as =:=/2 would have been handled. However, if it cannot be determined at compile time that some constant is free of integers, and the table uses =:=/2 when comparing keys for equality (see option key_equality), then the qlc module does not try to look up the constant. The reason is that there is in the general case no upper limit on the number of key values that can compare equal -to such a constant; every combination of integers and floats must be looked up:

    2> E2 = ets:new(t, [set]),
    -true = ets:insert(E2, [{{2,2},a},{{2,2.0},b},{{2.0,2},c}]),
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/queue.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/queue.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/queue.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -598,12 +598,12 @@
     
           
     
    -

    Returns a queue Q2 that is the result of removing the front item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue = queue:drop(Queue).
    -{[5,4,3],[2]}
    -3> queue:to_list(Queue1).
    -[2,3,4,5]
    +

    Returns a queue Q2 that is the result of removing the front item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue = queue:drop(Queue).
    +{[5,4,3],[2]}
    +3> queue:to_list(Queue1).
    +[2,3,4,5]
    @@ -631,12 +631,12 @@ -

    Returns a queue Q2 that is the result of removing the rear item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> Queue = queue:drop_r(Queue).
    -{[4,3],[1,2]}
    -3> queue:to_list(Queue1).
    -[1,2,3,4]
    +

    Returns a queue Q2 that is the result of removing the rear item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> Queue = queue:drop_r(Queue).
    +{[4,3],[1,2]}
    +3> queue:to_list(Queue1).
    +[1,2,3,4]
    @@ -664,9 +664,9 @@ -

    Returns Item at the front of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> 1 == queue:get(Queue).
    +

    Returns Item at the front of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> 1 == queue:get(Queue).
     true
    @@ -695,9 +695,9 @@ -

    Returns Item at the rear of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -2> 5 == queue:get_r(Queue).
    +

    Returns Item at the rear of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +{[5,4,3],[1,2]}
    +2> 5 == queue:get_r(Queue).
     true
    @@ -727,12 +727,12 @@

    Returns tuple {value, Item}, where Item is the front item of Q, or empty -if Q is empty.

    Example 1:

    1> queue:peek(queue:new()).
    +if Q is empty.

    Example 1:

    1> queue:peek(queue:new()).
     empty
    -2> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -3> queue:peek(Queue).
    -{value, 1}
    +2>
    Queue = queue:from_list([1,2,3,4,5]). +{[5,4,3],[1,2]} +3> queue:peek(Queue). +{value, 1}
    @@ -761,12 +761,12 @@

    Returns tuple {value, Item}, where Item is the rear item of Q, or empty -if Q is empty.

    Example 1:

    1> queue:peek_r(queue:new()).
    +if Q is empty.

    Example 1:

    1> queue:peek_r(queue:new()).
     empty
    -2> Queue = queue:from_list([1,2,3,4,5]).
    -{[5,4,3],[1,2]}
    -3> queue:peek_r(Queue).
    -{value, 5}
    +2>
    Queue = queue:from_list([1,2,3,4,5]). +{[5,4,3],[1,2]} +3> queue:peek_r(Queue). +{value, 5}
    @@ -801,10 +801,10 @@ -

    Inserts Item at the head of queue Q1. Returns the new queue Q2.

    Example:

    1> Queue = queue:cons(0, queue:from_list([1,2,3])).
    -{[3,2],[0,1]}
    -2> queue:to_list(Queue).
    -[0,1,2,3]
    +

    Inserts Item at the head of queue Q1. Returns the new queue Q2.

    Example:

    1> Queue = queue:cons(0, queue:from_list([1,2,3])).
    +{[3,2],[0,1]}
    +2> queue:to_list(Queue).
    +[0,1,2,3]
    @@ -832,7 +832,7 @@ -

    Returns the tail item of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> queue:daeh(queue:from_list([1,2,3])).
    +

    Returns the tail item of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> queue:daeh(queue:from_list([1,2,3])).
     3
    @@ -861,7 +861,7 @@ -

    Returns Item from the head of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> queue:head(queue:from_list([1,2,3])).
    +

    Returns Item from the head of queue Q.

    Fails with reason empty if Q is empty.

    Example 1:

    1> queue:head(queue:from_list([1,2,3])).
     1
    @@ -890,10 +890,10 @@ -

    Returns a queue Q2 that is the result of removing the tail item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:init(queue:from_list([1,2,3])).
    -{[2],[1]}
    -2> queue:to_list(Queue).
    -[1,2]
    +

    Returns a queue Q2 that is the result of removing the tail item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:init(queue:from_list([1,2,3])).
    +{[2],[1]}
    +2> queue:to_list(Queue).
    +[1,2]
    @@ -953,7 +953,7 @@ -

    Returns the tail item of queue Q.

    Fails with reason empty if Q is empty.

    Example:

    1> queue:last(queue:from_list([1,2,3])).
    +

    Returns the tail item of queue Q.

    Fails with reason empty if Q is empty.

    Example:

    1> queue:last(queue:from_list([1,2,3])).
     3
    @@ -982,10 +982,10 @@ -

    Returns a queue Q2 that is the result of removing the tail item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:liat(queue:from_list([1,2,3])).
    -{[2],[1]}
    -2> queue:to_list(Queue).
    -[1,2]
    +

    Returns a queue Q2 that is the result of removing the tail item from Q1.

    Fails with reason empty if Q1 is empty.

    Example:

    1> Queue = queue:liat(queue:from_list([1,2,3])).
    +{[2],[1]}
    +2> queue:to_list(Queue).
    +[1,2]
    @@ -1013,10 +1013,10 @@ -

    Inserts Item as the tail item of queue Q1. Returns the new queue Q2.

    Example:

    1> Queue = queue:snoc(queue:from_list([1,2,3]), 4).
    -{[4,3,2],[1]}
    -2> queue:to_list(Queue).
    -[1,2,3,4]
    +

    Inserts Item as the tail item of queue Q1. Returns the new queue Q2.

    Example:

    1> Queue = queue:snoc(queue:from_list([1,2,3]), 4).
    +{[4,3,2],[1]}
    +2> queue:to_list(Queue).
    +[1,2,3,4]
    @@ -1082,10 +1082,10 @@

    Returns true if Pred(Item) returns true for all items Item in Q, -otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    -2> queue:all(fun (E) -> E > 3 end, Queue).
    +otherwise false.

    Example:

    1> Queue = queue:from_list([1,2,3,4,5]).
    +2> queue:all(fun (E) -> E > 3 end, Queue).
     false
    -3> queue:all(fun (E) -> E > 0 end, Queue).
    +3> queue:all(fun (E) -> E > 0 end, Queue).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/random.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/random.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/random.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -344,9 +344,9 @@
           
     
     

    Seeds random number generation with integer values in the process dictionary and -returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    -            erlang:monotonic_time(),
    -            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, +returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    +            erlang:monotonic_time(),
    +            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, and erlang:unique_integer/0.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/rand.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/rand.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/rand.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -83,40 +83,40 @@
    %% If there is no state there, [`seed(default)`](`seed/1`) %% is implicitly called first: %% -1> R0 = rand:uniform(), - is_float(R0) andalso 0.0 =< R0 andalso R0 < 1.0. +1> R0 = rand:uniform(), + is_float(R0) andalso 0.0 =< R0 andalso R0 < 1.0. true -2> R1 = rand:uniform(), - is_float(R1) andalso 0.0 =< R1 andalso R1 < 1.0. +2> R1 = rand:uniform(), + is_float(R1) andalso 0.0 =< R1 andalso R1 < 1.0. true %% Generate a uniformly distributed integer in the range 1..4711: %% -3> K0 = rand:uniform(4711), - is_integer(K0) andalso 1 =< K0 andalso K0 =< 4711. +3> K0 = rand:uniform(4711), + is_integer(K0) andalso 1 =< K0 andalso K0 =< 4711. true %% Generate a binary with 16 bytes, uniformly distributed: %% -4> B0 = rand:bytes(16), - byte_size(B0) == 16. +4> B0 = rand:bytes(16), + byte_size(B0) == 16. true %% Select and initialize a specified algorithm, %% with an automatic default seed, then generate %% a floating point number: %% -5> rand:seed(exro928ss). -6> R2 = rand:uniform(), - is_float(R2) andalso 0.0 =< R2 andalso R2 < 1.0. +5> rand:seed(exro928ss). +6> R2 = rand:uniform(), + is_float(R2) andalso 0.0 =< R2 andalso R2 < 1.0. true %% Select and initialize a specified algorithm %% with a specified seed, then generate %% a floating point number: %% -7> rand:seed(exro928ss, 123456789). -8> R3 = rand:uniform(). +7> rand:seed(exro928ss, 123456789). +8> R3 = rand:uniform(). 0.48303622772415256 %% Select and initialize a specific algorithm, @@ -124,28 +124,28 @@ %% with explicit generator state, then generate %% two floating point numbers. %% -9> S0 = rand:seed_s(exsss). -10> {R4, S1} = rand:uniform_s(S0), - is_float(R4) andalso 0.0 =< R4 andalso R4 < 1.0. +9> S0 = rand:seed_s(exsss). +10> {R4, S1} = rand:uniform_s(S0), + is_float(R4) andalso 0.0 =< R4 andalso R4 < 1.0. true -11> {R5, S2} = rand:uniform_s(S1), - is_float(R5) andalso 0.0 =< R5 andalso R5 < 1.0. +11> {R5, S2} = rand:uniform_s(S1), + is_float(R5) andalso 0.0 =< R5 andalso R5 < 1.0. true %% Repeat the first after seed -12> {R4, _} = rand:uniform_s(S0). +12> {R4, _} = rand:uniform_s(S0). %% Generate a standard normal distribution number %% using the built-in fast Ziggurat Method: %% -13> {SND0, S3} = rand:normal_s(S2), - is_float(SND0). +13> {SND0, S3} = rand:normal_s(S2), + is_float(SND0). true %% Generate a normal distribution number %% with mean -3 and variance 0.5: %% -14> {ND0, S4} = rand:normal_s(-3, 0.5, S3), - is_float(ND0). +14> {ND0, S4} = rand:normal_s(-3, 0.5, S3), + is_float(ND0). true %% Generate a textbook basic form Box-Muller @@ -153,14 +153,14 @@ %% distribution as the built-in Ziggurat method above, %% but is much slower: %% -15> R6 = rand:uniform_real(), - is_float(R6) andalso 0.0 < R6 andalso R6 < 1.0. +15> R6 = rand:uniform_real(), + is_float(R6) andalso 0.0 < R6 andalso R6 < 1.0. true -16> R7 = rand:uniform(), - is_float(R7) andalso 0.0 =< R7 andalso R7 < 1.0. +16> R7 = rand:uniform(), + is_float(R7) andalso 0.0 =< R7 andalso R7 < 1.0. true %% R6 cannot be equal to 0.0 so math:log/1 will never fail -17> SND1 = math:sqrt(-2 * math:log(R6)) * math:cos(math:pi() * R7).

    Algorithms

    The base generator algorithms implement the +17> SND1 = math:sqrt(-2 * math:log(R6)) * math:cos(math:pi() * R7).

    Algorithms

    The base generator algorithms implement the Xoroshiro and Xorshift algorithms by Sebastiano Vigna. During an iteration they generate an integer (at least 58-bit) and operate on a state of several integers. @@ -227,7 +227,7 @@ up to (and included) 16TB, with the exception of binary rank tests, which fail due to the lowest bit being an LFSR; all other bits pass all tests. We suggest to use a sign test to extract a random Boolean value.

    If this is a problem; to generate a boolean with these algorithms, -use something like this:

    (rand:uniform(256) > 128) % -> boolean()
    ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

    For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

    (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

    The floating point generating functions in this module waste the lowest bits +use something like this:

    (rand:uniform(256) > 128) % -> boolean()
    ((rand:uniform(256) - 1) bsr 7) % -> 0 | 1

    For a general range, with N = 1 for exrop, and N = 3 for exs1024s:

    (((rand:uniform(Range bsl N) - 1) bsr N) + 1)

    The floating point generating functions in this module waste the lowest bits when converting from an integer so they avoid this snag.

    Niche algorithms

    The niche algorithms API contains special purpose algorithms that do not use the plug-in framework, mainly for performance reasons.

    Since these algorithms lack the plug-in framework support, generating numbers @@ -1421,7 +1421,7 @@ 16#7fa6502 * 2^32 - 1, which have been selected, in collaboration with Sebastiano Vigna, to avoid bignum operations and still get good statistical quality. It has been named "MWC59" and can be written as:

    C = CX0 bsr 32
    -X = CX0 band ((1 bsl 32)-1))
    +X = CX0 band ((1 bsl 32)-1))
     CX1 = 16#7fa6502 * X + C

    Because the generator uses a multiplier that is a power of 2 it gets statistical flaws for collision tests and birthday spacings tests in 2 and 3 dimensions, and these caveats apply even when looking @@ -2324,10 +2324,10 @@ equally spaced in the interval.

    Warning

    This function may return exactly 0.0 which can be fatal for certain applications. If that is undesired you can use (1.0 - rand:uniform()) to get the interval 0.0 < X =< 1.0, or instead use uniform_real/0.

    If neither endpoint is desired you can achieve the range -0.0 < X < 1.0 using test and re-try like this:

    my_uniform() ->
    -    case rand:uniform() of
    +0.0 < X < 1.0 using test and re-try like this:

    my_uniform() ->
    +    case rand:uniform() of
             X when 0.0 < X -> X;
    -        _ -> my_uniform()
    +        _ -> my_uniform()
         end.
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/re.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/re.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/re.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -2405,32 +2405,32 @@

    Takes a compiled regular expression and an item, and returns the relevant data from the regular expression.

    The only supported item is namelist, which returns the tuple {namelist, [binary()]}, -containing the names of all (unique) named subpatterns in the regular expression.

    For example:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    -{ok,{re_pattern,3,0,0,
    -                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -2> re:inspect(MP,namelist).
    -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    -3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
    -{ok,{re_pattern,3,0,0,
    -                <<69,82,67,80,119,0,0,0,0,0,8,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -4> re:inspect(MPD,namelist).
    -{namelist,[<<"B">>,<<"C">>]}

    Notice in the second example that the duplicate name only occurs once in the +containing the names of all (unique) named subpatterns in the regular expression.

    For example:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    +{ok,{re_pattern,3,0,0,
    +                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    +                  255,255,...>>}}
    +2> re:inspect(MP,namelist).
    +{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    +3> {ok,MPD} = re:compile("(?<C>A)|(?<B>B)|(?<C>C)",[dupnames]).
    +{ok,{re_pattern,3,0,0,
    +                <<69,82,67,80,119,0,0,0,0,0,8,0,1,0,0,0,255,255,255,255,
    +                  255,255,...>>}}
    +4> re:inspect(MPD,namelist).
    +{namelist,[<<"B">>,<<"C">>]}

    Notice in the second example that the duplicate name only occurs once in the returned list, and that the list is in alphabetical order regardless of where the names are positioned in the regular expression. The order of the names is the same as the order of captured subexpressions if {capture, all_names} is specified as an option to run/3. You can therefore create a name-to-value -mapping from the result of run/3 like this:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    -{ok,{re_pattern,3,0,0,
    -                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    -                  255,255,...>>}}
    -2> {namelist, N} = re:inspect(MP,namelist).
    -{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    -3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]).
    -{match,[<<"A">>,<<>>,<<>>]}
    -4> NameMap = lists:zip(N,L).
    -[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
    +mapping from the result of run/3 like this:

    1> {ok,MP} = re:compile("(?<A>A)|(?<B>B)|(?<C>C)").
    +{ok,{re_pattern,3,0,0,
    +                <<69,82,67,80,119,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,
    +                  255,255,...>>}}
    +2> {namelist, N} = re:inspect(MP,namelist).
    +{namelist,[<<"A">>,<<"B">>,<<"C">>]}
    +3> {match,L} = re:run("AA",MP,[{capture,all_names,binary}]).
    +{match,[<<"A">>,<<>>,<<>>]}
    +4> NameMap = lists:zip(N,L).
    +[{<<"A">>,<<"A">>},{<<"B">>,<<>>},{<<"C">>,<<>>}]
    @@ -2519,16 +2519,16 @@ subexpression number N, is inserted in the result. If no subexpression with that number is generated by the regular expression, nothing is inserted.

    To insert an & or a \ in the result, precede it with a \. Notice that Erlang already gives a special meaning to \ in literal strings, so a single \ must be -written as "\\" and therefore a double \ as "\\\\".

    Example:

    1> re:replace("abcd","c","[&]",[{return,list}]).
    -"ab[c]d"

    while

    2> re:replace("abcd","c","[\\&]",[{return,list}]).
    +written as "\\" and therefore a double \ as "\\\\".

    Example:

    1> re:replace("abcd","c","[&]",[{return,list}]).
    +"ab[c]d"

    while

    2> re:replace("abcd","c","[\\&]",[{return,list}]).
     "ab[&]d"

    If the replacement is given as a fun, it will be called with the whole matching expression as the first argument and a list of subexpression matches in the order in which they appear in the regular expression. The returned value will be -inserted in the result.

    Example:

    3> re:replace("abcd", ".(.)",
    -    fun(Whole, [<<C>>]) ->
    -         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
    +inserted in the result.

    Example:

    3> re:replace("abcd", ".(.)",
    +    fun(Whole, [<<C>>]) ->
    +         <<$#, Whole/binary, $-, (C - $a + $A), $#>>
         end,
    -    [{return, list}]).
    +    [{return, list}]).
     "#ab-B#cd"

    Note

    Non-matching optional subexpressions will not be included in the list of subexpression matches if they are the last subexpressions in the regular expression.

    Example:

    The regular expression "(a)(b)?(c)?" ("a", optionally followed by "b", @@ -2649,7 +2649,7 @@ run/3 handles empty matches in the same way as Perl: a zero-length match at any point is also retried with options [anchored, notempty_atstart]. If that search gives a result of length > 0, -the result is included. Example:

    re:run("cat","(|at)",[global]).

    The following matchings are performed:

    • At offset 0 - The regular expression (|at) first match at the +the result is included. Example:

      re:run("cat","(|at)",[global]).

      The following matchings are performed:

      • At offset 0 - The regular expression (|at) first match at the initial position of string cat, giving the result set [{0,0},{0,0}] (the second {0,0} is because of the subexpression marked by the parentheses). As the length of the match is 0, we do not advance to the next position yet.

      • At offset 0 with [anchored, notempty_atstart] - The search is @@ -2661,7 +2661,7 @@ of results and the position in the search string is advanced two steps.

      • At offset 3 - The search once again matches the empty string, giving [{3,0},{3,0}].

      • At offset 1 with [anchored, notempty_atstart] - This gives no result of length > 0 and we are at the last position, so the global search is -complete.

      The result of the call is:

      {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
    • notempty - An empty string is not considered to be a valid match if this +complete.

    The result of the call is:

    {match,[[{0,0},{0,0}],[{1,0},{1,0}],[{1,2},{1,2}],[{3,0},{3,0}]]}
  • notempty - An empty string is not considered to be a valid match if this option is specified. If alternatives in the pattern exist, they are tried. If all the alternatives match the empty string, the entire match fails.

    Example:

    If the following pattern is applied to a string not beginning with "a" or "b", it would normally match the empty string at the start of the subject:

    a?b?

    With option notempty, this match is invalid, so run/3 searches @@ -2732,12 +2732,12 @@ instead of the stack, the amount of heap memory that can be used.

    The Erlang VM uses a PCRE library where heap memory is used when regular expression match recursion occurs. This therefore limits the use of machine heap, not C stack.

    Specifying a lower value can result in matches with deep recursion failing, -when they should have matched:

    1> re:run("aaaaaaaaaaaaaz","(a+)*z").
    -{match,[{0,14},{0,13}]}
    -2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
    +when they should have matched:

    1> re:run("aaaaaaaaaaaaaz","(a+)*z").
    +{match,[{0,14},{0,13}]}
    +2> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5}]).
     nomatch
    -3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]).
    -{error,match_limit_recursion}

    This option and option match_limit are only to be used in rare cases. +3> re:run("aaaaaaaaaaaaaz","(a+)*z",[{match_limit_recursion,5},report_errors]). +{error,match_limit_recursion}

    This option and option match_limit are only to be used in rare cases. Understanding of the PCRE library internals is recommended before tampering with these limits.

  • {offset, integer() >= 0} - Start matching at the offset (position) specified in the subject string. The offset is zero-based, so that the default @@ -2750,9 +2750,9 @@ capturing).

    As an example of the default behavior, the following call returns, as first and only captured string, the matching part of the subject ("abcd" in the middle) as an index pair {3,4}, where character positions are zero-based, -just as in offsets:

    re:run("ABCabcdABC","abcd",[]).

    The return value of this call is:

    {match,[{3,4}]}

    Another (and quite common) case is where the regular expression matches all of -the subject:

    re:run("ABCabcdABC",".*abcd.*",[]).

    Here the return value correspondingly points out all of the string, beginning -at index 0, and it is 10 characters long:

    {match,[{0,10}]}

    If the regular expression contains capturing subpatterns, like in:

    re:run("ABCabcdABC",".*(abcd).*",[]).

    all of the matched subject is captured, as well as the captured substrings:

    {match,[{0,10},{3,4}]}

    The complete matching pattern always gives the first return value in the list +just as in offsets:

    re:run("ABCabcdABC","abcd",[]).

    The return value of this call is:

    {match,[{3,4}]}

    Another (and quite common) case is where the regular expression matches all of +the subject:

    re:run("ABCabcdABC",".*abcd.*",[]).

    Here the return value correspondingly points out all of the string, beginning +at index 0, and it is 10 characters long:

    {match,[{0,10}]}

    If the regular expression contains capturing subpatterns, like in:

    re:run("ABCabcdABC",".*(abcd).*",[]).

    all of the matched subject is captured, as well as the captured substrings:

    {match,[{0,10},{3,4}]}

    The complete matching pattern always gives the first return value in the list and the remaining subpatterns are added in the order they occurred in the regular expression.

    The capture tuple is built up as follows:

    • ValueSpec - Specifies which captured (sub)patterns are to be returned. ValueSpec can either be an atom describing a predefined set of return @@ -2777,12 +2777,12 @@ subpatterns (see below) in the regular expression, one can use atom/0s or string/0s to specify the subpatterns to be returned. For example, consider the regular expression:

      ".*(abcd).*"

      matched against string "ABCabcdABC", capturing only the "abcd" part (the -first explicit subpattern):

      re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

      The call gives the following result, as the first explicitly captured +first explicit subpattern):

      re:run("ABCabcdABC",".*(abcd).*",[{capture,[1]}]).

      The call gives the following result, as the first explicitly captured subpattern is "(abcd)", matching "abcd" in the subject, at (zero-based) -position 3, of length 4:

      {match,[{3,4}]}

      Consider the same regular expression, but with the subpattern explicitly +position 3, of length 4:

      {match,[{3,4}]}

      Consider the same regular expression, but with the subpattern explicitly named 'FOO':

      ".*(?<FOO>abcd).*"

      With this expression, we could still give the index of the subpattern with -the following call:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

      giving the same result as before. But, as the subpattern is named, we can -also specify its name in the value list:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

      This would give the same result as the earlier examples, namely:

      {match,[{3,4}]}

      The values list can specify indexes or names not present in the regular +the following call:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,[1]}]).

      giving the same result as before. But, as the subpattern is named, we can +also specify its name in the value list:

      re:run("ABCabcdABC",".*(?<FOO>abcd).*",[{capture,['FOO']}]).

      This would give the same result as the earlier examples, namely:

      {match,[{3,4}]}

      The values list can specify indexes or names not present in the regular expression, in which case the return values vary depending on the type. If the type is index, the tuple {-1,0} is returned for values with no corresponding subpattern in the regular expression, but for the other types @@ -2817,12 +2817,12 @@ string:

      "ABCabcdABC"

      the subpattern at index 2 does not match, as "abdd" is not present in the string, but the complete pattern matches (because of the alternative a(..d)). The subpattern at index 2 is therefore unassigned and the default -return value is:

      {match,[{0,10},{3,4},{-1,0},{4,3}]}

      Setting the capture Type to binary gives:

      {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

      Here the empty binary (<<>>) represents the unassigned subpattern. In the +return value is:

      {match,[{0,10},{3,4},{-1,0},{4,3}]}

      Setting the capture Type to binary gives:

      {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]}

      Here the empty binary (<<>>) represents the unassigned subpattern. In the binary case, some information about the matching is therefore lost, as <<>> can also be an empty string captured.

      If differentiation between empty matches and non-existing subpatterns is necessary, use the type index and do the conversion to the final type in Erlang code.

      When option global is speciified, the capture specification affects each -match separately, so that:

      re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

      gives

      {match,[["a"],["b"]]}

    For a descriptions of options only affecting the compilation step, see +match separately, so that:

    re:run("cacb","c(a|b)",[global,{capture,[1],list}]).

    gives

    {match,[["a"],["b"]]}
  • For a descriptions of options only affecting the compilation step, see compile/2.

    @@ -2909,7 +2909,7 @@ compilation option is specified to this function, both the regular expression and Subject are to be specified as valid Unicode charlist()s.

    The result is given as a list of "strings", the preferred data type specified in option return (default iodata).

    If subexpressions are specified in the regular expression, the matching -subexpressions are returned in the resulting list as well. For example:

    re:split("Erlang","[ln]",[{return,list}]).

    gives

    ["Er","a","g"]

    while

    re:split("Erlang","([ln])",[{return,list}]).

    gives

    ["Er","l","a","n","g"]

    The text matching the subexpression (marked by the parentheses in the regular +subexpressions are returned in the resulting list as well. For example:

    re:split("Erlang","[ln]",[{return,list}]).

    gives

    ["Er","a","g"]

    while

    re:split("Erlang","([ln])",[{return,list}]).

    gives

    ["Er","l","a","n","g"]

    The text matching the subexpression (marked by the parentheses in the regular expression) is inserted in the result list where it was found. This means that concatenating the result of a split where the whole regular expression is a single subexpression (as in the last example) always results in the original @@ -2917,21 +2917,21 @@ "g"), nothing is inserted after that. To make the group of strings and the parts matching the subexpressions more obvious, one can use option group, which groups together the part of the subject string with the parts matching the -subexpressions when the string was split:

    re:split("Erlang","([ln])",[{return,list},group]).

    gives

    [["Er","l"],["a","n"],["g"]]

    Here the regular expression first matched the "l", causing "Er" to be the first +subexpressions when the string was split:

    re:split("Erlang","([ln])",[{return,list},group]).

    gives

    [["Er","l"],["a","n"],["g"]]

    Here the regular expression first matched the "l", causing "Er" to be the first part in the result. When the regular expression matched, the (only) subexpression was bound to the "l", so the "l" is inserted in the group together with "Er". The next match is of the "n", making "a" the next part to be returned. As the subexpression is bound to substring "n" in this case, the "n" is inserted into this group. The last group consists of the remaining string, as no more matches are found.

    By default, all parts of the string, including the empty strings, are returned -from the function, for example:

    re:split("Erlang","[lg]",[{return,list}]).

    gives

    ["Er","an",[]]

    as the matching of the "g" in the end of the string leaves an empty rest, which +from the function, for example:

    re:split("Erlang","[lg]",[{return,list}]).

    gives

    ["Er","an",[]]

    as the matching of the "g" in the end of the string leaves an empty rest, which is also returned. This behavior differs from the default behavior of the split function in Perl, where empty strings at the end are by default removed. To get -the "trimming" default behavior of Perl, specify trim as an option:

    re:split("Erlang","[lg]",[{return,list},trim]).

    gives

    ["Er","an"]

    The "trim" option says; "give me as many parts as possible except the empty +the "trimming" default behavior of Perl, specify trim as an option:

    re:split("Erlang","[lg]",[{return,list},trim]).

    gives

    ["Er","an"]

    The "trim" option says; "give me as many parts as possible except the empty ones", which sometimes can be useful. You can also specify how many parts you -want, by specifying {parts,N}:

    re:split("Erlang","[lg]",[{return,list},{parts,2}]).

    gives

    ["Er","ang"]

    Notice that the last part is "ang", not "an", as splitting was specified into +want, by specifying {parts,N}:

    re:split("Erlang","[lg]",[{return,list},{parts,2}]).

    gives

    ["Er","ang"]

    Notice that the last part is "ang", not "an", as splitting was specified into two parts, and the splitting stops when enough parts are given, which is why the -result differs from that of trim.

    More than three parts are not possible with this indata, so

    re:split("Erlang","[lg]",[{return,list},{parts,4}]).

    gives the same result as the default, which is to be viewed as "an infinite +result differs from that of trim.

    More than three parts are not possible with this indata, so

    re:split("Erlang","[lg]",[{return,list},{parts,4}]).

    gives the same result as the default, which is to be viewed as "an infinite number of parts".

    Specifying 0 as the number of parts gives the same effect as option trim. If subexpressions are captured, empty subexpressions matched at the end are also stripped from the result if trim or {parts,0} is specified.

    The trim behavior corresponds exactly to the Perl default. {parts,N}, where /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/sets.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/sets.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/sets.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -43,11 +43,11 @@ respect to the aforementioned functions, their overall behavior may differ. As mentioned, this module considers elements as different if and only if they do not match (=:=), while both ordsets and gb_sets consider elements -as different if and only if they do not compare equal (==).

    Examples

    1> sets:is_element(1.0, sets:from_list([1])).
    +as different if and only if they do not compare equal (==).

    Examples

    1> sets:is_element(1.0, sets:from_list([1])).
     false
    -2> ordsets:is_element(1.0, ordsets:from_list([1])).
    +2> ordsets:is_element(1.0, ordsets:from_list([1])).
     true
    -3> gb_sets:is_element(1.0, gb_sets:from_list([1])).
    +3> gb_sets:is_element(1.0, gb_sets:from_list([1])).
     true

    See Also

    gb_sets, ordsets

    @@ -416,16 +416,16 @@ -

    Returns a new set formed from Set1 with Element inserted.

    Examples

    1> S0 = sets:new().
    -2> S1 = sets:add_element(7, S0).
    -3> sets:to_list(S1).
    -[7]
    -4> S2 = sets:add_element(42, S1).
    -5> lists:sort(sets:to_list(S2)).
    -[7,42]
    -6> S2 = sets:add_element(42, S1).
    -7> lists:sort(sets:to_list(S2)).
    -[7,42]
    +

    Returns a new set formed from Set1 with Element inserted.

    Examples

    1> S0 = sets:new().
    +2> S1 = sets:add_element(7, S0).
    +3> sets:to_list(S1).
    +[7]
    +4> S2 = sets:add_element(42, S1).
    +5> lists:sort(sets:to_list(S2)).
    +[7,42]
    +6> S2 = sets:add_element(42, S1).
    +7> lists:sort(sets:to_list(S2)).
    +[7,42]
    @@ -453,12 +453,12 @@ -

    Returns a copy of Set1 with Element removed.

    Examples

    1> S = sets:from_list([a,b]).
    -2> sets:to_list(sets:del_element(b, S)).
    -[a]
    -3> S = sets:del_element(x, S).
    -4> lists:sort(sets:to_list(S)).
    -[a,b]
    +

    Returns a copy of Set1 with Element removed.

    Examples

    1> S = sets:from_list([a,b]).
    +2> sets:to_list(sets:del_element(b, S)).
    +[a]
    +3> S = sets:del_element(x, S).
    +4> lists:sort(sets:to_list(S)).
    +[a,b]
    @@ -487,11 +487,11 @@ -

    Filters elements in Set1 using predicate function Pred.

    Examples

    1> S = sets:from_list([1,2,3,4,5,6,7]).
    -2> IsEven = fun(N) -> N rem 2 =:= 0 end.
    -3> Filtered = sets:filter(IsEven, S).
    -4> lists:sort(sets:to_list(Filtered)).
    -[2,4,6]
    +

    Filters elements in Set1 using predicate function Pred.

    Examples

    1> S = sets:from_list([1,2,3,4,5,6,7]).
    +2> IsEven = fun(N) -> N rem 2 =:= 0 end.
    +3> Filtered = sets:filter(IsEven, S).
    +4> lists:sort(sets:to_list(Filtered)).
    +[2,4,6]
    @@ -528,17 +528,17 @@

    Calls Fun(Elem) for each Elem of Set1 to update or remove elements from Set1.

    Fun/1 must return either a Boolean or a tuple {true, Value}. The function returns the set of elements for which Fun returns a new -value, with true being equivalent to {true, Elem}.

    sets:filtermap/2 behaves as if it were defined as follows:

    filtermap(Fun, Set1) ->
    -    sets:from_list(lists:filtermap(Fun, Set1)).

    Examples

    1> S = sets:from_list([2,4,5,6,8,9])
    -2> F = fun(X) ->
    +value, with true being equivalent to {true, Elem}.

    sets:filtermap/2 behaves as if it were defined as follows:

    filtermap(Fun, Set1) ->
    +    sets:from_list(lists:filtermap(Fun, Set1)).

    Examples

    1> S = sets:from_list([2,4,5,6,8,9])
    +2> F = fun(X) ->
                case X rem 2 of
    -               0 -> {true, X div 2};
    +               0 -> {true, X div 2};
                    1 -> false
                end
             end.
    -3> Set = sets:filtermap(F, S).
    -4> lists:sort(sets:to_list(Set)).
    -[1,2,3,4]
    +3>
    Set = sets:filtermap(F, S). +4> lists:sort(sets:to_list(Set)). +[1,2,3,4]
    @@ -574,9 +574,9 @@

    Folds Function over every element in Set and returns the final value of -the accumulator.

    The evaluation order is undefined.

    Examples

    1> S = sets:from_list([1,2,3,4]).
    +the accumulator.

    The evaluation order is undefined.

    Examples

    1> S = sets:from_list([1,2,3,4]).
     2> Plus = fun erlang:'+'/2.
    -3> sets:fold(Plus, 0, S).
    +3> sets:fold(Plus, 0, S).
     10
    @@ -605,9 +605,9 @@ -

    Returns a set of the elements in List.

    Examples

    1> S = sets:from_list([a,b,c]).
    -2> lists:sort(sets:to_list(S)).
    -[a,b,c]
    +

    Returns a set of the elements in List.

    Examples

    1> S = sets:from_list([a,b,c]).
    +2> lists:sort(sets:to_list(S)).
    +[a,b,c]
    @@ -637,9 +637,9 @@ -

    Returns a set of the elements in List of the given version.

    Examples

    1> S = sets:from_list([a,b,c], [{version, 1}]).
    -2> lists:sort(sets:to_list(S)).
    -[a,b,c]
    +

    Returns a set of the elements in List of the given version.

    Examples

    1> S = sets:from_list([a,b,c], [{version, 1}]).
    +2> lists:sort(sets:to_list(S)).
    +[a,b,c]
    @@ -668,15 +668,15 @@

    Returns the intersection of the non-empty list of sets.

    The intersection of multiple sets is a new set that contains only the -elements that are present in all sets.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    -2> S1 = sets:from_list([d,e,f]).
    -3> S2 = sets:from_list([q,r])
    -4> Sets = [S0, S1, S2].
    -5> sets:to_list(sets:intersection([S0, S1, S2])).
    -[]
    -6> sets:to_list(sets:intersection([S0, S1])).
    -[d]
    -7> sets:intersection([]).
    +elements that are present in all sets.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    +2> S1 = sets:from_list([d,e,f]).
    +3> S2 = sets:from_list([q,r])
    +4> Sets = [S0, S1, S2].
    +5> sets:to_list(sets:intersection([S0, S1, S2])).
    +[]
    +6> sets:to_list(sets:intersection([S0, S1])).
    +[d]
    +7> sets:intersection([]).
     ** exception error: no function clause matching sets:intersection([])
    @@ -707,14 +707,14 @@

    Returns the intersection of Set1 and Set2.

    The intersection of two sets is a new set that contains only the -elements that are present in both sets.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    -2> S1 = sets:from_list([c,d,e,f]).
    -3> S2 = sets:from_list([q,r]).
    -4> Intersection = sets:intersection(S0, S1).
    -5> lists:sort(sets:to_list(Intersection)).
    -[c,d]
    -6> sets:to_list(sets:intersection(S1, S2)).
    -[]
    +elements that are present in both sets.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    +2> S1 = sets:from_list([c,d,e,f]).
    +3> S2 = sets:from_list([q,r]).
    +4> Intersection = sets:intersection(S0, S1).
    +5> lists:sort(sets:to_list(Intersection)).
    +[c,d]
    +6> sets:to_list(sets:intersection(S1, S2)).
    +[]
    @@ -744,12 +744,12 @@

    Returns true if Set1 and Set2 are disjoint; otherwise, returns false.

    Two sets are disjoint if they have no elements in common.

    This function is equivalent to sets:intersection(Set1, Set2) =:= [], -but faster.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    -2> S1 = sets:from_list([d,e,f]).
    -3> S2 = sets:from_list([q,r])
    -4> sets:is_disjoint(S0, S1).
    +but faster.

    Examples

    1> S0 = sets:from_list([a,b,c,d]).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/shell_default.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -23,10 +23,10 @@
     
           

    Customizing the Erlang environment.

    The functions in this module are called when no module name is specified in a -shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
    +shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
     "cba"
    -2> c(foo).
    -{ok, foo}

    In command one, module lists is called. In command two, no module name is +2> c(foo). +{ok, foo}

    In command one, module lists is called. In command two, no module name is specified. The shell searches module user_default followed by module shell_default for function c/1.

    shell_default is intended for "system wide" customizations to the shell. user_default is intended for "local" or individual user customizations.

    Hint

    To add your own commands to the shell, create a module called user_default and /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/shell.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/shell.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/shell.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -60,7 +60,7 @@ definitions. To facilitate matters, record definitions in modules shell_default and user_default (if loaded) are read each time a new job is started. For example, adding the following line to user_default makes the -definition of file_info readily available in the shell:

    -include_lib("kernel/include/file.hrl").

    The shell runs in two modes:

    • Normal (possibly restricted) mode, in which commands can be edited and +definition of file_info readily available in the shell:

      -include_lib("kernel/include/file.hrl").

      The shell runs in two modes:

      • Normal (possibly restricted) mode, in which commands can be edited and expressions evaluated
      • Job Control Mode, JCL, in which jobs can be started, killed, detached, and connected

      Only the currently connected job can 'talk' to the shell.

      Shell Commands

      The commands below are the built-in shell commands that are always available. In most system the commands listed in the c module are also available in the @@ -116,30 +116,30 @@ records to a module file, where FilePath should include both the path to the file and the name of the module with .erl suffix.

      Example: src/my_module.erl

    Example

    The following example is a long dialog with the shell. Commands starting with > are inputs to the shell. All other lines are output from the shell.

    strider 1> erl
    -Erlang (BEAM) emulator version 5.3 [hipe] [threads:0]
    +Erlang (BEAM) emulator version 5.3 [hipe] [threads:0]
     
    -Eshell V5.3  (abort with ^G)
    +Eshell V5.3  (abort with ^G)
     1> Str = "abcd".
    -"abcd"

    Command 1 sets variable Str to string "abcd".

    2> L = length(Str).
    -4

    Command 2 sets L to the length of string Str.

    3> Descriptor = {L, list_to_atom(Str)}.
    -{4,abcd}

    Command 3 builds the tuple Descriptor, evaluating the BIF +"abcd"

    Command 1 sets variable Str to string "abcd".

    2> L = length(Str).
    +4

    Command 2 sets L to the length of string Str.

    3> Descriptor = {L, list_to_atom(Str)}.
    +{4,abcd}

    Command 3 builds the tuple Descriptor, evaluating the BIF list_to_atom/1 .

    4> L.
    -4

    Command 4 prints the value of variable L.

    5> b().
    -Descriptor = {4,abcd}
    +4

    Command 4 prints the value of variable L.

    5> b().
    +Descriptor = {4,abcd}
     L = 4
     Str = "abcd"
     ok

    Command 5 evaluates the internal shell command b(), which is an abbreviation of "bindings". This prints the current shell variables and their bindings. ok -at the end is the return value of function b().

    6> f(L).
    +at the end is the return value of function b().

    6> f(L).
     ok

    Command 6 evaluates the internal shell command f(L) (abbreviation of -"forget"). The value of variable L is removed.

    7> b().
    -Descriptor = {4,abcd}
    +"forget"). The value of variable L is removed.

    7> b().
    +Descriptor = {4,abcd}
     Str = "abcd"
    -ok

    Command 7 prints the new bindings.

    8> f(L).
    -ok

    Command 8 has no effect, as L has no value.

    9> {L, _} = Descriptor.
    -{4,abcd}

    Command 9 performs a pattern matching operation on Descriptor, binding a new +ok

    Command 7 prints the new bindings.

    8> f(L).
    +ok

    Command 8 has no effect, as L has no value.

    9> {L, _} = Descriptor.
    +{4,abcd}

    Command 9 performs a pattern matching operation on Descriptor, binding a new value to L.

    10> L.
    -4

    Command 10 prints the current value of L.

    11> {P, Q, R} = Descriptor.
    +4

    Command 10 prints the current value of L.

    11> {P, Q, R} = Descriptor.
     ** exception error: no match of right hand side value {4,abcd}

    Command 11 tries to match {P, Q, R} against Descriptor, which is {4, abc}. The match fails and none of the new variables become bound. The printout starting with "** exception error:" is not the value of the expression (the @@ -148,74 +148,74 @@ other variables (L, Str, and so on) are unchanged.

    12> P.
     * 1:1: variable 'P' is unbound
     13> Descriptor.
    -{4,abcd}

    Commands 12 and 13 show that P is unbound because the previous command failed, -and that Descriptor has not changed.

    14>{P, Q} = Descriptor.
    -{4,abcd}
    +{4,abcd}

    Commands 12 and 13 show that P is unbound because the previous command failed, +and that Descriptor has not changed.

    14>{P, Q} = Descriptor.
    +{4,abcd}
     15> P.
    -4

    Commands 14 and 15 show a correct match where P and Q are bound.

    16> f().
    -ok

    Command 16 clears all bindings.

    The next few commands assume that test1:demo(X) is defined as follows:

    demo(X) ->
    -    put(aa, worked),
    +4

    Commands 14 and 15 show a correct match where P and Q are bound.

    16> f().
    +ok

    Command 16 clears all bindings.

    The next few commands assume that test1:demo(X) is defined as follows:

    demo(X) ->
    +    put(aa, worked),
         X = 1,
    -    X + 10.
    17> put(aa, hello).
    +    X + 10.
    17> put(aa, hello).
     undefined
    -18> get(aa).
    +18> get(aa).
     hello

    Commands 17 and 18 set and inspect the value of item aa in the process -dictionary.

    19> Y = test1:demo(1).
    +dictionary.

    19> Y = test1:demo(1).
     11

    Command 19 evaluates test1:demo(1). The evaluation succeeds and the changes made in the process dictionary become visible to the shell. The new value of -dictionary item aa can be seen in command 20.

    20> get().
    -[{aa,worked}]
    -21> put(aa, hello).
    +dictionary item aa can be seen in command 20.

    20> get().
    +[{aa,worked}]
    +21> put(aa, hello).
     worked
    -22> Z = test1:demo(2).
    +22> Z = test1:demo(2).
     ** exception error: no match of right hand side value 1
          in function  test1:demo/1

    Commands 21 and 22 change the value of dictionary item aa to hello and call test1:demo(2). Evaluation fails and the changes made to the dictionary in test1:demo(2), before the error occurred, are discarded.

    23> Z.
     * 1:1: variable 'Z' is unbound
    -24> get(aa).
    +24> get(aa).
     hello

    Commands 23 and 24 show that Z was not bound and that dictionary item aa has -retained its original value.

    25> erase(), put(aa, hello).
    +retained its original value.

    25> erase(), put(aa, hello).
     undefined
    -26> spawn(test1, demo, [1]).
    +26> spawn(test1, demo, [1]).
     <0.57.0>
    -27> get(aa).
    +27> get(aa).
     hello

    Commands 25, 26, and 27 show the effect of evaluating test1:demo(1) in the background. In this case, the expression is evaluated in a newly spawned process. Any changes made in the process dictionary are local to the newly -spawned process and therefore not visible to the shell.

    28> io:format("hello hello\n").
    +spawned process and therefore not visible to the shell.

    28> io:format("hello hello\n").
     hello hello
     ok
    -29> e(28).
    +29> e(28).
     hello hello
     ok
    -30> v(28).
    +30> v(28).
     ok

    Commands 28, 29 and 30 use the history facilities of the shell. Command 29 re-evaluates command 28. Command 30 uses the value (result) of command 28. In the cases of a pure function (a function with no side effects), the result is the same. For a function with side effects, the result can be different.

    The next few commands show some record manipulation. It is assumed that ex.erl -defines a record as follows:

    -record(rec, {a, b = val()}).

    val() ->
        3.

    31> c(ex).
    -{ok,ex}
    -32> rr(ex).
    -[rec]

    Commands 31 and 32 compile file ex.erl and read the record definitions in +defines a record as follows:

    -record(rec, {a, b = val()}).

    val() ->
        3.

    31> c(ex).
    +{ok,ex}
    +32> rr(ex).
    +[rec]

    Commands 31 and 32 compile file ex.erl and read the record definitions in ex.beam. If the compiler did not output any record definitions on the BEAM -file, rr(ex) tries to read record definitions from the source file instead.

    33> rl(rec).
    --record(rec,{a,b = val()}).
    -ok

    Command 33 prints the definition of the record named rec.

    34> #rec{}.
    +file, rr(ex) tries to read record definitions from the source file instead.

    33> rl(rec).
    +-record(rec,{a,b = val()}).
    +ok

    Command 33 prints the definition of the record named rec.

    34> #rec{}.
     ** exception error: undefined shell command val/0

    Command 34 tries to create a rec record, but fails as function val/0 is -undefined.

    35> #rec{b = 3}.
    -#rec{a = undefined,b = 3}

    Command 35 shows the workaround: explicitly assign values to record fields that -cannot otherwise be initialized.

    36> rp(v(-1)).
    -#rec{a = undefined,b = 3}
    +undefined.

    35> #rec{b = 3}.
    +#rec{a = undefined,b = 3}

    Command 35 shows the workaround: explicitly assign values to record fields that +cannot otherwise be initialized.

    36> rp(v(-1)).
    +#rec{a = undefined,b = 3}
     ok

    Command 36 prints the newly created record using record definitions maintained -by the shell.

    37> rd(rec, {f = orddict:new()}).
    +by the shell.

    37> rd(rec, {f = orddict:new()}).
     rec

    Command 37 defines a record directly in the shell. The definition replaces the -one read from file ex.beam.

    38> #rec{}.
    -#rec{f = []}
    -ok

    Command 38 creates a record using the new definition, and prints the result.

    39> rd(rec, {c}), A.
    +one read from file ex.beam.

    38> #rec{}.
    +#rec{f = []}
    +ok

    Command 38 creates a record using the new definition, and prints the result.

    39> rd(rec, {c}), A.
     * 1:15: variable 'A' is unbound
    -40> #rec{}.
    -#rec{c = undefined}
    +40> #rec{}.
    +#rec{c = undefined}
     ok

    Command 39 and 40 show that record definitions are updated as side effects. The evaluation of the command fails, but the definition of rec has been carried out.

    For the next command, it is assumed that test1:loop(N) is defined as follows:

    loop(N) ->
        io:format("Hello Number: ~w~n", [N]),
        loop(N+1).

    41> test1:loop(0).
    @@ -241,31 +241,31 @@
     JCL mode the user can start and stop jobs.

    In this particular case, command i ("interrupt") terminates the looping program, and command c connects to the shell again. As the process was running in the background before we killed it, more printouts occur before message -"** exception exit: killed" is shown.

    42> E = ets:new(t, []).
    -#Ref<0.1662103692.2407923716.214192>

    Command 42 creates an ETS table.

    43> ets:insert({d,1,2}).
    +"** exception exit: killed" is shown.

    42> E = ets:new(t, []).
    +#Ref<0.1662103692.2407923716.214192>

    Command 42 creates an ETS table.

    43> ets:insert({d,1,2}).
     ** exception error: undefined function ets:insert/1

    Command 43 tries to insert a tuple into the ETS table, but the first argument -(the table) is missing. The exception kills the evaluator process.

    44> ets:insert(E, {d,1,2}).
    +(the table) is missing. The exception kills the evaluator process.

    44> ets:insert(E, {d,1,2}).
     ** exception error: argument is of wrong type
          in function  ets:insert/2
             called as ets:insert(16,{d,1,2})

    Command 44 corrects the mistake, but the ETS table has been destroyed as it was -owned by the killed evaluator process.

    45> f(E).
    +owned by the killed evaluator process.

    45> f(E).
     ok
    -46> catch_exception(true).
    +46> catch_exception(true).
     false

    Command 46 sets the exception handling of the evaluator process to true. The exception handling can also be set when starting Erlang by -erl -stdlib shell_catch_exception true.

    47> E = ets:new(t, []).
    +erl -stdlib shell_catch_exception true.

    47> E = ets:new(t, []).
     #Ref<0.1662103692.2407923716.214197>
    -48> ets:insert({d,1,2}).
    +48> ets:insert({d,1,2}).
     * exception error: undefined function ets:insert/1

    Command 48 makes the same mistake as in command 43, but this time the evaluator process lives on. The single star at the beginning of the printout signals that -the exception has been caught.

    49> ets:insert(E, {d,1,2}).
    -true

    Command 49 successfully inserts the tuple into the ETS table.

    50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
    +the exception has been caught.

    49> ets:insert(E, {d,1,2}).
    +true

    Command 49 successfully inserts the tuple into the ETS table.

    50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/slave.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/slave.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/slave.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -258,7 +258,7 @@
     at a master node. A pseudo server is an intermediary that only has the same
     registered name as the real server.

    For example, if you have started a slave node N and want to execute pxw graphics code on this node, you can start server pxw_server as a pseudo server -at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
    +at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
    @@ -412,9 +412,9 @@ passed to the new node and can be used for a variety of purposes; see erl(1).

    As an example, suppose that you want to start a slave node at host H with node name Name@H and want the slave node to have the following properties:

    • Directory Dir is to be added to the code path.
    • The Mnesia directory is to be set to M.
    • The Unix DISPLAY environment variable is to be set to the display of the -master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
    +master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
     Arg = "-mnesia_dir " ++ M ++ " -pa " ++ Dir ++ E,
    -slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, +slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, otherwise {error, Reason}, where Reason can be one of:

    • timeout - The master node failed to get in contact with the slave node. This can occur in a number of circumstances:

      • Erlang/OTP is not installed on the remote host.
      • The file system on the other host has a different structure to the the master.
      • The Erlang nodes have different cookies.
    • no_rsh - No remote shell program was found on the computer. Note that /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/sofs.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -156,16 +156,16 @@ selecting, duplicating, or rearranging parts of the elements.

    • Specifying a SetFun as an integer I is equivalent to specifying {external, fun(X) -> element(I, X) end}, but is to be preferred, as it makes it possible to handle this case even more efficiently.

    Examples of valid SetFuns:

    fun sofs:union/1
    -fun(S) -> sofs:partition(1, S) end
    -fun(S) -> sofs:from_term(sofs:no_elements(S)) end
    -{external, fun(A) -> A end}
    -{external, fun({A,_,C}) -> {C,A} end}
    -{external, fun({_,{_,C}}) -> C end}
    -{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
    +fun(S) -> sofs:partition(1, S) end
    +fun(S) -> sofs:from_term(sofs:no_elements(S)) end
    +{external, fun(A) -> A end}
    +{external, fun({A,_,C}) -> {C,A} end}
    +{external, fun({_,{_,C}}) -> C end}
    +{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
     2

    Examples of invalid SetFuns:

    fun sofs:no_elements/1
    -{external, fun(A) -> 2 * A end}
    -{external, fun({A,B,C}) -> A + B + C end}
    -{external, fun lists:sum/1}

    The order in which a SetFun is applied to the elements of an unordered set is +{external, fun(A) -> 2 * A end} +{external, fun({A,B,C}) -> A + B + C end} +{external, fun lists:sum/1}

    The order in which a SetFun is applied to the elements of an unordered set is not specified, and can change in future versions of this module.

    The execution time of the functions of this module is dominated by the time it takes to sort lists. When no sorting is needed, the execution time is in the worst case proportional to the sum of the sizes of the input arguments and the @@ -1655,9 +1655,9 @@

    Creates a function.

    a_function(F, T) is equivalent to -from_term(F, T) if the result is a function.

    Examples

    1> sofs:is_a_function(sofs:a_function([{1,a},{2,b},{3,c}])).
    +from_term(F, T) if the result is a function.

    Examples

    1> sofs:is_a_function(sofs:a_function([{1,a},{2,b},{3,c}])).
     true
    -2> sofs:a_function([{1,a},{1,b}]).
    +2> sofs:a_function([{1,a},{1,b}]).
     ** exception error: bad_function
          in function  sofs:a_function/1
    @@ -1692,10 +1692,10 @@ belongs to SetOfSets and E belongs to Set.

    If SetOfSets is a partition of a set X and R is the equivalence relation in X induced by SetOfSets, then the returned relation is the canonical map from X onto the equivalence classes with -respect to R.

    Examples

    1> Ss = sofs:from_term([[a,b],[b,c]]).
    -2> CR = sofs:canonical_relation(Ss).
    -3> sofs:to_external(CR).
    -[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    +respect to R.

    Examples

    1> Ss = sofs:from_term([[a,b],[b,c]]).
    +2> CR = sofs:canonical_relation(Ss).
    +3> sofs:to_external(CR).
    +[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
    @@ -1725,12 +1725,12 @@

    Returns the composite of the functions Function1 and -Function2.

    Examples

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]).
    -2> F2 = sofs:a_function([{1,x},{2,y},{3,z}]).
    -3> F = sofs:composite(F1, F2).
    -4> sofs:to_external(F).
    -[{a,x},{b,y},{c,y}]
    -5> sofs:composite(F2, F1).
    +Function2.

    Examples

    1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]).
    +2> F2 = sofs:a_function([{1,x},{2,y},{3,z}]).
    +3> F = sofs:composite(F1, F2).
    +4> sofs:to_external(F).
    +[{a,x},{b,y},{c,y}]
    +5> sofs:composite(F2, F1).
     ** exception error: bad_function
          in function  sofs:composite/2
    @@ -1762,11 +1762,11 @@

    Creates the function that maps each element of set Set -onto AnySet.

    Examples

    1> S = sofs:set([a,b]).
    -2> E = sofs:from_term(1).
    -3> R = sofs:constant_function(S, E).
    -4> sofs:to_external(R).
    -[{a,1},{b,1}]
    +onto AnySet.

    Examples

    1> S = sofs:set([a,b]).
    +2> E = sofs:from_term(1).
    +3> R = sofs:constant_function(S, E).
    +4> sofs:to_external(R).
    +[{a,1},{b,1}]
    @@ -1795,10 +1795,10 @@

    Returns the converse of the binary relation BinRel1.

    See inverse/1 for a similar function that applies only to invertible -functions.

    Examples

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]).
    -2> R2 = sofs:converse(R1).
    -3> sofs:to_external(R2).
    -[{a,1},{a,3},{b,2}]
    +functions.

    Examples

    1> R1 = sofs:relation([{1,a},{2,b},{3,a}]).
    +2> R2 = sofs:converse(R1).
    +3> sofs:to_external(R2).
    +[{a,1},{a,3},{b,2}]
    @@ -1826,12 +1826,12 @@ -

    Returns the difference of the sets Set1 and Set2.

    Examples

    1> S0 = sofs:set([a,b,c,d]).
    -2> S1 = sofs:set([c,d,e,f]).
    -3> sofs:to_external(sofs:difference(S0, S1)).
    -[a,b]
    -4> sofs:to_external(sofs:difference(S1, S0)).
    -[e,f]
    +

    Returns the difference of the sets Set1 and Set2.

    Examples

    1> S0 = sofs:set([a,b,c,d]).
    +2> S1 = sofs:set([c,d,e,f]).
    +3> sofs:to_external(sofs:difference(S0, S1)).
    +[a,b]
    +4> sofs:to_external(sofs:difference(S1, S0)).
    +[e,f]
    @@ -1893,15 +1893,15 @@ a. It is assumed that Type is a valid type of the external set of the family.

    If G is a directed graph, it holds that the vertices and edges of G are the same as the vertices and edges of -family_to_digraph(digraph_to_family(G)).

    Examples

    1> G = digraph:new().
    -2> digraph:add_vertex(G, 1).
    -3> digraph:add_vertex(G, a).
    -4> digraph:add_vertex(G, b).
    -5> digraph:add_edge(G, 1, a).
    -6> digraph:add_edge(G, 1, b).
    -7> F = sofs:digraph_to_family(G).
    -8> sofs:to_external(F).
    -[{1,[a,b]},{a,[]},{b,[]}]
    +family_to_digraph(digraph_to_family(G)).

    Examples

    1> G = digraph:new().
    +2> digraph:add_vertex(G, 1).
    +3> digraph:add_vertex(G, a).
    +4> digraph:add_vertex(G, b).
    +5> digraph:add_edge(G, 1, a).
    +6> digraph:add_edge(G, 1, b).
    +7> F = sofs:digraph_to_family(G).
    +8> sofs:to_external(F).
    +[{1,[a,b]},{a,[]},{b,[]}]
    @@ -1929,10 +1929,10 @@ -

    Returns the domain of the binary relation BinRel.

    Examples

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]).
    -2> S = sofs:domain(R).
    -3> sofs:to_external(S).
    -[1,2]
    +

    Returns the domain of the binary relation BinRel.

    Examples

    1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]).
    +2> S = sofs:domain(R).
    +3> sofs:to_external(S).
    +[1,2]
    @@ -1962,11 +1962,11 @@

    Returns the difference between the binary relation BinRel1 and the -restriction of BinRel1 to Set.

    Examples

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]).
    -2> S = sofs:set([2,4,6]).
    -3> R2 = sofs:drestriction(R1, S).
    -4> sofs:to_external(R2).
    -[{1,a},{3,c}]

    drestriction(R, S) is equivalent to +restriction of BinRel1 to Set.

    Examples

    1> R1 = sofs:relation([{1,a},{2,b},{3,c}]).
    +2> S = sofs:set([2,4,6]).
    +3> R2 = sofs:drestriction(R1, S).
    +4> sofs:to_external(R2).
    +[{1,a},{3,c}]

    drestriction(R, S) is equivalent to difference(R, restriction(R, S)).

    @@ -1997,12 +1997,12 @@

    Returns a subset of Set1 containing those elements that do not give an element -in Set2 as the result of applying SetFun.

    Examples

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end}.
    -2> R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]).
    -3> R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]).
    -4> R3 = sofs:drestriction(SetFun, R1, R2).
    -5> sofs:to_external(R3).
    -[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to +in Set2 as the result of applying SetFun.

    Examples

    1> SetFun = {external, fun({_A,B,C}) -> {B,C} end}.
    +2> R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]).
    +3> R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]).
    +4> R3 = sofs:drestriction(SetFun, R1, R2).
    +5> sofs:to_external(R3).
    +[{a,aa,1}]

    drestriction(F, S1, S2) is equivalent to difference(S1, restriction(F, S1, S2)).

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -42,13 +42,13 @@ prompt function takes the main prompt as its only parameter.

  • shell_saved_results = integer() >= 0 - Can be used to determine how many results are saved by the Erlang shell.

  • shell_session_slogan = string() | fun() -> string()) - The slogan printed when starting an Erlang shell. Example:

    $ erl -stdlib shell_session_slogan '"Test slogan"'
    -Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
    +Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Test slogan
     1>
  • shell_slogan = string() | fun(() -> string()) - The slogan printed when starting the Erlang shell subsystem. Example:

    $ erl -stdlib shell_slogan '"Test slogan"'
     Test slogan
    -Eshell V13.0.2  (abort with ^G)
    +Eshell V13.0.2  (abort with ^G)
     1>

    The default is the return value of erlang:system_info(system_version).

  • shell_strings = boolean() - Can be used to determine how the Erlang shell outputs lists of integers.

  • shell_hints = boolean() - Can be used to enable/disable /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/string.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/string.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/string.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -43,14 +43,14 @@ expect UTF-8 binaries but not all functions verify that all binaries are encoded correctly.

    Unless otherwise specified the return value type is the same as the input type. That is, binary input returns binary output, list input returns a list output, -and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
    +and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
     "sarah"
    -2> string:trim(<<"  sarah  ">>).
    -<<"sarah">>
    -3> string:lexemes("foo bar", " ").
    -["foo","bar"]
    -4> string:lexemes(<<"foo bar">>, " ").
    -[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 +2> string:trim(<<" sarah ">>). +<<"sarah">> +3> string:lexemes("foo bar", " "). +["foo","bar"] +4> string:lexemes(<<"foo bar">>, " "). +[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 and operate on grapheme clusters. The old functions that only work on Latin-1 lists as input are still available but should not be used, they will be @@ -944,7 +944,7 @@

    Converts String to a case-agnostic comparable string. Function casefold/1 is preferred over lowercase/1 -when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
    +when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
     "ω and ss sharp s"
    @@ -976,9 +976,9 @@

    Returns a string where any trailing \n or \r\n have been removed from -String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
    -<<"\nHello">>
    -183> string:chomp("\nHello\r\r\n").
    +String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
    +<<"\nHello">>
    +183> string:chomp("\nHello\r\r\n").
     "\nHello\r"
    @@ -1079,11 +1079,11 @@ nfc, nfd, nfkc, and -nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
    +nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
     true
    -2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
    +2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
     false
    -3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
    +3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
     true
    @@ -1149,13 +1149,13 @@

    Removes anything before SearchPattern in String and returns the remainder of the string or nomatch if SearchPattern is not found. Dir, which can be leading or trailing, indicates from which direction characters are to be -searched.

    Example:

    1> string:find("ab..cd..ef", ".").
    +searched.

    Example:

    1> string:find("ab..cd..ef", ".").
     "..cd..ef"
    -2> string:find(<<"ab..cd..ef">>, "..", trailing).
    -<<"..ef">>
    -3> string:find(<<"ab..cd..ef">>, "x", leading).
    +2> string:find(<<"ab..cd..ef">>, "..", trailing).
    +<<"..ef">>
    +3> string:find(<<"ab..cd..ef">>, "x", leading).
     nomatch
    -4> string:find("ab..cd..ef", "x", trailing).
    +4> string:find("ab..cd..ef", "x", trailing).
     nomatch
    @@ -1186,9 +1186,9 @@ -

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
    +

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
     false
    -2> string:is_empty(["",<<>>]).
    +2> string:is_empty(["",<<>>]).
     true
    @@ -1226,13 +1226,13 @@

    Returns a float between +0.0 and 1.0 representing the Jaro similarity between the given strings. Strings with a higher similarity will score closer -to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
    +to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
     1.0
    -2> string:jaro_similarity("foo", "bar").
    +2> string:jaro_similarity("foo", "bar").
     +0.0
    -3> string:jaro_similarity("michelle", "michael").
    +3> string:jaro_similarity("michelle", "michael").
     0.8690476190476191
    -4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
    +4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
     0.5317460317460317

    The Jaro distance between two strings can be calculated with JaroDistance = 1.0 - JaroSimilarity.

    @@ -1264,9 +1264,9 @@ -

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
    +

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
     3
    -2> string:length(<<195,159,226,134,145,101,204,138>>).
    +2> string:length(<<195,159,226,134,145,101,204,138>>).
     3
    @@ -1301,10 +1301,10 @@

    Returns a list of lexemes in String, separated by the grapheme clusters in SeparatorList.

    Notice that, as shown in this example, two or more adjacent separator graphemes clusters in String are treated as one. That is, there are no empty strings in -the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    -["abc","de̊f","ghi","jkl","foo"]
    -2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    -[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    +the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    +["abc","de̊f","ghi","jkl","foo"]
    +2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    +[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    @@ -1335,7 +1335,7 @@

    Converts String to lowercase.

    Notice that function casefold/1 should be used when converting a string to be -tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
    +tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
     "michał"
    @@ -1369,8 +1369,8 @@

    Returns the first codepoint in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple if the -next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    -[101|<<"̊fg"/utf8>>]
    +next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    +[101|<<"̊fg"/utf8>>]
    @@ -1404,8 +1404,8 @@

    Returns the first grapheme cluster in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple -if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    -["e̊"|<<"fg">>]
    +if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    +["e̊"|<<"fg">>]
    @@ -1440,7 +1440,7 @@

    Returns lexeme number N in String, where lexemes are separated by the -grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
    +grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
     "ghi"
    @@ -1538,11 +1538,11 @@

    Pads String to Length with grapheme cluster Char. Dir, which can be -leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    -[<<72,101,204,138,108,108,195,182>>,32,32,32]
    -2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
    +leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    +[<<72,101,204,138,108,108,195,182>>,32,32,32]
    +2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
     '   He̊llö'
    -3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
    +3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
     ' He̊llö  '
    @@ -1574,9 +1574,9 @@

    If Prefix is the prefix of String, removes it and returns the remainder of -String, otherwise returns nomatch.

    Example:

    1> string:prefix(<<"prefix of string">>, "pre").
    -<<"fix of string">>
    -2> string:prefix("pre", "prefix").
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/supervisor.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/supervisor.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/supervisor.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -40,11 +40,11 @@
     left to right according to this list. When the supervisor is going to terminate,
     it first terminates its child processes in reversed start order, from right to
     left.

    Supervisor flags

    The supervisor properties are defined by the supervisor flags. The type -definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    -                intensity => non_neg_integer(),   % optional
    -                period => pos_integer(),          % optional
    -                hibernate_after => timeout(),     % optional, available since OTP 28.0
    -                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with +definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    +                intensity => non_neg_integer(),   % optional
    +                period => pos_integer(),          % optional
    +                hibernate_after => timeout(),     % optional, available since OTP 28.0
    +                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with the strategy key in the above map:

    • one_for_one - If one child process terminates and is to be restarted, only that child process is affected. This is the default restart strategy.

    • one_for_all - If one child process terminates and is to be restarted, all other child processes are terminated and then all child processes are @@ -90,13 +90,13 @@ this feature will also compile and run with older OTP versions.

      However, such applications, when compiled with an OTP version that predates the appearance of the automatic shutdown feature, will leak processes because the automatic shutdowns they rely on will not happen.

      It is up to implementors to take proper precautions if they expect that their -applications may be compiled with older OTP versions.

      Child specification

      The type definition of a child specification is as follows:

      child_spec() = #{id => child_id(),             % mandatory
      -                 start => mfargs(),            % mandatory
      -                 restart => restart(),         % optional
      -                 significant => significant(), % optional
      -                 shutdown => shutdown(),       % optional
      -                 type => worker(),             % optional
      -                 modules => modules()}         % optional

      The old tuple format is kept for backwards compatibility, see child_spec/0, +applications may be compiled with older OTP versions.

      Child specification

      The type definition of a child specification is as follows:

      child_spec() = #{id => child_id(),             % mandatory
      +                 start => mfargs(),            % mandatory
      +                 restart => restart(),         % optional
      +                 significant => significant(), % optional
      +                 shutdown => shutdown(),       % optional
      +                 type => worker(),             % optional
      +                 modules => modules()}         % optional

      The old tuple format is kept for backwards compatibility, see child_spec/0, but the map is preferred.

      • id is used to identify the child specification internally by the supervisor.

        The id key is mandatory.

        Notice that this identifier on occasion has been called "name". As far as possible, the terms "identifier" or "id" are now used but to keep backward compatibility, some occurences of "name" can still be found, for example in /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/terminal_interface.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/terminal_interface.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/terminal_interface.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -33,18 +33,18 @@ ║ │ │ ║ ║ │ │ ║ ╚═══════╧═══════╧═══════╝

    We will use the alternate screen buffer for our game so first we need to set that up:

    #!/usr/bin/env escript
    -main(_Args) ->
    +main(_Args) ->
         
    -    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    -    io:put_chars("\e[?25l"), %% Hide the cursor
    -    draw_board(),
    -    timer:sleep(5000),
    -    io:put_chars("\e[?25h"), %% Show the cursor
    -    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    -    ok.

    We then use the box drawing parts of Unicode to draw our board:

    draw_board() ->
    -    io:put_chars("\e[5;0H"), %% Move cursor to top left
    -    io:put_chars(
    -      ["     ╔═══════╤═══════╤═══════╗\r\n",
    +    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    +    io:put_chars("\e[?25l"), %% Hide the cursor
    +    draw_board(),
    +    timer:sleep(5000),
    +    io:put_chars("\e[?25h"), %% Show the cursor
    +    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    +    ok.

    We then use the box drawing parts of Unicode to draw our board:

    draw_board() ->
    +    io:put_chars("\e[5;0H"), %% Move cursor to top left
    +    io:put_chars(
    +      ["     ╔═══════╤═══════╤═══════╗\r\n",
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║     Place an X by pressing Enter\r\n",
            "     ║       │       │       ║\r\n",
    @@ -56,51 +56,51 @@
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║\r\n",
    -       "     ╚═══════╧═══════╧═══════╝\r\n"]),
    +       "     ╚═══════╧═══════╧═══════╝\r\n"]),
         ok.

    Let us add some interactivity to our game! To do that we need to change the shell from running in cooked to raw mode. This is done by calling shell:start_interactive({noshell, raw}). We can then use io:get_chars/2 to read key strokes from the user. The key strokes will be returned as ANSI escape codes, -so we will have need to handle the codes for up, down, left, right and enter.

    It could look something like this:

    main(_Args) ->
    -    ok = shell:start_interactive({noshell, raw}),
    +so we will have need to handle the codes for up, down, left, right and enter.

    It could look something like this:

    main(_Args) ->
    +    ok = shell:start_interactive({noshell, raw}),
         
    -    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    -    io:put_chars("\e[?25l"), %% Hide the cursor
    -    draw_board(),
    -    loop(0),
    -    io:put_chars("\e[?25h"), %% Show the cursor
    -    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    +    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    +    io:put_chars("\e[?25l"), %% Hide the cursor
    +    draw_board(),
    +    loop(0),
    +    io:put_chars("\e[?25h"), %% Show the cursor
    +    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
         ok.
     
    -loop(Pos) ->
    -    io:put_chars(draw_selection(Pos)),
    +loop(Pos) ->
    +    io:put_chars(draw_selection(Pos)),
         %% Read at most 1024 characters from stdin.
    -    Chars = io:get_chars("", 1024),
    -    case handle_input(Chars, Pos) of
    +    Chars = io:get_chars("", 1024),
    +    case handle_input(Chars, Pos) of
             stop -> stop;
             NewPos ->
    -            io:put_chars(clear_selection(Pos)),
    -            loop(NewPos)
    +            io:put_chars(clear_selection(Pos)),
    +            loop(NewPos)
         end.
     
    -handle_input("\e[A" ++ Rest, Pos) ->
    +handle_input("\e[A" ++ Rest, Pos) ->
         %% Up key
    -    handle_input(Rest, max(0, Pos - 3));
    -handle_input("\e[B" ++ Rest, Pos) ->
    +    handle_input(Rest, max(0, Pos - 3));
    +handle_input("\e[B" ++ Rest, Pos) ->
         %% Down key
    -    handle_input(Rest, min(8, Pos + 3));
    -handle_input("\e[C" ++ Rest, Pos) ->
    +    handle_input(Rest, min(8, Pos + 3));
    +handle_input("\e[C" ++ Rest, Pos) ->
         %% right key
    -    handle_input(Rest, min(8, Pos + 1));
    -handle_input("\e[D" ++ Rest, Pos) ->
    +    handle_input(Rest, min(8, Pos + 1));
    +handle_input("\e[D" ++ Rest, Pos) ->
         %% left key
    -    handle_input(Rest, max(0, Pos - 1));
    -handle_input("q" ++ _, _State) ->
    +    handle_input(Rest, max(0, Pos - 1));
    +handle_input("q" ++ _, _State) ->
         stop;
    -handle_input([_ | T], State) ->
    -    handle_input(T, State);
    -handle_input([], State) ->
    +handle_input([_ | T], State) ->
    +    handle_input(T, State);
    +handle_input([], State) ->
         State.

    Note that when using io:get_chars/2 with the shell set in {noshell, raw} mode it will return as soon as any data is available. The number of characters is the maximum number that will be returned. We use 1024 here to make sure that @@ -110,24 +110,24 @@ %% \b = Move cursor left %% \e[C = Move cursor right %% \n = Move cursor down -clear_selection(Pos) -> - [set_position(Pos), +clear_selection(Pos) -> + [set_position(Pos), " ","\b\b\b\b\b\b\b\n", " \e[C\e[C\e[C\e[C\e[C ", - "\b\b\b\b\b\b\b\n"," "]. + "\b\b\b\b\b\b\b\n"," "]. -draw_selection(Pos) -> - [set_position(Pos), +draw_selection(Pos) -> + [set_position(Pos), "┌─────┐","\b\b\b\b\b\b\b\n", "│\e[C\e[C\e[C\e[C\e[C│", - "\b\b\b\b\b\b\b\n","└─────┘"]. + "\b\b\b\b\b\b\b\n","└─────┘"]. %% Set the cursor position to be at the top %% left of the field of the given position -set_position(Pos) -> - Row = 6 + (Pos div 3) * 4, - Col = 7 + (Pos rem 3) * 8, - io_lib:format("\e[~p;~pH",[Row, Col]).

    Now we have a program where we can move the marker around the board. +set_position(Pos) -> + Row = 6 + (Pos div 3) * 4, + Col = 7 + (Pos rem 3) * 8, + io_lib:format("\e[~p;~pH",[Row, Col]).

    Now we have a program where we can move the marker around the board. To complete the game we need to add some state so that we know which squares are marked and whos turn it is. You can find the final solution in tic-tac-toe.es.

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/timer.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/timer.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/timer.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -34,15 +34,15 @@ the Timer Module section in the Efficiency Guide.

    For more information on timers in Erlang in general, see the Timers section of the Time and Time Correction in Erlang -ERTS User's guide.

    Examples

    Example 1

    The following example shows how to print "Hello World!" in 5 seconds:

    1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
    -{ok,TRef}
    +ERTS User's guide.

    Examples

    Example 1

    The following example shows how to print "Hello World!" in 5 seconds:

    1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
    +{ok,TRef}
     Hello World!

    Example 2

    The following example shows a process performing a certain action, and if this -action is not completed within a certain limit, the process is killed:

    Pid = spawn(mod, fun, [foo, bar]),
    +action is not completed within a certain limit, the process is killed:

    Pid = spawn(mod, fun, [foo, bar]),
     %% If pid is not finished in 10 seconds, kill him
    -{ok, R} = timer:kill_after(timer:seconds(10), Pid),
    +{ok, R} = timer:kill_after(timer:seconds(10), Pid),
     ...
     %% We change our mind...
    -timer:cancel(R),
    +timer:cancel(R),
     ...

    Notes

    A timer can always be removed by calling cancel/1.

    An interval timer, that is, a timer created by evaluating any of the functions apply_interval/2, apply_interval/3, apply_interval/4, apply_repeatedly/2, apply_repeatedly/3, apply_repeatedly/4, @@ -63,20 +63,20 @@ process which set the timer about its completion, by sending it a done message.

    Using self/0 inside the timed function, the code below does not work as intended. The task gets done, but the done message gets sent to the wrong -process and is lost.

    1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
    -{ok,TRef}
    +process and is lost.

    1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
    +{ok,TRef}
     2> receive done -> done after 5000 -> timeout end.
     %% ... 5s pass...
     timeout

    The code below calls self/0 in the process which sets the timer and assigns it to a variable, which is then used in the function to send the done message to, -and so works as intended.

    1> Target = self()
    +and so works as intended.

    1> Target = self()
     <0.82.0>
    -2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
    -{ok,TRef}
    +2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
    +{ok,TRef}
     3> receive done -> done after 5000 -> timeout end.
     %% ... 1s passes...
    -done

    Another option is to pass the message target as a parameter to the function.

    1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
    -{ok,TRef}
    +done

    Another option is to pass the message target as a parameter to the function.

    1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
    +{ok,TRef}
     2> receive done -> done after 5000 -> timeout end.
     %% ... 1s passes...
     done
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -201,20 +201,20 @@ iolists, where binaries and lists can be combined to represent a sequence of bytes. In the same way, the Unicode-aware modules often allow for combinations of binaries and lists, where the binaries have characters encoded in UTF-8 and -the lists contain such binaries or numbers representing Unicode code points:

    unicode_binary() = binary() with characters encoded in UTF-8 coding standard
    +the lists contain such binaries or numbers representing Unicode code points:

    unicode_binary() = binary() with characters encoded in UTF-8 coding standard
     
    -chardata() = charlist() | unicode_binary()
    +chardata() = charlist() | unicode_binary()
     
    -charlist() = maybe_improper_list(char() | unicode_binary() | charlist(),
    -  unicode_binary() | nil())

    The module unicode even supports similar mixes with binaries containing +charlist() = maybe_improper_list(char() | unicode_binary() | charlist(), + unicode_binary() | nil())

    The module unicode even supports similar mixes with binaries containing other encodings than UTF-8, but that is a special case to allow for conversions -to and from external data:

    external_unicode_binary() = binary() with characters coded in a user-specified
    -  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
    +to and from external data:

    external_unicode_binary() = binary() with characters coded in a user-specified
    +  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
     
    -external_chardata() = external_charlist() | external_unicode_binary()
    +external_chardata() = external_charlist() | external_unicode_binary()
     
    -external_charlist() = maybe_improper_list(char() | external_unicode_binary() |
    -  external_charlist(), external_unicode_binary() | nil())

    Basic Language Support

    As from Erlang/OTP R16, Erlang source files can be +external_charlist() = maybe_improper_list(char() | external_unicode_binary() | + external_charlist(), external_unicode_binary() | nil())

    Basic Language Support

    As from Erlang/OTP R16, Erlang source files can be written in UTF-8 or bytewise (latin1) encoding. For information about how to state the encoding of an Erlang source file, see the epp module. As from Erlang/OTP R16, strings and comments can be written using @@ -238,12 +238,12 @@ In the following example, the code point of a Cyrillic с is output:

    7> $с.
     1089

    Heuristic String Detection

    In certain output functions and in the output of return values in the shell, Erlang tries to detect string data in lists and binaries heuristically. -Typically you will see heuristic detection in a situation like this:

    1> [97,98,99].
    +Typically you will see heuristic detection in a situation like this:

    1> [97,98,99].
     "abc"
    -2> <<97,98,99>>.
    -<<"abc">>
    -3> <<195,165,195,164,195,182>>.
    -<<"åäö"/utf8>>

    Here the shell detects lists containing printable characters or binaries +2> <<97,98,99>>. +<<"abc">> +3> <<195,165,195,164,195,182>>. +<<"åäö"/utf8>>

    Here the shell detects lists containing printable characters or binaries containing printable characters in bytewise or UTF-8 encoding. But what is a printable character? One view is that anything the Unicode standard thinks is printable, is also printable according to the heuristic detection. The result is @@ -258,32 +258,32 @@ controls how heuristic string detection is done. More ranges are expected to be added in the future, enabling tailoring of the heuristics to the language and region relevant to the user.

    The following examples show the two startup options:

    $ erl +pc latin1
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> [1024].
    -[1024]
    -2> [1070,1085,1080,1082,1086,1076].
    -[1070,1085,1080,1082,1086,1076]
    -3> [229,228,246].
    +Eshell V5.10.1  (abort with ^G)
    +1> [1024].
    +[1024]
    +2> [1070,1085,1080,1082,1086,1076].
    +[1070,1085,1080,1082,1086,1076]
    +3> [229,228,246].
     "åäö"
    -4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
    -<<208,174,208,189,208,184,208,186,208,190,208,180>>
    -5> <<229/utf8,228/utf8,246/utf8>>.
    -<<"åäö"/utf8>>
    $ erl +pc unicode
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
    +<<208,174,208,189,208,184,208,186,208,190,208,180>>
    +5> <<229/utf8,228/utf8,246/utf8>>.
    +<<"åäö"/utf8>>
    $ erl +pc unicode
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> [1024].
    +Eshell V5.10.1  (abort with ^G)
    +1> [1024].
     "Ѐ"
    -2> [1070,1085,1080,1082,1086,1076].
    +2> [1070,1085,1080,1082,1086,1076].
     "Юникод"
    -3> [229,228,246].
    +3> [229,228,246].
     "åäö"
    -4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
    -<<"Юникод"/utf8>>
    -5> <<229/utf8,228/utf8,246/utf8>>.
    -<<"åäö"/utf8>>

    In the examples, you can see that the default Erlang shell interprets only +4> <<208,174,208,189,208,184,208,186,208,190,208,180>>. +<<"Юникод"/utf8>> +5> <<229/utf8,228/utf8,246/utf8>>. +<<"åäö"/utf8>>

    In the examples, you can see that the default Erlang shell interprets only characters from the ISO Latin1 range as printable and only detects lists or binaries with those "printable" characters as containing string data. The valid UTF-8 binary containing the Russian word "Юникод", is not printed as a string. @@ -291,17 +291,17 @@ outputs anything containing printable Unicode data (in binaries, either UTF-8 or bytewise encoded) as string data.

    These heuristics are also used by io:format/2, io_lib:format/2, and friends when modifier t is used with ~p or ~P:

    $ erl +pc latin1
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    -{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
    +Eshell V5.10.1  (abort with ^G)
    +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    +{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
     ok
    $ erl +pc unicode
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    -{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
    +Eshell V5.10.1  (abort with ^G)
    +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    +{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
     ok

    Notice that this only affects heuristic interpretation of lists and binaries on output. For example, the ~ts format sequence always outputs a valid list of characters, regardless of the +pc setting, as the programmer has explicitly @@ -318,19 +318,19 @@ capable of. There is no portable way for Erlang to ask the terminal about its UTF-8 capacity, we have to rely on the language and character type settings.

    To investigate what Erlang thinks about the terminal, the call io:getopts() can be used when the shell is started:

    $ LC_CTYPE=en_US.ISO-8859-1 erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,latin1}
    -2> q().
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,latin1}
    +2> q().
     ok
     $ LC_CTYPE=en_US.UTF-8 erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,unicode}
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,unicode}
     2>

    When (finally?) everything is in order with the locale settings, fonts. and the terminal emulator, you have probably found a way to input characters in the script you desire. For testing, the simplest way is to add some keyboard @@ -343,14 +343,14 @@ easily if you are not used to this. For example, entering commands using a Cyrillic character set is not easily done in the Erlang shell.

    Now you are set up for some Unicode input and output. The simplest thing to do is to enter a string in the shell:

    $ erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,unicode}
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,unicode}
     2> "Юникод".
     "Юникод"
    -3> io:format("~ts~n", [v(2)]).
    +3> io:format("~ts~n", [v(2)]).
     Юникод
     ok
     4>

    While strings can be input as Unicode characters, the language elements are @@ -377,10 +377,10 @@ charlist() represented by it.

    #!/usr/bin/env escript
     %%! -kernel standard_io_encoding latin1
     
    -main(_) ->
    -  {ok, Char} = file:read_line(standard_io),
    -  ok = file:write(standard_io, string:trim(Char)),
    -  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
    +main(_) ->
    +  {ok, Char} = file:read_line(standard_io),
    +  ok = file:write(standard_io, string:trim(Char)),
    +  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
       ok.
    $ escript test.es
     ξ
     ξ: [206,190]

    ξ would normally be represented as the integer 958, but since we are using @@ -580,13 +580,13 @@ example {encoding,utf8}).

  • Functions reading Erlang syntax from files recognize the coding: comment and can therefore handle Unicode data on input. When writing Erlang terms to a file, you are advised to insert such comments when applicable:

    $ erl +fna +pc unicode
    -Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
     
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/unicode.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/unicode.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/unicode.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -949,13 +949,13 @@
     the first part of a (so far) valid UTF character.

    If one UTF character is split over two consecutive binaries in the Data, the conversion succeeds. This means that a character can be decoded from a range of binaries as long as the whole range is specified as input without errors -occurring.

    Example:

    decode_data(Data) ->
    -   case unicode:characters_to_list(Data,unicode) of
    -      {incomplete,Encoded, Rest} ->
    -            More = get_some_more_data(),
    -            Encoded ++ decode_data([Rest, More]);
    -      {error,Encoded,Rest} ->
    -            handle_error(Encoded,Rest);
    +occurring.

    Example:

    decode_data(Data) ->
    +   case unicode:characters_to_list(Data,unicode) of
    +      {incomplete,Encoded, Rest} ->
    +            More = get_some_more_data(),
    +            Encoded ++ decode_data([Rest, More]);
    +      {error,Encoded,Rest} ->
    +            handle_error(Encoded,Rest);
           List ->
                 List
        end.

    However, bit strings that are not whole bytes are not allowed, so a UTF @@ -990,8 +990,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    -<<"abc..åäö"/utf8>>
    +of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    +<<"abc..åäö"/utf8>>
    @@ -1022,7 +1022,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    +of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
     "abc..åäö"
    @@ -1054,8 +1054,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfd_binary("abc..åäö").
    -<<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
    +of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfd_binary("abc..åäö").
    +<<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
    @@ -1086,8 +1086,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfd_list("abc..åäö").
    -[97,98,99,46,46,97,778,97,776,111,776]
    +of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfd_list("abc..åäö").
    +[97,98,99,46,46,97,778,97,776,111,776]
    @@ -1118,8 +1118,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    -<<"abc..åäö32"/utf8>>
    +of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    +<<"abc..åäö32"/utf8>>
    @@ -1150,7 +1150,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    +of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
     "abc..åäö32"
    @@ -1183,8 +1183,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
    -<<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
    +standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
    +<<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
    @@ -1216,8 +1216,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
    -[97,98,99,46,46,97,778,97,776,111,776,51,50]
    +standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
    +[97,98,99,46,46,97,778,97,776,111,776,51,50]
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -68,19 +68,19 @@ to explain this by an example.

    Let's say that we would like to create the following URI and send it over the network: http://cities/örebro?foo bar. This is not a valid URI as it contains characters that are not allowed in a URI such as "ö" and the space. We can -verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    -  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails +verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    +  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails at the last attempt when it encounters the colon character ":". Note, that the inital fault occurs when the parser attempts to interpret the character "ö" and after a failure back-tracks to the point where it has another possible parsing alternative.

    The proper way to solve this problem is to use uri_string:recompose/1 with a -uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    -  query => "foo bar"}).
    +uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    +  query => "foo bar"}).
       "http://cities/%C3%B6rebro?foo%20bar"

    The result is a valid URI where all the special characters are encoded as defined by the standard. Applying uri_string:parse/1 and -uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    -  #{host => "cities",path => "/örebro",query => "foo bar",
    -  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    Percent-encoding

    As you have seen in the previous chapter, a standard URI can only contain a +uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    +  #{host => "cities",path => "/örebro",query => "foo bar",
    +  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    Percent-encoding

    As you have seen in the previous chapter, a standard URI can only contain a strict subset of the US ASCII character set, moreover the allowed set of characters is not the same in the different URI components. Percent-encoding is a mechanism to represent a data octet in a component when that octet's @@ -97,27 +97,27 @@ question the library provides a utility function, uri_string:allowed_characters/0, that lists the allowed set of characters in each major URI component, and also in the -most important standard character sets.

        1> uri_string:allowed_characters().
    -    [{scheme,
    -     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    -    {userinfo,
    -     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {host,
    -     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {ipv4,".0123456789"},
    -    {ipv6,".0123456789:ABCDEFabcdef"},
    -    {regname,
    -     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {path,
    -     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {query,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {fragment,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {reserved,"!#$&'()*+,/:;=?@[]"},
    -    {unreserved,
    -     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be -percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
    +most important standard character sets.

        1> uri_string:allowed_characters().
    +    [{scheme,
    +     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    +    {userinfo,
    +     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {host,
    +     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {ipv4,".0123456789"},
    +    {ipv6,".0123456789:ABCDEFabcdef"},
    +    {regname,
    +     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {path,
    +     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {query,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {fragment,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {reserved,"!#$&'()*+,/:;=?@[]"},
    +    {unreserved,
    +     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be +percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
         "https://local%23host"

    Consuming a URI containing percent-encoded triplets can take many steps. The following example shows how to handle an input URI that is not normalized and contains multiple percent-encoded triplets. First, the input @@ -129,32 +129,32 @@ You can try to normalize the input with uri_string:normalize/1. The normalize operation decodes those percent-encoded triplets that correspond to a character in the unreserved set. Normalization is a safe, idempotent operation that -converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
    +converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
         "http://local%23host/%F6re%26bro%20"
    -    5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]).
    -    #{host => "local%23host",path => "/%F6re%26bro%20",
    -      scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this + 5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]). + #{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this point, when the URI is already parsed, it is safe to apply application specific decoding on the remaining character triplets. Erlang/OTP provides a function, uri_string:percent_decode/1 for raw percent decoding that you can use on the -host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
    +host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
         "local#host"
    -    7> uri_string:percent_decode("/%F6re%26bro%20").
    -    {error,invalid_utf8,<<"/öre&bro ">>}
    -    8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20",
    -    scheme => "http"}).
    -    {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character + 7> uri_string:percent_decode("/%F6re%26bro%20"). + {error,invalid_utf8,<<"/öre&bro ">>} + 8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}). + {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character with non-UTF-8 encoding. In order to be able to decode this, you have to make assumptions about the encoding used in these triplets. The most obvious choice is latin-1, so you can try uri_string:transcode/2, to transcode the path to -UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
    +UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
         "/%C3%B6re%26bro%20"
    -    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
    +    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
         "/öre&bro "

    It is important to emphasize that it is not safe to apply -uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
    +uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
         "http://local#host/öre&bro "
    -    12> uri_string:parse("http://local#host/öre&bro ").
    -    {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens + 12> uri_string:parse("http://local#host/öre&bro "). + {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens when converting a uri_map() into a uri_string(). Applying any percent-encoding directly on an input URI would not be safe just as in the case of /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/uri_string.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/uri_string.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/uri_string.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -479,11 +479,11 @@

    Composes a form-urlencoded QueryString based on a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
    +specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
     "foo+bar=1&city=%C3%B6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"örebro"/utf8>>}]).
    -<<"foo+bar=1&city=%C3%B6rebro">>
    +2>
    uri_string:compose_query([{<<"foo bar">>,<<"1">>}, +2> {<<"city">>,<<"örebro"/utf8>>}]). +<<"foo+bar=1&city=%C3%B6rebro">>
    @@ -526,12 +526,12 @@ ";" (U+003B) character.

    Bytes that are out of the range 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A, are percent-encoded (U+0025 PERCENT SIGN character (%) followed by uppercase ASCII hex digits representing the hexadecimal value of the -byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    -1> [{encoding, latin1}]).
    +byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    +1> [{encoding, latin1}]).
     "foo+bar=1&city=%F6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]).
    -<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>
    +2>
    uri_string:compose_query([{<<"foo bar">>,<<"1">>}, +2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]). +<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>
    @@ -567,11 +567,11 @@

    Dissects an urlencoded QueryString and returns a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    -[{"foo bar","1"},{"city","örebro"}]
    -2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    -[{<<"foo bar">>,<<"1">>},
    - {<<"city">>,<<230,157,177,228,186,172>>}]
    +specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    +[{"foo bar","1"},{"city","örebro"}]
    +2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    +[{<<"foo bar">>,<<"1">>},
    + {<<"city">>,<<230,157,177,228,186,172>>}]
    @@ -605,14 +605,14 @@

    Transforms an URI into a normalized form using Syntax-Based Normalization as defined by RFC 3986.

    This function implements case normalization, percent-encoding normalization, path segment normalization and scheme based normalization for HTTP(S) with basic -support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
    +support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
     "/a/g"
    -2> uri_string:normalize(<<"mid/content=5/../6">>).
    -<<"mid/6">>
    -3> uri_string:normalize("http://localhost:80").
    +2> uri_string:normalize(<<"mid/content=5/../6">>).
    +<<"mid/6">>
    +3> uri_string:normalize("http://localhost:80").
     "http://localhost/"
    -4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}).
    +4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}).
     "http://localhost-%C3%B6rebro/a/g"
    @@ -649,15 +649,15 @@

    Same as normalize/1 but with an additional Options parameter, that controls whether the normalized URI shall be returned as an -uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    -#{path => "/a/g"}
    -2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    -#{path => <<"mid/6">>}
    -3> uri_string:normalize("http://localhost:80", [return_map]).
    -#{scheme => "http",path => "/",host => "localhost"}
    -4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}, [return_map]).
    -#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    +uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    +#{path => "/a/g"}
    +2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    +#{path => <<"mid/6">>}
    +3> uri_string:normalize("http://localhost:80", [return_map]).
    +#{scheme => "http",path => "/",host => "localhost"}
    +4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}, [return_map]).
    +#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    @@ -689,14 +689,14 @@

    Parses an RFC 3986 compliant uri_string/0 into a uri_map/0, that holds the parsed components of the -URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    -#{fragment => "nose",host => "example.com",
    +URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => foo,userinfo => "user"}
    -2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>).
    -#{host => <<"example.com">>,path => <<"/over/there">>,
    -  port => 8042,query => <<"name=ferret">>,scheme => <<"foo">>,
    -  userinfo => <<"user">>}
    +
    scheme => foo,userinfo => "user"} +2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>). +#{host => <<"example.com">>,path => <<"/over/there">>, + port => 8042,query => <<"name=ferret">>,scheme => <<"foo">>, + userinfo => <<"user">>}
    @@ -736,16 +736,16 @@

    Decodes all percent-encoded triplets in the input that can be both a uri_string/0 and a uri_map/0.

    Note, that this function performs raw decoding and it shall be used on already parsed URI components. Applying this function directly on a standard URI can -effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    -1> scheme => "http"}).
    -#{host => "localhost-örebro",path => [],scheme => "http"}
    -2> uri_string:percent_decode(<<"%C3%B6rebro">>).
    -<<"örebro"/utf8>>

    Warning

    Using uri_string:percent_decode/1 directly on a URI is not safe. This +effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    +1> scheme => "http"}).
    +#{host => "localhost-örebro",path => [],scheme => "http"}
    +2> uri_string:percent_decode(<<"%C3%B6rebro">>).
    +<<"örebro"/utf8>>

    Warning

    Using uri_string:percent_decode/1 directly on a URI is not safe. This example shows, that after each consecutive application of the function the -resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
    -<<"http://local%2Fhost/path">>
    -4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
    -<<"http://local/host/path">>
    +resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
    +<<"http://local%2Fhost/path">>
    +4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
    +<<"http://local/host/path">>
    @@ -777,10 +777,10 @@

    Replaces characters out of unreserved set with their percent encoded equivalents.

    Unreserved characters defined in -RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
    +RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
     "SomeId%2F04"
    -2> uri_string:quote(<<"SomeId/04">>).
    -<<"SomeId%2F04">>

    Warning

    Function is not aware about any URI component context and should not be used +2> uri_string:quote(<<"SomeId/04">>). +<<"SomeId%2F04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -814,10 +814,10 @@

    Same as quote/1, but Safe allows user to provide a list of -characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
    +characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
     "SomeId/04"
    -2> uri_string:quote(<<"SomeId/04">>, "/").
    -<<"SomeId/04">>

    Warning

    Function is not aware about any URI component context and should not be used +2> uri_string:quote(<<"SomeId/04">>, "/"). +<<"SomeId/04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -851,13 +851,13 @@

    Creates an RFC 3986 compliant URIString (percent-encoded), based on the components of URIMap. If the -URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    -1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    -#{fragment => "nose",host => "example.com",
    +URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    +1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => "foo",userinfo => "user"}
    +  scheme => "foo",userinfo => "user"}
     
    -2> uri_string:recompose(URIMap).
    +2> uri_string:recompose(URIMap).
     "foo://example.com:8042/over/there?name=ferret#nose"
    @@ -894,13 +894,13 @@

    Convert a RefURI reference that might be relative to a given base URI into the parsed components of the reference's target, which can then be recomposed to -form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
    +form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/zip.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/zip.xhtml	2026-04-20 15:17:36.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/zip.xhtml	2042-05-23 04:35:58.000000000 +0000
    @@ -685,29 +685,29 @@
     archive. The iteration can be ended prematurely in a controlled manner by
     throwing an exception.

    Example:

    > Name = "dummy.zip".
     "dummy.zip"
    -> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    -{ok,{"dummy.zip",
    -     <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    -{ok,[{"bar",<<"BAR">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}},
    -     {"foo",<<"FOO">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}}]}
    -> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    -{ok,{"dummy.zip",
    -     <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
    -<<"FOO">>
    +>
    {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]). +{ok,{"dummy.zip", + <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0, + 0,0,3,0,0,...>>}} +> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}). +{ok,[{"bar",<<"BAR">>, + {file_info,3,regular,read_write, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + 54,1,0,0,0,0,0}}, + {"foo",<<"FOO">>, + {file_info,3,regular,read_write, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + 54,1,0,0,0,0,0}}]} +> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]). +{ok,{"dummy.zip", + <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0, + 0,0,3,0,0,...>>}} +> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}). +<<"FOO">>
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/zstd.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/zstd.xhtml 2026-04-20 15:17:36.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib.epub/OEBPS/zstd.xhtml 2042-05-23 04:35:58.000000000 +0000 @@ -25,25 +25,25 @@

    Zstandard compression interface.

    This module provides an API for the Zstandard library (www.zstd.net). It is used to compress and decompress data and offers the same compression ratio as zlib but at a lower CPU cost.

    Example:

    1> Data = ~"my data to be compressed".
    -2> Compressed = zstd:compress(Data).
    -3> zstd:decompress(Compressed).
    -[~"my data to be compressed"]

    If you are compressing or decompressing possibly large amounts of data, -it is also possible to do streamed compression/decompression.

    Example:

    1> Compress = fun F(Ctx, D) ->
    -                      case file:read(D, 5) of
    -                          {ok, Data} ->
    -                              {continue, C} = zstd:stream(Ctx, Data),
    -                              [C|F(Ctx, D)];
    +2> Compressed = zstd:compress(Data).
    +3> zstd:decompress(Compressed).
    +[~"my data to be compressed"]

    If you are compressing or decompressing possibly large amounts of data, +it is also possible to do streamed compression/decompression.

    Example:

    1> Compress = fun F(Ctx, D) ->
    +                      case file:read(D, 5) of
    +                          {ok, Data} ->
    +                              {continue, C} = zstd:stream(Ctx, Data),
    +                              [C|F(Ctx, D)];
                               eof ->
    -                              {done, C} = zstd:finish(Ctx, ""),
    +                              {done, C} = zstd:finish(Ctx, ""),
                                   C
                           end
                   end.
    -2> {ok, Ctx} = zstd:context(compress).
    -3> {ok, D} = file:open(File,[read,binary]).
    -4> Compressed = iolist_to_binary(Compress(Ctx, D)).
    -<<40,181,47,253,0,88,89,0,0,108,111,114,101,109,32,105,112,115,117,109>>
    -5> zstd:decompress(Compressed).
    -[~"lorem ipsum"]

    In all functions errors can be thrown, where Reason describes the error.

    Typical Reasons:

    • badarg - Bad argument.
    • zstd_error - An error generated by the Zstandard library.
    • not_on_controlling_process - The context was used by a process that +2> {ok, Ctx} = zstd:context(compress). +3> {ok, D} = file:open(File,[read,binary]). +4> Compressed = iolist_to_binary(Compress(Ctx, D)). +<<40,181,47,253,0,88,89,0,0,108,111,114,101,109,32,105,112,115,117,109>> +5> zstd:decompress(Compressed). +[~"lorem ipsum"]

    In all functions errors can be thrown, where Reason describes the error.

    Typical Reasons:

    • badarg - Bad argument.
    • zstd_error - An error generated by the Zstandard library.
    • not_on_controlling_process - The context was used by a process that did not create it.
    @@ -621,8 +621,8 @@ -

    Compress Data using the given compress_parameters/0 or the context/0.

    Example:

    1> zstd:compress("abc").
    -2> zstd:compress("abc", #{ compressionLevel => 20 }).
    +

    Compress Data using the given compress_parameters/0 or the context/0.

    Example:

    1> zstd:compress("abc").
    +2> zstd:compress("abc", #{ compressionLevel => 20 }).
    @@ -745,9 +745,9 @@ -

    Decompress Data using the given decompress_parameters/0 or the context/0.

    Example:

    1> Compressed = zstd:compress("abc").
    -2> zstd:decompress(Compressed).
    -[~"abc"]
    +

    Decompress Data using the given decompress_parameters/0 or the context/0.

    Example:

    1> Compressed = zstd:compress("abc").
    +2> zstd:decompress(Compressed).
    +[~"abc"]
    @@ -816,12 +816,12 @@ you can use get_dict_id/1 on the dictionary and compressed data, or just try to decompress as decompression will raise and exception if an incorrect dictionary is given.

    The compressionLevel set on a dictionary will override the compressionLevel -set in the context/0.

    Example:

    1> {ok, CDict} = zstd:dict(compress, Dict).
    -2> Data = lists:duplicate(100, 1).
    -[1, 1, 1 | _]
    -3> iolist_size(zstd:compress(Data)).
    +set in the context/0.

    Example:

    1> {ok, CDict} = zstd:dict(compress, Dict).
    +2> Data = lists:duplicate(100, 1).
    +[1, 1, 1 | _]
    +3> iolist_size(zstd:compress(Data)).
     17
    -4> iolist_size(zstd:compress(Data, #{ dictionary => CDict, dictIDFlag => false })).
    +4> iolist_size(zstd:compress(Data, #{ dictionary => CDict, dictIDFlag => false })).
     16

    As loading a dictionary can be a heavy operations, it is possible to create only a single dict/0 and provide it to multiple context/0.

    There is no API exposed in zstd to create a dictionary, instead use the zstd command line tool.

    @@ -855,11 +855,11 @@

    Finish compressing/decompressing data.

    This flushes all output buffers and resets the context/0 so -that it can be used for compressing/decompressing again.

    Example:

    1> {ok, DCtx} = zstd:context(decompress).
    -2> {continue, D1} = zstd:stream(DCtx, <<40,181,47,253,32>>).
    -3> {done, D2} = zstd:finish(DCtx, <<2,17,0,0,97,98>>).
    -4> iolist_to_binary([D1,D2]).
    -<<"ab">>
    +that it can be used for compressing/decompressing again.

    Example:

    1> {ok, DCtx} = zstd:context(decompress).
    +2> {continue, D1} = zstd:stream(DCtx, <<40,181,47,253,32>>).
    +3> {done, D2} = zstd:finish(DCtx, <<2,17,0,0,97,98>>).
    +4> iolist_to_binary([D1,D2]).
    +<<"ab">>
    @@ -889,10 +889,10 @@ -

    Get the dictionary ID of a dictionary or a frame.

    The dictionary ID 0 represents no dictionary.

    Example:

    1> {ok, CDict} = zstd:dict(compress, Dict).
    -2> zstd:get_dict_id(CDict).
    +

    Get the dictionary ID of a dictionary or a frame.

    The dictionary ID 0 represents no dictionary.

    Example:

    1> {ok, CDict} = zstd:dict(compress, Dict).
    +2> zstd:get_dict_id(CDict).
     1850243626
    -3> zstd:get_dict_id(zstd:compress("abc")).
    +3> zstd:get_dict_id(zstd:compress("abc")).
     0
    @@ -934,11 +934,11 @@

    Get header of a Zstandard compressed frame.

    A compressed Zstandard stream can consist of multiple frames. This function will read metadata from the first frame. This information -can be useful when debugging corrupted Zstandard streams.

    Example:

    1> Compressed = zstd:compress(~"abc").
    -2> zstd:get_frame_header(Compressed).
    -{ok,#{frameContentSize => 3,windowSize => 3,blockSizeMax => 3,
    +can be useful when debugging corrupted Zstandard streams.

    Example:

    1> Compressed = zstd:compress(~"abc").
    +2> zstd:get_frame_header(Compressed).
    +{ok,#{frameContentSize => 3,windowSize => 3,blockSizeMax => 3,
           frameType => 'ZSTD_frame',headerSize => 6,
    -      dictID => 0, checksumFlag => false}}
    +
    dictID => 0, checksumFlag => false}}
    @@ -972,13 +972,13 @@ which parameters are available and what each parameter does.

    Note that it is not possible to get the dictionary and pledgedSrcSize parameters using this API. Instead you can use get_dict_id/1 on the context/0 to get the id of the dictionary used. There is no way to -get the pledgedSrcSize.

    Returns ok on success, raises an error on failure.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    -{ok, _}
    -2> zstd:get_parameter(CCtx, compressionLevel).
    +get the pledgedSrcSize.

    Returns ok on success, raises an error on failure.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    +{ok, _}
    +2> zstd:get_parameter(CCtx, compressionLevel).
     3
    -3> zstd:set_parameter(CCtx, compressionLevel, 15).
    +3> zstd:set_parameter(CCtx, compressionLevel, 15).
     ok
    -4> zstd:get_parameter(CCtx, compressionLevel).
    +4> zstd:get_parameter(CCtx, compressionLevel).
     15
    @@ -1011,14 +1011,14 @@

    Reset a context while streaming data, returning it to its original state but keeping all parameters set.

    By resetting the state, the context can be re-used for other operations even -if it is in the middle of a (de)compression stream.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    -2> zstd:stream(CCtx, "a").
    -{continue, _}
    -3> zstd:reset(CCtx).
    +if it is in the middle of a (de)compression stream.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    +2> zstd:stream(CCtx, "a").
    +{continue, _}
    +3> zstd:reset(CCtx).
     ok
    -4> {done, Compressed} = zstd:finish(CCtx, "b").
    -5> zstd:decompress(Compressed).
    -[~"b"]
    +4>
    {done, Compressed} = zstd:finish(CCtx, "b"). +5> zstd:decompress(Compressed). +[~"b"]
    @@ -1049,14 +1049,14 @@

    Set a parameter on a context/0.

    See compress_parameters/0 and decompress_parameters/0 for details on -which parameters are available and what each parameter does.

    Returns ok on success, raises an error on failure.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    -{ok, _}
    -2> ok = zstd:set_parameter(CCtx, compressionLevel, 15).
    +which parameters are available and what each parameter does.

    Returns ok on success, raises an error on failure.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    +{ok, _}
    +2> ok = zstd:set_parameter(CCtx, compressionLevel, 15).
     ok
    -3> zstd:stream(CCtx, "abc").
    -{continue, _}
    -4> catch zstd:set_parameter(CCtx, dictionary, "abc").
    -{'EXIT', {{zstd_error, <<"Operation not authorized at current processing stage">>}, _}}
    +3>
    zstd:stream(CCtx, "abc"). +{continue, _} +4> catch zstd:set_parameter(CCtx, dictionary, "abc"). +{'EXIT', {{zstd_error, <<"Operation not authorized at current processing stage">>}, _}}
    @@ -1091,13 +1091,13 @@

    Compress or decompress a stream of data. The last stream of data should be called -with finish/2 to complete the compression/decompression.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib_app.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib_app.html	2026-04-20 17:48:58.717798056 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/stdlib_app.html	2026-04-20 17:48:58.717798056 +0000
    @@ -113,13 +113,13 @@
     prompt function takes the main prompt as its only parameter.

  • shell_saved_results = integer() >= 0 - Can be used to determine how many results are saved by the Erlang shell.

  • shell_session_slogan = string() | fun() -> string()) - The slogan printed when starting an Erlang shell. Example:

    $ erl -stdlib shell_session_slogan '"Test slogan"'
    -Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
    +Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Test slogan
     1>
  • shell_slogan = string() | fun(() -> string()) - The slogan printed when starting the Erlang shell subsystem. Example:

    $ erl -stdlib shell_slogan '"Test slogan"'
     Test slogan
    -Eshell V13.0.2  (abort with ^G)
    +Eshell V13.0.2  (abort with ^G)
     1>

    The default is the return value of erlang:system_info(system_version).

  • shell_strings = boolean() - Can be used to determine how the Erlang shell outputs lists of integers.

  • shell_hints = boolean() - Can be used to enable/disable @@ -166,7 +166,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/string.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/string.html 2026-04-20 17:48:58.777798428 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/string.html 2026-04-20 17:48:58.773798403 +0000 @@ -114,14 +114,14 @@ expect UTF-8 binaries but not all functions verify that all binaries are encoded correctly.

    Unless otherwise specified the return value type is the same as the input type. That is, binary input returns binary output, list input returns a list output, -and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
    +and mixed input can return a mixed output.

    1> string:trim("  sarah  ").
     "sarah"
    -2> string:trim(<<"  sarah  ">>).
    -<<"sarah">>
    -3> string:lexemes("foo bar", " ").
    -["foo","bar"]
    -4> string:lexemes(<<"foo bar">>, " ").
    -[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 +2> string:trim(<<" sarah ">>). +<<"sarah">> +3> string:lexemes("foo bar", " "). +["foo","bar"] +4> string:lexemes(<<"foo bar">>, " "). +[<<"foo">>,<<"bar">>]

    This module has been reworked in Erlang/OTP 20 to handle unicode:chardata/0 and operate on grapheme clusters. The old functions that only work on Latin-1 lists as input are still available but should not be used, they will be @@ -1031,7 +1031,7 @@

    Converts String to a case-agnostic comparable string. Function casefold/1 is preferred over lowercase/1 -when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
    +when two strings are to be compared for equality. See also equal/4.

    Example:

    1> string:casefold("Ω and ẞ SHARP S").
     "ω and ss sharp s"
  • @@ -1063,9 +1063,9 @@

    Returns a string where any trailing \n or \r\n have been removed from -String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
    -<<"\nHello">>
    -183> string:chomp("\nHello\r\r\n").
    +String.

    Example:

    182> string:chomp(<<"\nHello\n\n">>).
    +<<"\nHello">>
    +183> string:chomp("\nHello\r\r\n").
     "\nHello\r"
    @@ -1166,11 +1166,11 @@ nfc, nfd, nfkc, and -nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
    +nfkd.

    Example:

    1> string:equal("åäö", <<"åäö"/utf8>>).
     true
    -2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
    +2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
     false
    -3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
    +3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
     true
    @@ -1236,13 +1236,13 @@

    Removes anything before SearchPattern in String and returns the remainder of the string or nomatch if SearchPattern is not found. Dir, which can be leading or trailing, indicates from which direction characters are to be -searched.

    Example:

    1> string:find("ab..cd..ef", ".").
    +searched.

    Example:

    1> string:find("ab..cd..ef", ".").
     "..cd..ef"
    -2> string:find(<<"ab..cd..ef">>, "..", trailing).
    -<<"..ef">>
    -3> string:find(<<"ab..cd..ef">>, "x", leading).
    +2> string:find(<<"ab..cd..ef">>, "..", trailing).
    +<<"..ef">>
    +3> string:find(<<"ab..cd..ef">>, "x", leading).
     nomatch
    -4> string:find("ab..cd..ef", "x", trailing).
    +4> string:find("ab..cd..ef", "x", trailing).
     nomatch
    @@ -1273,9 +1273,9 @@ -

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
    +

    Returns true if String is the empty string, otherwise false.

    Example:

    1> string:is_empty("foo").
     false
    -2> string:is_empty(["",<<>>]).
    +2> string:is_empty(["",<<>>]).
     true
    @@ -1313,13 +1313,13 @@

    Returns a float between +0.0 and 1.0 representing the Jaro similarity between the given strings. Strings with a higher similarity will score closer -to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
    +to 1.0, with +0.0 meaning no similarity and 1.0 meaning an exact match.

    Example:

    1> string:jaro_similarity("ditto", "ditto").
     1.0
    -2> string:jaro_similarity("foo", "bar").
    +2> string:jaro_similarity("foo", "bar").
     +0.0
    -3> string:jaro_similarity("michelle", "michael").
    +3> string:jaro_similarity("michelle", "michael").
     0.8690476190476191
    -4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
    +4> string:jaro_similarity(<<"Édouard"/utf8>>, <<"Claude">>).
     0.5317460317460317

    The Jaro distance between two strings can be calculated with JaroDistance = 1.0 - JaroSimilarity.

    @@ -1351,9 +1351,9 @@ -

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
    +

    Returns the number of grapheme clusters in String.

    Example:

    1> string:length("ß↑e̊").
     3
    -2> string:length(<<195,159,226,134,145,101,204,138>>).
    +2> string:length(<<195,159,226,134,145,101,204,138>>).
     3
    @@ -1388,10 +1388,10 @@

    Returns a list of lexemes in String, separated by the grapheme clusters in SeparatorList.

    Notice that, as shown in this example, two or more adjacent separator graphemes clusters in String are treated as one. That is, there are no empty strings in -the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    -["abc","de̊f","ghi","jkl","foo"]
    -2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    -[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    +the resulting list of lexemes. See also split/3 which returns empty strings.

    Notice that [$\r,$\n] is one grapheme cluster.

    Example:

    1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
    +["abc","de̊f","ghi","jkl","foo"]
    +2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
    +[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
    @@ -1422,7 +1422,7 @@

    Converts String to lowercase.

    Notice that function casefold/1 should be used when converting a string to be -tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
    +tested for equality.

    Example:

    2> string:lowercase(string:uppercase("Michał")).
     "michał"
    @@ -1456,8 +1456,8 @@

    Returns the first codepoint in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple if the -next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    -[101|<<"̊fg"/utf8>>]
    +next byte is invalid.

    Example:

    1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
    +[101|<<"̊fg"/utf8>>]
    @@ -1491,8 +1491,8 @@

    Returns the first grapheme cluster in String and the rest of String in the tail. Returns an empty list if String is empty or an {error, String} tuple -if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    -["e̊"|<<"fg">>]
    +if the next byte is invalid.

    Example:

    1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
    +["e̊"|<<"fg">>]
    @@ -1527,7 +1527,7 @@

    Returns lexeme number N in String, where lexemes are separated by the -grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
    +grapheme clusters in SeparatorList.

    Example:

    1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
     "ghi"
    @@ -1625,11 +1625,11 @@

    Pads String to Length with grapheme cluster Char. Dir, which can be -leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    -[<<72,101,204,138,108,108,195,182>>,32,32,32]
    -2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
    +leading, trailing, or both, indicates where the padding should be added.

    Example:

    1> string:pad(<<"He̊llö"/utf8>>, 8).
    +[<<72,101,204,138,108,108,195,182>>,32,32,32]
    +2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
     '   He̊llö'
    -3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
    +3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
     ' He̊llö  '
    @@ -1661,9 +1661,9 @@

    If Prefix is the prefix of String, removes it and returns the remainder of -String, otherwise returns nomatch.

    Example:

    1> string:prefix(<<"prefix of string">>, "pre").
    -<<"fix of string">>
    -2> string:prefix("pre", "prefix").
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor.html	2026-04-20 17:48:58.817798676 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor.html	2026-04-20 17:48:58.821798701 +0000
    @@ -111,11 +111,11 @@
     left to right according to this list. When the supervisor is going to terminate,
     it first terminates its child processes in reversed start order, from right to
     left.

    Supervisor flags

    The supervisor properties are defined by the supervisor flags. The type -definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    -                intensity => non_neg_integer(),   % optional
    -                period => pos_integer(),          % optional
    -                hibernate_after => timeout(),     % optional, available since OTP 28.0
    -                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with +definition for the supervisor flags is as follows:

    sup_flags() = #{strategy => strategy(),           % optional
    +                intensity => non_neg_integer(),   % optional
    +                period => pos_integer(),          % optional
    +                hibernate_after => timeout(),     % optional, available since OTP 28.0
    +                auto_shutdown => auto_shutdown()} % optional

    Restart Strategies

    A supervisor can have one of the following restart strategies specified with the strategy key in the above map:

    • one_for_one - If one child process terminates and is to be restarted, only that child process is affected. This is the default restart strategy.

    • one_for_all - If one child process terminates and is to be restarted, all other child processes are terminated and then all child processes are @@ -161,13 +161,13 @@ this feature will also compile and run with older OTP versions.

      However, such applications, when compiled with an OTP version that predates the appearance of the automatic shutdown feature, will leak processes because the automatic shutdowns they rely on will not happen.

      It is up to implementors to take proper precautions if they expect that their -applications may be compiled with older OTP versions.

      Child specification

      The type definition of a child specification is as follows:

      child_spec() = #{id => child_id(),             % mandatory
      -                 start => mfargs(),            % mandatory
      -                 restart => restart(),         % optional
      -                 significant => significant(), % optional
      -                 shutdown => shutdown(),       % optional
      -                 type => worker(),             % optional
      -                 modules => modules()}         % optional

      The old tuple format is kept for backwards compatibility, see child_spec/0, +applications may be compiled with older OTP versions.

      Child specification

      The type definition of a child specification is as follows:

      child_spec() = #{id => child_id(),             % mandatory
      +                 start => mfargs(),            % mandatory
      +                 restart => restart(),         % optional
      +                 significant => significant(), % optional
      +                 shutdown => shutdown(),       % optional
      +                 type => worker(),             % optional
      +                 modules => modules()}         % optional

      The old tuple format is kept for backwards compatibility, see child_spec/0, but the map is preferred.

      • id is used to identify the child specification internally by the supervisor.

        The id key is mandatory.

        Notice that this identifier on occasion has been called "name". As far as possible, the terms "identifier" or "id" are now used but to keep backward compatibility, some occurences of "name" can still be found, for example in @@ -1807,7 +1807,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor_bridge.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor_bridge.html 2026-04-20 17:48:58.853798899 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/supervisor_bridge.html 2026-04-20 17:48:58.857798924 +0000 @@ -378,7 +378,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sys.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sys.html 2026-04-20 17:48:58.905799222 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/sys.html 2026-04-20 17:48:58.905799222 +0000 @@ -2276,7 +2276,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/terminal_interface.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/terminal_interface.html 2026-04-20 17:48:58.945799470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/terminal_interface.html 2026-04-20 17:48:58.941799445 +0000 @@ -104,18 +104,18 @@ ║ │ │ ║ ║ │ │ ║ ║ │ │ ║ -╚═══════╧═══════╧═══════╝

    We will use the alternate screen buffer for our game so first we need to set that up:

    #href_anchor"nf">main(_Args) ->
    +╚═══════╧═══════╧═══════╝

    We will use the alternate screen buffer for our game so first we need to set that up:

    #href_anchor"nf">main(_Args) ->
         
    -    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    -    io:put_chars("\e[?25l"), %% Hide the cursor
    -    draw_board(),
    -    timer:sleep(5000),
    -    io:put_chars("\e[?25h"), %% Show the cursor
    -    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    -    ok.

    We then use the box drawing parts of Unicode to draw our board:

    draw_board() ->
    -    io:put_chars("\e[5;0H"), %% Move cursor to top left
    -    io:put_chars(
    -      ["     ╔═══════╤═══════╤═══════╗\r\n",
    +    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    +    io:put_chars("\e[?25l"), %% Hide the cursor
    +    draw_board(),
    +    timer:sleep(5000),
    +    io:put_chars("\e[?25h"), %% Show the cursor
    +    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    +    ok.

    We then use the box drawing parts of Unicode to draw our board:

    draw_board() ->
    +    io:put_chars("\e[5;0H"), %% Move cursor to top left
    +    io:put_chars(
    +      ["     ╔═══════╤═══════╤═══════╗\r\n",
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║     Place an X by pressing Enter\r\n",
            "     ║       │       │       ║\r\n",
    @@ -127,51 +127,51 @@
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║\r\n",
    -       "     ╚═══════╧═══════╧═══════╝\r\n"]),
    +       "     ╚═══════╧═══════╧═══════╝\r\n"]),
         ok.

    Let us add some interactivity to our game! To do that we need to change the shell from running in cooked to raw mode. This is done by calling shell:start_interactive({noshell, raw}). We can then use io:get_chars/2 to read key strokes from the user. The key strokes will be returned as ANSI escape codes, -so we will have need to handle the codes for up, down, left, right and enter.

    It could look something like this:

    main(_Args) ->
    -    ok = shell:start_interactive({noshell, raw}),
    +so we will have need to handle the codes for up, down, left, right and enter.

    It could look something like this:

    main(_Args) ->
    +    ok = shell:start_interactive({noshell, raw}),
         
    -    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    -    io:put_chars("\e[?25l"), %% Hide the cursor
    -    draw_board(),
    -    loop(0),
    -    io:put_chars("\e[?25h"), %% Show the cursor
    -    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    +    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    +    io:put_chars("\e[?25l"), %% Hide the cursor
    +    draw_board(),
    +    loop(0),
    +    io:put_chars("\e[?25h"), %% Show the cursor
    +    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
         ok.
     
    -loop(Pos) ->
    -    io:put_chars(draw_selection(Pos)),
    +loop(Pos) ->
    +    io:put_chars(draw_selection(Pos)),
         %% Read at most 1024 characters from stdin.
    -    Chars = io:get_chars("", 1024),
    -    case handle_input(Chars, Pos) of
    +    Chars = io:get_chars("", 1024),
    +    case handle_input(Chars, Pos) of
             stop -> stop;
             NewPos ->
    -            io:put_chars(clear_selection(Pos)),
    -            loop(NewPos)
    +            io:put_chars(clear_selection(Pos)),
    +            loop(NewPos)
         end.
     
    -handle_input("\e[A" ++ Rest, Pos) ->
    +handle_input("\e[A" ++ Rest, Pos) ->
         %% Up key
    -    handle_input(Rest, max(0, Pos - 3));
    -handle_input("\e[B" ++ Rest, Pos) ->
    +    handle_input(Rest, max(0, Pos - 3));
    +handle_input("\e[B" ++ Rest, Pos) ->
         %% Down key
    -    handle_input(Rest, min(8, Pos + 3));
    -handle_input("\e[C" ++ Rest, Pos) ->
    +    handle_input(Rest, min(8, Pos + 3));
    +handle_input("\e[C" ++ Rest, Pos) ->
         %% right key
    -    handle_input(Rest, min(8, Pos + 1));
    -handle_input("\e[D" ++ Rest, Pos) ->
    +    handle_input(Rest, min(8, Pos + 1));
    +handle_input("\e[D" ++ Rest, Pos) ->
         %% left key
    -    handle_input(Rest, max(0, Pos - 1));
    -handle_input("q" ++ _, _State) ->
    +    handle_input(Rest, max(0, Pos - 1));
    +handle_input("q" ++ _, _State) ->
         stop;
    -handle_input([_ | T], State) ->
    -    handle_input(T, State);
    -handle_input([], State) ->
    +handle_input([_ | T], State) ->
    +    handle_input(T, State);
    +handle_input([], State) ->
         State.

    Note that when using io:get_chars/2 with the shell set in {noshell, raw} mode it will return as soon as any data is available. The number of characters is the maximum number that will be returned. We use 1024 here to make sure that @@ -181,24 +181,24 @@ %% \b = Move cursor left %% \e[C = Move cursor right %% \n = Move cursor down -clear_selection(Pos) -> - [set_position(Pos), +clear_selection(Pos) -> + [set_position(Pos), " ","\b\b\b\b\b\b\b\n", " \e[C\e[C\e[C\e[C\e[C ", - "\b\b\b\b\b\b\b\n"," "]. + "\b\b\b\b\b\b\b\n"," "]. -draw_selection(Pos) -> - [set_position(Pos), +draw_selection(Pos) -> + [set_position(Pos), "┌─────┐","\b\b\b\b\b\b\b\n", "│\e[C\e[C\e[C\e[C\e[C│", - "\b\b\b\b\b\b\b\n","└─────┘"]. + "\b\b\b\b\b\b\b\n","└─────┘"]. %% Set the cursor position to be at the top %% left of the field of the given position -set_position(Pos) -> - Row = 6 + (Pos div 3) * 4, - Col = 7 + (Pos rem 3) * 8, - io_lib:format("\e[~p;~pH",[Row, Col]).

    Now we have a program where we can move the marker around the board. +set_position(Pos) -> + Row = 6 + (Pos div 3) * 4, + Col = 7 + (Pos rem 3) * 8, + io_lib:format("\e[~p;~pH",[Row, Col]).

    Now we have a program where we can move the marker around the board. To complete the game we need to add some state so that we know which squares are marked and whos turn it is. You can find the final solution in tic-tac-toe.es.

    @@ -253,7 +253,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/timer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/timer.html 2026-04-20 17:48:58.993799768 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/timer.html 2026-04-20 17:48:58.997799793 +0000 @@ -105,15 +105,15 @@ the Timer Module section in the Efficiency Guide.

    For more information on timers in Erlang in general, see the Timers section of the Time and Time Correction in Erlang -ERTS User's guide.

    Examples

    Example 1

    The following example shows how to print "Hello World!" in 5 seconds:

    1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
    -{ok,TRef}
    +ERTS User's guide.

    Examples

    Example 1

    The following example shows how to print "Hello World!" in 5 seconds:

    1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
    +{ok,TRef}
     Hello World!

    Example 2

    The following example shows a process performing a certain action, and if this -action is not completed within a certain limit, the process is killed:

    Pid = spawn(mod, fun, [foo, bar]),
    +action is not completed within a certain limit, the process is killed:

    Pid = spawn(mod, fun, [foo, bar]),
     %% If pid is not finished in 10 seconds, kill him
    -{ok, R} = timer:kill_after(timer:seconds(10), Pid),
    +{ok, R} = timer:kill_after(timer:seconds(10), Pid),
     ...
     %% We change our mind...
    -timer:cancel(R),
    +timer:cancel(R),
     ...

    Notes

    A timer can always be removed by calling cancel/1.

    An interval timer, that is, a timer created by evaluating any of the functions apply_interval/2, apply_interval/3, apply_interval/4, apply_repeatedly/2, apply_repeatedly/3, apply_repeatedly/4, @@ -134,20 +134,20 @@ process which set the timer about its completion, by sending it a done message.

    Using self/0 inside the timed function, the code below does not work as intended. The task gets done, but the done message gets sent to the wrong -process and is lost.

    1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
    -{ok,TRef}
    +process and is lost.

    1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
    +{ok,TRef}
     2> receive done -> done after 5000 -> timeout end.
     %% ... 5s pass...
     timeout

    The code below calls self/0 in the process which sets the timer and assigns it to a variable, which is then used in the function to send the done message to, -and so works as intended.

    1> Target = self()
    +and so works as intended.

    1> Target = self()
     <0.82.0>
    -2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
    -{ok,TRef}
    +2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
    +{ok,TRef}
     3> receive done -> done after 5000 -> timeout end.
     %% ... 1s passes...
    -done

    Another option is to pass the message target as a parameter to the function.

    1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
    -{ok,TRef}
    +done

    Another option is to pass the message target as a parameter to the function.

    1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
    +{ok,TRef}
     2> receive done -> done after 5000 -> timeout end.
     %% ... 1s passes...
     done
    @@ -1594,7 +1594,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode.html 2026-04-20 17:48:59.037800041 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode.html 2026-04-20 17:48:59.033800016 +0000 @@ -1036,13 +1036,13 @@ the first part of a (so far) valid UTF character.

    If one UTF character is split over two consecutive binaries in the Data, the conversion succeeds. This means that a character can be decoded from a range of binaries as long as the whole range is specified as input without errors -occurring.

    Example:

    decode_data(Data) ->
    -   case unicode:characters_to_list(Data,unicode) of
    -      {incomplete,Encoded, Rest} ->
    -            More = get_some_more_data(),
    -            Encoded ++ decode_data([Rest, More]);
    -      {error,Encoded,Rest} ->
    -            handle_error(Encoded,Rest);
    +occurring.

    Example:

    decode_data(Data) ->
    +   case unicode:characters_to_list(Data,unicode) of
    +      {incomplete,Encoded, Rest} ->
    +            More = get_some_more_data(),
    +            Encoded ++ decode_data([Rest, More]);
    +      {error,Encoded,Rest} ->
    +            handle_error(Encoded,Rest);
           List ->
                 List
        end.

    However, bit strings that are not whole bytes are not allowed, so a UTF @@ -1077,8 +1077,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    -<<"abc..åäö"/utf8>>
    +of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    +<<"abc..åäö"/utf8>>
    @@ -1109,7 +1109,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    +of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
     "abc..åäö"
    @@ -1141,8 +1141,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfd_binary("abc..åäö").
    -<<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
    +of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfd_binary("abc..åäö").
    +<<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
    @@ -1173,8 +1173,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfd_list("abc..åäö").
    -[97,98,99,46,46,97,778,97,776,111,776]
    +of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfd_list("abc..åäö").
    +[97,98,99,46,46,97,778,97,776,111,776]
    @@ -1205,8 +1205,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    -<<"abc..åäö32"/utf8>>
    +of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    +<<"abc..åäö32"/utf8>>
    @@ -1237,7 +1237,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    +of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
     "abc..åäö32"
    @@ -1270,8 +1270,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
    -<<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
    +standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
    +<<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
    @@ -1303,8 +1303,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
    -[97,98,99,46,46,97,778,97,776,111,776,51,50]
    +standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
    +[97,98,99,46,46,97,778,97,776,111,776,51,50]
    @@ -1365,7 +1365,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode_usage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode_usage.html 2026-04-20 17:48:59.081800313 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/unicode_usage.html 2026-04-20 17:48:59.085800338 +0000 @@ -263,20 +263,20 @@ iolists, where binaries and lists can be combined to represent a sequence of bytes. In the same way, the Unicode-aware modules often allow for combinations of binaries and lists, where the binaries have characters encoded in UTF-8 and -the lists contain such binaries or numbers representing Unicode code points:

    unicode_binary() = binary() with characters encoded in UTF-8 coding standard
    +the lists contain such binaries or numbers representing Unicode code points:

    unicode_binary() = binary() with characters encoded in UTF-8 coding standard
     
    -chardata() = charlist() | unicode_binary()
    +chardata() = charlist() | unicode_binary()
     
    -charlist() = maybe_improper_list(char() | unicode_binary() | charlist(),
    -  unicode_binary() | nil())

    The module unicode even supports similar mixes with binaries containing +charlist() = maybe_improper_list(char() | unicode_binary() | charlist(), + unicode_binary() | nil())

    The module unicode even supports similar mixes with binaries containing other encodings than UTF-8, but that is a special case to allow for conversions -to and from external data:

    external_unicode_binary() = binary() with characters coded in a user-specified
    -  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
    +to and from external data:

    external_unicode_binary() = binary() with characters coded in a user-specified
    +  Unicode encoding other than UTF-8 (UTF-16 or UTF-32)
     
    -external_chardata() = external_charlist() | external_unicode_binary()
    +external_chardata() = external_charlist() | external_unicode_binary()
     
    -external_charlist() = maybe_improper_list(char() | external_unicode_binary() |
    -  external_charlist(), external_unicode_binary() | nil())

    Basic Language Support

    As from Erlang/OTP R16, Erlang source files can be +external_charlist() = maybe_improper_list(char() | external_unicode_binary() | + external_charlist(), external_unicode_binary() | nil())

    Basic Language Support

    As from Erlang/OTP R16, Erlang source files can be written in UTF-8 or bytewise (latin1) encoding. For information about how to state the encoding of an Erlang source file, see the epp module. As from Erlang/OTP R16, strings and comments can be written using @@ -300,12 +300,12 @@ In the following example, the code point of a Cyrillic с is output:

    7> $с.
     1089

    Heuristic String Detection

    In certain output functions and in the output of return values in the shell, Erlang tries to detect string data in lists and binaries heuristically. -Typically you will see heuristic detection in a situation like this:

    1> [97,98,99].
    +Typically you will see heuristic detection in a situation like this:

    1> [97,98,99].
     "abc"
    -2> <<97,98,99>>.
    -<<"abc">>
    -3> <<195,165,195,164,195,182>>.
    -<<"åäö"/utf8>>

    Here the shell detects lists containing printable characters or binaries +2> <<97,98,99>>. +<<"abc">> +3> <<195,165,195,164,195,182>>. +<<"åäö"/utf8>>

    Here the shell detects lists containing printable characters or binaries containing printable characters in bytewise or UTF-8 encoding. But what is a printable character? One view is that anything the Unicode standard thinks is printable, is also printable according to the heuristic detection. The result is @@ -320,32 +320,32 @@ controls how heuristic string detection is done. More ranges are expected to be added in the future, enabling tailoring of the heuristics to the language and region relevant to the user.

    The following examples show the two startup options:

    $ erl +pc latin1
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> [1024].
    -[1024]
    -2> [1070,1085,1080,1082,1086,1076].
    -[1070,1085,1080,1082,1086,1076]
    -3> [229,228,246].
    +Eshell V5.10.1  (abort with ^G)
    +1> [1024].
    +[1024]
    +2> [1070,1085,1080,1082,1086,1076].
    +[1070,1085,1080,1082,1086,1076]
    +3> [229,228,246].
     "åäö"
    -4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
    -<<208,174,208,189,208,184,208,186,208,190,208,180>>
    -5> <<229/utf8,228/utf8,246/utf8>>.
    -<<"åäö"/utf8>>
    $ erl +pc unicode
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
    +<<208,174,208,189,208,184,208,186,208,190,208,180>>
    +5> <<229/utf8,228/utf8,246/utf8>>.
    +<<"åäö"/utf8>>
    $ erl +pc unicode
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> [1024].
    +Eshell V5.10.1  (abort with ^G)
    +1> [1024].
     "Ѐ"
    -2> [1070,1085,1080,1082,1086,1076].
    +2> [1070,1085,1080,1082,1086,1076].
     "Юникод"
    -3> [229,228,246].
    +3> [229,228,246].
     "åäö"
    -4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
    -<<"Юникод"/utf8>>
    -5> <<229/utf8,228/utf8,246/utf8>>.
    -<<"åäö"/utf8>>

    In the examples, you can see that the default Erlang shell interprets only +4> <<208,174,208,189,208,184,208,186,208,190,208,180>>. +<<"Юникод"/utf8>> +5> <<229/utf8,228/utf8,246/utf8>>. +<<"åäö"/utf8>>

    In the examples, you can see that the default Erlang shell interprets only characters from the ISO Latin1 range as printable and only detects lists or binaries with those "printable" characters as containing string data. The valid UTF-8 binary containing the Russian word "Юникод", is not printed as a string. @@ -353,17 +353,17 @@ outputs anything containing printable Unicode data (in binaries, either UTF-8 or bytewise encoded) as string data.

    These heuristics are also used by io:format/2, io_lib:format/2, and friends when modifier t is used with ~p or ~P:

    $ erl +pc latin1
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    -{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
    +Eshell V5.10.1  (abort with ^G)
    +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    +{<<"åäö">>,<<"åäö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
     ok
    $ erl +pc unicode
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    -{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
    +Eshell V5.10.1  (abort with ^G)
    +1> io:format("~tp~n",[{<<"åäö">>, <<"åäö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
    +{<<"åäö">>,<<"åäö"/utf8>>,<<"Юникод"/utf8>>}
     ok

    Notice that this only affects heuristic interpretation of lists and binaries on output. For example, the ~ts format sequence always outputs a valid list of characters, regardless of the +pc setting, as the programmer has explicitly @@ -380,19 +380,19 @@ capable of. There is no portable way for Erlang to ask the terminal about its UTF-8 capacity, we have to rely on the language and character type settings.

    To investigate what Erlang thinks about the terminal, the call io:getopts() can be used when the shell is started:

    $ LC_CTYPE=en_US.ISO-8859-1 erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,latin1}
    -2> q().
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,latin1}
    +2> q().
     ok
     $ LC_CTYPE=en_US.UTF-8 erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,unicode}
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,unicode}
     2>

    When (finally?) everything is in order with the locale settings, fonts. and the terminal emulator, you have probably found a way to input characters in the script you desire. For testing, the simplest way is to add some keyboard @@ -405,14 +405,14 @@ easily if you are not used to this. For example, entering commands using a Cyrillic character set is not easily done in the Erlang shell.

    Now you are set up for some Unicode input and output. The simplest thing to do is to enter a string in the shell:

    $ erl
    -Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]
     
    -Eshell V5.10.1  (abort with ^G)
    -1> lists:keyfind(encoding, 1, io:getopts()).
    -{encoding,unicode}
    +Eshell V5.10.1  (abort with ^G)
    +1> lists:keyfind(encoding, 1, io:getopts()).
    +{encoding,unicode}
     2> "Юникод".
     "Юникод"
    -3> io:format("~ts~n", [v(2)]).
    +3> io:format("~ts~n", [v(2)]).
     Юникод
     ok
     4>

    While strings can be input as Unicode characters, the language elements are @@ -439,10 +439,10 @@ charlist() represented by it.

    #!/usr/bin/env escript
     %%! -kernel standard_io_encoding latin1
     
    -main(_) ->
    -  {ok, Char} = file:read_line(standard_io),
    -  ok = file:write(standard_io, string:trim(Char)),
    -  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
    +main(_) ->
    +  {ok, Char} = file:read_line(standard_io),
    +  ok = file:write(standard_io, string:trim(Char)),
    +  ok = file:write(standard_io, io_lib:format(": ~w~n",[string:trim(Char)])),
       ok.
    $ escript test.es
     ξ
     ξ: [206,190]

    ξ would normally be represented as the integer 958, but since we are using @@ -642,13 +642,13 @@ example {encoding,utf8}).

    Functions reading Erlang syntax from files recognize the coding: comment and can therefore handle Unicode data on input. When writing Erlang terms to a file, you are advised to insert such comments when applicable:

    $ erl +fna +pc unicode
    -Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
    +Erlang R16B (erts-5.10.1) [source]  [async-threads:0] [hipe] [kernel-poll:false]
     
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string.html	2026-04-20 17:48:59.129800612 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string.html	2026-04-20 17:48:59.129800612 +0000
    @@ -551,11 +551,11 @@
     

    Composes a form-urlencoded QueryString based on a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
    +specification for non-UTF-8 encodings.

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}]).
     "foo+bar=1&city=%C3%B6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"örebro"/utf8>>}]).
    -<<"foo+bar=1&city=%C3%B6rebro">>
    +2>
    uri_string:compose_query([{<<"foo bar">>,<<"1">>}, +2> {<<"city">>,<<"örebro"/utf8>>}]). +<<"foo+bar=1&city=%C3%B6rebro">>
    @@ -598,12 +598,12 @@ ";" (U+003B) character.

    Bytes that are out of the range 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A, are percent-encoded (U+0025 PERCENT SIGN character (%) followed by uppercase ASCII hex digits representing the hexadecimal value of the -byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    -1> [{encoding, latin1}]).
    +byte).

    See also the opposite operation dissect_query/1.

    Example:

    1> uri_string:compose_query([{"foo bar","1"},{"city","örebro"}],
    +1> [{encoding, latin1}]).
     "foo+bar=1&city=%F6rebro"
    -2> uri_string:compose_query([{<<"foo bar">>,<<"1">>},
    -2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]).
    -<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>
    +2>
    uri_string:compose_query([{<<"foo bar">>,<<"1">>}, +2> {<<"city">>,<<"東京"/utf8>>}], [{encoding, latin1}]). +<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>
    @@ -639,11 +639,11 @@

    Dissects an urlencoded QueryString and returns a QueryList, a list of non-percent-encoded key-value pairs.

    Form-urlencoding is defined in section 4.10.21.6 of the HTML 5.2 specification and in section 4.10.22.6 of the HTML 5.0 -specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    -[{"foo bar","1"},{"city","örebro"}]
    -2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    -[{<<"foo bar">>,<<"1">>},
    - {<<"city">>,<<230,157,177,228,186,172>>}]
    +specification for non-UTF-8 encodings.

    See also the opposite operation compose_query/1.

    Example:

    1> uri_string:dissect_query("foo+bar=1&city=%C3%B6rebro").
    +[{"foo bar","1"},{"city","örebro"}]
    +2> uri_string:dissect_query(<<"foo+bar=1&city=%26%2326481%3B%26%2320140%3B">>).
    +[{<<"foo bar">>,<<"1">>},
    + {<<"city">>,<<230,157,177,228,186,172>>}]
    @@ -677,14 +677,14 @@

    Transforms an URI into a normalized form using Syntax-Based Normalization as defined by RFC 3986.

    This function implements case normalization, percent-encoding normalization, path segment normalization and scheme based normalization for HTTP(S) with basic -support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
    +support for FTP, SSH, SFTP and TFTP.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g").
     "/a/g"
    -2> uri_string:normalize(<<"mid/content=5/../6">>).
    -<<"mid/6">>
    -3> uri_string:normalize("http://localhost:80").
    +2> uri_string:normalize(<<"mid/content=5/../6">>).
    +<<"mid/6">>
    +3> uri_string:normalize("http://localhost:80").
     "http://localhost/"
    -4> uri_string:normalize(#href_anchor"ss">scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}).
    +4> uri_string:normalize(#href_anchor"ss">scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}).
     "http://localhost-%C3%B6rebro/a/g"
    @@ -721,15 +721,15 @@

    Same as normalize/1 but with an additional Options parameter, that controls whether the normalized URI shall be returned as an -uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    -#{path => "/a/g"}
    -2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    -#{path => <<"mid/6">>}
    -3> uri_string:normalize("http://localhost:80", [return_map]).
    -#{scheme => "http",path => "/",host => "localhost"}
    -4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    -4> host => "localhost-örebro"}, [return_map]).
    -#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    +uri_map().

    There is one supported option: return_map.

    Example:

    1> uri_string:normalize("/a/b/c/./../../g", [return_map]).
    +#{path => "/a/g"}
    +2> uri_string:normalize(<<"mid/content=5/../6">>, [return_map]).
    +#{path => <<"mid/6">>}
    +3> uri_string:normalize("http://localhost:80", [return_map]).
    +#{scheme => "http",path => "/",host => "localhost"}
    +4> uri_string:normalize(#{scheme => "http",port => 80,path => "/a/b/c/./../../g",
    +4> host => "localhost-örebro"}, [return_map]).
    +#{scheme => "http",path => "/a/g",host => "localhost-örebro"}
    @@ -761,14 +761,14 @@

    Parses an RFC 3986 compliant uri_string/0 into a uri_map/0, that holds the parsed components of the -URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    -#{fragment => "nose",host => "example.com",
    +URI. If parsing fails, an error tuple is returned.

    See also the opposite operation recompose/1.

    Example:

    1> uri_string:parse("foo://user@example.com:8042/over/there?name=ferret#nose").
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => foo,userinfo => "user"}
    -2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>).
    -#{host => <<"example.com">>,path => <<"/over/there">>,
    -  port => 8042,query => <<"name=ferret">>,scheme => <<"foo">>,
    -  userinfo => <<"user">>}
    +
    scheme => foo,userinfo => "user"} +2> uri_string:parse(<<"foo://user@example.com:8042/over/there?name=ferret">>). +#{host => <<"example.com">>,path => <<"/over/there">>, + port => 8042,query => <<"name=ferret">>,scheme => <<"foo">>, + userinfo => <<"user">>}
    @@ -808,16 +808,16 @@

    Decodes all percent-encoded triplets in the input that can be both a uri_string/0 and a uri_map/0.

    Note, that this function performs raw decoding and it shall be used on already parsed URI components. Applying this function directly on a standard URI can -effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    -1> scheme => "http"}).
    -#{host => "localhost-örebro",path => [],scheme => "http"}
    -2> uri_string:percent_decode(<<"%C3%B6rebro">>).
    -<<"örebro"/utf8>>

    Warning

    Using uri_string:percent_decode/1 directly on a URI is not safe. This +effectively change it.

    If the input encoding is not UTF-8, an error tuple is returned.

    Example:

    1> uri_string:percent_decode(#{host => "localhost-%C3%B6rebro",path => [],
    +1> scheme => "http"}).
    +#{host => "localhost-örebro",path => [],scheme => "http"}
    +2> uri_string:percent_decode(<<"%C3%B6rebro">>).
    +<<"örebro"/utf8>>

    Warning

    Using uri_string:percent_decode/1 directly on a URI is not safe. This example shows, that after each consecutive application of the function the -resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
    -<<"http://local%2Fhost/path">>
    -4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
    -<<"http://local/host/path">>
    +resulting URI will be changed. None of these URIs refer to the same resource.

    3> uri_string:percent_decode(<<"http://local%252Fhost/path">>).
    +<<"http://local%2Fhost/path">>
    +4> uri_string:percent_decode(<<"http://local%2Fhost/path">>).
    +<<"http://local/host/path">>
    @@ -849,10 +849,10 @@

    Replaces characters out of unreserved set with their percent encoded equivalents.

    Unreserved characters defined in -RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
    +RFC 3986 are not quoted.

    Example:

    1> uri_string:quote("SomeId/04").
     "SomeId%2F04"
    -2> uri_string:quote(<<"SomeId/04">>).
    -<<"SomeId%2F04">>

    Warning

    Function is not aware about any URI component context and should not be used +2> uri_string:quote(<<"SomeId/04">>). +<<"SomeId%2F04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -886,10 +886,10 @@

    Same as quote/1, but Safe allows user to provide a list of -characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
    +characters to be protected from encoding.

    Example:

    1> uri_string:quote("SomeId/04", "/").
     "SomeId/04"
    -2> uri_string:quote(<<"SomeId/04">>, "/").
    -<<"SomeId/04">>

    Warning

    Function is not aware about any URI component context and should not be used +2> uri_string:quote(<<"SomeId/04">>, "/"). +<<"SomeId/04">>

    Warning

    Function is not aware about any URI component context and should not be used on whole URI. If applied more than once on the same data, might produce unexpected results.

    @@ -923,13 +923,13 @@

    Creates an RFC 3986 compliant URIString (percent-encoded), based on the components of URIMap. If the -URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    -1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    -#{fragment => "nose",host => "example.com",
    +URIMap is invalid, an error tuple is returned.

    See also the opposite operation parse/1.

    Example:

    1> URIMap = #{fragment => "nose", host => "example.com", path => "/over/there",
    +1> port => 8042, query => "name=ferret", scheme => "foo", userinfo => "user"}.
    +#{fragment => "nose",host => "example.com",
       path => "/over/there",port => 8042,query => "name=ferret",
    -  scheme => "foo",userinfo => "user"}
    +  scheme => "foo",userinfo => "user"}
     
    -2> uri_string:recompose(URIMap).
    +2> uri_string:recompose(URIMap).
     "foo://example.com:8042/over/there?name=ferret#nose"
    @@ -966,13 +966,13 @@

    Convert a RefURI reference that might be relative to a given base URI into the parsed components of the reference's target, which can then be recomposed to -form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
    +form the target URI.

    Example:

    1> uri_string:resolve("/abs/ol/ute", "http://localhost/a/b/c?q").
    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string_usage.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string_usage.html	2026-04-20 17:48:59.165800835 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/uri_string_usage.html	2026-04-20 17:48:59.173800884 +0000
    @@ -126,19 +126,19 @@
     to explain this by an example.

    Let's say that we would like to create the following URI and send it over the network: http://cities/örebro?foo bar. This is not a valid URI as it contains characters that are not allowed in a URI such as "ö" and the space. We can -verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    -  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails +verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    +  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails at the last attempt when it encounters the colon character ":". Note, that the inital fault occurs when the parser attempts to interpret the character "ö" and after a failure back-tracks to the point where it has another possible parsing alternative.

    The proper way to solve this problem is to use uri_string:recompose/1 with a -uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    -  query => "foo bar"}).
    +uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    +  query => "foo bar"}).
       "http://cities/%C3%B6rebro?foo%20bar"

    The result is a valid URI where all the special characters are encoded as defined by the standard. Applying uri_string:parse/1 and -uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    -  #{host => "cities",path => "/örebro",query => "foo bar",
    -  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    Percent-encoding

    As you have seen in the previous chapter, a standard URI can only contain a +uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    +  #{host => "cities",path => "/örebro",query => "foo bar",
    +  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    Percent-encoding

    As you have seen in the previous chapter, a standard URI can only contain a strict subset of the US ASCII character set, moreover the allowed set of characters is not the same in the different URI components. Percent-encoding is a mechanism to represent a data octet in a component when that octet's @@ -155,27 +155,27 @@ question the library provides a utility function, uri_string:allowed_characters/0, that lists the allowed set of characters in each major URI component, and also in the -most important standard character sets.

        1> uri_string:allowed_characters().
    -    [{scheme,
    -     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    -    {userinfo,
    -     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {host,
    -     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {ipv4,".0123456789"},
    -    {ipv6,".0123456789:ABCDEFabcdef"},
    -    {regname,
    -     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {path,
    -     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {query,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {fragment,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {reserved,"!#$&'()*+,/:;=?@[]"},
    -    {unreserved,
    -     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be -percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
    +most important standard character sets.

        1> uri_string:allowed_characters().
    +    [{scheme,
    +     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    +    {userinfo,
    +     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {host,
    +     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {ipv4,".0123456789"},
    +    {ipv6,".0123456789:ABCDEFabcdef"},
    +    {regname,
    +     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {path,
    +     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {query,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {fragment,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {reserved,"!#$&'()*+,/:;=?@[]"},
    +    {unreserved,
    +     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be +percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
         "https://local%23host"

    Consuming a URI containing percent-encoded triplets can take many steps. The following example shows how to handle an input URI that is not normalized and contains multiple percent-encoded triplets. First, the input @@ -187,32 +187,32 @@ You can try to normalize the input with uri_string:normalize/1. The normalize operation decodes those percent-encoded triplets that correspond to a character in the unreserved set. Normalization is a safe, idempotent operation that -converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
    +converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
         "http://local%23host/%F6re%26bro%20"
    -    5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]).
    -    #{host => "local%23host",path => "/%F6re%26bro%20",
    -      scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this + 5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]). + #{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this point, when the URI is already parsed, it is safe to apply application specific decoding on the remaining character triplets. Erlang/OTP provides a function, uri_string:percent_decode/1 for raw percent decoding that you can use on the -host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
    +host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
         "local#host"
    -    7> uri_string:percent_decode("/%F6re%26bro%20").
    -    {error,invalid_utf8,<<"/öre&bro ">>}
    -    8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20",
    -    scheme => "http"}).
    -    {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character + 7> uri_string:percent_decode("/%F6re%26bro%20"). + {error,invalid_utf8,<<"/öre&bro ">>} + 8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}). + {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character with non-UTF-8 encoding. In order to be able to decode this, you have to make assumptions about the encoding used in these triplets. The most obvious choice is latin-1, so you can try uri_string:transcode/2, to transcode the path to -UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
    +UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
         "/%C3%B6re%26bro%20"
    -    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
    +    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
         "/öre&bro "

    It is important to emphasize that it is not safe to apply -uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
    +uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
         "http://local#host/öre&bro "
    -    12> uri_string:parse("http://local#host/öre&bro ").
    -    {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens + 12> uri_string:parse("http://local#host/öre&bro "). + {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens when converting a uri_map() into a uri_string(). Applying any percent-encoding directly on an input URI would not be safe just as in the case of @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/win32reg.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/win32reg.html 2026-04-20 17:48:59.217801157 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/win32reg.html 2026-04-20 17:48:59.213801132 +0000 @@ -877,7 +877,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zip.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zip.html 2026-04-20 17:48:59.257801405 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zip.html 2026-04-20 17:48:59.265801455 +0000 @@ -772,29 +772,29 @@ archive. The iteration can be ended prematurely in a controlled manner by throwing an exception.

    Example:

    > Name = "dummy.zip".
     "dummy.zip"
    -> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    -{ok,{"dummy.zip",
    -     <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    -{ok,[{"bar",<<"BAR">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}},
    -     {"foo",<<"FOO">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}}]}
    -> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    -{ok,{"dummy.zip",
    -     <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
    -<<"FOO">>
    +> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]). +{ok,{"dummy.zip", + <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0, + 0,0,3,0,0,...>>}} +> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}). +{ok,[{"bar",<<"BAR">>, + {file_info,3,regular,read_write, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + 54,1,0,0,0,0,0}}, + {"foo",<<"FOO">>, + {file_info,3,regular,read_write, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + 54,1,0,0,0,0,0}}]} +> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]). +{ok,{"dummy.zip", + <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0, + 0,0,3,0,0,...>>}} +> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}). +<<"FOO">>
    @@ -1642,7 +1642,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zstd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zstd.html 2026-04-20 17:48:59.305801703 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.3/doc/html/zstd.html 2026-04-20 17:48:59.309801728 +0000 @@ -96,25 +96,25 @@

    Zstandard compression interface.

    This module provides an API for the Zstandard library (www.zstd.net). It is used to compress and decompress data and offers the same compression ratio as zlib but at a lower CPU cost.

    Example:

    1> Data = ~"my data to be compressed".
    -2> Compressed = zstd:compress(Data).
    -3> zstd:decompress(Compressed).
    -[~"my data to be compressed"]

    If you are compressing or decompressing possibly large amounts of data, -it is also possible to do streamed compression/decompression.

    Example:

    1> Compress = fun F(Ctx, D) ->
    -                      case file:read(D, 5) of
    -                          {ok, Data} ->
    -                              {continue, C} = zstd:stream(Ctx, Data),
    -                              [C|F(Ctx, D)];
    +2> Compressed = zstd:compress(Data).
    +3> zstd:decompress(Compressed).
    +[~"my data to be compressed"]

    If you are compressing or decompressing possibly large amounts of data, +it is also possible to do streamed compression/decompression.

    Example:

    1> Compress = fun F(Ctx, D) ->
    +                      case file:read(D, 5) of
    +                          {ok, Data} ->
    +                              {continue, C} = zstd:stream(Ctx, Data),
    +                              [C|F(Ctx, D)];
                               eof ->
    -                              {done, C} = zstd:finish(Ctx, ""),
    +                              {done, C} = zstd:finish(Ctx, ""),
                                   C
                           end
                   end.
    -2> {ok, Ctx} = zstd:context(compress).
    -3> {ok, D} = file:open(File,[read,binary]).
    -4> Compressed = iolist_to_binary(Compress(Ctx, D)).
    -<<40,181,47,253,0,88,89,0,0,108,111,114,101,109,32,105,112,115,117,109>>
    -5> zstd:decompress(Compressed).
    -[~"lorem ipsum"]

    In all functions errors can be thrown, where Reason describes the error.

    Typical Reasons:

    • badarg - Bad argument.
    • zstd_error - An error generated by the Zstandard library.
    • not_on_controlling_process - The context was used by a process that +2> {ok, Ctx} = zstd:context(compress). +3> {ok, D} = file:open(File,[read,binary]). +4> Compressed = iolist_to_binary(Compress(Ctx, D)). +<<40,181,47,253,0,88,89,0,0,108,111,114,101,109,32,105,112,115,117,109>> +5> zstd:decompress(Compressed). +[~"lorem ipsum"]

    In all functions errors can be thrown, where Reason describes the error.

    Typical Reasons:

    • badarg - Bad argument.
    • zstd_error - An error generated by the Zstandard library.
    • not_on_controlling_process - The context was used by a process that did not create it.
    @@ -708,8 +708,8 @@ -

    Compress Data using the given compress_parameters/0 or the context/0.

    Example:

    1> zstd:compress("abc").
    -2> zstd:compress("abc", #{ compressionLevel => 20 }).
    +

    Compress Data using the given compress_parameters/0 or the context/0.

    Example:

    1> zstd:compress("abc").
    +2> zstd:compress("abc", #{ compressionLevel => 20 }).
    @@ -832,9 +832,9 @@ -

    Decompress Data using the given decompress_parameters/0 or the context/0.

    Example:

    1> Compressed = zstd:compress("abc").
    -2> zstd:decompress(Compressed).
    -[~"abc"]
    +

    Decompress Data using the given decompress_parameters/0 or the context/0.

    Example:

    1> Compressed = zstd:compress("abc").
    +2> zstd:decompress(Compressed).
    +[~"abc"]
    @@ -903,12 +903,12 @@ you can use get_dict_id/1 on the dictionary and compressed data, or just try to decompress as decompression will raise and exception if an incorrect dictionary is given.

    The compressionLevel set on a dictionary will override the compressionLevel -set in the context/0.

    Example:

    1> {ok, CDict} = zstd:dict(compress, Dict).
    -2> Data = lists:duplicate(100, 1).
    -[1, 1, 1 | _]
    -3> iolist_size(zstd:compress(Data)).
    +set in the context/0.

    Example:

    1> {ok, CDict} = zstd:dict(compress, Dict).
    +2> Data = lists:duplicate(100, 1).
    +[1, 1, 1 | _]
    +3> iolist_size(zstd:compress(Data)).
     17
    -4> iolist_size(zstd:compress(Data, #{ dictionary => CDict, dictIDFlag => false })).
    +4> iolist_size(zstd:compress(Data, #{ dictionary => CDict, dictIDFlag => false })).
     16

    As loading a dictionary can be a heavy operations, it is possible to create only a single dict/0 and provide it to multiple context/0.

    There is no API exposed in zstd to create a dictionary, instead use the zstd command line tool.

    @@ -942,11 +942,11 @@

    Finish compressing/decompressing data.

    This flushes all output buffers and resets the context/0 so -that it can be used for compressing/decompressing again.

    Example:

    1> {ok, DCtx} = zstd:context(decompress).
    -2> {continue, D1} = zstd:stream(DCtx, <<40,181,47,253,32>>).
    -3> {done, D2} = zstd:finish(DCtx, <<2,17,0,0,97,98>>).
    -4> iolist_to_binary([D1,D2]).
    -<<"ab">>
    +that it can be used for compressing/decompressing again.

    Example:

    1> {ok, DCtx} = zstd:context(decompress).
    +2> {continue, D1} = zstd:stream(DCtx, <<40,181,47,253,32>>).
    +3> {done, D2} = zstd:finish(DCtx, <<2,17,0,0,97,98>>).
    +4> iolist_to_binary([D1,D2]).
    +<<"ab">>
    @@ -976,10 +976,10 @@ -

    Get the dictionary ID of a dictionary or a frame.

    The dictionary ID 0 represents no dictionary.

    Example:

    1> {ok, CDict} = zstd:dict(compress, Dict).
    -2> zstd:get_dict_id(CDict).
    +

    Get the dictionary ID of a dictionary or a frame.

    The dictionary ID 0 represents no dictionary.

    Example:

    1> {ok, CDict} = zstd:dict(compress, Dict).
    +2> zstd:get_dict_id(CDict).
     1850243626
    -3> zstd:get_dict_id(zstd:compress("abc")).
    +3> zstd:get_dict_id(zstd:compress("abc")).
     0
    @@ -1021,11 +1021,11 @@

    Get header of a Zstandard compressed frame.

    A compressed Zstandard stream can consist of multiple frames. This function will read metadata from the first frame. This information -can be useful when debugging corrupted Zstandard streams.

    Example:

    1> Compressed = zstd:compress(~"abc").
    -2> zstd:get_frame_header(Compressed).
    -{ok,#{frameContentSize => 3,windowSize => 3,blockSizeMax => 3,
    +can be useful when debugging corrupted Zstandard streams.

    Example:

    1> Compressed = zstd:compress(~"abc").
    +2> zstd:get_frame_header(Compressed).
    +{ok,#{frameContentSize => 3,windowSize => 3,blockSizeMax => 3,
           frameType => 'ZSTD_frame',headerSize => 6,
    -      dictID => 0, checksumFlag => false}}
    +
    dictID => 0, checksumFlag => false}}
    @@ -1059,13 +1059,13 @@ which parameters are available and what each parameter does.

    Note that it is not possible to get the dictionary and pledgedSrcSize parameters using this API. Instead you can use get_dict_id/1 on the context/0 to get the id of the dictionary used. There is no way to -get the pledgedSrcSize.

    Returns ok on success, raises an error on failure.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    -{ok, _}
    -2> zstd:get_parameter(CCtx, compressionLevel).
    +get the pledgedSrcSize.

    Returns ok on success, raises an error on failure.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    +{ok, _}
    +2> zstd:get_parameter(CCtx, compressionLevel).
     3
    -3> zstd:set_parameter(CCtx, compressionLevel, 15).
    +3> zstd:set_parameter(CCtx, compressionLevel, 15).
     ok
    -4> zstd:get_parameter(CCtx, compressionLevel).
    +4> zstd:get_parameter(CCtx, compressionLevel).
     15
    @@ -1098,14 +1098,14 @@

    Reset a context while streaming data, returning it to its original state but keeping all parameters set.

    By resetting the state, the context can be re-used for other operations even -if it is in the middle of a (de)compression stream.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    -2> zstd:stream(CCtx, "a").
    -{continue, _}
    -3> zstd:reset(CCtx).
    +if it is in the middle of a (de)compression stream.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    +2> zstd:stream(CCtx, "a").
    +{continue, _}
    +3> zstd:reset(CCtx).
     ok
    -4> {done, Compressed} = zstd:finish(CCtx, "b").
    -5> zstd:decompress(Compressed).
    -[~"b"]
    +4>
    {done, Compressed} = zstd:finish(CCtx, "b"). +5> zstd:decompress(Compressed). +[~"b"]
    @@ -1136,14 +1136,14 @@

    Set a parameter on a context/0.

    See compress_parameters/0 and decompress_parameters/0 for details on -which parameters are available and what each parameter does.

    Returns ok on success, raises an error on failure.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    -{ok, _}
    -2> ok = zstd:set_parameter(CCtx, compressionLevel, 15).
    +which parameters are available and what each parameter does.

    Returns ok on success, raises an error on failure.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    +{ok, _}
    +2> ok = zstd:set_parameter(CCtx, compressionLevel, 15).
     ok
    -3> zstd:stream(CCtx, "abc").
    -{continue, _}
    -4> catch zstd:set_parameter(CCtx, dictionary, "abc").
    -{'EXIT', {{zstd_error, <<"Operation not authorized at current processing stage">>}, _}}
    +3>
    zstd:stream(CCtx, "abc"). +{continue, _} +4> catch zstd:set_parameter(CCtx, dictionary, "abc"). +{'EXIT', {{zstd_error, <<"Operation not authorized at current processing stage">>}, _}}
    @@ -1178,13 +1178,13 @@

    Compress or decompress a stream of data. The last stream of data should be called -with finish/2 to complete the compression/decompression.

    Example:

    1> {ok, CCtx} = zstd:context(compress).
    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/404.html	2026-04-20 17:48:59.341801926 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/404.html	2026-04-20 17:48:59.341801926 +0000
    @@ -106,7 +106,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/api-reference.html 2026-04-20 17:48:59.373802125 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/api-reference.html 2026-04-20 17:48:59.365802075 +0000 @@ -186,7 +186,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/chapter.html 2026-04-20 17:48:59.401802298 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/chapter.html 2026-04-20 17:48:59.401802298 +0000 @@ -140,7 +140,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/epp_dodger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/epp_dodger.html 2026-04-20 17:48:59.441802547 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/epp_dodger.html 2026-04-20 17:48:59.441802547 +0000 @@ -856,7 +856,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_comment_scan.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_comment_scan.html 2026-04-20 17:48:59.469802721 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_comment_scan.html 2026-04-20 17:48:59.477802770 +0000 @@ -414,7 +414,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_prettypr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_prettypr.html 2026-04-20 17:48:59.517803018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_prettypr.html 2026-04-20 17:48:59.513802993 +0000 @@ -978,7 +978,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_recomment.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_recomment.html 2026-04-20 17:48:59.553803241 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_recomment.html 2026-04-20 17:48:59.553803241 +0000 @@ -356,7 +356,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax.html 2026-04-20 17:48:59.669803961 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax.html 2026-04-20 17:48:59.673803986 +0000 @@ -6931,10 +6931,10 @@

    Returns the associated post-comments of a node.

    This is a possibly empty list of abstract comments, in top-down textual order. When the code is formatted, post-comments are typically -displayed to the right of and/or below the node. For example:

    {foo, X, Y}     % Post-comment of tuple

    If possible, the comment should be moved past any following separator characters +displayed to the right of and/or below the node. For example:

    {foo, X, Y}     % Post-comment of tuple

    If possible, the comment should be moved past any following separator characters on the same line, rather than placing the separators on the following line. -For example:

    foo([X | Xs], Y) ->
    -    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
    +For example:

    foo([X | Xs], Y) ->
    +    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
      ...

    (where the comment is moved past the rightmost ")" and the ";").

    See also: comment/2, get_attrs/1, get_precomments/1, set_postcomments/2.

    @@ -6967,10 +6967,10 @@

    Returns the associated pre-comments of a node.

    This is a possibly empty list of abstract comments, in top-down textual order. When the code is formatted, pre-comments are typically displayed directly above the node. For example:

    % Pre-comment of function
    -foo(X) -> {bar, X}.

    If possible, the comment should be moved before any preceding separator -characters on the same line. For example:

    foo([X | Xs]) ->
    +foo(X) -> {bar, X}.

    If possible, the comment should be moved before any preceding separator +characters on the same line. For example:

    foo([X | Xs]) ->
         % Pre-comment of 'bar(X)' node
    -    [bar(X) | foo(Xs)];
    +    [bar(X) | foo(Xs)];
     ...

    (where the comment is moved before the "[").

    See also: comment/2, get_attrs/1, get_postcomments/1, set_precomments/2.

    @@ -12542,7 +12542,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax_lib.html 2026-04-20 17:48:59.729804333 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/erl_syntax_lib.html 2026-04-20 17:48:59.729804333 +0000 @@ -2467,7 +2467,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl.html 2026-04-20 17:48:59.785804681 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl.html 2026-04-20 17:48:59.781804656 +0000 @@ -97,30 +97,30 @@ making it easy both to build new ASTs from scratch and to match and decompose existing ASTs. For details that are outside the scope of Merl itself, see the documentation of erl_syntax.

    Quick start

    To enable the full power of Merl, your module needs to include the Merl header -file:

    -include_lib("syntax_tools/include/merl.hrl").

    Then, you can use the ?Q(Text) macros in your code to create ASTs or match on -existing ASTs. For example:

    Tuple = ?Q("{foo, 42}"),
    -?Q("{foo, _@Number}") = Tuple,
    -Call = ?Q("foo:bar(_@Number)")

    Calling merl:print(Call) will then print the following code:

    foo:bar(42)

    The ?Q macros turn the quoted code fragments into ASTs, and lifts +file:

    -include_lib("syntax_tools/include/merl.hrl").

    Then, you can use the ?Q(Text) macros in your code to create ASTs or match on +existing ASTs. For example:

    Tuple = ?Q("{foo, 42}"),
    +?Q("{foo, _@Number}") = Tuple,
    +Call = ?Q("foo:bar(_@Number)")

    Calling merl:print(Call) will then print the following code:

    foo:bar(42)

    The ?Q macros turn the quoted code fragments into ASTs, and lifts metavariables such as _@Tuple and _@Number to the level of your Erlang code, so you can use the corresponding Erlang variables Tuple and Number directly. This is the most straightforward way to use Merl, and in many cases it's all you need.

    You can even write case switches using ?Q macros as patterns. For example:

    case AST of
    -    ?Q("{foo, _@Foo}") -> handle(Foo);
    -    ?Q("{bar, _@Bar}") when erl_syntax:is_integer(Bar) -> handle(Bar);
    -    _ -> handle_default()
    +    ?Q("{foo, _@Foo}") -> handle(Foo);
    +    ?Q("{bar, _@Bar}") when erl_syntax:is_integer(Bar) -> handle(Bar);
    +    _ -> handle_default()
     end

    These case switches only allow ?Q(...) or _ as clause patterns, and the guards may contain any expressions, not just Erlang guard expressions.

    If the macro MERL_NO_TRANSFORM is defined before the merl.hrl header file is included, the parse transform used by Merl will be disabled, and in that case, the match expressions ?Q(...) = ..., case switches using ?Q(...) patterns, and automatic metavariables like _@Tuple cannot be used in your code, but the Merl macros and functions still work. To do metavariable substitution, you need -to use the ?Q(Text, Map) macro. For example:

    Tuple = ?Q("{foo, _@bar, _@baz}", [{bar, Bar}, {baz,Baz}])

    The text given to a ?Q(Text) macro can be either a single string or a list of +to use the ?Q(Text, Map) macro. For example:

    Tuple = ?Q("{foo, _@bar, _@baz}", [{bar, Bar}, {baz,Baz}])

    The text given to a ?Q(Text) macro can be either a single string or a list of strings. The latter is useful when you need to split a long expression over -multiple lines. For example:

    ?Q(["case _@Expr of",
    +multiple lines. For example:

    ?Q(["case _@Expr of",
         "  {foo, X} -> f(X);",
         "  {bar, X} -> g(X)",
         "  _ -> h(X)"
    -"end"])

    If there is a syntax error somewhere in the text (like the missing semicolon in +"end"])

    If there is a syntax error somewhere in the text (like the missing semicolon in the second clause above) this allows Merl to generate an error message pointing to the exact line in your source code. (Just remember to comma-separate the strings in the list, otherwise Erlang will concatenate the string fragments as @@ -137,59 +137,59 @@ uppercase character, as in _@Foo or _@_@Foo, it will become a variable on the Erlang level, and can be used to easily deconstruct and construct syntax trees:

    case Input of
    -    ?Q("{foo, _@Number}") -> ?Q("foo:bar(_@Number)");
    +    ?Q("{foo, _@Number}") -> ?Q("foo:bar(_@Number)");
         ...

    We refer to these as "automatic metavariables". If in addition the name ends with @, as in _@Foo@, the value of the variable as an Erlang term will be automatically converted to the corresponding abstract syntax tree when used to -construct a larger tree. For example, in:

    Bar = {bar, 42},
    -Foo = ?Q("{foo, _@Bar@}")

    (where Bar is just some term, not a syntax tree) the result Foo will be a +construct a larger tree. For example, in:

    Bar = {bar, 42},
    +Foo = ?Q("{foo, _@Bar@}")

    (where Bar is just some term, not a syntax tree) the result Foo will be a syntax tree representing {foo, {bar, 42}}. This avoids the need for temporary -variables in order to inject data, as in

    TmpBar = erl_syntax:abstract(Bar),
    -Foo = ?Q("{foo, _@TmpBar}")

    If the context requires an integer rather than a variable, an atom, or a string, +variables in order to inject data, as in

    TmpBar = erl_syntax:abstract(Bar),
    +Foo = ?Q("{foo, _@TmpBar}")

    If the context requires an integer rather than a variable, an atom, or a string, you cannot use the uppercase convention to mark an automatic metavariable. Instead, if the integer (without the 909-prefix and lift/glob markers) ends in a 9, the integer will become an Erlang-level variable prefixed with Q, and if it ends with 99 it will also be automatically abstracted. For example, the following will increment the arity of the exported function f:

    case Form of
    -    ?Q("-export([f/90919]).") ->
    -        Q2 = erl_syntax:concrete(Q1) + 1,
    -        ?Q("-export([f/909299]).");
    +    ?Q("-export([f/90919]).") ->
    +        Q2 = erl_syntax:concrete(Q1) + 1,
    +        ?Q("-export([f/909299]).");
         ...

    When to use the various forms of metavariables

    Merl can only parse a fragment of text if it follows the basic syntactical rules of Erlang. In most places, a normal Erlang variable can be used as metavariable, -for example:

    ?Q("f(_@Arg)") = Expr

    but if you want to match on something like the name of a function, you have to -use an atom as metavariable:

    ?Q("'@Name'() -> _@@_." = Function

    (note the anonymous glob variable _@@_ to ignore the function body).

    In some contexts, only a string or an integer is allowed. For example, the +for example:

    ?Q("f(_@Arg)") = Expr

    but if you want to match on something like the name of a function, you have to +use an atom as metavariable:

    ?Q("'@Name'() -> _@@_." = Function

    (note the anonymous glob variable _@@_ to ignore the function body).

    In some contexts, only a string or an integer is allowed. For example, the directive -file(Name, Line) requires that Name is a string literal and -Line an integer literal:

    ?Q("-file(\"'@File\", 9090).") = ?Q("-file(\"foo.erl\", 42).")).

    This will extract the string literal "foo.erl" into the variable Foo. Note +Line an integer literal:

    ?Q("-file(\"'@File\", 9090).") = ?Q("-file(\"foo.erl\", 42).")).

    This will extract the string literal "foo.erl" into the variable Foo. Note the use of the anonymous variable 9090 to ignore the line number. To match and also bind a metavariable that must be an integer literal, we can use the convention of ending the integer with a 9, turning it into a Q-prefixed variable on the Erlang level (see the previous section).

    Globs

    Whenever you want to match out a number of elements in a sequence (zero or more) -rather than a fixed set of elements, you need to use a glob. For example:

    ?Q("{_@@Elements}") = ?Q({a, b, c})

    will bind Elements to the list of individual syntax trees representing the atoms +rather than a fixed set of elements, you need to use a glob. For example:

    ?Q("{_@@Elements}") = ?Q({a, b, c})

    will bind Elements to the list of individual syntax trees representing the atoms a, b, and c. This can also be used with static prefix and suffix elements -in the sequence. For example:

    ?Q("{a, b, _@@Elements}") = ?Q({a, b, c, d})

    will bind Elements to the list of the c and d subtrees, and

    ?Q("{_@@Elements, c, d}") = ?Q({a, b, c, d})

    will bind Elements to the list of the a and b subtrees. You can even use -plain metavariables in the prefix or suffix:

    ?Q("{_@First, _@@Rest}") = ?Q({a, b, c})

    or

    ?Q("{_@@_, _@Last}") = ?Q({a, b, c})

    (ignoring all but the last element). However, you cannot have two globs as part +in the sequence. For example:

    ?Q("{a, b, _@@Elements}") = ?Q({a, b, c, d})

    will bind Elements to the list of the c and d subtrees, and

    ?Q("{_@@Elements, c, d}") = ?Q({a, b, c, d})

    will bind Elements to the list of the a and b subtrees. You can even use +plain metavariables in the prefix or suffix:

    ?Q("{_@First, _@@Rest}") = ?Q({a, b, c})

    or

    ?Q("{_@@_, _@Last}") = ?Q({a, b, c})

    (ignoring all but the last element). However, you cannot have two globs as part of the same sequence.

    Lifted metavariables

    In some cases, the Erlang syntax rules make it impossible to place a -metavariable directly where you would like it. For example, you cannot write:

    ?Q("-export([_@@Name]).")

    to match out all name/arity pairs in the export list, or to insert a list of +metavariable directly where you would like it. For example, you cannot write:

    ?Q("-export([_@@Name]).")

    to match out all name/arity pairs in the export list, or to insert a list of exports in a declaration, because the Erlang parser only allows elements on the form A/I (where A is an atom and I an integer) in the export list. A variable like the above is not allowed, but neither is a single atom or integer, so '@@Name' or 909919 would not work either.

    What you have to do in such cases is to write your metavariable in a syntactically valid position, and use lifting markers to denote where it should -really apply, as in:

    ?Q("-export(['@_@Name'/0]).")

    This causes the variable to be lifted (after parsing) to the next higher level +really apply, as in:

    ?Q("-export(['@_@Name'/0]).")

    This causes the variable to be lifted (after parsing) to the next higher level in the syntax tree, replacing that entire subtree. In this case, the '@_@Name'/0 will be replaced with '@@Name', and the /0 part was just used as dummy notation and will be discarded.

    You may even need to apply lifting more than once. To match the entire export -list as a single syntax tree, you can write:

    ?Q("-export(['@__Name'/0]).")

    using two underscores, but with no glob marker this time. This will make the +list as a single syntax tree, you can write:

    ?Q("-export(['@__Name'/0]).")

    using two underscores, but with no glob marker this time. This will make the entire ['@__Name'/0] part be replaced with '@Name'.

    Sometimes, the tree structure of a code fragment is not very obvious, and parts of the structure may be invisible when printed as source code. For instance, a -simple function definition like the following:

    zero() -> 0.

    consists of the name (the atom zero), and a list of clauses containing the +simple function definition like the following:

    zero() -> 0.

    consists of the name (the atom zero), and a list of clauses containing the single clause () -> 0. The clause consists of an argument list (empty), a guard (empty), and a body (which is always a list of expressions) containing the single expression 0. This means that to match out the name and the list of clauses of any function, you'll need to use a pattern like ?Q("'@Name'() -> _@_@Body."), using a dummy clause whose body is a glob lifted one level.

    To visualize the structure of a syntax tree, you can use the function -merl:show(T), which prints a summary. For example, entering

    merl:show(merl:quote("inc(X, Y) when Y > 0 -> X + Y."))

    in the Erlang shell will print the following (where the + signs separate +merl:show(T), which prints a summary. For example, entering

    merl:show(merl:quote("inc(X, Y) when Y > 0 -> X + Y."))

    in the Erlang shell will print the following (where the + signs separate groups of subtrees on the same level):

    function: inc(X, Y) when ... -> X + Y.
       atom: inc
       +
    @@ -1723,7 +1723,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl_transform.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl_transform.html 2026-04-20 17:48:59.813804854 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/merl_transform.html 2026-04-20 17:48:59.809804830 +0000 @@ -121,7 +121,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/notes.html 2026-04-20 17:48:59.853805102 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/notes.html 2026-04-20 17:48:59.853805102 +0000 @@ -89,13 +89,13 @@ -

    This document describes the changes made to the Syntax_Tools application.

    Syntax_Tools 4.0.3

    Fixed Bugs and Malfunctions

    • Corrected the af_zip_generator() type in the parser and syntax_tools.

      Own Id: OTP-19939

    Improvements and New Features

    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

      make release_docs places the documentation in the released code under the doc folder.

      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

      Improves the source Software-Bill-of-Materials

      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

      Own Id: OTP-19886 Aux Id: PR-10434

    Syntax_Tools 4.0.2

    Fixed Bugs and Malfunctions

    • Annotate map comprehensions and generators

      Own Id: OTP-19817 Aux Id: GH-10119

    Syntax_Tools 4.0.1

    Fixed Bugs and Malfunctions

    • Fixed zip generator crash in annotate_bindings/1

      Own Id: OTP-19731 Aux Id: GH-10102, PR-10104

    Syntax_Tools 4.0

    Fixed Bugs and Malfunctions

    • A few minor issues were corrected in m:syntax_tools, as well in the erl_anno module.

      Own Id: OTP-19422 Aux Id: PR-9253

    Improvements and New Features

    • Comprehensions have been extended with zip generators according to EEP 73.

      Example:

      1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
      -[5,7,9]

      Own Id: OTP-19184 Aux Id: PR-8926

    • New strict generators have been added for comprehensions.

      The currently existing generators are "relaxed": they ignore terms in the +

      This document describes the changes made to the Syntax_Tools application.

      Syntax_Tools 4.0.3

      Fixed Bugs and Malfunctions

      • Corrected the af_zip_generator() type in the parser and syntax_tools.

        Own Id: OTP-19939

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      Syntax_Tools 4.0.2

      Fixed Bugs and Malfunctions

      • Annotate map comprehensions and generators

        Own Id: OTP-19817 Aux Id: GH-10119

      Syntax_Tools 4.0.1

      Fixed Bugs and Malfunctions

      • Fixed zip generator crash in annotate_bindings/1

        Own Id: OTP-19731 Aux Id: GH-10102, PR-10104

      Syntax_Tools 4.0

      Fixed Bugs and Malfunctions

      • A few minor issues were corrected in m:syntax_tools, as well in the erl_anno module.

        Own Id: OTP-19422 Aux Id: PR-9253

      Improvements and New Features

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        +[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • New strict generators have been added for comprehensions.

        The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

        The new strict generators fail with exception badmatch if a pattern doesn't match.

        Examples:

        Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        -[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        +[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
        +that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
         ** exception error: no match of right hand side value ok

        Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

        The strict version for bitstring generators is <:=.

        Own Id: OTP-19317 Aux Id: PR-8625

      • Fixed licenses in files and added ORT curations to the following apps: otp, eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.

        Own Id: OTP-19478 Aux Id: PR-9376, PR-9402, PR-9819

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Syntax_Tools 3.2.2.2

      Fixed Bugs and Malfunctions

      • Annotate map comprehensions and generators

        Own Id: OTP-19817 Aux Id: GH-10119

      Syntax_Tools 3.2.2.1

      Fixed Bugs and Malfunctions

      • Backport fix for annotating maybe to OTP-27

        Own Id: OTP-19740 Aux Id: GH-10103, PR-10118

      Syntax_Tools 3.2.2

      Fixed Bugs and Malfunctions

      • Annotation of maybe expressions has been corrected.

        Own Id: OTP-19405 Aux Id: PR-8811

      Syntax_Tools 3.2.1

      Fixed Bugs and Malfunctions

      • The documentation for syntax_tools has been polished after the migration to the new documentation system.

        Own Id: OTP-19102 Aux Id: PR-8515

      Syntax_Tools 3.2

      Fixed Bugs and Malfunctions

      • The epp_dodger module can now handle the maybe and else keywords.

        Own Id: OTP-18608 Aux Id: GH-7266, PR-7267

      • Reverting a #href_anchor"https://github.com/erlang/otp/pull/7398" title="">PR-7398

      Improvements and New Features

      Syntax_Tools 3.1.0.1

      Fixed Bugs and Malfunctions

      • Annotate map comprehensions and generators

        Own Id: OTP-19817 Aux Id: GH-10119

      Syntax_Tools 3.1

      Improvements and New Features

      • Map comprehensions as suggested in EEP 58 has now been implemented.

        Own Id: OTP-18413 Aux Id: EEP-58, PR-6727

      Syntax_Tools 3.0.1

      Fixed Bugs and Malfunctions

      • erl_syntax_lib:annotate_bindings/1,2 will now properly annotate named functions and their arguments.

        Own Id: OTP-18380 Aux Id: PR-6523, GH-4733

      Syntax_Tools 3.0

      Fixed Bugs and Malfunctions

      • The erl_syntax_lib:analyze_attribute/1 function would return {Name, {Name, Value}} instead of {Name, Value} (which is the documented @@ -201,7 +201,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/prettypr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/prettypr.html 2026-04-20 17:48:59.893805351 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/prettypr.html 2026-04-20 17:48:59.893805351 +0000 @@ -1135,7 +1135,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/search.html 2026-04-20 17:48:59.925805550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.3/doc/html/search.html 2026-04-20 17:48:59.921805525 +0000 @@ -104,7 +104,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/404.html 2026-04-20 17:48:59.953805723 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/404.html 2026-04-20 17:48:59.953805723 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/api-reference.html 2026-04-20 17:48:59.973805847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/api-reference.html 2026-04-20 17:48:59.977805872 +0000 @@ -127,7 +127,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/getting_started.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/getting_started.html 2026-04-20 17:49:00.009806071 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/getting_started.html 2026-04-20 17:49:00.009806071 +0000 @@ -92,10 +92,10 @@

        The start/1 function starts a daemon process listening for UDP packets on a port. When it receives a request for read or write, it spawns a temporary server process handling the transfer.

        This is a simple example of starting the TFTP server and reading the content of -a sample file using the TFTP client.

        Step 1. Create a sample file to be used for the transfer:

              $ echo "Erlang/OTP 21" > /tmp/file.txt

        Step 2. Start the TFTP server:

              1> Callback = {callback,{"",tftp_file,[{root_dir,"/tmp"}]}}.
        -      2> {ok, Pid} = tftp:start([{port, 19999}, Callback]).
        -      {ok,<0.65.0>}

        Step 3. Start the TFTP client (in another shell):

              1> tftp:read_file("file.txt", binary, [{port, 19999}]).
        -      {ok,<<"Erlang/OTP 21\n">>}
        +a sample file using the TFTP client.

        Step 1. Create a sample file to be used for the transfer:

              $ echo "Erlang/OTP 21" > /tmp/file.txt

        Step 2. Start the TFTP server:

              1> Callback = {callback,{"",tftp_file,[{root_dir,"/tmp"}]}}.
        +      2> {ok, Pid} = tftp:start([{port, 19999}, Callback]).
        +      {ok,<0.65.0>}

        Step 3. Start the TFTP client (in another shell):

              1> tftp:read_file("file.txt", binary, [{port, 19999}]).
        +      {ok,<<"Erlang/OTP 21\n">>}
        @@ -138,7 +138,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/introduction.html 2026-04-20 17:49:00.037806243 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/introduction.html 2026-04-20 17:49:00.037806243 +0000 @@ -164,7 +164,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/notes.html 2026-04-20 17:49:00.065806418 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/notes.html 2026-04-20 17:49:00.069806443 +0000 @@ -148,7 +148,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/search.html 2026-04-20 17:49:00.101806641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/search.html 2026-04-20 17:49:00.101806641 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.epub/OEBPS/content.opf 2026-04-20 15:20:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.epub/OEBPS/content.opf 2042-05-23 04:39:14.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> tftp - 1.2.4 - urn:uuid:f2165b75-102b-3603-f78b-13607047749a + urn:uuid:71ab2641-8dc6-befa-5d7b-45da56e3f671 en - 2026-04-20T15:20:22Z + 2042-05-23T04:39:14Z /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.epub/OEBPS/getting_started.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.epub/OEBPS/getting_started.xhtml 2026-04-20 15:20:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.epub/OEBPS/getting_started.xhtml 2042-05-23 04:39:14.000000000 +0000 @@ -20,10 +20,10 @@

        The start/1 function starts a daemon process listening for UDP packets on a port. When it receives a request for read or write, it spawns a temporary server process handling the transfer.

        This is a simple example of starting the TFTP server and reading the content of -a sample file using the TFTP client.

        Step 1. Create a sample file to be used for the transfer:

              $ echo "Erlang/OTP 21" > /tmp/file.txt

        Step 2. Start the TFTP server:

              1> Callback = {callback,{"",tftp_file,[{root_dir,"/tmp"}]}}.
        -      2> {ok, Pid} = tftp:start([{port, 19999}, Callback]).
        -      {ok,<0.65.0>}

        Step 3. Start the TFTP client (in another shell):

              1> tftp:read_file("file.txt", binary, [{port, 19999}]).
        -      {ok,<<"Erlang/OTP 21\n">>}
        +a sample file using the TFTP client.

        Step 1. Create a sample file to be used for the transfer:

              $ echo "Erlang/OTP 21" > /tmp/file.txt

        Step 2. Start the TFTP server:

              1> Callback = {callback,{"",tftp_file,[{root_dir,"/tmp"}]}}.
        +      2> {ok, Pid} = tftp:start([{port, 19999}, Callback]).
        +      {ok,<0.65.0>}

        Step 3. Start the TFTP client (in another shell):

              1> tftp:read_file("file.txt", binary, [{port, 19999}]).
        +      {ok,<<"Erlang/OTP 21\n">>}
        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.html 2026-04-20 17:49:00.241807510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp.html 2026-04-20 17:49:00.237807485 +0000 @@ -949,7 +949,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp_logger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp_logger.html 2026-04-20 17:49:00.269807684 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.4/doc/html/tftp_logger.html 2026-04-20 17:49:00.273807708 +0000 @@ -276,7 +276,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/404.html 2026-04-20 17:49:00.301807882 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/404.html 2026-04-20 17:49:00.301807882 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/api-reference.html 2026-04-20 17:49:00.333808080 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/api-reference.html 2026-04-20 17:49:00.333808080 +0000 @@ -193,7 +193,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover.html 2026-04-20 17:49:00.385808403 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover.html 2026-04-20 17:49:00.389808428 +0000 @@ -1520,7 +1520,7 @@ call is equivalent to analyse('_', coverage, Arg).

        Otherwise Arg is assumed to be a module name, and this call is equivalent to analyse(Arg, coverage, function).

        Note

        To analyze a module whose name overlaps with one the values in analysis() or level(), the module -name has to be in a list. For example, to analyze a module named calls:

        cover:analyse([calls]).
        +name has to be in a list. For example, to analyze a module named calls:

        cover:analyse([calls]).
        @@ -1562,7 +1562,7 @@ analyse(Arg1, Arg2, function).

        If Arg2 is one of the values in level(), Arg1 is assumed to be a module and this call is equivalent to analyse(Arg1, coverage, Arg2).

        Note

        To analyze a module whose name overlaps with one of the values in analysis(), the module name needs to be in a -list. For example, to analyze a module named calls:

        cover:analyse([calls], function).
        +list. For example, to analyze a module named calls:

        cover:analyse([calls], function).
        @@ -1671,7 +1671,7 @@ options, this call is equivalent to analyse_to_file('_', Arg).

        Otherwise Arg is assumed to be a module, and this call is equivalent to analyse_to_file(Arg, []).

        Note

        To analyze a module of the name html (which overlaps with an option in analyse_option()), it is necessary to -use cover:analyse_to_file/2:

        cover:analyse_to_file([html], []).
        +use cover:analyse_to_file/2:

        cover:analyse_to_file([html], []).
        @@ -2664,7 +2664,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover_chapter.html 2026-04-20 17:49:00.437808726 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cover_chapter.html 2026-04-20 17:49:00.429808676 +0000 @@ -92,75 +92,75 @@

        Introduction

        The module cover provides a set of functions for coverage analysis of Erlang programs, counting how many times each executable line is executed.

        Coverage analysis can be used to verify test cases, making sure all relevant -code is covered, and can be helpful when looking for bottlenecks in the code.

        Getting Started With Cover

        Example

        Assume that a test case for the following program should be verified:

        -module(channel).
        --behaviour(gen_server).
        +code is covered, and can be helpful when looking for bottlenecks in the code.

        Getting Started With Cover

        Example

        Assume that a test case for the following program should be verified:

        -module(channel).
        +-behaviour(gen_server).
         
        --export([start_link/0,stop/0]).
        --export([alloc/0,free/1]). % client interface
        --export([init/1,handle_call/3,terminate/2]). % callback functions
        +-export([start_link/0,stop/0]).
        +-export([alloc/0,free/1]). % client interface
        +-export([init/1,handle_call/3,terminate/2]). % callback functions
         
        -start_link() ->
        -    gen_server:start_link({local,channel}, channel, [], []).
        +start_link() ->
        +    gen_server:start_link({local,channel}, channel, [], []).
         
        -stop() ->
        -    gen_server:call(channel, stop).
        +stop() ->
        +    gen_server:call(channel, stop).
         
         %%%-Client interface functions-------------------------------------------
         
        -alloc() ->
        -    gen_server:call(channel, alloc).
        +alloc() ->
        +    gen_server:call(channel, alloc).
         
        -free(Channel) ->
        -    gen_server:call(channel, {free,Channel}).
        +free(Channel) ->
        +    gen_server:call(channel, {free,Channel}).
         
         %%%-gen_server callback functions----------------------------------------
         
        -init(_Arg) ->
        -    {ok,channels()}.
        +init(_Arg) ->
        +    {ok,channels()}.
         
        -handle_call(stop, _Client, Channels) ->
        -    {stop,normal,ok,Channels};
        +handle_call(stop, _Client, Channels) ->
        +    {stop,normal,ok,Channels};
         
        -handle_call(alloc, _Client, Channels) ->
        -    {Ch,Channels2} = alloc(Channels),
        -    {reply,{ok,Ch},Channels2};
        +handle_call(alloc, _Client, Channels) ->
        +    {Ch,Channels2} = alloc(Channels),
        +    {reply,{ok,Ch},Channels2};
         
        -handle_call({free,Channel}, _Client, Channels) ->
        -    Channels2 = free(Channel, Channels),
        -    {reply,ok,Channels2}.
        +handle_call({free,Channel}, _Client, Channels) ->
        +    Channels2 = free(Channel, Channels),
        +    {reply,ok,Channels2}.
         
        -terminate(_Reason, _Channels) ->
        +terminate(_Reason, _Channels) ->
             ok.
         
         %%%-Internal functions---------------------------------------------------
         
        -channels() ->
        -    [ch1,ch2,ch3].
        +channels() ->
        +    [ch1,ch2,ch3].
         
        -alloc([Channel|Channels]) ->
        -    {Channel,Channels};
        -alloc([]) ->
        +alloc([Channel|Channels]) ->
        +    {Channel,Channels};
        +alloc([]) ->
             false.
         
        -free(Channel, Channels) ->
        -    [Channel|Channels].

        The test case is implemented as follows:

        -module(test).
        --export([s/0]).
        -
        -s() ->
        -    {ok,Pid} = channel:start_link(),
        -    {ok,Ch1} = channel:alloc(),
        -    ok = channel:free(Ch1),
        -    ok = channel:stop().

        Preparation

        First of all, Cover must be started. This spawns a process which owns the Cover -database where all coverage data will be stored.

        1> cover:start().
        -{ok,<0.90.0>}

        To include other nodes in the coverage analysis, use +free(Channel, Channels) -> + [Channel|Channels].

        The test case is implemented as follows:

        -module(test).
        +-export([s/0]).
        +
        +s() ->
        +    {ok,Pid} = channel:start_link(),
        +    {ok,Ch1} = channel:alloc(),
        +    ok = channel:free(Ch1),
        +    ok = channel:stop().

        Preparation

        First of all, Cover must be started. This spawns a process which owns the Cover +database where all coverage data will be stored.

        1> cover:start().
        +{ok,<0.90.0>}

        To include other nodes in the coverage analysis, use cover:start/1. All cover-compiled modules will then be loaded on all nodes, and data from all nodes will be summed up when analysing. For simplicity this example only involves the current node.

        Before any analysis can take place, the involved modules must be cover-compiled. This means that some extra information is added to the module before beging compiled into a binary and loaded. The source file of the module is -not affected and no .beam file is created.

        2> cover:compile_module(channel).
        -{ok,channel}

        Each time a function in the cover-compiled module channel is called, +not affected and no .beam file is created.

        2> cover:compile_module(channel).
        +{ok,channel}

        Each time a function in the cover-compiled module channel is called, information about the call will be added to the Cover database. Run the test case:

        3> test:s().
         ok

        Cover analysis is performed by examining the contents of the Cover database. The @@ -172,174 +172,174 @@ {Cov,NotCov}, where Cov is the number of executable lines that have been executed at least once and NotCov is the number of executable lines that have not been executed.

        If the analysis is made on module level, the result is given for the entire -module as a tuple {Module,{Cov,NotCov}}:

        4> cover:analyse(channel, coverage, module).
        -{ok,{channel,{14,1}}}

        For channel, the result shows that 14 lines in the module are covered but one +module as a tuple {Module,{Cov,NotCov}}:

        4> cover:analyse(channel, coverage, module).
        +{ok,{channel,{14,1}}}

        For channel, the result shows that 14 lines in the module are covered but one line is not covered.

        If the analysis is made on function level, the result is given as a list of tuples {Function,{Cov,NotCov}}, one for each function in the module. A -function is specified by its module name, function name and arity:

        5> cover:analyse(channel, coverage, function).
        -{ok,[{{channel,start_link,0},{1,0}},
        -     {{channel,stop,0},{1,0}},
        -     {{channel,alloc,0},{1,0}},
        -     {{channel,free,1},{1,0}},
        -     {{channel,init,1},{1,0}},
        -     {{channel,handle_call,3},{5,0}},
        -     {{channel,terminate,2},{1,0}},
        -     {{channel,channels,0},{1,0}},
        -     {{channel,alloc,1},{1,1}},
        -     {{channel,free,2},{1,0}}]}

        For channel, the result shows that the uncovered line is in the function +function is specified by its module name, function name and arity:

        5> cover:analyse(channel, coverage, function).
        +{ok,[{{channel,start_link,0},{1,0}},
        +     {{channel,stop,0},{1,0}},
        +     {{channel,alloc,0},{1,0}},
        +     {{channel,free,1},{1,0}},
        +     {{channel,init,1},{1,0}},
        +     {{channel,handle_call,3},{5,0}},
        +     {{channel,terminate,2},{1,0}},
        +     {{channel,channels,0},{1,0}},
        +     {{channel,alloc,1},{1,1}},
        +     {{channel,free,2},{1,0}}]}

        For channel, the result shows that the uncovered line is in the function channel:alloc/1.

        If the analysis is made on clause level, the result is given as a list of tuples {Clause,{Cov,NotCov}}, one for each function clause in the module. A clause is specified by its module name, function name, arity and position within the -function definition:

        6> cover:analyse(channel, coverage, clause).
        -{ok,[{{channel,start_link,0,1},{1,0}},
        -     {{channel,stop,0,1},{1,0}},
        -     {{channel,alloc,0,1},{1,0}},
        -     {{channel,free,1,1},{1,0}},
        -     {{channel,init,1,1},{1,0}},
        -     {{channel,handle_call,3,1},{1,0}},
        -     {{channel,handle_call,3,2},{2,0}},
        -     {{channel,handle_call,3,3},{2,0}},
        -     {{channel,terminate,2,1},{1,0}},
        -     {{channel,channels,0,1},{1,0}},
        -     {{channel,alloc,1,1},{1,0}},
        -     {{channel,alloc,1,2},{0,1}},
        -     {{channel,free,2,1},{1,0}}]}

        For channel, the result shows that the uncovered line is in the second clause +function definition:

        6> cover:analyse(channel, coverage, clause).
        +{ok,[{{channel,start_link,0,1},{1,0}},
        +     {{channel,stop,0,1},{1,0}},
        +     {{channel,alloc,0,1},{1,0}},
        +     {{channel,free,1,1},{1,0}},
        +     {{channel,init,1,1},{1,0}},
        +     {{channel,handle_call,3,1},{1,0}},
        +     {{channel,handle_call,3,2},{2,0}},
        +     {{channel,handle_call,3,3},{2,0}},
        +     {{channel,terminate,2,1},{1,0}},
        +     {{channel,channels,0,1},{1,0}},
        +     {{channel,alloc,1,1},{1,0}},
        +     {{channel,alloc,1,2},{0,1}},
        +     {{channel,free,2,1},{1,0}}]}

        For channel, the result shows that the uncovered line is in the second clause of channel:alloc/1.

        Finally, if the analysis is made on line level, the result is given as a list of tuples {Line,{Cov,NotCov}}, one for each executable line in the source code. A -line is specified by its module name and line number.

        7> cover:analyse(channel, coverage, line).
        -{ok,[{{channel,9},{1,0}},
        -     {{channel,12},{1,0}},
        -     {{channel,17},{1,0}},
        -     {{channel,20},{1,0}},
        -     {{channel,25},{1,0}},
        -     {{channel,28},{1,0}},
        -     {{channel,31},{1,0}},
        -     {{channel,32},{1,0}},
        -     {{channel,35},{1,0}},
        -     {{channel,36},{1,0}},
        -     {{channel,39},{1,0}},
        -     {{channel,44},{1,0}},
        -     {{channel,47},{1,0}},
        -     {{channel,49},{0,1}},
        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof.html differs (HTML document, UTF-8 Unicode text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof.html	2026-04-20 17:49:00.481808998 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof.html	2026-04-20 17:49:00.473808949 +0000
        @@ -555,7 +555,7 @@
         
               
         
        -

        Collects and analyses all call counters for module Module.

        This function returns:

        {Module, ModuleCount, FuncAnalysisList}

        where FuncAnalysisList is a list of tuples, one for each function:

        {{Module, FunctionName, Arity}, FuncCallCount}

        If call counters are still running while analyse/0,1,2 is executing, the result +

        Collects and analyses all call counters for module Module.

        This function returns:

        {Module, ModuleCount, FuncAnalysisList}

        where FuncAnalysisList is a list of tuples, one for each function:

        {{Module, FunctionName, Arity}, FuncCallCount}

        If call counters are still running while analyse/0,1,2 is executing, the result could be inconsistent. This happens if the process executing analyse/0,1,2 is scheduled out so some other process can increment the counters that are being analysed. Calling pause() before analysing takes care of @@ -1076,7 +1076,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof_chapter.html 2026-04-20 17:49:00.513809197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/cprof_chapter.html 2026-04-20 17:49:00.513809197 +0000 @@ -114,110 +114,110 @@ cprof itself; the only way to analyze cprof is by specifying it as a single module to analyse.

        Call count tracing is very lightweight compared to other forms of tracing since no trace message has to be generated. Some measurements indicates performance -degradations in the vicinity of 10 percent.

        The following sections show some examples of profiling with cprof.

        Example: Background work

        From the Erlang shell:

        1> cprof:start(), cprof:pause(). % Stop counters just after start
        +degradations in the vicinity of 10 percent.

        The following sections show some examples of profiling with cprof.

        Example: Background work

        From the Erlang shell:

        1> cprof:start(), cprof:pause(). % Stop counters just after start
         8492
        -2> cprof:analyse().
        -{539,
        - [{shell,155,
        -         [{{shell,prep_check,1},55},
        -          {{shell,used_records,4},45},
        -          {{shell,used_records,1},45},
        -          {{shell,used_record_defs,2},1},
        -          {{shell,record_defs,2},1},
        -          {{shell,record_bindings,2},1},
        -          {{shell,exprs,7},1},
        -          {{shell,expr,4},1},
        -          {{shell,expand_records,2},1},
        -          {{shell,check_command,2},1},
        -          {{shell,apply_fun,3},1},
        -          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
        -          {{shell,'-eval_loop/3-fun-0-',3},1}]},
        +2> cprof:analyse().
        +{539,
        + [{shell,155,
        +         [{{shell,prep_check,1},55},
        +          {{shell,used_records,4},45},
        +          {{shell,used_records,1},45},
        +          {{shell,used_record_defs,2},1},
        +          {{shell,record_defs,2},1},
        +          {{shell,record_bindings,2},1},
        +          {{shell,exprs,7},1},
        +          {{shell,expr,4},1},
        +          {{shell,expand_records,2},1},
        +          {{shell,check_command,2},1},
        +          {{shell,apply_fun,3},1},
        +          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
        +          {{shell,'-eval_loop/3-fun-0-',3},1}]},
           %% Information about many modules omitted.
                              .
                              .
                              .
           %% Here is the last part.
        -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
        -  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
        -  {maps,1,[{{maps,from_list,1},1}]},
        -  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
        -3> cprof:analyse(cprof).
        -{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
        -4> cprof:stop().
        +  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
        +  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
        +  {maps,1,[{{maps,from_list,1},1}]},
        +  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
        +3> cprof:analyse(cprof).
        +{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
        +4> cprof:stop().
         8586

        The example showed some of the background work that the shell performs just to interpret the first command line.

        What is captured in this example is the part of the work the shell does while interpreting the command line that occurs between the actual calls to -cprof:start() and cprof:analyse().

        Example: One module

        From the Erlang shell:

        1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
        +cprof:start() and cprof:analyse().

        Example: One module

        From the Erlang shell:

        1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
         1
        -2> cprof:analyse(calendar).
        -{calendar,9,
        -          [{{calendar,last_day_of_the_month1,2},1},
        -           {{calendar,last_day_of_the_month,2},1},
        -           {{calendar,is_leap_year1,1},1},
        -           {{calendar,is_leap_year,1},1},
        -           {{calendar,dy,1},1},
        -           {{calendar,dm,1},1},
        -           {{calendar,df,2},1},
        -           {{calendar,day_of_the_week,3},1},
        -           {{calendar,date_to_gregorian_days,3},1}]}
        -3> cprof:stop().
        +2> cprof:analyse(calendar).
        +{calendar,9,
        +          [{{calendar,last_day_of_the_month1,2},1},
        +           {{calendar,last_day_of_the_month,2},1},
        +           {{calendar,is_leap_year1,1},1},
        +           {{calendar,is_leap_year,1},1},
        +           {{calendar,dy,1},1},
        +           {{calendar,dm,1},1},
        +           {{calendar,df,2},1},
        +           {{calendar,day_of_the_week,3},1},
        +           {{calendar,date_to_gregorian_days,3},1}]}
        +3> cprof:stop().
         8648

        The example tells us that "Aktiebolaget LM Ericsson & Co" was registered on a Monday (since the return value of the first command is 1), and that the calendar module needed 9 function calls to calculate that.

        Using cprof:analyse() in this example also shows approximately the same -background work as in the first example.

        Example: In the code

        Write a module:

        -module(sort).
        --export([do/1]).
        +background work as in the first example.

        Example: In the code

        Write a module:

        -module(sort).
        +-export([do/1]).
         
        -do(N) ->
        -    cprof:stop(),
        -    cprof:start(),
        -    do(N, []).
        -
        -do(0, L) ->
        -    R = lists:sort(L),
        -    cprof:pause(),
        +do(N) ->
        +    cprof:stop(),
        +    cprof:start(),
        +    do(N, []).
        +
        +do(0, L) ->
        +    R = lists:sort(L),
        +    cprof:pause(),
             R;
        -do(N, L) ->
        -    do(N-1, [rand:uniform(256)-1 | L]).

        From the Erlang shell:

        1> c(sort).
        -{ok,sort}
        -2> rand:seed(default, 42), ok.
        +do(N, L) ->
        +    do(N-1, [rand:uniform(256)-1 | L]).

        From the Erlang shell:

        1> c(sort).
        +{ok,sort}
        +2> rand:seed(default, 42), ok.
         ok.
        -3> sort:do(1000).
        -[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
        -4> cprof:analyse().
        -{13180,
        - [{lists,6173,
        -         [{{lists,rmerge3_1,6},1045},
        -          {{lists,rmerge3_2,6},977},
        -          {{lists,split_1,5},652},
        -          {{lists,merge3_1,6},579},
        -          {{lists,merge3_2,6},577},
        -          {{lists,rmerge3_12_3,6},511},
        -          {{lists,split_1_1,6},347},
        -          {{lists,merge3_12_3,6},310},
        -          {{lists,rmerge3_21_3,6},282},
        -          {{lists,merge3_21_3,6},221},
        -          {{lists,merge2_1,4},154},
        -          {{lists,merge2_2,5},138},
        -          {{lists,reverse,2},106},
        -          {{lists,rmerge2_2,5},87},
        -          {{lists,rmergel,2},81},
        -          {{lists,rmerge2_1,4},75},
        -          {{lists,mergel,2},28},
        -          {{lists,keyfind,3},2},
        -          {{lists,sort,1},1}]},
        -  {rand,5000,
        -        [{{rand,uniform_s,2},1000},
        -         {{rand,uniform,1},1000},
        -         {{rand,seed_put,1},1000},
        -         {{rand,seed_get,0},1000},
        -         {{rand,exsss_uniform,2},1000}]},
        -  {erlang,1004,
        -          [{{erlang,put,2},1000},
        -           {{erlang,trace_pattern,3},2},
        -           {{erlang,ensure_tracer_module_loaded,2},2}]},
        -  {sort,1001,[{{sort,do,2},1001}]},
        -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}
        -5> cprof:stop().
        +3> sort:do(1000).
        +[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
        +4> cprof:analyse().
        +{13180,
        + [{lists,6173,
        +         [{{lists,rmerge3_1,6},1045},
        +          {{lists,rmerge3_2,6},977},
        +          {{lists,split_1,5},652},
        +          {{lists,merge3_1,6},579},
        +          {{lists,merge3_2,6},577},
        +          {{lists,rmerge3_12_3,6},511},
        +          {{lists,split_1_1,6},347},
        +          {{lists,merge3_12_3,6},310},
        +          {{lists,rmerge3_21_3,6},282},
        +          {{lists,merge3_21_3,6},221},
        +          {{lists,merge2_1,4},154},
        +          {{lists,merge2_2,5},138},
        +          {{lists,reverse,2},106},
        +          {{lists,rmerge2_2,5},87},
        +          {{lists,rmergel,2},81},
        +          {{lists,rmerge2_1,4},75},
        +          {{lists,mergel,2},28},
        +          {{lists,keyfind,3},2},
        +          {{lists,sort,1},1}]},
        +  {rand,5000,
        +        [{{rand,uniform_s,2},1000},
        +         {{rand,uniform,1},1000},
        +         {{rand,seed_put,1},1000},
        +         {{rand,seed_get,0},1000},
        +         {{rand,exsss_uniform,2},1000}]},
        +  {erlang,1004,
        +          [{{erlang,put,2},1000},
        +           {{erlang,trace_pattern,3},2},
        +           {{erlang,ensure_tracer_module_loaded,2},2}]},
        +  {sort,1001,[{{sort,do,2},1001}]},
        +  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}
        +5> cprof:stop().
         12625

        The example shows some details of how lists:sort/1 works. It used 6173 function calls in module lists to complete the work.

        This time, since the shell was not involved in starting and stopping cprof, no /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/eprof.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/eprof.html 2026-04-20 17:49:00.553809445 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/eprof.html 2026-04-20 17:49:00.553809445 +0000 @@ -976,7 +976,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang-el.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang-el.html 2026-04-20 17:49:00.589809669 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang-el.html 2026-04-20 17:49:00.589809669 +0000 @@ -133,23 +133,23 @@ with almost the same argument as the preceding.

      Edit - Alignment

      • C-c C-a (align-current) - aligns comments, arrows, assignments, and type annotations around the cursor.
      Example:
       
      -sum(L) -> sum(L, 0).
      -sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
      -sum([], Sum) -> Sum.   % base case
      +sum(L) -> sum(L, 0).
      +sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
      +sum([], Sum) -> Sum.   % base case
       
      --record { two :: int(), % hello
      -          three = hello :: string(),    % there
      -          four = 42 :: int() }.
      +-record { two :: int(), % hello
      +          three = hello :: string(),    % there
      +          four = 42 :: int() }.
       
       becomes:
       
      -sum(L) -> sum(L, 0).
      -sum([H|T], Sum) -> sum(T, Sum + H); % recurse
      -sum([], Sum)    -> Sum.             % base case
      +sum(L) -> sum(L, 0).
      +sum([H|T], Sum) -> sum(T, Sum + H); % recurse
      +sum([], Sum)    -> Sum.             % base case
       
      --record { two           :: int(),    % hello
      -          three = hello :: string(), % there
      -          four  = 42    :: int() }.

      Syntax highlighting

      The syntax highlighting can be activated from the Erlang menu. There are four +-record { two :: int(), % hello + three = hello :: string(), % there + four = 42 :: int() }.

    Syntax highlighting

    The syntax highlighting can be activated from the Erlang menu. There are four different alternatives:

    • Off: Normal black and white display.
    • Level 1: Function headers, reserved words, comments, strings, quoted atoms, and character constants will be colored.
    • Level 2: The above, attributes, Erlang bif:s, guards, and words in comments enclosed in single quotes will be colored.
    • Level 3: The above, variables, records, and macros will be colored. (This @@ -230,7 +230,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang_mode_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang_mode_chapter.html 2026-04-20 17:49:00.621809867 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/erlang_mode_chapter.html 2026-04-20 17:49:00.621809867 +0000 @@ -224,7 +224,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof.html 2026-04-20 17:49:00.673810190 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof.html 2026-04-20 17:49:00.673810190 +0000 @@ -134,61 +134,61 @@ interested reader to try it out. Note that some flags to analyse/1 will affect the format.

      The following example was run on Erlang/OTP R8 on Solaris 8; all OTP internals in this example are version dependent.

      As an example, we will use the following function, which is a -slightly modified benchmark function from module file:

      -module(foo).
      --export([create_file_slow/2]).
      +slightly modified benchmark function from module file:

      -module(foo).
      +-export([create_file_slow/2]).
       
      -create_file_slow(Name, N) when is_integer(N), N >= 0 ->
      -    {ok, FD} =
      -        file:open(Name, [raw, write, delayed_write, binary]),
      +create_file_slow(Name, N) when is_integer(N), N >= 0 ->
      +    {ok, FD} =
      +        file:open(Name, [raw, write, delayed_write, binary]),
           if N > 256 ->
      -            ok = file:write(FD,
      -                            lists:map(fun (X) -> <<X:32/unsigned>> end,
      -                            lists:seq(0, 255))),
      -            ok = create_file_slow(FD, 256, N);
      +            ok = file:write(FD,
      +                            lists:map(fun (X) -> <<X:32/unsigned>> end,
      +                            lists:seq(0, 255))),
      +            ok = create_file_slow(FD, 256, N);
              true ->
      -            ok = create_file_slow(FD, 0, N)
      +            ok = create_file_slow(FD, 0, N)
           end,
      -    ok = file:close(FD).
      +    ok = file:close(FD).
       
      -create_file_slow(FD, M, M) ->
      +create_file_slow(FD, M, M) ->
           ok;
      -create_file_slow(FD, M, N) ->
      -    ok = file:write(FD, <<M:32/unsigned>>),
      -    create_file_slow(FD, M+1, N).

      Let us have a look at the printout after running:

      1> fprof:apply(foo, create_file_slow, [junk, 1024]).
      -2> fprof:profile().
      -3> fprof:analyse().

      The printout starts with:

      %% Analysis results:
      -{  analysis_options,
      - [{callers, true},
      -  {sort, acc},
      -  {totals, false},
      -  {details, true}]}.
      +create_file_slow(FD, M, N) ->
      +    ok = file:write(FD, <<M:32/unsigned>>),
      +    create_file_slow(FD, M+1, N).

      Let us have a look at the printout after running:

      1> fprof:apply(foo, create_file_slow, [junk, 1024]).
      +2> fprof:profile().
      +3> fprof:analyse().

      The printout starts with:

      %% Analysis results:
      +{  analysis_options,
      + [{callers, true},
      +  {sort, acc},
      +  {totals, false},
      +  {details, true}]}.
       
       %                                       CNT       ACC       OWN
      -[{ totals,                             9627, 1691.119, 1659.074}].  %%%

      The CNT column shows the total number of function calls that was found in the +[{ totals, 9627, 1691.119, 1659.074}]. %%%

      The CNT column shows the total number of function calls that was found in the trace. In the ACC column is the total time of the trace from first timestamp to last. And in the OWN column is the sum of the execution time in functions found in the trace, not including called functions. In this case it is very close to the ACC time since the emulator had practically nothing to do except executing our test program.

      All time values in the printout are in milliseconds.

      The printout continues:

      %                                       CNT       ACC       OWN
      -[{ "<0.28.0>",                         9627,undefined, 1659.074}].   %%

      This is the printout header of one process. The printout contains only this one +[{ "<0.28.0>", 9627,undefined, 1659.074}]. %%

    This is the printout header of one process. The printout contains only this one process since we called fprof:apply/3 that traces only the current process. Therefore the CNT and OWN columns perfectly matches the totals above. The ACC column is undefined since summing the ACC times of all calls in the process makes no sense — one would get something like the ACC value from totals above multiplied by the average depth of the call stack.

    All paragraphs up to the next process header only concerns function calls within -this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    - { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    - [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    -  {suspend,                               1,    0.000,    0.000}]}.
    -
    -{[{{fprof,apply_start_stop,4},            1, 1691.046,    0.103}],
    - { {foo,create_file_slow,2},              1, 1691.046,    0.103},     %
    - [{{file,close,1},                        1, 1398.873,    0.019},
    -  {{foo,create_file_slow,3},              1,  249.678,    0.029},
    -  {{file,open,2},                         1,   20.778,    0.055},
    -  {{lists,map,2},                         1,   16.590,    0.043},
    -  {{lists,seq,2},                         1,    4.708,    0.017},
    -  {{file,write,2},                        1,    0.316,    0.021}]}.

    The printout consists of one paragraph per called function. The function +this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    + { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    + [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    +  {suspend,                               1,    0.000,    0.000}]}.
    +
    +{[{{fprof,apply_start_stop,4},            1, 1691.046,    0.103}],
    + { {foo,create_file_slow,2},              1, 1691.046,    0.103},     %
    + [{{file,close,1},                        1, 1398.873,    0.019},
    +  {{foo,create_file_slow,3},              1,  249.678,    0.029},
    +  {{file,open,2},                         1,   20.778,    0.055},
    +  {{lists,map,2},                         1,   16.590,    0.043},
    +  {{lists,seq,2},                         1,    4.708,    0.017},
    +  {{file,write,2},                        1,    0.316,    0.021}]}.

    The printout consists of one paragraph per called function. The function marked with % is the one the paragraph concerns — foo:create_file_slow/2. Above the marked function are the calling functions — those that has called the marked, and below are those called by the marked function.

    The paragraphs are per default sorted in descending order of the ACC column for @@ -205,12 +205,12 @@ (lists:seq/2 and lists:map/2).

    The function undefined that has called fprof:apply_start_stop/4 is an unknown function because that call was not recorded in the trace. It was only recorded that the execution returned from fprof:apply_start_stop/4 to some -other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    - { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    - [{{file,write,2},                      768,  220.314,   14.539},
    -  {suspend,                              57,    6.041,    0.000},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that +other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    + { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    + [{{file,write,2},                      768,  220.314,   14.539},
    +  {suspend,                              57,    6.041,    0.000},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that foo:create_file_slow/3 was called only from foo:create_file_slow/2 and itself, and called only file:write/2, note the number of calls to file:write/2. But here we see that suspend was called a few times. This is a @@ -218,88 +218,88 @@ foo:create_file_slow/3, and since there is no receive or erlang:yield/0 in the code, it must be Erlang scheduling suspensions, or the trace file driver compensating for large file write operations (these are regarded as a schedule -out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    -  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    -  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    -  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    -  {{lists,map,2},                        10,    2.104,    0.000},
    -  {{prim_file,write,2},                  17,    1.852,    0.000},
    -  {{erlang,port_command,2},              15,    1.713,    0.000},
    -  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    -  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    -  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    -  {{lists,seq,4},                         3,    0.880,    0.000},
    -  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    -  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    -  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    -  {{prim_file,i32,4},                     1,    0.109,    0.000},
    -  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    - { suspend,                             299,   32.002,    0.000},     %
    - [ ]}.

    We find no particularly long suspend times, so no function seems to have waited +out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    +  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    +  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    +  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    +  {{lists,map,2},                        10,    2.104,    0.000},
    +  {{prim_file,write,2},                  17,    1.852,    0.000},
    +  {{erlang,port_command,2},              15,    1.713,    0.000},
    +  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    +  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    +  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    +  {{lists,seq,4},                         3,    0.880,    0.000},
    +  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    +  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    +  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    +  {{prim_file,i32,4},                     1,    0.109,    0.000},
    +  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    + { suspend,                             299,   32.002,    0.000},     %
    + [ ]}.

    We find no particularly long suspend times, so no function seems to have waited in a receive statement. Actually, prim_file:drv_command/4 contains a receive statement, but in this test program, the message lies in the process receive buffer when the receive statement is entered. We also see that the total suspend time for the test run is small.

    The suspend pseudo function has an OWN time of zero. This is to prevent the process total OWN time from including time in suspension. Whether suspend -time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    -  {{prim_file,write,2},                  16,    0.692,    0.692},
    -  {{lists,map,2},                         2,    0.195,    0.195}],
    - { garbage_collect,                      43,    1.760,    1.760},     %
    - [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like +time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    +  {{prim_file,write,2},                  16,    0.692,    0.692},
    +  {{lists,map,2},                         2,    0.195,    0.195}],
    + { garbage_collect,                      43,    1.760,    1.760},     %
    + [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like suspend, instead it is equal to the ACC time.

    Garbage collection often occurs while a process is suspended, but fprof hides this fact by pretending that the suspended function was first unsuspended and then garbage collected. Otherwise the printout would show garbage_collect being called from suspend, but not which function that might have caused the -garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    -  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    - { {file,write,2},                      769,  220.630,   14.560},     %
    - [{{prim_file,write,2},                 769,  199.789,   22.573},
    -  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from +garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    +  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    + { {file,write,2},                      769,  220.630,   14.560},     %
    + [{{prim_file,write,2},                 769,  199.789,   22.573},
    +  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from foo:create_file_slow/3 and foo:create_file_slow/2. The number of calls in each case as well as the used time are also confirms the previous results.

    We see that file:write/2 only calls prim_file:write/2, but let us refrain from digging into the internals of the kernel application.

    If we nevertheless do dig down we find the call to the linked-in driver -that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    - { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    - [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close +that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    + { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    + [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close operation the absolutely biggest contributor. We find a comparison ratio a -little bit up in the call stack:

    {[{{prim_file,close,1},                   1, 1398.748,    0.024},
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof_chapter.html	2026-04-20 17:49:00.709810413 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/fprof_chapter.html	2026-04-20 17:49:00.709810413 +0000
    @@ -122,10 +122,10 @@
     The tracing has to be stopped at a suitable later time using
     fprof:trace(stop).

    Immediate profiling

    It is also possible to trace immediately into the profiling process that creates the raw profile data, that is to short circuit the tracing and profiling steps -so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    -fprof:trace([start, {tracer, Tracer}]),
    +so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    +fprof:trace([start, {tracer, Tracer}]),
     %% Run code to profile
    -fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime +fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime system.

    @@ -178,7 +178,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt.html 2026-04-20 17:49:00.753810686 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt.html 2026-04-20 17:49:00.753810686 +0000 @@ -1816,7 +1816,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt_chapter.html 2026-04-20 17:49:00.785810884 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/lcnt_chapter.html 2026-04-20 17:49:00.789810909 +0000 @@ -173,20 +173,20 @@ <nonode@nohost.189.0> 5354 0.5230 118 <nonode@nohost.121.0> 5845 0.9239 115 <nonode@nohost.104.0> 5140 0.7782 108 -ok

    Example with Mnesia Transaction Benchmark

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
    +ok

    Example with Mnesia Transaction Benchmark

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
     
    -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    -1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    -    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    -    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
    +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    +1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    +    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    +    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
     ok
    -2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
    +2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
         .
         .
         .
     ignore

    Initial configuring of the benchmark is done. It is time to profile the actual -Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    -    true}|Conf]), Tps/60 end).
    +Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    +    true}|Conf]), Tps/60 end).
           .
           .
           .
    @@ -278,63 +278,63 @@
     However, one should also look for high lock acquisition frequencies (#tries)
     since locks generate overhead and because high frequency could become
     problematic if they begin to have conflicts even if it is not shown in a
    -particular test.

    The Big Bang Benchmark

    -module(big).
    --export([bang/1]).
    +particular test.

    The Big Bang Benchmark

    -module(big).
    +-export([bang/1]).
     
    -pinger([], [], true) ->
    +pinger([], [], true) ->
         receive
    -	{procs, Procs, ReportTo} ->
    -	    pinger(Procs, [], ReportTo)
    +	{procs, Procs, ReportTo} ->
    +	    pinger(Procs, [], ReportTo)
         end;
    -pinger([], [], false) ->
    -    receive {ping, From} -> From ! {pong, self()} end,
    -    pinger([],[],false);
    -pinger([], [], ReportTo) ->
    -    ReportTo ! {done, self()},
    -    pinger([],[],false);
    -pinger([], [Po|Pos] = Pongers, ReportTo) ->
    +pinger([], [], false) ->
    +    receive {ping, From} -> From ! {pong, self()} end,
    +    pinger([],[],false);
    +pinger([], [], ReportTo) ->
    +    ReportTo ! {done, self()},
    +    pinger([],[],false);
    +pinger([], [Po|Pos] = Pongers, ReportTo) ->
         receive
    -	{ping, From} ->
    -	    From ! {pong, self()},
    -	    pinger([], Pongers, ReportTo);
    -	{pong, Po} ->
    -	    pinger([], Pos, ReportTo)
    +	{ping, From} ->
    +	    From ! {pong, self()},
    +	    pinger([], Pongers, ReportTo);
    +	{pong, Po} ->
    +	    pinger([], Pos, ReportTo)
         end;
    -pinger([Pi|Pis], Pongers, ReportTo) ->
    -    receive {ping, From} -> From ! {pong, self()}
    +pinger([Pi|Pis], Pongers, ReportTo) ->
    +    receive {ping, From} -> From ! {pong, self()}
         after 0 -> ok
         end,
    -    Pi ! {ping, self()},
    -    pinger(Pis, [Pi|Pongers], ReportTo).
    +    Pi ! {ping, self()},
    +    pinger(Pis, [Pi|Pongers], ReportTo).
     
    -spawn_procs(N) when N =< 0 ->
    -    [];
    -spawn_procs(N) ->
    -    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
    +spawn_procs(N) when N =< 0 ->
    +    [];
    +spawn_procs(N) ->
    +    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
     
    -send_procs([], Msg) ->
    +send_procs([], Msg) ->
         Msg;
    -send_procs([P|Ps], Msg) ->
    +send_procs([P|Ps], Msg) ->
         P ! Msg,
    -    send_procs(Ps, Msg).
    +    send_procs(Ps, Msg).
     
    -receive_msgs([]) ->
    +receive_msgs([]) ->
         ok;
    -receive_msgs([M|Ms]) ->
    +receive_msgs([M|Ms]) ->
         receive
     	M ->
    -	    receive_msgs(Ms)
    +	    receive_msgs(Ms)
         end.
     
    -bang(N) when integer(N) ->
    -    Procs = spawn_procs(N),
    -    RMsgs = lists:map(fun (P) -> {done, P} end, Procs),
    -    Start = now(),
    -    send_procs(Procs, {procs, Procs, self()}),
    -    receive_msgs(RMsgs),
    -    Stop = now(),
    -    lists:foreach(fun (P) -> exit(P, normal) end, Procs),
    -    timer:now_diff(Stop, Start).

    See Also

    LCNT Reference Manual

    +
    bang(N) when integer(N) -> + Procs = spawn_procs(N), + RMsgs = lists:map(fun (P) -> {done, P} end, Procs), + Start = now(), + send_procs(Procs, {procs, Procs, self()}), + receive_msgs(RMsgs), + Stop = now(), + lists:foreach(fun (P) -> exit(P, normal) end, Procs), + timer:now_diff(Stop, Start).

    See Also

    LCNT Reference Manual

    @@ -386,7 +386,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/make.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/make.html 2026-04-20 17:49:00.821811108 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/make.html 2026-04-20 17:49:00.817811083 +0000 @@ -101,8 +101,8 @@ the first match is used. For example, the following Emakefile means that file1 should be compiled with the options [debug_info,{i,"../foo"}], while all other files in the current directory should be compiled with only the -debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    -{'*',[debug_info]}.

    See Also

    The Compiler Application

    +debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    +{'*',[debug_info]}.

    See Also

    The Compiler Application

    @@ -343,7 +343,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/notes.html 2026-04-20 17:49:00.861811356 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/notes.html 2026-04-20 17:49:00.865811381 +0000 @@ -89,37 +89,37 @@ -

    This document describes the changes made to the Tools application.

    Tools 4.1.4

    Improvements and New Features

    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

      make release_docs places the documentation in the released code under the doc folder.

      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

      Improves the source Software-Bill-of-Materials

      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

      Own Id: OTP-19886 Aux Id: PR-10434

    Tools 4.1.3

    Improvements and New Features

    • Fixed some deprecations for newer emacs versions.

      Own Id: OTP-19726 Aux Id: PR-10106

    Tools 4.1.2

    Fixed Bugs and Malfunctions

    • A crash has been eliminated in tprof:collect/0 when unloading a module while collecting traces.

      Own Id: OTP-19135 Aux Id: GH-8483, PR-8547

    • Improved the indent-region Emacs command, which could indent badly when inside multiline string.

      Own Id: OTP-19396 Aux Id: PR-9186

    • eprof:start_profiling/3 can now return information about which process it failed to trace.

      Own Id: OTP-19419 Aux Id: PR-9219

    • Fixed a race condition when processes cause the Cover server to be started at the same time.

      Own Id: OTP-19517 Aux Id: PR-9124

    • Fix bug in tprof where the session name could not be set.

      Own Id: OTP-19580 Aux Id: PR-9648

    • Add tprof to the .app file.

      Own Id: OTP-19628 Aux Id: PR-9787

    Improvements and New Features

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    Tools 4.1.1

    Fixed Bugs and Malfunctions

    • Fixed some deprecated errors on emacs-29.

      Own Id: OTP-19273 Aux Id: PR-8879

    • The cover tool could sometimes wrongly report lines as uncovered.

      Own Id: OTP-19289 Aux Id: GH-8867, PR-8919

    • Fixed tprof:format(IoDevice, ...) to not demand unicode encoding supported by IoDevice.

      Own Id: OTP-19299 Aux Id: PR-8949

    Tools 4.1

    Fixed Bugs and Malfunctions

    • tprof no longer crashes when using pause/restart/continue when profiling all modules.

      Own Id: OTP-19136 Aux Id: GH-8472, PR-8472, PR-8541

    • On systems supporting native coverage, calls to cover could hang or crash if cover-compiled module had been reloaded from outside cover. This has been corrected so that cover now recovers from the error and and sends a report to the logger about the failure to retrieve coverage information.

      Own Id: OTP-19203 Aux Id: GH-8661, PR-8742

    Improvements and New Features

    • Figures in the documentation have been improved.

      Own Id: OTP-19130 Aux Id: PR-7226

    Tools 4.0

    Fixed Bugs and Malfunctions

    • Dialyzer warnings due to type specs added in dbg have been eliminated.

      Own Id: OTP-18860

    • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

      For example, consider this module:

      -module(foo).
      --export([bar/0, baz/0]).
      +

      This document describes the changes made to the Tools application.

      Tools 4.1.4

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      Tools 4.1.3

      Improvements and New Features

      • Fixed some deprecations for newer emacs versions.

        Own Id: OTP-19726 Aux Id: PR-10106

      Tools 4.1.2

      Fixed Bugs and Malfunctions

      • A crash has been eliminated in tprof:collect/0 when unloading a module while collecting traces.

        Own Id: OTP-19135 Aux Id: GH-8483, PR-8547

      • Improved the indent-region Emacs command, which could indent badly when inside multiline string.

        Own Id: OTP-19396 Aux Id: PR-9186

      • eprof:start_profiling/3 can now return information about which process it failed to trace.

        Own Id: OTP-19419 Aux Id: PR-9219

      • Fixed a race condition when processes cause the Cover server to be started at the same time.

        Own Id: OTP-19517 Aux Id: PR-9124

      • Fix bug in tprof where the session name could not be set.

        Own Id: OTP-19580 Aux Id: PR-9648

      • Add tprof to the .app file.

        Own Id: OTP-19628 Aux Id: PR-9787

      Improvements and New Features

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Tools 4.1.1

      Fixed Bugs and Malfunctions

      • Fixed some deprecated errors on emacs-29.

        Own Id: OTP-19273 Aux Id: PR-8879

      • The cover tool could sometimes wrongly report lines as uncovered.

        Own Id: OTP-19289 Aux Id: GH-8867, PR-8919

      • Fixed tprof:format(IoDevice, ...) to not demand unicode encoding supported by IoDevice.

        Own Id: OTP-19299 Aux Id: PR-8949

      Tools 4.1

      Fixed Bugs and Malfunctions

      • tprof no longer crashes when using pause/restart/continue when profiling all modules.

        Own Id: OTP-19136 Aux Id: GH-8472, PR-8472, PR-8541

      • On systems supporting native coverage, calls to cover could hang or crash if cover-compiled module had been reloaded from outside cover. This has been corrected so that cover now recovers from the error and and sends a report to the logger about the failure to retrieve coverage information.

        Own Id: OTP-19203 Aux Id: GH-8661, PR-8742

      Improvements and New Features

      • Figures in the documentation have been improved.

        Own Id: OTP-19130 Aux Id: PR-7226

      Tools 4.0

      Fixed Bugs and Malfunctions

      • Dialyzer warnings due to type specs added in dbg have been eliminated.

        Own Id: OTP-18860

      • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

        For example, consider this module:

        -module(foo).
        +-export([bar/0, baz/0]).
         
        -bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries -for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries +for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +3> cover:analyse(foo, coverage, line).
        +{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        +4> cover:analyse(foo, calls, line).
        +{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1}]}

        Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

      • Fixed align command in emacs mode.

        Own Id: OTP-19026 Aux Id: PR-8155

      Improvements and New Features

      • Triple-Quoted Strings has been implemented as per EEP 64. See String in the Reference Manual.

        Example:

        1> """
        +3> cover:analyse(foo, coverage, line).
        +{ok,[{{foo,4},{1,0}}]}
        +4> cover:analyse(foo, calls, line).
        +{ok,[{{foo,4},1}]}

        Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

      • Fixed align command in emacs mode.

        Own Id: OTP-19026 Aux Id: PR-8155

      Improvements and New Features

      • Triple-Quoted Strings has been implemented as per EEP 64. See String in the Reference Manual.

        Example:

        1> """
            a
            b
            c
            """.
         "a\nb\nc"

        Adjacent string literals without intervening white space is now a syntax error, to avoid possible confusion with triple-quoted strings. For example:

        1> "abc""xyz".
         "xyz".
        -* 1:6: adjacent string literals without intervening white space

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

      • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

        Example:

        1> tprof:profile(lists, seq, [1, 16], #href_anchor"ss">type => call_memory}).
        +* 1:6: adjacent string literals without intervening white space

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

      • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

        Example:

        1> tprof:profile(lists, seq, [1, 16], #href_anchor"ss">type => call_memory}).
         
         ****** Process <0.92.0>  --  100.00% of total *** 
        -FUNCTION          CALLS  WORDS  PER CALL  [     %]
        -lists:seq_loop/3      5     32      6.40  [100.00]
        -                            32            [ 100.0]
        +FUNCTION          CALLS  WORDS  PER CALL  [     %]
        +lists:seq_loop/3      5     32      6.40  [100.00]
        +                            32            [ 100.0]
         ok

        Own Id: OTP-18756 Aux Id: PR-6639

      • 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

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • Improved the align command in emacs mode.

        Own Id: OTP-19080 Aux Id: PR-8288

      Tools 3.6

      Improvements and New Features

      • Map comprehensions as suggested in EEP 58 has now been implemented.

        Own Id: OTP-18413 Aux Id: EEP-58, PR-6727

      • The instrument module has been moved from tools to runtime_tools.

        Own Id: OTP-18487 Aux Id: PR-6829

      Tools 3.5.3

      Improvements and New Features

      • Removed the previously undocumented and unsupported emem tool.

        Own Id: OTP-17892 Aux Id: PR-5591

      Tools 3.5.2

      Fixed Bugs and Malfunctions

      • Erlang-mode fixed for newer versions of xref using CL-Lib structures instead of EIEIO classes.

        Own Id: OTP-17746 Aux Id: GH-5314, PR-5324

      Tools 3.5.1

      Fixed Bugs and Malfunctions

      • The cover tool would not work on modules compiled with the tuple_calls option.

        Own Id: OTP-17440 Aux Id: GH-4796

      Tools 3.5

      Fixed Bugs and Malfunctions

      • For cover-compiled code, the error behaviour of list and binary comprehensions @@ -390,7 +390,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/search.html 2026-04-20 17:49:00.893811554 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/search.html 2026-04-20 17:49:00.893811554 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tags.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tags.html 2026-04-20 17:49:00.933811802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tags.html 2026-04-20 17:49:00.933811802 +0000 @@ -751,7 +751,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/content.opf 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/content.opf 2042-05-23 04:36:28.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> tools - 4.1.4 - urn:uuid:0cf0558c-9f4a-22f7-0d0f-07b0d491a69b + urn:uuid:c3551c42-f176-c83a-2218-781e55afa790 en - 2026-04-20T15:18:00Z + 2042-05-23T04:36:28Z /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cover_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cover_chapter.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cover_chapter.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -20,75 +20,75 @@

        Introduction

        The module cover provides a set of functions for coverage analysis of Erlang programs, counting how many times each executable line is executed.

        Coverage analysis can be used to verify test cases, making sure all relevant -code is covered, and can be helpful when looking for bottlenecks in the code.

        Getting Started With Cover

        Example

        Assume that a test case for the following program should be verified:

        -module(channel).
        --behaviour(gen_server).
        +code is covered, and can be helpful when looking for bottlenecks in the code.

        Getting Started With Cover

        Example

        Assume that a test case for the following program should be verified:

        -module(channel).
        +-behaviour(gen_server).
         
        --export([start_link/0,stop/0]).
        --export([alloc/0,free/1]). % client interface
        --export([init/1,handle_call/3,terminate/2]). % callback functions
        +-export([start_link/0,stop/0]).
        +-export([alloc/0,free/1]). % client interface
        +-export([init/1,handle_call/3,terminate/2]). % callback functions
         
        -start_link() ->
        -    gen_server:start_link({local,channel}, channel, [], []).
        +start_link() ->
        +    gen_server:start_link({local,channel}, channel, [], []).
         
        -stop() ->
        -    gen_server:call(channel, stop).
        +stop() ->
        +    gen_server:call(channel, stop).
         
         %%%-Client interface functions-------------------------------------------
         
        -alloc() ->
        -    gen_server:call(channel, alloc).
        +alloc() ->
        +    gen_server:call(channel, alloc).
         
        -free(Channel) ->
        -    gen_server:call(channel, {free,Channel}).
        +free(Channel) ->
        +    gen_server:call(channel, {free,Channel}).
         
         %%%-gen_server callback functions----------------------------------------
         
        -init(_Arg) ->
        -    {ok,channels()}.
        +init(_Arg) ->
        +    {ok,channels()}.
         
        -handle_call(stop, _Client, Channels) ->
        -    {stop,normal,ok,Channels};
        +handle_call(stop, _Client, Channels) ->
        +    {stop,normal,ok,Channels};
         
        -handle_call(alloc, _Client, Channels) ->
        -    {Ch,Channels2} = alloc(Channels),
        -    {reply,{ok,Ch},Channels2};
        +handle_call(alloc, _Client, Channels) ->
        +    {Ch,Channels2} = alloc(Channels),
        +    {reply,{ok,Ch},Channels2};
         
        -handle_call({free,Channel}, _Client, Channels) ->
        -    Channels2 = free(Channel, Channels),
        -    {reply,ok,Channels2}.
        +handle_call({free,Channel}, _Client, Channels) ->
        +    Channels2 = free(Channel, Channels),
        +    {reply,ok,Channels2}.
         
        -terminate(_Reason, _Channels) ->
        +terminate(_Reason, _Channels) ->
             ok.
         
         %%%-Internal functions---------------------------------------------------
         
        -channels() ->
        -    [ch1,ch2,ch3].
        +channels() ->
        +    [ch1,ch2,ch3].
         
        -alloc([Channel|Channels]) ->
        -    {Channel,Channels};
        -alloc([]) ->
        +alloc([Channel|Channels]) ->
        +    {Channel,Channels};
        +alloc([]) ->
             false.
         
        -free(Channel, Channels) ->
        -    [Channel|Channels].

        The test case is implemented as follows:

        -module(test).
        --export([s/0]).
        -
        -s() ->
        -    {ok,Pid} = channel:start_link(),
        -    {ok,Ch1} = channel:alloc(),
        -    ok = channel:free(Ch1),
        -    ok = channel:stop().

        Preparation

        First of all, Cover must be started. This spawns a process which owns the Cover -database where all coverage data will be stored.

        1> cover:start().
        -{ok,<0.90.0>}

        To include other nodes in the coverage analysis, use +free(Channel, Channels) -> + [Channel|Channels].

        The test case is implemented as follows:

        -module(test).
        +-export([s/0]).
        +
        +s() ->
        +    {ok,Pid} = channel:start_link(),
        +    {ok,Ch1} = channel:alloc(),
        +    ok = channel:free(Ch1),
        +    ok = channel:stop().

        Preparation

        First of all, Cover must be started. This spawns a process which owns the Cover +database where all coverage data will be stored.

        1> cover:start().
        +{ok,<0.90.0>}

        To include other nodes in the coverage analysis, use cover:start/1. All cover-compiled modules will then be loaded on all nodes, and data from all nodes will be summed up when analysing. For simplicity this example only involves the current node.

        Before any analysis can take place, the involved modules must be cover-compiled. This means that some extra information is added to the module before beging compiled into a binary and loaded. The source file of the module is -not affected and no .beam file is created.

        2> cover:compile_module(channel).
        -{ok,channel}

        Each time a function in the cover-compiled module channel is called, +not affected and no .beam file is created.

        2> cover:compile_module(channel).
        +{ok,channel}

        Each time a function in the cover-compiled module channel is called, information about the call will be added to the Cover database. Run the test case:

        3> test:s().
         ok

        Cover analysis is performed by examining the contents of the Cover database. The @@ -100,174 +100,174 @@ {Cov,NotCov}, where Cov is the number of executable lines that have been executed at least once and NotCov is the number of executable lines that have not been executed.

        If the analysis is made on module level, the result is given for the entire -module as a tuple {Module,{Cov,NotCov}}:

        4> cover:analyse(channel, coverage, module).
        -{ok,{channel,{14,1}}}

        For channel, the result shows that 14 lines in the module are covered but one +module as a tuple {Module,{Cov,NotCov}}:

        4> cover:analyse(channel, coverage, module).
        +{ok,{channel,{14,1}}}

        For channel, the result shows that 14 lines in the module are covered but one line is not covered.

        If the analysis is made on function level, the result is given as a list of tuples {Function,{Cov,NotCov}}, one for each function in the module. A -function is specified by its module name, function name and arity:

        5> cover:analyse(channel, coverage, function).
        -{ok,[{{channel,start_link,0},{1,0}},
        -     {{channel,stop,0},{1,0}},
        -     {{channel,alloc,0},{1,0}},
        -     {{channel,free,1},{1,0}},
        -     {{channel,init,1},{1,0}},
        -     {{channel,handle_call,3},{5,0}},
        -     {{channel,terminate,2},{1,0}},
        -     {{channel,channels,0},{1,0}},
        -     {{channel,alloc,1},{1,1}},
        -     {{channel,free,2},{1,0}}]}

        For channel, the result shows that the uncovered line is in the function +function is specified by its module name, function name and arity:

        5> cover:analyse(channel, coverage, function).
        +{ok,[{{channel,start_link,0},{1,0}},
        +     {{channel,stop,0},{1,0}},
        +     {{channel,alloc,0},{1,0}},
        +     {{channel,free,1},{1,0}},
        +     {{channel,init,1},{1,0}},
        +     {{channel,handle_call,3},{5,0}},
        +     {{channel,terminate,2},{1,0}},
        +     {{channel,channels,0},{1,0}},
        +     {{channel,alloc,1},{1,1}},
        +     {{channel,free,2},{1,0}}]}

        For channel, the result shows that the uncovered line is in the function channel:alloc/1.

        If the analysis is made on clause level, the result is given as a list of tuples {Clause,{Cov,NotCov}}, one for each function clause in the module. A clause is specified by its module name, function name, arity and position within the -function definition:

        6> cover:analyse(channel, coverage, clause).
        -{ok,[{{channel,start_link,0,1},{1,0}},
        -     {{channel,stop,0,1},{1,0}},
        -     {{channel,alloc,0,1},{1,0}},
        -     {{channel,free,1,1},{1,0}},
        -     {{channel,init,1,1},{1,0}},
        -     {{channel,handle_call,3,1},{1,0}},
        -     {{channel,handle_call,3,2},{2,0}},
        -     {{channel,handle_call,3,3},{2,0}},
        -     {{channel,terminate,2,1},{1,0}},
        -     {{channel,channels,0,1},{1,0}},
        -     {{channel,alloc,1,1},{1,0}},
        -     {{channel,alloc,1,2},{0,1}},
        -     {{channel,free,2,1},{1,0}}]}

        For channel, the result shows that the uncovered line is in the second clause +function definition:

        6> cover:analyse(channel, coverage, clause).
        +{ok,[{{channel,start_link,0,1},{1,0}},
        +     {{channel,stop,0,1},{1,0}},
        +     {{channel,alloc,0,1},{1,0}},
        +     {{channel,free,1,1},{1,0}},
        +     {{channel,init,1,1},{1,0}},
        +     {{channel,handle_call,3,1},{1,0}},
        +     {{channel,handle_call,3,2},{2,0}},
        +     {{channel,handle_call,3,3},{2,0}},
        +     {{channel,terminate,2,1},{1,0}},
        +     {{channel,channels,0,1},{1,0}},
        +     {{channel,alloc,1,1},{1,0}},
        +     {{channel,alloc,1,2},{0,1}},
        +     {{channel,free,2,1},{1,0}}]}

        For channel, the result shows that the uncovered line is in the second clause of channel:alloc/1.

        Finally, if the analysis is made on line level, the result is given as a list of tuples {Line,{Cov,NotCov}}, one for each executable line in the source code. A -line is specified by its module name and line number.

        7> cover:analyse(channel, coverage, line).
        -{ok,[{{channel,9},{1,0}},
        -     {{channel,12},{1,0}},
        -     {{channel,17},{1,0}},
        -     {{channel,20},{1,0}},
        -     {{channel,25},{1,0}},
        -     {{channel,28},{1,0}},
        -     {{channel,31},{1,0}},
        -     {{channel,32},{1,0}},
        -     {{channel,35},{1,0}},
        -     {{channel,36},{1,0}},
        -     {{channel,39},{1,0}},
        -     {{channel,44},{1,0}},
        -     {{channel,47},{1,0}},
        -     {{channel,49},{0,1}},
        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cover.xhtml differs (HTML document, ASCII text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cover.xhtml	2026-04-20 15:18:01.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cover.xhtml	2042-05-23 04:36:28.000000000 +0000
        @@ -1433,7 +1433,7 @@
         call is equivalent to analyse('_', coverage, Arg).

        Otherwise Arg is assumed to be a module name, and this call is equivalent to analyse(Arg, coverage, function).

        Note

        To analyze a module whose name overlaps with one the values in analysis() or level(), the module -name has to be in a list. For example, to analyze a module named calls:

        cover:analyse([calls]).
        +name has to be in a list. For example, to analyze a module named calls:

        cover:analyse([calls]).
        @@ -1475,7 +1475,7 @@ analyse(Arg1, Arg2, function).

        If Arg2 is one of the values in level(), Arg1 is assumed to be a module and this call is equivalent to analyse(Arg1, coverage, Arg2).

        Note

        To analyze a module whose name overlaps with one of the values in analysis(), the module name needs to be in a -list. For example, to analyze a module named calls:

        cover:analyse([calls], function).
        +list. For example, to analyze a module named calls:

        cover:analyse([calls], function).
        @@ -1584,7 +1584,7 @@ options, this call is equivalent to analyse_to_file('_', Arg).

        Otherwise Arg is assumed to be a module, and this call is equivalent to analyse_to_file(Arg, []).

        Note

        To analyze a module of the name html (which overlaps with an option in analyse_option()), it is necessary to -use cover:analyse_to_file/2:

        cover:analyse_to_file([html], []).
        +use cover:analyse_to_file/2:

        cover:analyse_to_file([html], []).
        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -42,110 +42,110 @@ cprof itself; the only way to analyze cprof is by specifying it as a single module to analyse.

        Call count tracing is very lightweight compared to other forms of tracing since no trace message has to be generated. Some measurements indicates performance -degradations in the vicinity of 10 percent.

        The following sections show some examples of profiling with cprof.

        Example: Background work

        From the Erlang shell:

        1> cprof:start(), cprof:pause(). % Stop counters just after start
        +degradations in the vicinity of 10 percent.

        The following sections show some examples of profiling with cprof.

        Example: Background work

        From the Erlang shell:

        1> cprof:start(), cprof:pause(). % Stop counters just after start
         8492
        -2> cprof:analyse().
        -{539,
        - [{shell,155,
        -         [{{shell,prep_check,1},55},
        -          {{shell,used_records,4},45},
        -          {{shell,used_records,1},45},
        -          {{shell,used_record_defs,2},1},
        -          {{shell,record_defs,2},1},
        -          {{shell,record_bindings,2},1},
        -          {{shell,exprs,7},1},
        -          {{shell,expr,4},1},
        -          {{shell,expand_records,2},1},
        -          {{shell,check_command,2},1},
        -          {{shell,apply_fun,3},1},
        -          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
        -          {{shell,'-eval_loop/3-fun-0-',3},1}]},
        +2> cprof:analyse().
        +{539,
        + [{shell,155,
        +         [{{shell,prep_check,1},55},
        +          {{shell,used_records,4},45},
        +          {{shell,used_records,1},45},
        +          {{shell,used_record_defs,2},1},
        +          {{shell,record_defs,2},1},
        +          {{shell,record_bindings,2},1},
        +          {{shell,exprs,7},1},
        +          {{shell,expr,4},1},
        +          {{shell,expand_records,2},1},
        +          {{shell,check_command,2},1},
        +          {{shell,apply_fun,3},1},
        +          {{shell,'-exprs/7-lc$^0/1-0-',1},1},
        +          {{shell,'-eval_loop/3-fun-0-',3},1}]},
           %% Information about many modules omitted.
                              .
                              .
                              .
           %% Here is the last part.
        -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
        -  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
        -  {maps,1,[{{maps,from_list,1},1}]},
        -  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
        -3> cprof:analyse(cprof).
        -{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
        -4> cprof:stop().
        +  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]},
        +  {otp_internal,1,[{{otp_internal,obsolete,3},1}]},
        +  {maps,1,[{{maps,from_list,1},1}]},
        +  {erl_internal,1,[{{erl_internal,bif,3},1}]}]}
        +3> cprof:analyse(cprof).
        +{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
        +4> cprof:stop().
         8586

        The example showed some of the background work that the shell performs just to interpret the first command line.

        What is captured in this example is the part of the work the shell does while interpreting the command line that occurs between the actual calls to -cprof:start() and cprof:analyse().

        Example: One module

        From the Erlang shell:

        1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
        +cprof:start() and cprof:analyse().

        Example: One module

        From the Erlang shell:

        1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
         1
        -2> cprof:analyse(calendar).
        -{calendar,9,
        -          [{{calendar,last_day_of_the_month1,2},1},
        -           {{calendar,last_day_of_the_month,2},1},
        -           {{calendar,is_leap_year1,1},1},
        -           {{calendar,is_leap_year,1},1},
        -           {{calendar,dy,1},1},
        -           {{calendar,dm,1},1},
        -           {{calendar,df,2},1},
        -           {{calendar,day_of_the_week,3},1},
        -           {{calendar,date_to_gregorian_days,3},1}]}
        -3> cprof:stop().
        +2> cprof:analyse(calendar).
        +{calendar,9,
        +          [{{calendar,last_day_of_the_month1,2},1},
        +           {{calendar,last_day_of_the_month,2},1},
        +           {{calendar,is_leap_year1,1},1},
        +           {{calendar,is_leap_year,1},1},
        +           {{calendar,dy,1},1},
        +           {{calendar,dm,1},1},
        +           {{calendar,df,2},1},
        +           {{calendar,day_of_the_week,3},1},
        +           {{calendar,date_to_gregorian_days,3},1}]}
        +3> cprof:stop().
         8648

        The example tells us that "Aktiebolaget LM Ericsson & Co" was registered on a Monday (since the return value of the first command is 1), and that the calendar module needed 9 function calls to calculate that.

        Using cprof:analyse() in this example also shows approximately the same -background work as in the first example.

        Example: In the code

        Write a module:

        -module(sort).
        --export([do/1]).
        +background work as in the first example.

        Example: In the code

        Write a module:

        -module(sort).
        +-export([do/1]).
         
        -do(N) ->
        -    cprof:stop(),
        -    cprof:start(),
        -    do(N, []).
        +do(N) ->
        +    cprof:stop(),
        +    cprof:start(),
        +    do(N, []).
         
        -do(0, L) ->
        -    R = lists:sort(L),
        -    cprof:pause(),
        +do(0, L) ->
        +    R = lists:sort(L),
        +    cprof:pause(),
             R;
        -do(N, L) ->
        -    do(N-1, [rand:uniform(256)-1 | L]).

        From the Erlang shell:

        1> c(sort).
        -{ok,sort}
        -2> rand:seed(default, 42), ok.
        +do(N, L) ->
        +    do(N-1, [rand:uniform(256)-1 | L]).

        From the Erlang shell:

        1> c(sort).
        +{ok,sort}
        +2> rand:seed(default, 42), ok.
         ok.
        -3> sort:do(1000).
        -[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
        -4> cprof:analyse().
        -{13180,
        - [{lists,6173,
        -         [{{lists,rmerge3_1,6},1045},
        -          {{lists,rmerge3_2,6},977},
        -          {{lists,split_1,5},652},
        -          {{lists,merge3_1,6},579},
        -          {{lists,merge3_2,6},577},
        -          {{lists,rmerge3_12_3,6},511},
        -          {{lists,split_1_1,6},347},
        -          {{lists,merge3_12_3,6},310},
        -          {{lists,rmerge3_21_3,6},282},
        -          {{lists,merge3_21_3,6},221},
        -          {{lists,merge2_1,4},154},
        -          {{lists,merge2_2,5},138},
        -          {{lists,reverse,2},106},
        -          {{lists,rmerge2_2,5},87},
        -          {{lists,rmergel,2},81},
        -          {{lists,rmerge2_1,4},75},
        -          {{lists,mergel,2},28},
        -          {{lists,keyfind,3},2},
        -          {{lists,sort,1},1}]},
        -  {rand,5000,
        -        [{{rand,uniform_s,2},1000},
        -         {{rand,uniform,1},1000},
        -         {{rand,seed_put,1},1000},
        -         {{rand,seed_get,0},1000},
        -         {{rand,exsss_uniform,2},1000}]},
        -  {erlang,1004,
        -          [{{erlang,put,2},1000},
        -           {{erlang,trace_pattern,3},2},
        -           {{erlang,ensure_tracer_module_loaded,2},2}]},
        -  {sort,1001,[{{sort,do,2},1001}]},
        -  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}
        -5> cprof:stop().
        +3> sort:do(1000).
        +[0,0,0,1,1,1,1,2,2,3,3,4,4,4,4,5,5,5,6,6,6,6,7,7,7,7,7,8,8|...]
        +4> cprof:analyse().
        +{13180,
        + [{lists,6173,
        +         [{{lists,rmerge3_1,6},1045},
        +          {{lists,rmerge3_2,6},977},
        +          {{lists,split_1,5},652},
        +          {{lists,merge3_1,6},579},
        +          {{lists,merge3_2,6},577},
        +          {{lists,rmerge3_12_3,6},511},
        +          {{lists,split_1_1,6},347},
        +          {{lists,merge3_12_3,6},310},
        +          {{lists,rmerge3_21_3,6},282},
        +          {{lists,merge3_21_3,6},221},
        +          {{lists,merge2_1,4},154},
        +          {{lists,merge2_2,5},138},
        +          {{lists,reverse,2},106},
        +          {{lists,rmerge2_2,5},87},
        +          {{lists,rmergel,2},81},
        +          {{lists,rmerge2_1,4},75},
        +          {{lists,mergel,2},28},
        +          {{lists,keyfind,3},2},
        +          {{lists,sort,1},1}]},
        +  {rand,5000,
        +        [{{rand,uniform_s,2},1000},
        +         {{rand,uniform,1},1000},
        +         {{rand,seed_put,1},1000},
        +         {{rand,seed_get,0},1000},
        +         {{rand,exsss_uniform,2},1000}]},
        +  {erlang,1004,
        +          [{{erlang,put,2},1000},
        +           {{erlang,trace_pattern,3},2},
        +           {{erlang,ensure_tracer_module_loaded,2},2}]},
        +  {sort,1001,[{{sort,do,2},1001}]},
        +  {erts_internal,2,[{{erts_internal,trace_pattern,3},2}]}]}
        +5> cprof:stop().
         12625

        The example shows some details of how lists:sort/1 works. It used 6173 function calls in module lists to complete the work.

        This time, since the shell was not involved in starting and stopping cprof, no other work was done in the system during the profiling.

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cprof.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cprof.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/cprof.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -468,7 +468,7 @@ -

        Collects and analyses all call counters for module Module.

        This function returns:

        {Module, ModuleCount, FuncAnalysisList}

        where FuncAnalysisList is a list of tuples, one for each function:

        {{Module, FunctionName, Arity}, FuncCallCount}

        If call counters are still running while analyse/0,1,2 is executing, the result +

        Collects and analyses all call counters for module Module.

        This function returns:

        {Module, ModuleCount, FuncAnalysisList}

        where FuncAnalysisList is a list of tuples, one for each function:

        {{Module, FunctionName, Arity}, FuncCallCount}

        If call counters are still running while analyse/0,1,2 is executing, the result could be inconsistent. This happens if the process executing analyse/0,1,2 is scheduled out so some other process can increment the counters that are being analysed. Calling pause() before analysing takes care of /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/erlang-el.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/erlang-el.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/erlang-el.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -61,23 +61,23 @@ with almost the same argument as the preceding.

      Edit - Alignment

      • C-c C-a (align-current) - aligns comments, arrows, assignments, and type annotations around the cursor.
      Example:
       
      -sum(L) -> sum(L, 0).
      -sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
      -sum([], Sum) -> Sum.   % base case
      +sum(L) -> sum(L, 0).
      +sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
      +sum([], Sum) -> Sum.   % base case
       
      --record { two :: int(), % hello
      -          three = hello :: string(),    % there
      -          four = 42 :: int() }.
      +-record { two :: int(), % hello
      +          three = hello :: string(),    % there
      +          four = 42 :: int() }.
       
       becomes:
       
      -sum(L) -> sum(L, 0).
      -sum([H|T], Sum) -> sum(T, Sum + H); % recurse
      -sum([], Sum)    -> Sum.             % base case
      +sum(L) -> sum(L, 0).
      +sum([H|T], Sum) -> sum(T, Sum + H); % recurse
      +sum([], Sum)    -> Sum.             % base case
       
      --record { two           :: int(),    % hello
      -          three = hello :: string(), % there
      -          four  = 42    :: int() }.

      Syntax highlighting

      The syntax highlighting can be activated from the Erlang menu. There are four +-record { two :: int(), % hello + three = hello :: string(), % there + four = 42 :: int() }.

      Syntax highlighting

      The syntax highlighting can be activated from the Erlang menu. There are four different alternatives:

      • Off: Normal black and white display.
      • Level 1: Function headers, reserved words, comments, strings, quoted atoms, and character constants will be colored.
      • Level 2: The above, attributes, Erlang bif:s, guards, and words in comments enclosed in single quotes will be colored.
      • Level 3: The above, variables, records, and macros will be colored. (This /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -50,10 +50,10 @@ The tracing has to be stopped at a suitable later time using fprof:trace(stop).

        Immediate profiling

        It is also possible to trace immediately into the profiling process that creates the raw profile data, that is to short circuit the tracing and profiling steps -so that the filesystem is not used for tracing.

        Do something like this:

        {ok, Tracer} = fprof:profile(start),
        -fprof:trace([start, {tracer, Tracer}]),
        +so that the filesystem is not used for tracing.

        Do something like this:

        {ok, Tracer} = fprof:profile(start),
        +fprof:trace([start, {tracer, Tracer}]),
         %% Run code to profile
        -fprof:trace(stop);

        This puts less load on the filesystem, but much more load on the Erlang runtime +fprof:trace(stop);

        This puts less load on the filesystem, but much more load on the Erlang runtime system.

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/fprof.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/fprof.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/fprof.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -63,61 +63,61 @@ interested reader to try it out. Note that some flags to analyse/1 will affect the format.

        The following example was run on Erlang/OTP R8 on Solaris 8; all OTP internals in this example are version dependent.

        As an example, we will use the following function, which is a -slightly modified benchmark function from module file:

        -module(foo).
        --export([create_file_slow/2]).
        +slightly modified benchmark function from module file:

        -module(foo).
        +-export([create_file_slow/2]).
         
        -create_file_slow(Name, N) when is_integer(N), N >= 0 ->
        -    {ok, FD} =
        -        file:open(Name, [raw, write, delayed_write, binary]),
        +create_file_slow(Name, N) when is_integer(N), N >= 0 ->
        +    {ok, FD} =
        +        file:open(Name, [raw, write, delayed_write, binary]),
             if N > 256 ->
        -            ok = file:write(FD,
        -                            lists:map(fun (X) -> <<X:32/unsigned>> end,
        -                            lists:seq(0, 255))),
        -            ok = create_file_slow(FD, 256, N);
        +            ok = file:write(FD,
        +                            lists:map(fun (X) -> <<X:32/unsigned>> end,
        +                            lists:seq(0, 255))),
        +            ok = create_file_slow(FD, 256, N);
                true ->
        -            ok = create_file_slow(FD, 0, N)
        +            ok = create_file_slow(FD, 0, N)
             end,
        -    ok = file:close(FD).
        +    ok = file:close(FD).
         
        -create_file_slow(FD, M, M) ->
        +create_file_slow(FD, M, M) ->
             ok;
        -create_file_slow(FD, M, N) ->
        -    ok = file:write(FD, <<M:32/unsigned>>),
        -    create_file_slow(FD, M+1, N).

        Let us have a look at the printout after running:

        1> fprof:apply(foo, create_file_slow, [junk, 1024]).
        -2> fprof:profile().
        -3> fprof:analyse().

        The printout starts with:

        %% Analysis results:
        -{  analysis_options,
        - [{callers, true},
        -  {sort, acc},
        -  {totals, false},
        -  {details, true}]}.
        +create_file_slow(FD, M, N) ->
        +    ok = file:write(FD, <<M:32/unsigned>>),
        +    create_file_slow(FD, M+1, N).

        Let us have a look at the printout after running:

        1> fprof:apply(foo, create_file_slow, [junk, 1024]).
        +2> fprof:profile().
        +3> fprof:analyse().

        The printout starts with:

        %% Analysis results:
        +{  analysis_options,
        + [{callers, true},
        +  {sort, acc},
        +  {totals, false},
        +  {details, true}]}.
         
         %                                       CNT       ACC       OWN
        -[{ totals,                             9627, 1691.119, 1659.074}].  %%%

        The CNT column shows the total number of function calls that was found in the +[{ totals, 9627, 1691.119, 1659.074}]. %%%

        The CNT column shows the total number of function calls that was found in the trace. In the ACC column is the total time of the trace from first timestamp to last. And in the OWN column is the sum of the execution time in functions found in the trace, not including called functions. In this case it is very close to the ACC time since the emulator had practically nothing to do except executing our test program.

        All time values in the printout are in milliseconds.

        The printout continues:

        %                                       CNT       ACC       OWN
        -[{ "<0.28.0>",                         9627,undefined, 1659.074}].   %%

        This is the printout header of one process. The printout contains only this one +[{ "<0.28.0>", 9627,undefined, 1659.074}]. %%

    This is the printout header of one process. The printout contains only this one process since we called fprof:apply/3 that traces only the current process. Therefore the CNT and OWN columns perfectly matches the totals above. The ACC column is undefined since summing the ACC times of all calls in the process makes no sense — one would get something like the ACC value from totals above multiplied by the average depth of the call stack.

    All paragraphs up to the next process header only concerns function calls within -this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    - { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    - [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    -  {suspend,                               1,    0.000,    0.000}]}.
    +this process.

    Now we come to something more interesting:

    {[{undefined,                             0, 1691.076,    0.030}],
    + { {fprof,apply_start_stop,4},            0, 1691.076,    0.030},     %
    + [{{foo,create_file_slow,2},              1, 1691.046,    0.103},
    +  {suspend,                               1,    0.000,    0.000}]}.
     
    -{[{{fprof,apply_start_stop,4},            1, 1691.046,    0.103}],
    - { {foo,create_file_slow,2},              1, 1691.046,    0.103},     %
    - [{{file,close,1},                        1, 1398.873,    0.019},
    -  {{foo,create_file_slow,3},              1,  249.678,    0.029},
    -  {{file,open,2},                         1,   20.778,    0.055},
    -  {{lists,map,2},                         1,   16.590,    0.043},
    -  {{lists,seq,2},                         1,    4.708,    0.017},
    -  {{file,write,2},                        1,    0.316,    0.021}]}.

    The printout consists of one paragraph per called function. The function +{[{{fprof,apply_start_stop,4}, 1, 1691.046, 0.103}], + { {foo,create_file_slow,2}, 1, 1691.046, 0.103}, % + [{{file,close,1}, 1, 1398.873, 0.019}, + {{foo,create_file_slow,3}, 1, 249.678, 0.029}, + {{file,open,2}, 1, 20.778, 0.055}, + {{lists,map,2}, 1, 16.590, 0.043}, + {{lists,seq,2}, 1, 4.708, 0.017}, + {{file,write,2}, 1, 0.316, 0.021}]}.

    The printout consists of one paragraph per called function. The function marked with % is the one the paragraph concerns — foo:create_file_slow/2. Above the marked function are the calling functions — those that has called the marked, and below are those called by the marked function.

    The paragraphs are per default sorted in descending order of the ACC column for @@ -134,12 +134,12 @@ (lists:seq/2 and lists:map/2).

    The function undefined that has called fprof:apply_start_stop/4 is an unknown function because that call was not recorded in the trace. It was only recorded that the execution returned from fprof:apply_start_stop/4 to some -other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    - { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    - [{{file,write,2},                      768,  220.314,   14.539},
    -  {suspend,                              57,    6.041,    0.000},
    -  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that +other function above in the call stack, or that the process exited from there.

    Let us continue down the printout to find:

    {[{{foo,create_file_slow,2},              1,  249.678,    0.029},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}],
    + { {foo,create_file_slow,3},            769,  249.678,   23.323},     %
    + [{{file,write,2},                      768,  220.314,   14.539},
    +  {suspend,                              57,    6.041,    0.000},
    +  {{foo,create_file_slow,3},            768,    0.000,   23.294}]}.

    If you compare with the code you will see there also that foo:create_file_slow/3 was called only from foo:create_file_slow/2 and itself, and called only file:write/2, note the number of calls to file:write/2. But here we see that suspend was called a few times. This is a @@ -147,88 +147,88 @@ foo:create_file_slow/3, and since there is no receive or erlang:yield/0 in the code, it must be Erlang scheduling suspensions, or the trace file driver compensating for large file write operations (these are regarded as a schedule -out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    -  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    -  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    -  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    -  {{lists,map,2},                        10,    2.104,    0.000},
    -  {{prim_file,write,2},                  17,    1.852,    0.000},
    -  {{erlang,port_command,2},              15,    1.713,    0.000},
    -  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    -  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    -  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    -  {{lists,seq,4},                         3,    0.880,    0.000},
    -  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    -  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    -  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    -  {{prim_file,i32,4},                     1,    0.109,    0.000},
    -  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    - { suspend,                             299,   32.002,    0.000},     %
    - [ ]}.

    We find no particularly long suspend times, so no function seems to have waited +out followed by a schedule in to the same process).

    Let us find the suspend entry:

    {[{{file,write,2},                       53,    6.281,    0.000},
    +  {{foo,create_file_slow,3},             57,    6.041,    0.000},
    +  {{prim_file,drv_command,4},            50,    4.582,    0.000},
    +  {{prim_file,drv_get_response,1},       34,    2.986,    0.000},
    +  {{lists,map,2},                        10,    2.104,    0.000},
    +  {{prim_file,write,2},                  17,    1.852,    0.000},
    +  {{erlang,port_command,2},              15,    1.713,    0.000},
    +  {{prim_file,drv_command,2},            22,    1.482,    0.000},
    +  {{prim_file,translate_response,2},     11,    1.441,    0.000},
    +  {{prim_file,'-drv_command/2-fun-0-',1},  15,    1.340,    0.000},
    +  {{lists,seq,4},                         3,    0.880,    0.000},
    +  {{foo,'-create_file_slow/2-fun-0-',1},   5,    0.523,    0.000},
    +  {{erlang,bump_reductions,1},            4,    0.503,    0.000},
    +  {{prim_file,open_int_setopts,3},        1,    0.165,    0.000},
    +  {{prim_file,i32,4},                     1,    0.109,    0.000},
    +  {{fprof,apply_start_stop,4},            1,    0.000,    0.000}],
    + { suspend,                             299,   32.002,    0.000},     %
    + [ ]}.

    We find no particularly long suspend times, so no function seems to have waited in a receive statement. Actually, prim_file:drv_command/4 contains a receive statement, but in this test program, the message lies in the process receive buffer when the receive statement is entered. We also see that the total suspend time for the test run is small.

    The suspend pseudo function has an OWN time of zero. This is to prevent the process total OWN time from including time in suspension. Whether suspend -time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    -  {{prim_file,write,2},                  16,    0.692,    0.692},
    -  {{lists,map,2},                         2,    0.195,    0.195}],
    - { garbage_collect,                      43,    1.760,    1.760},     %
    - [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like +time is really ACC or OWN time is more of a philosophical question.

    Now we look at another interesting pseudo function, garbage_collect:

    {[{{prim_file,drv_command,4},            25,    0.873,    0.873},
    +  {{prim_file,write,2},                  16,    0.692,    0.692},
    +  {{lists,map,2},                         2,    0.195,    0.195}],
    + { garbage_collect,                      43,    1.760,    1.760},     %
    + [ ]}.

    Here we see that no function stands out, which is very normal.

    The garbage_collect pseudo function has not an OWN time of zero like suspend, instead it is equal to the ACC time.

    Garbage collection often occurs while a process is suspended, but fprof hides this fact by pretending that the suspended function was first unsuspended and then garbage collected. Otherwise the printout would show garbage_collect being called from suspend, but not which function that might have caused the -garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    -  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    - { {file,write,2},                      769,  220.630,   14.560},     %
    - [{{prim_file,write,2},                 769,  199.789,   22.573},
    -  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from +garbage collection.

    Let us now get back to the test code:

    {[{{foo,create_file_slow,3},            768,  220.314,   14.539},
    +  {{foo,create_file_slow,2},              1,    0.316,    0.021}],
    + { {file,write,2},                      769,  220.630,   14.560},     %
    + [{{prim_file,write,2},                 769,  199.789,   22.573},
    +  {suspend,                              53,    6.281,    0.000}]}.

    Not unexpectedly, we see that file:write/2 was called from foo:create_file_slow/3 and foo:create_file_slow/2. The number of calls in each case as well as the used time are also confirms the previous results.

    We see that file:write/2 only calls prim_file:write/2, but let us refrain from digging into the internals of the kernel application.

    If we nevertheless do dig down we find the call to the linked-in driver -that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    - { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    - [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close +that does the file operations towards the host operating system:

    {[{{prim_file,drv_command,4},           772, 1458.356, 1456.643}],
    + { {erlang,port_command,2},             772, 1458.356, 1456.643},     %
    + [{suspend,                              15,    1.713,    0.000}]}.

    This is 86 % of the total run time, and as we saw before it is the close operation the absolutely biggest contributor. We find a comparison ratio a -little bit up in the call stack:

    {[{{prim_file,close,1},                   1, 1398.748,    0.024},
    -  {{prim_file,write,2},                 769,  174.672,   12.810},
    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml	2026-04-20 15:18:01.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml	2042-05-23 04:36:28.000000000 +0000
    @@ -101,20 +101,20 @@
       <nonode@nohost.189.0>    5354          0.5230        118
       <nonode@nohost.121.0>    5845          0.9239        115
       <nonode@nohost.104.0>    5140          0.7782        108
    -ok

    Example with Mnesia Transaction Benchmark

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
    +ok

    Example with Mnesia Transaction Benchmark

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
     
    -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    -1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    -    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    -    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
    +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    +1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    +    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    +    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
     ok
    -2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
    +2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
         .
         .
         .
     ignore

    Initial configuring of the benchmark is done. It is time to profile the actual -Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    -    true}|Conf]), Tps/60 end).
    +Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    +    true}|Conf]), Tps/60 end).
           .
           .
           .
    @@ -206,63 +206,63 @@
     However, one should also look for high lock acquisition frequencies (#tries)
     since locks generate overhead and because high frequency could become
     problematic if they begin to have conflicts even if it is not shown in a
    -particular test.

    The Big Bang Benchmark

    -module(big).
    --export([bang/1]).
    +particular test.

    The Big Bang Benchmark

    -module(big).
    +-export([bang/1]).
     
    -pinger([], [], true) ->
    +pinger([], [], true) ->
         receive
    -	{procs, Procs, ReportTo} ->
    -	    pinger(Procs, [], ReportTo)
    +	{procs, Procs, ReportTo} ->
    +	    pinger(Procs, [], ReportTo)
         end;
    -pinger([], [], false) ->
    -    receive {ping, From} -> From ! {pong, self()} end,
    -    pinger([],[],false);
    -pinger([], [], ReportTo) ->
    -    ReportTo ! {done, self()},
    -    pinger([],[],false);
    -pinger([], [Po|Pos] = Pongers, ReportTo) ->
    +pinger([], [], false) ->
    +    receive {ping, From} -> From ! {pong, self()} end,
    +    pinger([],[],false);
    +pinger([], [], ReportTo) ->
    +    ReportTo ! {done, self()},
    +    pinger([],[],false);
    +pinger([], [Po|Pos] = Pongers, ReportTo) ->
         receive
    -	{ping, From} ->
    -	    From ! {pong, self()},
    -	    pinger([], Pongers, ReportTo);
    -	{pong, Po} ->
    -	    pinger([], Pos, ReportTo)
    +	{ping, From} ->
    +	    From ! {pong, self()},
    +	    pinger([], Pongers, ReportTo);
    +	{pong, Po} ->
    +	    pinger([], Pos, ReportTo)
         end;
    -pinger([Pi|Pis], Pongers, ReportTo) ->
    -    receive {ping, From} -> From ! {pong, self()}
    +pinger([Pi|Pis], Pongers, ReportTo) ->
    +    receive {ping, From} -> From ! {pong, self()}
         after 0 -> ok
         end,
    -    Pi ! {ping, self()},
    -    pinger(Pis, [Pi|Pongers], ReportTo).
    +    Pi ! {ping, self()},
    +    pinger(Pis, [Pi|Pongers], ReportTo).
     
    -spawn_procs(N) when N =< 0 ->
    -    [];
    -spawn_procs(N) ->
    -    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
    +spawn_procs(N) when N =< 0 ->
    +    [];
    +spawn_procs(N) ->
    +    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
     
    -send_procs([], Msg) ->
    +send_procs([], Msg) ->
         Msg;
    -send_procs([P|Ps], Msg) ->
    +send_procs([P|Ps], Msg) ->
         P ! Msg,
    -    send_procs(Ps, Msg).
    +    send_procs(Ps, Msg).
     
    -receive_msgs([]) ->
    +receive_msgs([]) ->
         ok;
    -receive_msgs([M|Ms]) ->
    +receive_msgs([M|Ms]) ->
         receive
     	M ->
    -	    receive_msgs(Ms)
    +	    receive_msgs(Ms)
         end.
     
    -bang(N) when integer(N) ->
    -    Procs = spawn_procs(N),
    -    RMsgs = lists:map(fun (P) -> {done, P} end, Procs),
    -    Start = now(),
    -    send_procs(Procs, {procs, Procs, self()}),
    -    receive_msgs(RMsgs),
    -    Stop = now(),
    -    lists:foreach(fun (P) -> exit(P, normal) end, Procs),
    -    timer:now_diff(Stop, Start).

    See Also

    LCNT Reference Manual

    +
    bang(N) when integer(N) -> + Procs = spawn_procs(N), + RMsgs = lists:map(fun (P) -> {done, P} end, Procs), + Start = now(), + send_procs(Procs, {procs, Procs, self()}), + receive_msgs(RMsgs), + Stop = now(), + lists:foreach(fun (P) -> exit(P, normal) end, Procs), + timer:now_diff(Stop, Start).

    See Also

    LCNT Reference Manual

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/make.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/make.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/make.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -30,8 +30,8 @@ the first match is used. For example, the following Emakefile means that file1 should be compiled with the options [debug_info,{i,"../foo"}], while all other files in the current directory should be compiled with only the -debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    -{'*',[debug_info]}.

    See Also

    The Compiler Application

    +debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    +{'*',[debug_info]}.

    See Also

    The Compiler Application

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/notes.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/notes.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -17,37 +17,37 @@

    Tools Release Notes

    -

    This document describes the changes made to the Tools application.

    Tools 4.1.4

    Improvements and New Features

    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

      make release_docs places the documentation in the released code under the doc folder.

      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

      Improves the source Software-Bill-of-Materials

      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

      Own Id: OTP-19886 Aux Id: PR-10434

    Tools 4.1.3

    Improvements and New Features

    • Fixed some deprecations for newer emacs versions.

      Own Id: OTP-19726 Aux Id: PR-10106

    Tools 4.1.2

    Fixed Bugs and Malfunctions

    • A crash has been eliminated in tprof:collect/0 when unloading a module while collecting traces.

      Own Id: OTP-19135 Aux Id: GH-8483, PR-8547

    • Improved the indent-region Emacs command, which could indent badly when inside multiline string.

      Own Id: OTP-19396 Aux Id: PR-9186

    • eprof:start_profiling/3 can now return information about which process it failed to trace.

      Own Id: OTP-19419 Aux Id: PR-9219

    • Fixed a race condition when processes cause the Cover server to be started at the same time.

      Own Id: OTP-19517 Aux Id: PR-9124

    • Fix bug in tprof where the session name could not be set.

      Own Id: OTP-19580 Aux Id: PR-9648

    • Add tprof to the .app file.

      Own Id: OTP-19628 Aux Id: PR-9787

    Improvements and New Features

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    Tools 4.1.1

    Fixed Bugs and Malfunctions

    • Fixed some deprecated errors on emacs-29.

      Own Id: OTP-19273 Aux Id: PR-8879

    • The cover tool could sometimes wrongly report lines as uncovered.

      Own Id: OTP-19289 Aux Id: GH-8867, PR-8919

    • Fixed tprof:format(IoDevice, ...) to not demand unicode encoding supported by IoDevice.

      Own Id: OTP-19299 Aux Id: PR-8949

    Tools 4.1

    Fixed Bugs and Malfunctions

    • tprof no longer crashes when using pause/restart/continue when profiling all modules.

      Own Id: OTP-19136 Aux Id: GH-8472, PR-8472, PR-8541

    • On systems supporting native coverage, calls to cover could hang or crash if cover-compiled module had been reloaded from outside cover. This has been corrected so that cover now recovers from the error and and sends a report to the logger about the failure to retrieve coverage information.

      Own Id: OTP-19203 Aux Id: GH-8661, PR-8742

    Improvements and New Features

    • Figures in the documentation have been improved.

      Own Id: OTP-19130 Aux Id: PR-7226

    Tools 4.0

    Fixed Bugs and Malfunctions

    • Dialyzer warnings due to type specs added in dbg have been eliminated.

      Own Id: OTP-18860

    • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

      For example, consider this module:

      -module(foo).
      --export([bar/0, baz/0]).
      +

      This document describes the changes made to the Tools application.

      Tools 4.1.4

      Improvements and New Features

      • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

        A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

        make release_docs places the documentation in the released code under the doc folder.

        make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

        The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

        Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

        Improves the source Software-Bill-of-Materials

        • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
        • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
        • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

        Own Id: OTP-19886 Aux Id: PR-10434

      Tools 4.1.3

      Improvements and New Features

      • Fixed some deprecations for newer emacs versions.

        Own Id: OTP-19726 Aux Id: PR-10106

      Tools 4.1.2

      Fixed Bugs and Malfunctions

      • A crash has been eliminated in tprof:collect/0 when unloading a module while collecting traces.

        Own Id: OTP-19135 Aux Id: GH-8483, PR-8547

      • Improved the indent-region Emacs command, which could indent badly when inside multiline string.

        Own Id: OTP-19396 Aux Id: PR-9186

      • eprof:start_profiling/3 can now return information about which process it failed to trace.

        Own Id: OTP-19419 Aux Id: PR-9219

      • Fixed a race condition when processes cause the Cover server to be started at the same time.

        Own Id: OTP-19517 Aux Id: PR-9124

      • Fix bug in tprof where the session name could not be set.

        Own Id: OTP-19580 Aux Id: PR-9648

      • Add tprof to the .app file.

        Own Id: OTP-19628 Aux Id: PR-9787

      Improvements and New Features

      • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

        Own Id: OTP-19575 Aux Id: PR-9670

      Tools 4.1.1

      Fixed Bugs and Malfunctions

      • Fixed some deprecated errors on emacs-29.

        Own Id: OTP-19273 Aux Id: PR-8879

      • The cover tool could sometimes wrongly report lines as uncovered.

        Own Id: OTP-19289 Aux Id: GH-8867, PR-8919

      • Fixed tprof:format(IoDevice, ...) to not demand unicode encoding supported by IoDevice.

        Own Id: OTP-19299 Aux Id: PR-8949

      Tools 4.1

      Fixed Bugs and Malfunctions

      • tprof no longer crashes when using pause/restart/continue when profiling all modules.

        Own Id: OTP-19136 Aux Id: GH-8472, PR-8472, PR-8541

      • On systems supporting native coverage, calls to cover could hang or crash if cover-compiled module had been reloaded from outside cover. This has been corrected so that cover now recovers from the error and and sends a report to the logger about the failure to retrieve coverage information.

        Own Id: OTP-19203 Aux Id: GH-8661, PR-8742

      Improvements and New Features

      • Figures in the documentation have been improved.

        Own Id: OTP-19130 Aux Id: PR-7226

      Tools 4.0

      Fixed Bugs and Malfunctions

      • Dialyzer warnings due to type specs added in dbg have been eliminated.

        Own Id: OTP-18860

      • In Erlang/OTP 26, doing a cover analysis on the line level would return multiple entries for lines on which multiple functions were defined.

        For example, consider this module:

        -module(foo).
        +-export([bar/0, baz/0]).
         
        -bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries -for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +bar() -> ok. baz() -> not_ok.

        In Erlang/OTP 26, analysing on the line level would return two entries +for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        -{ok,foo}
        -2> foo:bar().
        +3> cover:analyse(foo, coverage, line).
        +{ok,[{{foo,4},{1,0}},{{foo,4},{0,1}}]}
        +4> cover:analyse(foo, calls, line).
        +{ok,[{{foo,4},1},{{foo,4},0}]}

        In Erlang/OTP 27, there will only be a single entry for line 4:

        1> cover:compile_module(foo).
        +{ok,foo}
        +2> foo:bar().
         ok
        -3> cover:analyse(foo, coverage, line).
        -{ok,[{{foo,4},{1,0}}]}
        -4> cover:analyse(foo, calls, line).
        -{ok,[{{foo,4},1}]}

        Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

      • Fixed align command in emacs mode.

        Own Id: OTP-19026 Aux Id: PR-8155

      Improvements and New Features

      • Triple-Quoted Strings has been implemented as per EEP 64. See String in the Reference Manual.

        Example:

        1> """
        +3> cover:analyse(foo, coverage, line).
        +{ok,[{{foo,4},{1,0}}]}
        +4> cover:analyse(foo, calls, line).
        +{ok,[{{foo,4},1}]}

        Own Id: OTP-18998 Aux Id: GH-8159, PR-8182

      • Fixed align command in emacs mode.

        Own Id: OTP-19026 Aux Id: PR-8155

      Improvements and New Features

      • Triple-Quoted Strings has been implemented as per EEP 64. See String in the Reference Manual.

        Example:

        1> """
            a
            b
            c
            """.
         "a\nb\nc"

        Adjacent string literals without intervening white space is now a syntax error, to avoid possible confusion with triple-quoted strings. For example:

        1> "abc""xyz".
         "xyz".
        -* 1:6: adjacent string literals without intervening white space

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

      • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

        Example:

        1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
        +* 1:6: adjacent string literals without intervening white space

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18750 Aux Id: OTP-18746, PR-7313, PR-7451

      • There is a new tool tprof, which combines the functionality of eprof and cprof under one interface and adds heap profiling. It also has functionality to help with profiling process hierarchies.

        Example:

        1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
         
         ****** Process <0.92.0>  --  100.00% of total *** 
        -FUNCTION          CALLS  WORDS  PER CALL  [     %]
        -lists:seq_loop/3      5     32      6.40  [100.00]
        -                            32            [ 100.0]
        +FUNCTION          CALLS  WORDS  PER CALL  [     %]
        +lists:seq_loop/3      5     32      6.40  [100.00]
        +                            32            [ 100.0]
         ok

        Own Id: OTP-18756 Aux Id: PR-6639

      • 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

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • Improved the align command in emacs mode.

        Own Id: OTP-19080 Aux Id: PR-8288

      Tools 3.6

      Improvements and New Features

      • Map comprehensions as suggested in EEP 58 has now been implemented.

        Own Id: OTP-18413 Aux Id: EEP-58, PR-6727

      • The instrument module has been moved from tools to runtime_tools.

        Own Id: OTP-18487 Aux Id: PR-6829

      Tools 3.5.3

      Improvements and New Features

      • Removed the previously undocumented and unsupported emem tool.

        Own Id: OTP-17892 Aux Id: PR-5591

      Tools 3.5.2

      Fixed Bugs and Malfunctions

      • Erlang-mode fixed for newer versions of xref using CL-Lib structures instead of EIEIO classes.

        Own Id: OTP-17746 Aux Id: GH-5314, PR-5324

      Tools 3.5.1

      Fixed Bugs and Malfunctions

      • The cover tool would not work on modules compiled with the tuple_calls option.

        Own Id: OTP-17440 Aux Id: GH-4796

      Tools 3.5

      Fixed Bugs and Malfunctions

      • For cover-compiled code, the error behaviour of list and binary comprehensions /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/tprof.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/tprof.xhtml 2026-04-20 15:18:01.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/tprof.xhtml 2042-05-23 04:36:28.000000000 +0000 @@ -48,185 +48,185 @@ trace all functions.

        Warning

        Avoid hot code reloading for modules participating in the tracing. Reloading a module disables tracing and discards the accumulated statistics. The tprof results will probably be incorrect when the profiled code was -reloading during a profiling session.

        Ad-hoc profiling

        Ad-hoc profiling is convenient for profiling a single function call.

        For example:

        1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
        +reloading during a profiling session.

        Ad-hoc profiling

        Ad-hoc profiling is convenient for profiling a single function call.

        For example:

        1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
         
         ****** Process <0.92.0>  --  100.00% of total *** 
        -FUNCTION          CALLS  WORDS  PER CALL  [     %]
        -lists:seq_loop/3      5     32      6.40  [100.00]
        -                            32            [ 100.0]
        +FUNCTION          CALLS  WORDS  PER CALL  [     %]
        +lists:seq_loop/3      5     32      6.40  [100.00]
        +                            32            [ 100.0]
         ok

        By default tracing is enabled for all functions in all modules. When funs -are created in the interactive shell, parts of shell code are also traced:

        1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
        +are created in the interactive shell, parts of shell code are also traced:

        1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
         
         ****** Process <0.95.0>  --  100.00% of total *** 
        -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
        -erl_eval:do_apply/7            1      3      3.00  [ 3.61]
        -erl_eval:match_list/6          1      3      3.00  [ 3.61]
        -lists:reverse/1                1      4      4.00  [ 4.82]
        -erl_eval:expr_list/7           3      7      2.33  [ 8.43]
        -erl_eval:ret_expr/3            4     16      4.00  [19.28]
        -erl_eval:merge_bindings/4      3     18      6.00  [21.69]
        -lists:seq_loop/3               5     32      6.40  [38.55]
        -                                     83            [100.0]
        -ok

        However, it is possible to limit the trace to specific functions or modules:

        2> tprof:profile(fun() -> lists:seq(1, 16) end,
        -                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
        +FUNCTION                   CALLS  WORDS  PER CALL  [    %]
        +erl_eval:do_apply/7            1      3      3.00  [ 3.61]
        +erl_eval:match_list/6          1      3      3.00  [ 3.61]
        +lists:reverse/1                1      4      4.00  [ 4.82]
        +erl_eval:expr_list/7           3      7      2.33  [ 8.43]
        +erl_eval:ret_expr/3            4     16      4.00  [19.28]
        +erl_eval:merge_bindings/4      3     18      6.00  [21.69]
        +lists:seq_loop/3               5     32      6.40  [38.55]
        +                                     83            [100.0]
        +ok

        However, it is possible to limit the trace to specific functions or modules:

        2> tprof:profile(fun() -> lists:seq(1, 16) end,
        +                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
         ****** Process <0.98.0>  --  100.00% of total *** 
        -FUNCTION          CALLS  WORDS  PER CALL  [     %]
        -lists:seq_loop/3      5     32      6.40  [100.00]
        -                            32            [ 100.0]
        +FUNCTION          CALLS  WORDS  PER CALL  [     %]
        +lists:seq_loop/3      5     32      6.40  [100.00]
        +                            32            [ 100.0]
         
         ok

        Ad-hoc profiling results can be printed in a few different ways. The following -examples use the test module defined like this:

        -module(test).
        --export([test_spawn/0]).
        -test_spawn() ->
        -    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
        +examples use the test module defined like this:

        -module(test).
        +-export([test_spawn/0]).
        +test_spawn() ->
        +    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
             receive
        -        {'DOWN', MRef, process, Pid, normal} ->
        +        {'DOWN', MRef, process, Pid, normal} ->
                     done
        -    end.

        By default per-process statistics is shown:

        1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
        +    end.

        By default per-process statistics is shown:

        1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
         
         ****** Process <0.176.0>    -- 23.66 % of total allocations ***
        -FUNCTION                CALLS  WORDS  PER CALL  [    %]
        -erlang:spawn_monitor/1      1      2         2  [ 9.09]
        -erlang:spawn_opt/4          1      6         6  [27.27]
        -test:test_spawn/0           1     14        14  [63.64]
        -                                  22            [100.0]
        +FUNCTION                CALLS  WORDS  PER CALL  [    %]
        +erlang:spawn_monitor/1      1      2         2  [ 9.09]
        +erlang:spawn_opt/4          1      6         6  [27.27]
        +test:test_spawn/0           1     14        14  [63.64]
        +                                  22            [100.0]
         
         ****** Process <0.177.0>    -- 76.34 % of total allocations ***
        -FUNCTION           CALLS  WORDS  PER CALL  [    %]
        -erlang:apply/2         1      7         7  [ 9.86]
        -lists:seq_loop/3       9     64         7  [90.14]
        -                             71            [100.0]

        The following example prints the combined memory allocation of all +FUNCTION CALLS WORDS PER CALL [ %] +erlang:apply/2 1 7 7 [ 9.86] +lists:seq_loop/3 9 64 7 [90.14] + 71 [100.0]

        The following example prints the combined memory allocation of all processes, sorted by the total number of allocated words in descending -order:

        2> tprof:profile(test, test_spawn, [],
        -                 #{type => call_memory, report => {total, {measurement, descending}}}).
        +order:

        2> tprof:profile(test, test_spawn, [],
        +                 #{type => call_memory, report => {total, {measurement, descending}}}).
         
        -FUNCTION                CALLS  WORDS  PER CALL  [    %]
        -lists:seq_loop/3            9     64         7  [68.82]
        -test:test_spawn/0           1     14        14  [15.05]
        -erlang:apply/2              1      7         7  [ 7.53]
        -erlang:spawn_opt/4          1      6         6  [ 6.45]
        -erlang:spawn_monitor/1      1      2         2  [ 2.15]
        -                                  93            [100.0]

        The profiling data can also be collected for further inspection:

        3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
        -                                       #{type => call_memory, report => return}).
        +FUNCTION                CALLS  WORDS  PER CALL  [    %]
        +lists:seq_loop/3            9     64         7  [68.82]
        +test:test_spawn/0           1     14        14  [15.05]
        +erlang:apply/2              1      7         7  [ 7.53]
        +erlang:spawn_opt/4          1      6         6  [ 6.45]
        +erlang:spawn_monitor/1      1      2         2  [ 2.15]
        +                                  93            [100.0]

        The profiling data can also be collected for further inspection:

        3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
        +                                       #{type => call_memory, report => return}).
         <...>
        -4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
        +4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
         
         ****** Process <0.223.0>    -- 23.66 % of total allocations ***
        -FUNCTION                CALLS  WORDS  PER CALL  [    %]
        -test:test_spawn/0           1     14        14  [63.64]
        -erlang:spawn_opt/4          1      6         6  [27.27]
        -erlang:spawn_monitor/1      1      2         2  [ 9.09]
        -                                  22            [100.0]
        +FUNCTION                CALLS  WORDS  PER CALL  [    %]
        +test:test_spawn/0           1     14        14  [63.64]
        +erlang:spawn_opt/4          1      6         6  [27.27]
        +erlang:spawn_monitor/1      1      2         2  [ 9.09]
        +                                  22            [100.0]
         
         ****** Process <0.224.0>    -- 76.34 % of total allocations ***
        -FUNCTION           CALLS  WORDS  PER CALL  [    %]
        -lists:seq_loop/3       9     64         7  [90.14]
        -erlang:apply/2         1      7         7  [ 9.86]
        -                             71            [100.0]

        Which processes that are profiled depends on the profiling type.

        • call_count (default) counts calls in all processes.

        • call_time and call_memory limits the profiling to the processes +FUNCTION CALLS WORDS PER CALL [ %] +lists:seq_loop/3 9 64 7 [90.14] +erlang:apply/2 1 7 7 [ 9.86] + 71 [100.0]

        Which processes that are profiled depends on the profiling type.

        • call_count (default) counts calls in all processes.

        • call_time and call_memory limits the profiling to the processes spawned from the user-provided function (using the set_on_spawn -option for trace:process/4).

        call_time and call_memory can be restricted to profile a single process:

        2> tprof:profile(test, test_spawn, [],
        -                 #{type => call_memory, set_on_spawn => false}).
        +option for trace:process/4).

      call_time and call_memory can be restricted to profile a single process:

      2> tprof:profile(test, test_spawn, [],
      +                 #{type => call_memory, set_on_spawn => false}).
       
       ****** Process <0.183.0>    -- 100.00 % of total allocations ***
      -FUNCTION                CALLS  WORDS  PER CALL  [    %]
      -erlang:spawn_monitor/1      1      2         2  [ 9.09]
      -erlang:spawn_opt/4          1      6         6  [27.27]
      -test:test_spawn/0           1     14        14  [63.64]

      Erlang programs can perform expensive operations in other processes +FUNCTION CALLS WORDS PER CALL [ %] +erlang:spawn_monitor/1 1 2 2 [ 9.09] +erlang:spawn_opt/4 1 6 6 [27.27] +test:test_spawn/0 1 14 14 [63.64]

      Erlang programs can perform expensive operations in other processes than the original one. You can include multiple, new, or even all -processes in the trace when measuring time or memory:

      7> pg:start_link().
      -{ok,<0.252.0>}
      -8> tprof:profile(fun() -> pg:join(group, self()) end,
      -                 #{type => call_memory, rootset => [pg]}).
      +processes in the trace when measuring time or memory:

      7> pg:start_link().
      +{ok,<0.252.0>}
      +8> tprof:profile(fun() -> pg:join(group, self()) end,
      +                 #{type => call_memory, rootset => [pg]}).
       ****** Process <0.252.0>    -- 52.86 % of total allocations ***
      -FUNCTION                      CALLS  WORDS  PER CALL  [    %]
      -pg:leave_local_update_ets/5       1      2         2  [ 1.80]
      -gen:reply/2                       1      3         3  [ 2.70]
      -erlang:monitor/2                  1      3         3  [ 2.70]
      -gen_server:try_handle_call/4      1      3         3  [ 2.70]
      -gen_server:try_dispatch/4         1      3         3  [ 2.70]
      -maps:iterator/1                   2      4         2  [ 3.60]
      -maps:take/2                       1      6         6  [ 5.41]
      -pg:join_local_update_ets/5        1      8         8  [ 7.21]
      -pg:handle_info/2                  1      8         8  [ 7.21]
      -pg:handle_call/3                  1      9         9  [ 8.11]
      -gen_server:loop/7                 2      9         4  [ 8.11]
      -ets:lookup/2                      2     10         5  [ 9.01]
      -pg:join_local/3                   1     11        11  [ 9.91]
      -pg:notify_group/5                 2     16         8  [14.41]
      -erlang:setelement/3               2     16         8  [14.41]
      -                                       111            [100.0]
      +FUNCTION                      CALLS  WORDS  PER CALL  [    %]
      +pg:leave_local_update_ets/5       1      2         2  [ 1.80]
      +gen:reply/2                       1      3         3  [ 2.70]
      +erlang:monitor/2                  1      3         3  [ 2.70]
      +gen_server:try_handle_call/4      1      3         3  [ 2.70]
      +gen_server:try_dispatch/4         1      3         3  [ 2.70]
      +maps:iterator/1                   2      4         2  [ 3.60]
      +maps:take/2                       1      6         6  [ 5.41]
      +pg:join_local_update_ets/5        1      8         8  [ 7.21]
      +pg:handle_info/2                  1      8         8  [ 7.21]
      +pg:handle_call/3                  1      9         9  [ 8.11]
      +gen_server:loop/7                 2      9         4  [ 8.11]
      +ets:lookup/2                      2     10         5  [ 9.01]
      +pg:join_local/3                   1     11        11  [ 9.91]
      +pg:notify_group/5                 2     16         8  [14.41]
      +erlang:setelement/3               2     16         8  [14.41]
      +                                       111            [100.0]
       
       ****** Process <0.255.0>    -- 47.14 % of total allocations ***
      -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
      -erl_eval:match_list/6          1      3         3  [ 3.03]
      -erlang:monitor/2               1      3         3  [ 3.03]
      -lists:reverse/1                2      4         2  [ 4.04]
      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/xref_chapter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/xref_chapter.xhtml	2026-04-20 15:18:01.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tools.epub/OEBPS/xref_chapter.xhtml	2042-05-23 04:36:28.000000000 +0000
      @@ -26,25 +26,25 @@
       system and for doing some simple graph analyses on selected calls.

      The following sections show some features of Xref, beginning with a module check and a predefined analysis. Then follow examples that can be skipped on the first reading; not all of the concepts used are explained, and it is assumed that the -reference manual has been at least skimmed.

      Module Check

      Assume we want to check the following module:

      -module(my_module).
      +reference manual has been at least skimmed.

      Module Check

      Assume we want to check the following module:

      -module(my_module).
       
      --export([t/1]).
      +-export([t/1]).
       
      -t(A) ->
      -  my_module:t2(A).
      +t(A) ->
      +  my_module:t2(A).
       
      -t2(_) ->
      +t2(_) ->
         true.

      Cross reference data are read from BEAM files, so the first step when checking -an edited module is to compile it:

      1> c(my_module, debug_info).
      +an edited module is to compile it:

      1> c(my_module, debug_info).
       ./my_module.erl:10: Warning: function t2/1 is unused
      -{ok, my_module}

      The debug_info option ensures that the BEAM file contains debug information, +{ok, my_module}

      The debug_info option ensures that the BEAM file contains debug information, which makes it possible to find unused local functions.

      The module can now be checked for calls to deprecated functions, calls to undefined functions, and for unused local -functions:

      2> xref:m(my_module)
      -[{deprecated,[]},
      - {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
      - {unused,[{my_module,t2,1}]}]

      m/1 is also suitable for checking that the BEAM file of a module that is about +functions:

      2> xref:m(my_module)
      +[{deprecated,[]},
      + {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
      + {unused,[{my_module,t2,1}]}]

      m/1 is also suitable for checking that the BEAM file of a module that is about to be loaded into a running a system does not call any undefined functions. In either case, the code path of the code server (see the module code) is used for finding modules that export externally called functions not exported by the @@ -53,28 +53,28 @@ this example an xref server will be used, which makes it possible to analyze applications and releases, and also to select the library path explicitly.

      Each Xref server is referred to by a unique name. The name is given when -creating the server:

      1> xref:start(s).
      -{ok,<0.27.0>}

      Next the system to be analyzed is added to the Xref server. Here the system will +creating the server:

      1> xref:start(s).
      +{ok,<0.27.0>}

      Next the system to be analyzed is added to the Xref server. Here the system will be OTP, so no library path will be needed. Otherwise, when analyzing a system that uses OTP, the OTP modules are typically made library modules by setting the library path to the default OTP code path (or to code_path, see the reference manual). By default, the names of read BEAM files and warnings are output when adding analyzed modules, but these messages -can be avoided by setting default values of some options:

      2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
      +can be avoided by setting default values of some options:

      2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
       ok
      -3> xref:add_release(s, code:lib_dir(), {name, otp}).
      -{ok,otp}

      add_release/3 assumes that all subdirectories of the library directory +3> xref:add_release(s, code:lib_dir(), {name, otp}). +{ok,otp}

      add_release/3 assumes that all subdirectories of the library directory returned by code:lib_dir() contain applications; -the effect is that of reading all BEAM files for the application.

      It is now easy to check the release for calls to undefined functions:

      4> xref:analyze(s, undefined_function_calls).
      -{ok, [...]}

      We can now continue with further analyses, or we can delete the Xref server:

      5> xref:stop(s).

      The check for calls to undefined functions is an example of a predefined +the effect is that of reading all BEAM files for the application.

      It is now easy to check the release for calls to undefined functions:

      4> xref:analyze(s, undefined_function_calls).
      +{ok, [...]}

      We can now continue with further analyses, or we can delete the Xref server:

      5> xref:stop(s).

      The check for calls to undefined functions is an example of a predefined analysis, probably the most useful one. Other examples are the analyses that find unused local functions, or functions that call some given functions. See the analyze/2,3 functions for a complete list of predefined analyses.

      Each predefined analysis is a shorthand for a query, a sentence of a tiny language providing cross reference data as values of predefined variables. The check for calls to -undefined functions can thus be stated as a query:

      4> xref:q(s, "(XC - UC) || (XU - X - B)").
      -{ok,[...]}

      The query asks for the restriction of external calls except the unresolved calls +undefined functions can thus be stated as a query:

      4> xref:q(s, "(XC - UC) || (XU - X - B)").
      +{ok,[...]}

      The query asks for the restriction of external calls except the unresolved calls to calls to functions that are externally used but neither exported nor built-in functions (the || operator restricts the used functions while the | operator restricts the calling functions). The - operator returns the difference of two @@ -98,8 +98,8 @@ provided with a simple language. Below are some expressions of the language with comments, focusing on elements of the language rather than providing useful examples. The analyzed system is assumed to be OTP, so in order to run the -queries, first evaluate these calls:

      xref:start(s).
      -xref:add_release(s, code:root_dir()).
      • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

      • xref:q(s, "xref : Mod * X"). - All exported functions of the xref +queries, first evaluate these calls:

        xref:start(s).
        +xref:add_release(s, code:root_dir()).
        • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

        • xref:q(s, "xref : Mod * X"). - All exported functions of the xref module. The first operand of the intersection operator * is implicitly converted to the more special type of the second operand.

        • xref:q(s, "(Mod) tools"). - All modules of the Tools application.

        • xref:q(s, '"xref_.*" : Mod'). - All modules with a name beginning with xref_.

        • xref:q(s, "# E | X "). - Number of calls from exported functions.

        • xref:q(s, "XC || L "). - All external calls to local functions.

        • xref:q(s, "XC * LC"). - All calls that have both an external and a local @@ -136,18 +136,18 @@ a module M1 is said to call a module M2 if there is some function in M1 that calls some function in M2. It would be nice if we could use the much smaller module graph, since it is available also in the light weight -modulesmode of Xref servers.

          t(S) ->
          -  {ok, _} = xref:q(S, "Eplus := closure E"),
          -  {ok, Ms} = xref:q(S, "AM"),
          -  Fun = fun(M, N) ->
          -      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
          -      {ok, N0} = xref:q(S, lists:flatten(Q)),
          +modulesmode of Xref servers.

          t(S) ->
          +  {ok, _} = xref:q(S, "Eplus := closure E"),
          +  {ok, Ms} = xref:q(S, "AM"),
          +  Fun = fun(M, N) ->
          +      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
          +      {ok, N0} = xref:q(S, lists:flatten(Q)),
                 N + N0
               end,
          -  Sum = lists:foldl(Fun, 0, Ms),
          -  ok = xref:forget(S, 'Eplus'),
          -  {ok, Tot} = xref:q(S, "# (closure ME | AM)"),
          -  100 * ((Tot - Sum) / Tot).

          Comments on the code:

          • We want to find the reduction of the closure of the function graph to modules. + Sum = lists:foldl(Fun, 0, Ms), + ok = xref:forget(S, 'Eplus'), + {ok, Tot} = xref:q(S, "# (closure ME | AM)"), + 100 * ((Tot - Sum) / Tot).

          Comments on the code:

          • We want to find the reduction of the closure of the function graph to modules. The direct expression for doing that would be (Mod) (closure E | AM), but then we would have to represent all of the transitive closure of E in memory. Instead the number of indirectly used modules is found for each analyzed /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tprof.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tprof.html 2026-04-20 17:49:01.321814209 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/tprof.html 2026-04-20 17:49:01.321814209 +0000 @@ -119,185 +119,185 @@ trace all functions.

            Warning

            Avoid hot code reloading for modules participating in the tracing. Reloading a module disables tracing and discards the accumulated statistics. The tprof results will probably be incorrect when the profiled code was -reloading during a profiling session.

            Ad-hoc profiling

            Ad-hoc profiling is convenient for profiling a single function call.

            For example:

            1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
            +reloading during a profiling session.

            Ad-hoc profiling

            Ad-hoc profiling is convenient for profiling a single function call.

            For example:

            1> tprof:profile(lists, seq, [1, 16], #{type => call_memory}).
             
             ****** Process <0.92.0>  --  100.00% of total *** 
            -FUNCTION          CALLS  WORDS  PER CALL  [     %]
            -lists:seq_loop/3      5     32      6.40  [100.00]
            -                            32            [ 100.0]
            +FUNCTION          CALLS  WORDS  PER CALL  [     %]
            +lists:seq_loop/3      5     32      6.40  [100.00]
            +                            32            [ 100.0]
             ok

            By default tracing is enabled for all functions in all modules. When funs -are created in the interactive shell, parts of shell code are also traced:

            1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
            +are created in the interactive shell, parts of shell code are also traced:

            1> tprof:profile(fun() -> lists:seq(1, 16) end, #{type => call_memory}).
             
             ****** Process <0.95.0>  --  100.00% of total *** 
            -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
            -erl_eval:do_apply/7            1      3      3.00  [ 3.61]
            -erl_eval:match_list/6          1      3      3.00  [ 3.61]
            -lists:reverse/1                1      4      4.00  [ 4.82]
            -erl_eval:expr_list/7           3      7      2.33  [ 8.43]
            -erl_eval:ret_expr/3            4     16      4.00  [19.28]
            -erl_eval:merge_bindings/4      3     18      6.00  [21.69]
            -lists:seq_loop/3               5     32      6.40  [38.55]
            -                                     83            [100.0]
            -ok

            However, it is possible to limit the trace to specific functions or modules:

            2> tprof:profile(fun() -> lists:seq(1, 16) end,
            -                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
            +FUNCTION                   CALLS  WORDS  PER CALL  [    %]
            +erl_eval:do_apply/7            1      3      3.00  [ 3.61]
            +erl_eval:match_list/6          1      3      3.00  [ 3.61]
            +lists:reverse/1                1      4      4.00  [ 4.82]
            +erl_eval:expr_list/7           3      7      2.33  [ 8.43]
            +erl_eval:ret_expr/3            4     16      4.00  [19.28]
            +erl_eval:merge_bindings/4      3     18      6.00  [21.69]
            +lists:seq_loop/3               5     32      6.40  [38.55]
            +                                     83            [100.0]
            +ok

            However, it is possible to limit the trace to specific functions or modules:

            2> tprof:profile(fun() -> lists:seq(1, 16) end,
            +                 #{type => call_memory, pattern => [{lists, seq_loop, '_'}]}).
             ****** Process <0.98.0>  --  100.00% of total *** 
            -FUNCTION          CALLS  WORDS  PER CALL  [     %]
            -lists:seq_loop/3      5     32      6.40  [100.00]
            -                            32            [ 100.0]
            +FUNCTION          CALLS  WORDS  PER CALL  [     %]
            +lists:seq_loop/3      5     32      6.40  [100.00]
            +                            32            [ 100.0]
             
             ok

            Ad-hoc profiling results can be printed in a few different ways. The following -examples use the test module defined like this:

            -module(test).
            --export([test_spawn/0]).
            -test_spawn() ->
            -    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
            +examples use the test module defined like this:

            -module(test).
            +-export([test_spawn/0]).
            +test_spawn() ->
            +    {Pid, MRef} = spawn_monitor(fun () -> lists:seq(1, 32) end),
                 receive
            -        {'DOWN', MRef, process, Pid, normal} ->
            +        {'DOWN', MRef, process, Pid, normal} ->
                         done
            -    end.

            By default per-process statistics is shown:

            1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
            +    end.

            By default per-process statistics is shown:

            1> tprof:profile(test, test_spawn, [], #{type => call_memory}).
             
             ****** Process <0.176.0>    -- 23.66 % of total allocations ***
            -FUNCTION                CALLS  WORDS  PER CALL  [    %]
            -erlang:spawn_monitor/1      1      2         2  [ 9.09]
            -erlang:spawn_opt/4          1      6         6  [27.27]
            -test:test_spawn/0           1     14        14  [63.64]
            -                                  22            [100.0]
            +FUNCTION                CALLS  WORDS  PER CALL  [    %]
            +erlang:spawn_monitor/1      1      2         2  [ 9.09]
            +erlang:spawn_opt/4          1      6         6  [27.27]
            +test:test_spawn/0           1     14        14  [63.64]
            +                                  22            [100.0]
             
             ****** Process <0.177.0>    -- 76.34 % of total allocations ***
            -FUNCTION           CALLS  WORDS  PER CALL  [    %]
            -erlang:apply/2         1      7         7  [ 9.86]
            -lists:seq_loop/3       9     64         7  [90.14]
            -                             71            [100.0]

            The following example prints the combined memory allocation of all +FUNCTION CALLS WORDS PER CALL [ %] +erlang:apply/2 1 7 7 [ 9.86] +lists:seq_loop/3 9 64 7 [90.14] + 71 [100.0]

            The following example prints the combined memory allocation of all processes, sorted by the total number of allocated words in descending -order:

            2> tprof:profile(test, test_spawn, [],
            -                 #{type => call_memory, report => {total, {measurement, descending}}}).
            +order:

            2> tprof:profile(test, test_spawn, [],
            +                 #{type => call_memory, report => {total, {measurement, descending}}}).
             
            -FUNCTION                CALLS  WORDS  PER CALL  [    %]
            -lists:seq_loop/3            9     64         7  [68.82]
            -test:test_spawn/0           1     14        14  [15.05]
            -erlang:apply/2              1      7         7  [ 7.53]
            -erlang:spawn_opt/4          1      6         6  [ 6.45]
            -erlang:spawn_monitor/1      1      2         2  [ 2.15]
            -                                  93            [100.0]

            The profiling data can also be collected for further inspection:

            3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
            -                                       #{type => call_memory, report => return}).
            +FUNCTION                CALLS  WORDS  PER CALL  [    %]
            +lists:seq_loop/3            9     64         7  [68.82]
            +test:test_spawn/0           1     14        14  [15.05]
            +erlang:apply/2              1      7         7  [ 7.53]
            +erlang:spawn_opt/4          1      6         6  [ 6.45]
            +erlang:spawn_monitor/1      1      2         2  [ 2.15]
            +                                  93            [100.0]

            The profiling data can also be collected for further inspection:

            3> {done, ProfileData} = tprof:profile(fun test:test_spawn/0,
            +                                       #{type => call_memory, report => return}).
             <...>
            -4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
            +4> tprof:format(tprof:inspect(ProfileData, process, {percent, descending})).
             
             ****** Process <0.223.0>    -- 23.66 % of total allocations ***
            -FUNCTION                CALLS  WORDS  PER CALL  [    %]
            -test:test_spawn/0           1     14        14  [63.64]
            -erlang:spawn_opt/4          1      6         6  [27.27]
            -erlang:spawn_monitor/1      1      2         2  [ 9.09]
            -                                  22            [100.0]
            +FUNCTION                CALLS  WORDS  PER CALL  [    %]
            +test:test_spawn/0           1     14        14  [63.64]
            +erlang:spawn_opt/4          1      6         6  [27.27]
            +erlang:spawn_monitor/1      1      2         2  [ 9.09]
            +                                  22            [100.0]
             
             ****** Process <0.224.0>    -- 76.34 % of total allocations ***
            -FUNCTION           CALLS  WORDS  PER CALL  [    %]
            -lists:seq_loop/3       9     64         7  [90.14]
            -erlang:apply/2         1      7         7  [ 9.86]
            -                             71            [100.0]

            Which processes that are profiled depends on the profiling type.

            • call_count (default) counts calls in all processes.

            • call_time and call_memory limits the profiling to the processes +FUNCTION CALLS WORDS PER CALL [ %] +lists:seq_loop/3 9 64 7 [90.14] +erlang:apply/2 1 7 7 [ 9.86] + 71 [100.0]

            Which processes that are profiled depends on the profiling type.

            • call_count (default) counts calls in all processes.

            • call_time and call_memory limits the profiling to the processes spawned from the user-provided function (using the set_on_spawn -option for trace:process/4).

            call_time and call_memory can be restricted to profile a single process:

            2> tprof:profile(test, test_spawn, [],
            -                 #{type => call_memory, set_on_spawn => false}).
            +option for trace:process/4).

          call_time and call_memory can be restricted to profile a single process:

          2> tprof:profile(test, test_spawn, [],
          +                 #{type => call_memory, set_on_spawn => false}).
           
           ****** Process <0.183.0>    -- 100.00 % of total allocations ***
          -FUNCTION                CALLS  WORDS  PER CALL  [    %]
          -erlang:spawn_monitor/1      1      2         2  [ 9.09]
          -erlang:spawn_opt/4          1      6         6  [27.27]
          -test:test_spawn/0           1     14        14  [63.64]

          Erlang programs can perform expensive operations in other processes +FUNCTION CALLS WORDS PER CALL [ %] +erlang:spawn_monitor/1 1 2 2 [ 9.09] +erlang:spawn_opt/4 1 6 6 [27.27] +test:test_spawn/0 1 14 14 [63.64]

      Erlang programs can perform expensive operations in other processes than the original one. You can include multiple, new, or even all -processes in the trace when measuring time or memory:

      7> pg:start_link().
      -{ok,<0.252.0>}
      -8> tprof:profile(fun() -> pg:join(group, self()) end,
      -                 #href_anchor"ss">type => call_memory, rootset => [pg]}).
      +processes in the trace when measuring time or memory:

      7> pg:start_link().
      +{ok,<0.252.0>}
      +8> tprof:profile(fun() -> pg:join(group, self()) end,
      +                 #href_anchor"ss">type => call_memory, rootset => [pg]}).
       ****** Process <0.252.0>    -- 52.86 % of total allocations ***
      -FUNCTION                      CALLS  WORDS  PER CALL  [    %]
      -pg:leave_local_update_ets/5       1      2         2  [ 1.80]
      -gen:reply/2                       1      3         3  [ 2.70]
      -erlang:monitor/2                  1      3         3  [ 2.70]
      -gen_server:try_handle_call/4      1      3         3  [ 2.70]
      -gen_server:try_dispatch/4         1      3         3  [ 2.70]
      -maps:iterator/1                   2      4         2  [ 3.60]
      -maps:take/2                       1      6         6  [ 5.41]
      -pg:join_local_update_ets/5        1      8         8  [ 7.21]
      -pg:handle_info/2                  1      8         8  [ 7.21]
      -pg:handle_call/3                  1      9         9  [ 8.11]
      -gen_server:loop/7                 2      9         4  [ 8.11]
      -ets:lookup/2                      2     10         5  [ 9.01]
      -pg:join_local/3                   1     11        11  [ 9.91]
      -pg:notify_group/5                 2     16         8  [14.41]
      -erlang:setelement/3               2     16         8  [14.41]
      -                                       111            [100.0]
      +FUNCTION                      CALLS  WORDS  PER CALL  [    %]
      +pg:leave_local_update_ets/5       1      2         2  [ 1.80]
      +gen:reply/2                       1      3         3  [ 2.70]
      +erlang:monitor/2                  1      3         3  [ 2.70]
      +gen_server:try_handle_call/4      1      3         3  [ 2.70]
      +gen_server:try_dispatch/4         1      3         3  [ 2.70]
      +maps:iterator/1                   2      4         2  [ 3.60]
      +maps:take/2                       1      6         6  [ 5.41]
      +pg:join_local_update_ets/5        1      8         8  [ 7.21]
      +pg:handle_info/2                  1      8         8  [ 7.21]
      +pg:handle_call/3                  1      9         9  [ 8.11]
      +gen_server:loop/7                 2      9         4  [ 8.11]
      +ets:lookup/2                      2     10         5  [ 9.01]
      +pg:join_local/3                   1     11        11  [ 9.91]
      +pg:notify_group/5                 2     16         8  [14.41]
      +erlang:setelement/3               2     16         8  [14.41]
      +                                       111            [100.0]
       
       ****** Process <0.255.0>    -- 47.14 % of total allocations ***
      -FUNCTION                   CALLS  WORDS  PER CALL  [    %]
      -erl_eval:match_list/6          1      3         3  [ 3.03]
      -erlang:monitor/2               1      3         3  [ 3.03]
      -lists:reverse/1                2      4         2  [ 4.04]
      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref.html differs (HTML document, UTF-8 Unicode text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref.html	2026-04-20 17:49:01.393814656 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref.html	2026-04-20 17:49:01.393814656 +0000
      @@ -3681,7 +3681,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref_chapter.html 2026-04-20 17:49:01.425814855 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.4/doc/html/xref_chapter.html 2026-04-20 17:49:01.433814904 +0000 @@ -98,25 +98,25 @@ system and for doing some simple graph analyses on selected calls.

      The following sections show some features of Xref, beginning with a module check and a predefined analysis. Then follow examples that can be skipped on the first reading; not all of the concepts used are explained, and it is assumed that the -reference manual has been at least skimmed.

      Module Check

      Assume we want to check the following module:

      -module(my_module).
      +reference manual has been at least skimmed.

      Module Check

      Assume we want to check the following module:

      -module(my_module).
       
      --export([t/1]).
      +-export([t/1]).
       
      -t(A) ->
      -  my_module:t2(A).
      +t(A) ->
      +  my_module:t2(A).
       
      -t2(_) ->
      +t2(_) ->
         true.

      Cross reference data are read from BEAM files, so the first step when checking -an edited module is to compile it:

      1> c(my_module, debug_info).
      +an edited module is to compile it:

      1> c(my_module, debug_info).
       ./my_module.erl:10: Warning: function t2/1 is unused
      -{ok, my_module}

      The debug_info option ensures that the BEAM file contains debug information, +{ok, my_module}

      The debug_info option ensures that the BEAM file contains debug information, which makes it possible to find unused local functions.

      The module can now be checked for calls to deprecated functions, calls to undefined functions, and for unused local -functions:

      2> xref:m(my_module)
      -[{deprecated,[]},
      - {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
      - {unused,[{my_module,t2,1}]}]

      m/1 is also suitable for checking that the BEAM file of a module that is about +functions:

      2> xref:m(my_module)
      +[{deprecated,[]},
      + {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
      + {unused,[{my_module,t2,1}]}]

      m/1 is also suitable for checking that the BEAM file of a module that is about to be loaded into a running a system does not call any undefined functions. In either case, the code path of the code server (see the module code) is used for finding modules that export externally called functions not exported by the @@ -125,28 +125,28 @@ this example an xref server will be used, which makes it possible to analyze applications and releases, and also to select the library path explicitly.

      Each Xref server is referred to by a unique name. The name is given when -creating the server:

      1> xref:start(s).
      -{ok,<0.27.0>}

      Next the system to be analyzed is added to the Xref server. Here the system will +creating the server:

      1> xref:start(s).
      +{ok,<0.27.0>}

      Next the system to be analyzed is added to the Xref server. Here the system will be OTP, so no library path will be needed. Otherwise, when analyzing a system that uses OTP, the OTP modules are typically made library modules by setting the library path to the default OTP code path (or to code_path, see the reference manual). By default, the names of read BEAM files and warnings are output when adding analyzed modules, but these messages -can be avoided by setting default values of some options:

      2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
      +can be avoided by setting default values of some options:

      2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
       ok
      -3> xref:add_release(s, code:lib_dir(), {name, otp}).
      -{ok,otp}

      add_release/3 assumes that all subdirectories of the library directory +3> xref:add_release(s, code:lib_dir(), {name, otp}). +{ok,otp}

      add_release/3 assumes that all subdirectories of the library directory returned by code:lib_dir() contain applications; -the effect is that of reading all BEAM files for the application.

      It is now easy to check the release for calls to undefined functions:

      4> xref:analyze(s, undefined_function_calls).
      -{ok, [...]}

      We can now continue with further analyses, or we can delete the Xref server:

      5> xref:stop(s).

      The check for calls to undefined functions is an example of a predefined +the effect is that of reading all BEAM files for the application.

      It is now easy to check the release for calls to undefined functions:

      4> xref:analyze(s, undefined_function_calls).
      +{ok, [...]}

      We can now continue with further analyses, or we can delete the Xref server:

      5> xref:stop(s).

      The check for calls to undefined functions is an example of a predefined analysis, probably the most useful one. Other examples are the analyses that find unused local functions, or functions that call some given functions. See the analyze/2,3 functions for a complete list of predefined analyses.

      Each predefined analysis is a shorthand for a query, a sentence of a tiny language providing cross reference data as values of predefined variables. The check for calls to -undefined functions can thus be stated as a query:

      4> xref:q(s, "(XC - UC) || (XU - X - B)").
      -{ok,[...]}

      The query asks for the restriction of external calls except the unresolved calls +undefined functions can thus be stated as a query:

      4> xref:q(s, "(XC - UC) || (XU - X - B)").
      +{ok,[...]}

      The query asks for the restriction of external calls except the unresolved calls to calls to functions that are externally used but neither exported nor built-in functions (the || operator restricts the used functions while the | operator restricts the calling functions). The - operator returns the difference of two @@ -170,8 +170,8 @@ provided with a simple language. Below are some expressions of the language with comments, focusing on elements of the language rather than providing useful examples. The analyzed system is assumed to be OTP, so in order to run the -queries, first evaluate these calls:

      xref:start(s).
      -xref:add_release(s, code:root_dir()).
      • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

      • xref:q(s, "xref : Mod * X"). - All exported functions of the xref +queries, first evaluate these calls:

        xref:start(s).
        +xref:add_release(s, code:root_dir()).
        • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

        • xref:q(s, "xref : Mod * X"). - All exported functions of the xref module. The first operand of the intersection operator * is implicitly converted to the more special type of the second operand.

        • xref:q(s, "(Mod) tools"). - All modules of the Tools application.

        • xref:q(s, '"xref_.*" : Mod'). - All modules with a name beginning with xref_.

        • xref:q(s, "# E | X "). - Number of calls from exported functions.

        • xref:q(s, "XC || L "). - All external calls to local functions.

        • xref:q(s, "XC * LC"). - All calls that have both an external and a local @@ -208,18 +208,18 @@ a module M1 is said to call a module M2 if there is some function in M1 that calls some function in M2. It would be nice if we could use the much smaller module graph, since it is available also in the light weight -modulesmode of Xref servers.

          t(S) ->
          -  {ok, _} = xref:q(S, "Eplus := closure E"),
          -  {ok, Ms} = xref:q(S, "AM"),
          -  Fun = fun(M, N) ->
          -      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
          -      {ok, N0} = xref:q(S, lists:flatten(Q)),
          +modulesmode of Xref servers.

          t(S) ->
          +  {ok, _} = xref:q(S, "Eplus := closure E"),
          +  {ok, Ms} = xref:q(S, "AM"),
          +  Fun = fun(M, N) ->
          +      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
          +      {ok, N0} = xref:q(S, lists:flatten(Q)),
                 N + N0
               end,
          -  Sum = lists:foldl(Fun, 0, Ms),
          -  ok = xref:forget(S, 'Eplus'),
          -  {ok, Tot} = xref:q(S, "# (closure ME | AM)"),
          -  100 * ((Tot - Sum) / Tot).

          Comments on the code:

          • We want to find the reduction of the closure of the function graph to modules. + Sum = lists:foldl(Fun, 0, Ms), + ok = xref:forget(S, 'Eplus'), + {ok, Tot} = xref:q(S, "# (closure ME | AM)"), + 100 * ((Tot - Sum) / Tot).

          Comments on the code:

          • We want to find the reduction of the closure of the function graph to modules. The direct expression for doing that would be (Mod) (closure E | AM), but then we would have to represent all of the transitive closure of E in memory. Instead the number of indirectly used modules is found for each analyzed @@ -295,7 +295,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/404.html 2026-04-20 17:49:01.461815078 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/404.html 2026-04-20 17:49:01.461815078 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/api-reference.html 2026-04-20 17:49:01.637816170 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/api-reference.html 2026-04-20 17:49:01.641816194 +0000 @@ -2351,7 +2351,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/chapter.html 2026-04-20 17:49:01.669816368 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/chapter.html 2026-04-20 17:49:01.673816393 +0000 @@ -113,13 +113,13 @@ is the object reference. Optional arguments are last and expressed as tagged tuples in any order.

            For example the wxWindow C++ class is implemented in the wxWindow erlang module and the member wxWindow::CenterOnParent is thus -wxWindow:centerOnParent. The following C++ code:

              wxWindow MyWin = new wxWindow();
            -  MyWin.CenterOnParent(wxVERTICAL);
            +wxWindow:centerOnParent. The following C++ code:

              wxWindow MyWin = new wxWindow();
            +  MyWin.CenterOnParent(wxVERTICAL);
               ...
            -  delete MyWin;

            would in erlang look like:

              MyWin = wxWindow:new(),
            -  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
            +  delete MyWin;

            would in erlang look like:

              MyWin = wxWindow:new(),
            +  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
               ...
            -  wxWindow:destroy(MyWin),

            When you are reading wxWidgets documentation or the examples, you will notice + wxWindow:destroy(MyWin),

            When you are reading wxWidgets documentation or the examples, you will notice that some of the most basic classes are missing in wx, they are directly mapped to corresponding erlang terms:

            • wxPoint is represented by {Xcoord,Ycoord}

            • wxSize is represented by {Width,Height}

            • wxRect is represented by {Xcoord,Ycoord,Width,Height}

            • wxColour is represented by {Red,Green,Blue[,Alpha]}

            • wxString is represented by unicode:charlist()

            • wxGBPosition is represented by {Row,Column}

            • wxGBSpan is represented by {RowSpan,ColumnSPan}

            • wxGridCellCoords is represented by {Row,Column}

            In the places where the erlang API differs from the original one it should be @@ -141,14 +141,14 @@ from several processes in your application, you must share the environment. You can get the active environment with wx:get_env/0 and set it in the new processes with wx:set_env/1. Two processes or applications which have both -called wx:new() will not be able use each others objects.

              wx:new(),
            -  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
            -  Env = wx:get_env(),
            -  spawn(fun() ->
            -           wx:set_env(Env),
            +called wx:new() will not be able use each others objects.

              wx:new(),
            +  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
            +  Env = wx:get_env(),
            +  spawn(fun() ->
            +           wx:set_env(Env),
                        %% Here you can do wx calls from your helper process.
                        ...
            -        end),
            +        end),
               ...

            When wx:destroy/0 is invoked or when all processes in the application have died, the memory is deleted and all windows created by that application are closed.

            The wx application never cleans or garbage collects memory as long as the user @@ -243,7 +243,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/gl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/gl.html 2026-04-20 17:49:01.965818204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/gl.html 2026-04-20 17:49:01.965818204 +0000 @@ -41014,7 +41014,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/glu.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/glu.html 2026-04-20 17:49:02.025818576 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/glu.html 2026-04-20 17:49:02.033818626 +0000 @@ -1786,7 +1786,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/notes.html 2026-04-20 17:49:02.073818874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/notes.html 2026-04-20 17:49:02.073818874 +0000 @@ -205,7 +205,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/search.html 2026-04-20 17:49:02.105819073 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/search.html 2026-04-20 17:49:02.105819073 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/chapter.xhtml 2026-04-20 15:18:56.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/chapter.xhtml 2042-05-23 04:37:34.000000000 +0000 @@ -41,13 +41,13 @@ is the object reference. Optional arguments are last and expressed as tagged tuples in any order.

            For example the wxWindow C++ class is implemented in the wxWindow erlang module and the member wxWindow::CenterOnParent is thus -wxWindow:centerOnParent. The following C++ code:

              wxWindow MyWin = new wxWindow();
            -  MyWin.CenterOnParent(wxVERTICAL);
            +wxWindow:centerOnParent. The following C++ code:

              wxWindow MyWin = new wxWindow();
            +  MyWin.CenterOnParent(wxVERTICAL);
               ...
            -  delete MyWin;

            would in erlang look like:

              MyWin = wxWindow:new(),
            -  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
            +  delete MyWin;

            would in erlang look like:

              MyWin = wxWindow:new(),
            +  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
               ...
            -  wxWindow:destroy(MyWin),

            When you are reading wxWidgets documentation or the examples, you will notice + wxWindow:destroy(MyWin),

            When you are reading wxWidgets documentation or the examples, you will notice that some of the most basic classes are missing in wx, they are directly mapped to corresponding erlang terms:

            • wxPoint is represented by {Xcoord,Ycoord}

            • wxSize is represented by {Width,Height}

            • wxRect is represented by {Xcoord,Ycoord,Width,Height}

            • wxColour is represented by {Red,Green,Blue[,Alpha]}

            • wxString is represented by unicode:charlist()

            • wxGBPosition is represented by {Row,Column}

            • wxGBSpan is represented by {RowSpan,ColumnSPan}

            • wxGridCellCoords is represented by {Row,Column}

            In the places where the erlang API differs from the original one it should be @@ -69,14 +69,14 @@ from several processes in your application, you must share the environment. You can get the active environment with wx:get_env/0 and set it in the new processes with wx:set_env/1. Two processes or applications which have both -called wx:new() will not be able use each others objects.

              wx:new(),
            -  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
            -  Env = wx:get_env(),
            -  spawn(fun() ->
            -           wx:set_env(Env),
            +called wx:new() will not be able use each others objects.

              wx:new(),
            +  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
            +  Env = wx:get_env(),
            +  spawn(fun() ->
            +           wx:set_env(Env),
                        %% Here you can do wx calls from your helper process.
                        ...
            -        end),
            +        end),
               ...

            When wx:destroy/0 is invoked or when all processes in the application have died, the memory is deleted and all windows created by that application are closed.

            The wx application never cleans or garbage collects memory as long as the user /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/content.opf 2026-04-20 15:18:56.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/content.opf 2042-05-23 04:37:34.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> wx - 2.5.4 - urn:uuid:10c84243-2f82-670d-9f6d-ad93c4fac517 + urn:uuid:87f890f7-5183-ba0b-1eda-54bd0a192ef1 en - 2026-04-20T15:18:55Z + 2042-05-23T04:37:33Z /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/wx_object.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/wx_object.xhtml 2026-04-20 15:18:56.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.epub/OEBPS/wx_object.xhtml 2042-05-23 04:37:34.000000000 +0000 @@ -30,36 +30,36 @@ shutdown | Term, terminate(State) is called. It lets the user module clean up, it is always called when server terminates or when wx_object() in the driver is deleted. If the Parent process terminates the Module:terminate/2 function is -called.
            terminate(Reason, State)

            Example:

              -module(myDialog).
            -  -export([new/2, show/1, destroy/1]).  %% API
            -  -export([init/1, handle_call/3, handle_event/2,
            -           handle_info/2, code_change/3, terminate/2]).
            +called.
            terminate(Reason, State)

            Example:

              -module(myDialog).
            +  -export([new/2, show/1, destroy/1]).  %% API
            +  -export([init/1, handle_call/3, handle_event/2,
            +           handle_info/2, code_change/3, terminate/2]).
                        new/2, showModal/1, destroy/1]).  %% Callbacks
             
               %% Client API
            -  new(Parent, Msg) ->
            -     wx_object:start(?MODULE, [Parent,Id], []).
            +  new(Parent, Msg) ->
            +     wx_object:start(?MODULE, [Parent,Id], []).
             
            -  show(Dialog) ->
            -     wx_object:call(Dialog, show_modal).
            +  show(Dialog) ->
            +     wx_object:call(Dialog, show_modal).
             
            -  destroy(Dialog) ->
            -     wx_object:call(Dialog, destroy).
            +  destroy(Dialog) ->
            +     wx_object:call(Dialog, destroy).
             
               %% Server Implementation ala gen_server
            -  init([Parent, Str]) ->
            -     Dialog = wxDialog:new(Parent, 42, "Testing", []),
            +  init([Parent, Str]) ->
            +     Dialog = wxDialog:new(Parent, 42, "Testing", []),
                  ...
            -     wxDialog:connect(Dialog, command_button_clicked),
            -     {Dialog, MyState}.
            +     wxDialog:connect(Dialog, command_button_clicked),
            +     {Dialog, MyState}.
             
            -  handle_call(show, _From, State) ->
            -     wxDialog:show(State#state.win),
            -     {reply, ok, State};
            +  handle_call(show, _From, State) ->
            +     wxDialog:show(State#state.win),
            +     {reply, ok, State};
               ...
            -  handle_event(#wx{}, State) ->
            -     io:format("Users clicked button~n",[]),
            -     {noreply, State};
            +  handle_event(#wx{}, State) ->
            +     io:format("Users clicked button~n",[]),
            +     {noreply, State};
               ...

            DATA TYPES

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.html 2026-04-20 17:49:02.981824508 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx.html 2026-04-20 17:49:02.985824532 +0000 @@ -1428,7 +1428,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorEntry.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorEntry.html 2026-04-20 17:49:03.021824756 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorEntry.html 2026-04-20 17:49:03.017824731 +0000 @@ -525,7 +525,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorTable.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorTable.html 2026-04-20 17:49:03.053824954 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAcceleratorTable.html 2026-04-20 17:49:03.053824954 +0000 @@ -398,7 +398,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxActivateEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxActivateEvent.html 2026-04-20 17:49:03.081825127 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxActivateEvent.html 2026-04-20 17:49:03.085825152 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxArtProvider.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxArtProvider.html 2026-04-20 17:49:03.117825351 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxArtProvider.html 2026-04-20 17:49:03.117825351 +0000 @@ -385,7 +385,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiDockArt.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiDockArt.html 2026-04-20 17:49:03.149825550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiDockArt.html 2026-04-20 17:49:03.149825550 +0000 @@ -438,7 +438,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManager.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManager.html 2026-04-20 17:49:03.189825798 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManager.html 2026-04-20 17:49:03.189825798 +0000 @@ -1426,7 +1426,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManagerEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManagerEvent.html 2026-04-20 17:49:03.225826021 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiManagerEvent.html 2026-04-20 17:49:03.221825996 +0000 @@ -779,7 +779,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebook.html 2026-04-20 17:49:03.265826269 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebook.html 2026-04-20 17:49:03.273826319 +0000 @@ -1382,7 +1382,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebookEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebookEvent.html 2026-04-20 17:49:03.309826542 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiNotebookEvent.html 2026-04-20 17:49:03.313826567 +0000 @@ -518,7 +518,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiPaneInfo.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiPaneInfo.html 2026-04-20 17:49:03.377826964 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiPaneInfo.html 2026-04-20 17:49:03.377826964 +0000 @@ -4062,7 +4062,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiSimpleTabArt.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiSimpleTabArt.html 2026-04-20 17:49:03.409827163 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiSimpleTabArt.html 2026-04-20 17:49:03.409827163 +0000 @@ -281,7 +281,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiTabArt.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiTabArt.html 2026-04-20 17:49:03.441827361 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxAuiTabArt.html 2026-04-20 17:49:03.441827361 +0000 @@ -434,7 +434,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmap.html 2026-04-20 17:49:03.481827609 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmap.html 2026-04-20 17:49:03.485827634 +0000 @@ -1344,7 +1344,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapButton.html 2026-04-20 17:49:03.521827857 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapButton.html 2026-04-20 17:49:03.525827882 +0000 @@ -504,7 +504,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapDataObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapDataObject.html 2026-04-20 17:49:03.557828081 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBitmapDataObject.html 2026-04-20 17:49:03.561828106 +0000 @@ -399,7 +399,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlBase.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlBase.html 2026-04-20 17:49:03.597828329 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlBase.html 2026-04-20 17:49:03.593828304 +0000 @@ -923,7 +923,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlEvent.html 2026-04-20 17:49:03.629828527 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBookCtrlEvent.html 2026-04-20 17:49:03.629828527 +0000 @@ -442,7 +442,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBoxSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBoxSizer.html 2026-04-20 17:49:03.665828750 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBoxSizer.html 2026-04-20 17:49:03.669828775 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBrush.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBrush.html 2026-04-20 17:49:03.705828999 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBrush.html 2026-04-20 17:49:03.697828949 +0000 @@ -713,7 +713,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedDC.html 2026-04-20 17:49:03.737829197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedDC.html 2026-04-20 17:49:03.737829197 +0000 @@ -536,7 +536,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedPaintDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedPaintDC.html 2026-04-20 17:49:03.773829420 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxBufferedPaintDC.html 2026-04-20 17:49:03.777829445 +0000 @@ -373,7 +373,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxButton.html 2026-04-20 17:49:03.817829693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxButton.html 2026-04-20 17:49:03.817829693 +0000 @@ -882,7 +882,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarCtrl.html 2026-04-20 17:49:03.865829991 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarCtrl.html 2026-04-20 17:49:03.861829966 +0000 @@ -1355,7 +1355,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarDateAttr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarDateAttr.html 2026-04-20 17:49:03.901830215 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarDateAttr.html 2026-04-20 17:49:03.901830215 +0000 @@ -1011,7 +1011,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarEvent.html 2026-04-20 17:49:03.933830413 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCalendarEvent.html 2026-04-20 17:49:03.933830413 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCaret.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCaret.html 2026-04-20 17:49:03.977830686 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCaret.html 2026-04-20 17:49:03.973830661 +0000 @@ -951,7 +951,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckBox.html 2026-04-20 17:49:04.013830909 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckBox.html 2026-04-20 17:49:04.017830934 +0000 @@ -730,7 +730,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckListBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckListBox.html 2026-04-20 17:49:04.053831157 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCheckListBox.html 2026-04-20 17:49:04.053831157 +0000 @@ -481,7 +481,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChildFocusEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChildFocusEvent.html 2026-04-20 17:49:04.089831381 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChildFocusEvent.html 2026-04-20 17:49:04.085831356 +0000 @@ -318,7 +318,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoice.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoice.html 2026-04-20 17:49:04.121831579 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoice.html 2026-04-20 17:49:04.125831604 +0000 @@ -615,7 +615,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoicebook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoicebook.html 2026-04-20 17:49:04.173831902 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxChoicebook.html 2026-04-20 17:49:04.169831877 +0000 @@ -1323,7 +1323,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClientDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClientDC.html 2026-04-20 17:49:04.205832100 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClientDC.html 2026-04-20 17:49:04.205832100 +0000 @@ -288,7 +288,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboard.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboard.html 2026-04-20 17:49:04.241832324 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboard.html 2026-04-20 17:49:04.241832324 +0000 @@ -766,7 +766,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboardTextEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboardTextEvent.html 2026-04-20 17:49:04.273832522 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxClipboardTextEvent.html 2026-04-20 17:49:04.273832522 +0000 @@ -265,7 +265,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCloseEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCloseEvent.html 2026-04-20 17:49:04.313832769 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCloseEvent.html 2026-04-20 17:49:04.313832769 +0000 @@ -521,7 +521,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourData.html 2026-04-20 17:49:04.349832994 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourData.html 2026-04-20 17:49:04.349832994 +0000 @@ -513,7 +513,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourDialog.html 2026-04-20 17:49:04.385833217 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourDialog.html 2026-04-20 17:49:04.385833217 +0000 @@ -482,7 +482,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerCtrl.html 2026-04-20 17:49:04.421833440 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerCtrl.html 2026-04-20 17:49:04.421833440 +0000 @@ -536,7 +536,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerEvent.html 2026-04-20 17:49:04.449833614 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxColourPickerEvent.html 2026-04-20 17:49:04.453833638 +0000 @@ -315,7 +315,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxComboBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxComboBox.html 2026-04-20 17:49:04.497833912 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxComboBox.html 2026-04-20 17:49:04.493833887 +0000 @@ -1255,7 +1255,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCommandEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCommandEvent.html 2026-04-20 17:49:04.533834135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCommandEvent.html 2026-04-20 17:49:04.529834110 +0000 @@ -651,7 +651,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxContextMenuEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxContextMenuEvent.html 2026-04-20 17:49:04.569834358 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxContextMenuEvent.html 2026-04-20 17:49:04.565834333 +0000 @@ -364,7 +364,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControl.html 2026-04-20 17:49:04.605834581 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControl.html 2026-04-20 17:49:04.605834581 +0000 @@ -287,7 +287,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControlWithItems.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControlWithItems.html 2026-04-20 17:49:04.641834805 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxControlWithItems.html 2026-04-20 17:49:04.637834780 +0000 @@ -1138,7 +1138,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCursor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCursor.html 2026-04-20 17:49:04.673835003 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxCursor.html 2026-04-20 17:49:04.677835028 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDC.html 2026-04-20 17:49:04.737835400 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDC.html 2026-04-20 17:49:04.741835425 +0000 @@ -4021,7 +4021,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDCOverlay.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDCOverlay.html 2026-04-20 17:49:04.777835649 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDCOverlay.html 2026-04-20 17:49:04.777835649 +0000 @@ -364,7 +364,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDataObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDataObject.html 2026-04-20 17:49:04.809835847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDataObject.html 2026-04-20 17:49:04.805835822 +0000 @@ -223,7 +223,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDateEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDateEvent.html 2026-04-20 17:49:04.841836046 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDateEvent.html 2026-04-20 17:49:04.841836046 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDatePickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDatePickerCtrl.html 2026-04-20 17:49:04.877836269 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDatePickerCtrl.html 2026-04-20 17:49:04.873836244 +0000 @@ -545,7 +545,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDialog.html 2026-04-20 17:49:04.917836517 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDialog.html 2026-04-20 17:49:04.917836517 +0000 @@ -914,7 +914,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirDialog.html 2026-04-20 17:49:04.953836741 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirDialog.html 2026-04-20 17:49:04.957836765 +0000 @@ -494,7 +494,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirPickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirPickerCtrl.html 2026-04-20 17:49:04.989836964 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDirPickerCtrl.html 2026-04-20 17:49:04.989836964 +0000 @@ -544,7 +544,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplay.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplay.html 2026-04-20 17:49:05.029837212 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplay.html 2026-04-20 17:49:05.029837212 +0000 @@ -670,7 +670,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplayChangedEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplayChangedEvent.html 2026-04-20 17:49:05.061837410 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDisplayChangedEvent.html 2026-04-20 17:49:05.061837410 +0000 @@ -258,7 +258,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDropFilesEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDropFilesEvent.html 2026-04-20 17:49:05.097837634 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxDropFilesEvent.html 2026-04-20 17:49:05.093837609 +0000 @@ -395,7 +395,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEraseEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEraseEvent.html 2026-04-20 17:49:05.129837832 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEraseEvent.html 2026-04-20 17:49:05.129837832 +0000 @@ -317,7 +317,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvent.html 2026-04-20 17:49:05.161838031 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvent.html 2026-04-20 17:49:05.165838055 +0000 @@ -564,7 +564,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvtHandler.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvtHandler.html 2026-04-20 17:49:05.205838303 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxEvtHandler.html 2026-04-20 17:49:05.205838303 +0000 @@ -631,7 +631,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDataObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDataObject.html 2026-04-20 17:49:05.241838527 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDataObject.html 2026-04-20 17:49:05.241838527 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDialog.html 2026-04-20 17:49:05.281838775 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDialog.html 2026-04-20 17:49:05.277838750 +0000 @@ -901,7 +901,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDirPickerEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDirPickerEvent.html 2026-04-20 17:49:05.313838973 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFileDirPickerEvent.html 2026-04-20 17:49:05.313838973 +0000 @@ -315,7 +315,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFilePickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFilePickerCtrl.html 2026-04-20 17:49:05.349839197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFilePickerCtrl.html 2026-04-20 17:49:05.349839197 +0000 @@ -547,7 +547,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceData.html 2026-04-20 17:49:05.385839420 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceData.html 2026-04-20 17:49:05.381839394 +0000 @@ -549,7 +549,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceDialog.html 2026-04-20 17:49:05.421839644 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFindReplaceDialog.html 2026-04-20 17:49:05.417839619 +0000 @@ -493,7 +493,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFlexGridSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFlexGridSizer.html 2026-04-20 17:49:05.461839892 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFlexGridSizer.html 2026-04-20 17:49:05.461839892 +0000 @@ -816,7 +816,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFocusEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFocusEvent.html 2026-04-20 17:49:05.497840115 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFocusEvent.html 2026-04-20 17:49:05.493840090 +0000 @@ -323,7 +323,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFont.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFont.html 2026-04-20 17:49:05.533840337 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFont.html 2026-04-20 17:49:05.537840363 +0000 @@ -1176,7 +1176,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontData.html 2026-04-20 17:49:05.577840611 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontData.html 2026-04-20 17:49:05.577840611 +0000 @@ -814,7 +814,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontDialog.html 2026-04-20 17:49:05.609840810 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontDialog.html 2026-04-20 17:49:05.605840785 +0000 @@ -401,7 +401,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerCtrl.html 2026-04-20 17:49:05.641841008 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerCtrl.html 2026-04-20 17:49:05.645841033 +0000 @@ -616,7 +616,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerEvent.html 2026-04-20 17:49:05.681841256 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFontPickerEvent.html 2026-04-20 17:49:05.681841256 +0000 @@ -314,7 +314,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFrame.html 2026-04-20 17:49:05.713841455 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxFrame.html 2026-04-20 17:49:05.717841480 +0000 @@ -1237,7 +1237,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGBSizerItem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGBSizerItem.html 2026-04-20 17:49:05.749841678 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGBSizerItem.html 2026-04-20 17:49:05.749841678 +0000 @@ -189,7 +189,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGCDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGCDC.html 2026-04-20 17:49:05.781841877 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGCDC.html 2026-04-20 17:49:05.777841852 +0000 @@ -409,7 +409,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLCanvas.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLCanvas.html 2026-04-20 17:49:05.817842100 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLCanvas.html 2026-04-20 17:49:05.813842075 +0000 @@ -509,7 +509,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLContext.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLContext.html 2026-04-20 17:49:05.845842274 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGLContext.html 2026-04-20 17:49:05.845842274 +0000 @@ -422,7 +422,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGauge.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGauge.html 2026-04-20 17:49:05.877842472 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGauge.html 2026-04-20 17:49:05.881842497 +0000 @@ -697,7 +697,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGenericDirCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGenericDirCtrl.html 2026-04-20 17:49:05.925842770 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGenericDirCtrl.html 2026-04-20 17:49:05.925842770 +0000 @@ -1065,7 +1065,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsBrush.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsBrush.html 2026-04-20 17:49:05.957842968 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsBrush.html 2026-04-20 17:49:05.957842968 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsContext.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsContext.html 2026-04-20 17:49:06.005843266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsContext.html 2026-04-20 17:49:06.009843291 +0000 @@ -2184,7 +2184,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsFont.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsFont.html 2026-04-20 17:49:06.037843465 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsFont.html 2026-04-20 17:49:06.041843490 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsGradientStops.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsGradientStops.html 2026-04-20 17:49:06.073843688 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsGradientStops.html 2026-04-20 17:49:06.073843688 +0000 @@ -589,7 +589,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsMatrix.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsMatrix.html 2026-04-20 17:49:06.101843861 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsMatrix.html 2026-04-20 17:49:06.105843886 +0000 @@ -681,7 +681,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsObject.html 2026-04-20 17:49:06.137844085 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsObject.html 2026-04-20 17:49:06.133844060 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPath.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPath.html 2026-04-20 17:49:06.177844333 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPath.html 2026-04-20 17:49:06.177844333 +0000 @@ -1139,7 +1139,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPen.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPen.html 2026-04-20 17:49:06.205844507 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsPen.html 2026-04-20 17:49:06.209844532 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsRenderer.html 2026-04-20 17:49:06.237844705 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGraphicsRenderer.html 2026-04-20 17:49:06.237844705 +0000 @@ -674,7 +674,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGrid.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGrid.html 2026-04-20 17:49:06.333845301 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGrid.html 2026-04-20 17:49:06.329845276 +0000 @@ -8414,7 +8414,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridBagSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridBagSizer.html 2026-04-20 17:49:06.381845599 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridBagSizer.html 2026-04-20 17:49:06.377845574 +0000 @@ -1129,7 +1129,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellAttr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellAttr.html 2026-04-20 17:49:06.421845846 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellAttr.html 2026-04-20 17:49:06.425845871 +0000 @@ -1060,7 +1060,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolEditor.html 2026-04-20 17:49:06.457846071 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolEditor.html 2026-04-20 17:49:06.461846096 +0000 @@ -401,7 +401,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolRenderer.html 2026-04-20 17:49:06.493846294 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellBoolRenderer.html 2026-04-20 17:49:06.493846294 +0000 @@ -279,7 +279,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellChoiceEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellChoiceEditor.html 2026-04-20 17:49:06.525846492 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellChoiceEditor.html 2026-04-20 17:49:06.525846492 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellEditor.html 2026-04-20 17:49:06.561846716 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellEditor.html 2026-04-20 17:49:06.561846716 +0000 @@ -568,7 +568,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatEditor.html 2026-04-20 17:49:06.593846914 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatEditor.html 2026-04-20 17:49:06.593846914 +0000 @@ -359,7 +359,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatRenderer.html 2026-04-20 17:49:06.629847138 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellFloatRenderer.html 2026-04-20 17:49:06.629847138 +0000 @@ -511,7 +511,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberEditor.html 2026-04-20 17:49:06.665847361 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberEditor.html 2026-04-20 17:49:06.661847336 +0000 @@ -395,7 +395,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberRenderer.html 2026-04-20 17:49:06.697847559 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellNumberRenderer.html 2026-04-20 17:49:06.697847559 +0000 @@ -279,7 +279,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellRenderer.html 2026-04-20 17:49:06.733847782 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellRenderer.html 2026-04-20 17:49:06.733847782 +0000 @@ -304,7 +304,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellStringRenderer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellStringRenderer.html 2026-04-20 17:49:06.765847982 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellStringRenderer.html 2026-04-20 17:49:06.765847982 +0000 @@ -280,7 +280,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellTextEditor.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellTextEditor.html 2026-04-20 17:49:06.797848180 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridCellTextEditor.html 2026-04-20 17:49:06.797848180 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridEvent.html 2026-04-20 17:49:06.829848378 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridEvent.html 2026-04-20 17:49:06.833848403 +0000 @@ -602,7 +602,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridSizer.html 2026-04-20 17:49:06.869848626 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxGridSizer.html 2026-04-20 17:49:06.873848651 +0000 @@ -708,7 +708,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHelpEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHelpEvent.html 2026-04-20 17:49:06.905848850 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHelpEvent.html 2026-04-20 17:49:06.909848875 +0000 @@ -436,7 +436,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlEasyPrinting.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlEasyPrinting.html 2026-04-20 17:49:06.941849073 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlEasyPrinting.html 2026-04-20 17:49:06.945849098 +0000 @@ -925,7 +925,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlLinkEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlLinkEvent.html 2026-04-20 17:49:06.973849272 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlLinkEvent.html 2026-04-20 17:49:06.977849296 +0000 @@ -316,7 +316,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlWindow.html 2026-04-20 17:49:07.017849544 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxHtmlWindow.html 2026-04-20 17:49:07.017849544 +0000 @@ -1314,7 +1314,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIcon.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIcon.html 2026-04-20 17:49:07.049849743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIcon.html 2026-04-20 17:49:07.053849767 +0000 @@ -411,7 +411,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconBundle.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconBundle.html 2026-04-20 17:49:07.085849966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconBundle.html 2026-04-20 17:49:07.089849991 +0000 @@ -565,7 +565,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconizeEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconizeEvent.html 2026-04-20 17:49:07.117850165 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIconizeEvent.html 2026-04-20 17:49:07.121850190 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIdleEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIdleEvent.html 2026-04-20 17:49:07.153850388 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxIdleEvent.html 2026-04-20 17:49:07.157850413 +0000 @@ -500,7 +500,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImage.html 2026-04-20 17:49:07.213850761 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImage.html 2026-04-20 17:49:07.217850785 +0000 @@ -3824,7 +3824,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImageList.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImageList.html 2026-04-20 17:49:07.261851058 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxImageList.html 2026-04-20 17:49:07.261851058 +0000 @@ -938,7 +938,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxInitDialogEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxInitDialogEvent.html 2026-04-20 17:49:07.289851232 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxInitDialogEvent.html 2026-04-20 17:49:07.293851257 +0000 @@ -257,7 +257,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxJoystickEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxJoystickEvent.html 2026-04-20 17:49:07.325851455 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxJoystickEvent.html 2026-04-20 17:49:07.329851480 +0000 @@ -820,7 +820,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxKeyEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxKeyEvent.html 2026-04-20 17:49:07.365851704 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxKeyEvent.html 2026-04-20 17:49:07.369851728 +0000 @@ -894,7 +894,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLayoutAlgorithm.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLayoutAlgorithm.html 2026-04-20 17:49:07.409851976 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLayoutAlgorithm.html 2026-04-20 17:49:07.405851951 +0000 @@ -564,7 +564,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListBox.html 2026-04-20 17:49:07.445852199 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListBox.html 2026-04-20 17:49:07.445852199 +0000 @@ -780,7 +780,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListCtrl.html 2026-04-20 17:49:07.505852571 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListCtrl.html 2026-04-20 17:49:07.501852547 +0000 @@ -3215,7 +3215,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListEvent.html 2026-04-20 17:49:07.537852770 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListEvent.html 2026-04-20 17:49:07.537852770 +0000 @@ -796,7 +796,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItem.html 2026-04-20 17:49:07.577853018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItem.html 2026-04-20 17:49:07.581853043 +0000 @@ -1237,7 +1237,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItemAttr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItemAttr.html 2026-04-20 17:49:07.613853242 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListItemAttr.html 2026-04-20 17:49:07.617853266 +0000 @@ -660,7 +660,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListView.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListView.html 2026-04-20 17:49:07.657853514 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListView.html 2026-04-20 17:49:07.657853514 +0000 @@ -554,7 +554,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListbook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListbook.html 2026-04-20 17:49:07.697853763 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxListbook.html 2026-04-20 17:49:07.693853738 +0000 @@ -1322,7 +1322,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLocale.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLocale.html 2026-04-20 17:49:07.737854011 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLocale.html 2026-04-20 17:49:07.733853986 +0000 @@ -1336,7 +1336,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLogNull.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLogNull.html 2026-04-20 17:49:07.769854209 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxLogNull.html 2026-04-20 17:49:07.769854209 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIChildFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIChildFrame.html 2026-04-20 17:49:07.801854408 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIChildFrame.html 2026-04-20 17:49:07.797854383 +0000 @@ -619,7 +619,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIClientWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIClientWindow.html 2026-04-20 17:49:07.833854607 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIClientWindow.html 2026-04-20 17:49:07.833854607 +0000 @@ -370,7 +370,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIParentFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIParentFrame.html 2026-04-20 17:49:07.873854855 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMDIParentFrame.html 2026-04-20 17:49:07.873854855 +0000 @@ -787,7 +787,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMask.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMask.html 2026-04-20 17:49:07.905855053 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMask.html 2026-04-20 17:49:07.905855053 +0000 @@ -439,7 +439,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMaximizeEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMaximizeEvent.html 2026-04-20 17:49:07.941855276 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMaximizeEvent.html 2026-04-20 17:49:07.941855276 +0000 @@ -260,7 +260,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMemoryDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMemoryDC.html 2026-04-20 17:49:07.969855450 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMemoryDC.html 2026-04-20 17:49:07.973855475 +0000 @@ -412,7 +412,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenu.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenu.html 2026-04-20 17:49:08.021855773 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenu.html 2026-04-20 17:49:08.013855723 +0000 @@ -2209,7 +2209,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuBar.html 2026-04-20 17:49:08.061856021 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuBar.html 2026-04-20 17:49:08.061856021 +0000 @@ -1423,7 +1423,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuEvent.html 2026-04-20 17:49:08.093856219 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuEvent.html 2026-04-20 17:49:08.089856194 +0000 @@ -403,7 +403,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuItem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuItem.html 2026-04-20 17:49:08.133856468 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMenuItem.html 2026-04-20 17:49:08.133856468 +0000 @@ -1390,7 +1390,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMessageDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMessageDialog.html 2026-04-20 17:49:08.169856691 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMessageDialog.html 2026-04-20 17:49:08.169856691 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMiniFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMiniFrame.html 2026-04-20 17:49:08.205856914 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMiniFrame.html 2026-04-20 17:49:08.205856914 +0000 @@ -457,7 +457,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMirrorDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMirrorDC.html 2026-04-20 17:49:08.233857087 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMirrorDC.html 2026-04-20 17:49:08.233857087 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureChangedEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureChangedEvent.html 2026-04-20 17:49:08.261857261 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureChangedEvent.html 2026-04-20 17:49:08.261857261 +0000 @@ -316,7 +316,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureLostEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureLostEvent.html 2026-04-20 17:49:08.293857460 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseCaptureLostEvent.html 2026-04-20 17:49:08.293857460 +0000 @@ -262,7 +262,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseEvent.html 2026-04-20 17:49:08.333857708 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMouseEvent.html 2026-04-20 17:49:08.337857733 +0000 @@ -2041,7 +2041,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMoveEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMoveEvent.html 2026-04-20 17:49:08.369857931 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMoveEvent.html 2026-04-20 17:49:08.369857931 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMultiChoiceDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMultiChoiceDialog.html 2026-04-20 17:49:08.405858154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxMultiChoiceDialog.html 2026-04-20 17:49:08.401858130 +0000 @@ -406,7 +406,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNavigationKeyEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNavigationKeyEvent.html 2026-04-20 17:49:08.441858378 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNavigationKeyEvent.html 2026-04-20 17:49:08.441858378 +0000 @@ -589,7 +589,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotebook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotebook.html 2026-04-20 17:49:08.477858601 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotebook.html 2026-04-20 17:49:08.473858577 +0000 @@ -808,7 +808,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotificationMessage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotificationMessage.html 2026-04-20 17:49:08.513858825 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotificationMessage.html 2026-04-20 17:49:08.521858874 +0000 @@ -896,7 +896,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotifyEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotifyEvent.html 2026-04-20 17:49:08.553859072 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxNotifyEvent.html 2026-04-20 17:49:08.549859048 +0000 @@ -325,7 +325,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxOverlay.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxOverlay.html 2026-04-20 17:49:08.585859271 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxOverlay.html 2026-04-20 17:49:08.585859271 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialog.html 2026-04-20 17:49:08.613859445 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialog.html 2026-04-20 17:49:08.617859470 +0000 @@ -404,7 +404,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialogData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialogData.html 2026-04-20 17:49:08.661859743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPageSetupDialogData.html 2026-04-20 17:49:08.661859743 +0000 @@ -1444,7 +1444,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintDC.html 2026-04-20 17:49:08.697859966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintDC.html 2026-04-20 17:49:08.697859966 +0000 @@ -285,7 +285,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintEvent.html 2026-04-20 17:49:08.729860165 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaintEvent.html 2026-04-20 17:49:08.729860165 +0000 @@ -266,7 +266,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPalette.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPalette.html 2026-04-20 17:49:08.757860338 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPalette.html 2026-04-20 17:49:08.757860338 +0000 @@ -596,7 +596,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaletteChangedEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaletteChangedEvent.html 2026-04-20 17:49:08.793860562 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPaletteChangedEvent.html 2026-04-20 17:49:08.793860562 +0000 @@ -351,7 +351,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPanel.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPanel.html 2026-04-20 17:49:08.829860785 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPanel.html 2026-04-20 17:49:08.829860785 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPasswordEntryDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPasswordEntryDialog.html 2026-04-20 17:49:08.861860983 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPasswordEntryDialog.html 2026-04-20 17:49:08.861860983 +0000 @@ -326,7 +326,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPen.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPen.html 2026-04-20 17:49:08.901861232 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPen.html 2026-04-20 17:49:08.897861207 +0000 @@ -827,7 +827,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPickerBase.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPickerBase.html 2026-04-20 17:49:08.937861455 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPickerBase.html 2026-04-20 17:49:08.937861455 +0000 @@ -747,7 +747,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupTransientWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupTransientWindow.html 2026-04-20 17:49:08.973861678 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupTransientWindow.html 2026-04-20 17:49:08.973861678 +0000 @@ -474,7 +474,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupWindow.html 2026-04-20 17:49:09.009861901 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPopupWindow.html 2026-04-20 17:49:09.009861901 +0000 @@ -483,7 +483,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPostScriptDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPostScriptDC.html 2026-04-20 17:49:09.041862100 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPostScriptDC.html 2026-04-20 17:49:09.045862125 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewCanvas.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewCanvas.html 2026-04-20 17:49:09.073862299 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewCanvas.html 2026-04-20 17:49:09.073862299 +0000 @@ -186,7 +186,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewControlBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewControlBar.html 2026-04-20 17:49:09.113862547 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewControlBar.html 2026-04-20 17:49:09.113862547 +0000 @@ -484,7 +484,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewFrame.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewFrame.html 2026-04-20 17:49:09.145862745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPreviewFrame.html 2026-04-20 17:49:09.141862720 +0000 @@ -485,7 +485,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintData.html 2026-04-20 17:49:09.181862967 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintData.html 2026-04-20 17:49:09.185862993 +0000 @@ -1050,7 +1050,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialog.html 2026-04-20 17:49:09.217863192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialog.html 2026-04-20 17:49:09.217863192 +0000 @@ -398,7 +398,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialogData.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialogData.html 2026-04-20 17:49:09.249863390 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintDialogData.html 2026-04-20 17:49:09.253863415 +0000 @@ -1235,7 +1235,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintPreview.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintPreview.html 2026-04-20 17:49:09.297863688 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintPreview.html 2026-04-20 17:49:09.293863663 +0000 @@ -998,7 +998,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrinter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrinter.html 2026-04-20 17:49:09.329863886 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrinter.html 2026-04-20 17:49:09.333863910 +0000 @@ -685,7 +685,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintout.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintout.html 2026-04-20 17:49:09.373864160 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxPrintout.html 2026-04-20 17:49:09.373864160 +0000 @@ -1198,7 +1198,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxProgressDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxProgressDialog.html 2026-04-20 17:49:09.413864408 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxProgressDialog.html 2026-04-20 17:49:09.413864408 +0000 @@ -458,7 +458,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxQueryNewPaletteEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxQueryNewPaletteEvent.html 2026-04-20 17:49:09.449864631 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxQueryNewPaletteEvent.html 2026-04-20 17:49:09.449864631 +0000 @@ -353,7 +353,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioBox.html 2026-04-20 17:49:09.481864829 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioBox.html 2026-04-20 17:49:09.489864879 +0000 @@ -1086,7 +1086,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioButton.html 2026-04-20 17:49:09.521865078 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRadioButton.html 2026-04-20 17:49:09.525865102 +0000 @@ -543,7 +543,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRegion.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRegion.html 2026-04-20 17:49:09.561865326 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxRegion.html 2026-04-20 17:49:09.561865326 +0000 @@ -1170,7 +1170,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashEvent.html 2026-04-20 17:49:09.597865549 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashEvent.html 2026-04-20 17:49:09.597865549 +0000 @@ -406,7 +406,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashLayoutWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashLayoutWindow.html 2026-04-20 17:49:09.633865772 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashLayoutWindow.html 2026-04-20 17:49:09.629865747 +0000 @@ -653,7 +653,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashWindow.html 2026-04-20 17:49:09.669865996 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSashWindow.html 2026-04-20 17:49:09.669865996 +0000 @@ -746,7 +746,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScreenDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScreenDC.html 2026-04-20 17:49:09.705866219 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScreenDC.html 2026-04-20 17:49:09.705866219 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollBar.html 2026-04-20 17:49:09.737866417 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollBar.html 2026-04-20 17:49:09.737866417 +0000 @@ -758,7 +758,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollEvent.html 2026-04-20 17:49:09.773866640 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollEvent.html 2026-04-20 17:49:09.773866640 +0000 @@ -367,7 +367,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollWinEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollWinEvent.html 2026-04-20 17:49:09.801866815 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrollWinEvent.html 2026-04-20 17:49:09.809866865 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrolledWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrolledWindow.html 2026-04-20 17:49:09.841867063 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxScrolledWindow.html 2026-04-20 17:49:09.845867088 +0000 @@ -1032,7 +1032,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSetCursorEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSetCursorEvent.html 2026-04-20 17:49:09.881867311 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSetCursorEvent.html 2026-04-20 17:49:09.885867336 +0000 @@ -473,7 +473,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxShowEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxShowEvent.html 2026-04-20 17:49:09.913867510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxShowEvent.html 2026-04-20 17:49:09.917867534 +0000 @@ -354,7 +354,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSingleChoiceDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSingleChoiceDialog.html 2026-04-20 17:49:09.945867709 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSingleChoiceDialog.html 2026-04-20 17:49:09.949867733 +0000 @@ -445,7 +445,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizeEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizeEvent.html 2026-04-20 17:49:09.981867932 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizeEvent.html 2026-04-20 17:49:09.985867957 +0000 @@ -363,7 +363,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizer.html 2026-04-20 17:49:10.033868254 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizer.html 2026-04-20 17:49:10.037868279 +0000 @@ -2311,7 +2311,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerFlags.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerFlags.html 2026-04-20 17:49:10.073868502 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerFlags.html 2026-04-20 17:49:10.077868527 +0000 @@ -710,7 +710,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerItem.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerItem.html 2026-04-20 17:49:10.121868800 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSizerItem.html 2026-04-20 17:49:10.117868775 +0000 @@ -1656,7 +1656,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSlider.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSlider.html 2026-04-20 17:49:10.157869023 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSlider.html 2026-04-20 17:49:10.157869023 +0000 @@ -903,7 +903,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinButton.html 2026-04-20 17:49:10.193869247 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinButton.html 2026-04-20 17:49:10.189869222 +0000 @@ -646,7 +646,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinCtrl.html 2026-04-20 17:49:10.229869470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinCtrl.html 2026-04-20 17:49:10.237869519 +0000 @@ -698,7 +698,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinEvent.html 2026-04-20 17:49:10.269869718 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSpinEvent.html 2026-04-20 17:49:10.269869718 +0000 @@ -351,7 +351,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplashScreen.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplashScreen.html 2026-04-20 17:49:10.301869917 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplashScreen.html 2026-04-20 17:49:10.305869942 +0000 @@ -412,7 +412,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterEvent.html 2026-04-20 17:49:10.341870165 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterEvent.html 2026-04-20 17:49:10.341870165 +0000 @@ -475,7 +475,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterWindow.html 2026-04-20 17:49:10.381870413 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSplitterWindow.html 2026-04-20 17:49:10.385870437 +0000 @@ -1308,7 +1308,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBitmap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBitmap.html 2026-04-20 17:49:10.421870661 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBitmap.html 2026-04-20 17:49:10.425870686 +0000 @@ -537,7 +537,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBox.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBox.html 2026-04-20 17:49:10.461870909 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBox.html 2026-04-20 17:49:10.461870909 +0000 @@ -460,7 +460,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBoxSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBoxSizer.html 2026-04-20 17:49:10.489871083 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticBoxSizer.html 2026-04-20 17:49:10.493871108 +0000 @@ -365,7 +365,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticLine.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticLine.html 2026-04-20 17:49:10.525871306 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticLine.html 2026-04-20 17:49:10.525871306 +0000 @@ -527,7 +527,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticText.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticText.html 2026-04-20 17:49:10.565871555 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStaticText.html 2026-04-20 17:49:10.561871530 +0000 @@ -590,7 +590,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStatusBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStatusBar.html 2026-04-20 17:49:10.605871803 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStatusBar.html 2026-04-20 17:49:10.609871827 +0000 @@ -1056,7 +1056,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStdDialogButtonSizer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStdDialogButtonSizer.html 2026-04-20 17:49:10.645872050 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStdDialogButtonSizer.html 2026-04-20 17:49:10.645872050 +0000 @@ -482,7 +482,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextCtrl.html 2026-04-20 17:49:10.781872894 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextCtrl.html 2026-04-20 17:49:10.781872894 +0000 @@ -17621,7 +17621,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextEvent.html 2026-04-20 17:49:10.833873217 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxStyledTextEvent.html 2026-04-20 17:49:10.833873217 +0000 @@ -1187,7 +1187,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSysColourChangedEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSysColourChangedEvent.html 2026-04-20 17:49:10.865873416 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSysColourChangedEvent.html 2026-04-20 17:49:10.865873416 +0000 @@ -262,7 +262,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemOptions.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemOptions.html 2026-04-20 17:49:10.893873589 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemOptions.html 2026-04-20 17:49:10.897873614 +0000 @@ -444,7 +444,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemSettings.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemSettings.html 2026-04-20 17:49:10.933873837 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxSystemSettings.html 2026-04-20 17:49:10.933873837 +0000 @@ -403,7 +403,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIcon.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIcon.html 2026-04-20 17:49:10.965874035 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIcon.html 2026-04-20 17:49:10.969874060 +0000 @@ -480,7 +480,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIconEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIconEvent.html 2026-04-20 17:49:11.005874284 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTaskBarIconEvent.html 2026-04-20 17:49:11.001874258 +0000 @@ -260,7 +260,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextAttr.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextAttr.html 2026-04-20 17:49:11.045874532 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextAttr.html 2026-04-20 17:49:11.049874557 +0000 @@ -1817,7 +1817,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextCtrl.html 2026-04-20 17:49:11.105874904 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextCtrl.html 2026-04-20 17:49:11.101874879 +0000 @@ -2479,7 +2479,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextDataObject.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextDataObject.html 2026-04-20 17:49:11.133875078 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextDataObject.html 2026-04-20 17:49:11.133875078 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextEntryDialog.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextEntryDialog.html 2026-04-20 17:49:11.165875277 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTextEntryDialog.html 2026-04-20 17:49:11.169875301 +0000 @@ -442,7 +442,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToggleButton.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToggleButton.html 2026-04-20 17:49:11.201875500 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToggleButton.html 2026-04-20 17:49:11.201875500 +0000 @@ -532,7 +532,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolBar.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolBar.html 2026-04-20 17:49:11.249875797 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolBar.html 2026-04-20 17:49:11.245875772 +0000 @@ -2027,7 +2027,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolTip.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolTip.html 2026-04-20 17:49:11.281875996 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolTip.html 2026-04-20 17:49:11.285876020 +0000 @@ -470,7 +470,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolbook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolbook.html 2026-04-20 17:49:11.333876319 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxToolbook.html 2026-04-20 17:49:11.333876319 +0000 @@ -1324,7 +1324,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTopLevelWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTopLevelWindow.html 2026-04-20 17:49:11.377876591 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTopLevelWindow.html 2026-04-20 17:49:11.377876591 +0000 @@ -1106,7 +1106,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeCtrl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeCtrl.html 2026-04-20 17:49:11.437876963 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeCtrl.html 2026-04-20 17:49:11.437876963 +0000 @@ -3620,7 +3620,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeEvent.html 2026-04-20 17:49:11.469877162 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreeEvent.html 2026-04-20 17:49:11.469877162 +0000 @@ -595,7 +595,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreebook.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreebook.html 2026-04-20 17:49:11.517877460 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxTreebook.html 2026-04-20 17:49:11.513877435 +0000 @@ -1522,7 +1522,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxUpdateUIEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxUpdateUIEvent.html 2026-04-20 17:49:11.557877708 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxUpdateUIEvent.html 2026-04-20 17:49:11.557877708 +0000 @@ -991,7 +991,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebView.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebView.html 2026-04-20 17:49:11.605878005 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebView.html 2026-04-20 17:49:11.605878005 +0000 @@ -2300,7 +2300,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebViewEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebViewEvent.html 2026-04-20 17:49:11.645878254 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWebViewEvent.html 2026-04-20 17:49:11.641878229 +0000 @@ -443,7 +443,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindow.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindow.html 2026-04-20 17:49:11.733878800 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindow.html 2026-04-20 17:49:11.737878824 +0000 @@ -8178,7 +8178,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowCreateEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowCreateEvent.html 2026-04-20 17:49:11.773879048 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowCreateEvent.html 2026-04-20 17:49:11.773879048 +0000 @@ -258,7 +258,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDC.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDC.html 2026-04-20 17:49:11.809879271 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDC.html 2026-04-20 17:49:11.805879247 +0000 @@ -283,7 +283,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDestroyEvent.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDestroyEvent.html 2026-04-20 17:49:11.841879470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxWindowDestroyEvent.html 2026-04-20 17:49:11.841879470 +0000 @@ -265,7 +265,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxXmlResource.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxXmlResource.html 2026-04-20 17:49:11.885879742 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wxXmlResource.html 2026-04-20 17:49:11.881879718 +0000 @@ -1450,7 +1450,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_misc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_misc.html 2026-04-20 17:49:11.921879966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_misc.html 2026-04-20 17:49:11.921879966 +0000 @@ -1331,7 +1331,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_object.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_object.html 2026-04-20 17:49:11.969880264 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.4/doc/html/wx_object.html 2026-04-20 17:49:11.969880264 +0000 @@ -101,36 +101,36 @@ shutdown | Term, terminate(State) is called. It lets the user module clean up, it is always called when server terminates or when wx_object() in the driver is deleted. If the Parent process terminates the Module:terminate/2 function is -called.
            terminate(Reason, State)

            Example:

              -module(myDialog).
            -  -export([new/2, show/1, destroy/1]).  %% API
            -  -export([init/1, handle_call/3, handle_event/2,
            -           handle_info/2, code_change/3, terminate/2]).
            +called.
            terminate(Reason, State)

            Example:

              -module(myDialog).
            +  -export([new/2, show/1, destroy/1]).  %% API
            +  -export([init/1, handle_call/3, handle_event/2,
            +           handle_info/2, code_change/3, terminate/2]).
                        new/2, showModal/1, destroy/1]).  %% Callbacks
             
               %% Client API
            -  new(Parent, Msg) ->
            -     wx_object:start(?MODULE, [Parent,Id], []).
            +  new(Parent, Msg) ->
            +     wx_object:start(?MODULE, [Parent,Id], []).
             
            -  show(Dialog) ->
            -     wx_object:call(Dialog, show_modal).
            +  show(Dialog) ->
            +     wx_object:call(Dialog, show_modal).
             
            -  destroy(Dialog) ->
            -     wx_object:call(Dialog, destroy).
            +  destroy(Dialog) ->
            +     wx_object:call(Dialog, destroy).
             
               %% Server Implementation ala gen_server
            -  init([Parent, Str]) ->
            -     Dialog = wxDialog:new(Parent, 42, "Testing", []),
            +  init([Parent, Str]) ->
            +     Dialog = wxDialog:new(Parent, 42, "Testing", []),
                  ...
            -     wxDialog:connect(Dialog, command_button_clicked),
            -     {Dialog, MyState}.
            +     wxDialog:connect(Dialog, command_button_clicked),
            +     {Dialog, MyState}.
             
            -  handle_call(show, _From, State) ->
            -     wxDialog:show(State#state.win),
            -     {reply, ok, State};
            +  handle_call(show, _From, State) ->
            +     wxDialog:show(State#state.win),
            +     {reply, ok, State};
               ...
            -  handle_event(#wx{}, State) ->
            -     io:format("Users clicked button~n",[]),
            -     {noreply, State};
            +  handle_event(#wx{}, State) ->
            +     io:format("Users clicked button~n",[]),
            +     {noreply, State};
               ...

            DATA TYPES

            @@ -1334,7 +1334,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/404.html 2026-04-20 17:49:11.993880413 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/404.html 2026-04-20 17:49:11.997880437 +0000 @@ -106,7 +106,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/api-reference.html 2026-04-20 17:49:12.025880611 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/api-reference.html 2026-04-20 17:49:12.025880611 +0000 @@ -168,7 +168,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/notes.html 2026-04-20 17:49:12.065880860 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/notes.html 2026-04-20 17:49:12.065880860 +0000 @@ -339,7 +339,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/search.html 2026-04-20 17:49:12.097881058 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/search.html 2026-04-20 17:49:12.097881058 +0000 @@ -104,7 +104,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl.html 2026-04-20 17:49:12.129881256 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl.html 2026-04-20 17:49:12.137881306 +0000 @@ -1109,7 +1109,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_eventp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_eventp.html 2026-04-20 17:49:12.169881504 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_eventp.html 2026-04-20 17:49:12.169881504 +0000 @@ -519,7 +519,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_examples.html 2026-04-20 17:49:12.205881727 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_examples.html 2026-04-20 17:49:12.201881703 +0000 @@ -104,86 +104,86 @@ user state, use their own state variable instead. Another option (used in e.g. xmerl_eventp.erl) is for customization functions to share one of the local states (in xmerl_eventp.erl, the continuation function and the fetch function -both access the cont_state.)

            Functions to access user state:

            • xmerl_scan:user_state(GlobalState)
            • xmerl_scan:user_state(UserState, GlobalState)

            1.2 Event Function

            {event_fun, fun()} | {event_fun, fun(), EventState}

            The event function is called at the beginning and at the end of a parsed entity. -It has the following format and semantics:

            fun(Event, GlobalState) ->
            -   EventState = xmerl_scan:event_state(GlobalState),
            -   EventState2 = foo(Event, EventState),
            -   GlobalState2 = xmerl_scan:event_state(EventState2, GlobalState)
            -end.

            1.3 Hook Function

            {hook_fun, fun()} | {hook_fun, fun(), HookState}

            The hook function is called when the processor has parsed a complete entity. -Format and semantics:

            fun(Entity, GlobalState) ->
            -   HookState = xmerl_scan:hook_state(GlobalState),
            -   {TransformedEntity, HookState2} = foo(Entity, HookState),
            -   GlobalState2 = xmerl_scan:hook_state(HookState2, GlobalState),
            -   {TransformedEntity, GlobalState2}
            +both access the cont_state.)

            Functions to access user state:

            • xmerl_scan:user_state(GlobalState)
            • xmerl_scan:user_state(UserState, GlobalState)

            1.2 Event Function

            {event_fun, fun()} | {event_fun, fun(), EventState}

            The event function is called at the beginning and at the end of a parsed entity. +It has the following format and semantics:

            fun(Event, GlobalState) ->
            +   EventState = xmerl_scan:event_state(GlobalState),
            +   EventState2 = foo(Event, EventState),
            +   GlobalState2 = xmerl_scan:event_state(EventState2, GlobalState)
            +end.

            1.3 Hook Function

            {hook_fun, fun()} | {hook_fun, fun(), HookState}

            The hook function is called when the processor has parsed a complete entity. +Format and semantics:

            fun(Entity, GlobalState) ->
            +   HookState = xmerl_scan:hook_state(GlobalState),
            +   {TransformedEntity, HookState2} = foo(Entity, HookState),
            +   GlobalState2 = xmerl_scan:hook_state(HookState2, GlobalState),
            +   {TransformedEntity, GlobalState2}
             end.

            The relationship between the event function, the hook function and the accumulator function is as follows:

            1. The event function is first called with an 'ended' event for the parsed entity.
            2. The hook function is called, possibly re-formatting the entity.
            3. The acc function is called in order to (optionally) add the re-formatted -entity to the contents of its parent element.

            1.4 Fetch Function

            {fetch_fun, fun()} | {fetch_fun, fun(), FetchState}

            The fetch function is called in order to fetch an external resource (e.g. a +entity to the contents of its parent element.

          • 1.4 Fetch Function

            {fetch_fun, fun()} | {fetch_fun, fun(), FetchState}

            The fetch function is called in order to fetch an external resource (e.g. a DTD).

            The fetch function can respond with three different return values:

            Result ::=
            -   {ok, {file, Filename}, NewGlobalState} |
            -   {ok, {string, String}, NewGlobalState} |
            -   {ok, not_fetched, NewGlobalState}

            Format and semantics:

            fun(URI, GlobalState) ->
            -   FetchState = xmerl_scan:fetch_state(GlobalState),
            -   Result = foo(URI, FetchState).  % Result being one of the above
            -end.

            1.5 Continuation Function

            {continuation_fun, fun()} | {continuation_fun, fun(), ContinuationState}

            The continuation function is called when the parser encounters the end of the -byte stream. Format and semantics:

            fun(Continue, Exception, GlobalState) ->
            -   ContState = xmerl_scan:cont_state(GlobalState),
            -   {Result, ContState2} = get_more_bytes(ContState),
            +   {ok, {file, Filename}, NewGlobalState} |
            +   {ok, {string, String}, NewGlobalState} |
            +   {ok, not_fetched, NewGlobalState}

            Format and semantics:

            fun(URI, GlobalState) ->
            +   FetchState = xmerl_scan:fetch_state(GlobalState),
            +   Result = foo(URI, FetchState).  % Result being one of the above
            +end.

            1.5 Continuation Function

            {continuation_fun, fun()} | {continuation_fun, fun(), ContinuationState}

            The continuation function is called when the parser encounters the end of the +byte stream. Format and semantics:

            fun(Continue, Exception, GlobalState) ->
            +   ContState = xmerl_scan:cont_state(GlobalState),
            +   {Result, ContState2} = get_more_bytes(ContState),
                case Result of
            -      [] ->
            -         GlobalState2 = xmerl_scan:cont_state(ContState2, GlobalState),
            -         Exception(GlobalState2);
            +      [] ->
            +         GlobalState2 = xmerl_scan:cont_state(ContState2, GlobalState),
            +         Exception(GlobalState2);
                   MoreBytes ->
            -         {MoreBytes2, Rest} = end_on_whitespace_char(MoreBytes),
            -         ContState3 = update_cont_state(Rest, ContState2),
            -         GlobalState3 = xmerl_scan:cont_state(ContState3, GlobalState),
            -         Continue(MoreBytes2, GlobalState3)
            +         {MoreBytes2, Rest} = end_on_whitespace_char(MoreBytes),
            +         ContState3 = update_cont_state(Rest, ContState2),
            +         GlobalState3 = xmerl_scan:cont_state(ContState3, GlobalState),
            +         Continue(MoreBytes2, GlobalState3)
                end
            -end.

            1.6 Rules Functions

            {rules, ReadFun : fun(), WriteFun : fun(), RulesState} |
            -{rules, Table : ets()}

            The rules functions take care of storing scanner information in a rules +end.

      1.6 Rules Functions

      {rules, ReadFun : fun(), WriteFun : fun(), RulesState} |
      +{rules, Table : ets()}

      The rules functions take care of storing scanner information in a rules database. User-provided rules functions may opt to store the information in mnesia, or perhaps in the user_state(RulesState).

      The following modes exist:

      • If the user doesn't specify an option, the scanner creates an ets table, and uses built-in functions to read and write data to it. When the scanner is done, the ets table is deleted.
      • If the user specifies an ets table via the {rules, Table} option, the scanner uses this table. When the scanner is done, it does not delete the table.
      • If the user specifies read and write functions, the scanner will use them -instead.

      The format for the read and write functions are as follows:

       WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
      - ReadFun(Context, Name, ScannerState) -> Definition | undefined.

      Here is a summary of the data objects currently being written by the scanner:

      ContextKey ValueDefinition
      notationNotationName{system, SL} | {public, PIDL, SL}
      elem_defElementName#xmlElement{content = ContentSpec}
      parameter_entityPENamePEDef
      entityEntityNameEntityDef

      Table 1: Scanner data objects

      where

      ContentSpec ::= empty | any | ElemContent
      -ElemContent ::= {Mode, Elems}
      +instead.

    The format for the read and write functions are as follows:

     WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
    + ReadFun(Context, Name, ScannerState) -> Definition | undefined.

    Here is a summary of the data objects currently being written by the scanner:

    ContextKey ValueDefinition
    notationNotationName{system, SL} | {public, PIDL, SL}
    elem_defElementName#xmlElement{content = ContentSpec}
    parameter_entityPENamePEDef
    entityEntityNameEntityDef

    Table 1: Scanner data objects

    where

    ContentSpec ::= empty | any | ElemContent
    +ElemContent ::= {Mode, Elems}
     Mode        ::= seq | choice
    -Elems       ::= [Elem]
    -Elem        ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
    +Elems       ::= [Elem]
    +Elem        ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
     Occurrence  ::= '*' | '?' | '+'

    NOTE: When <Elem> is not wrapped with <Occurrence>, (Occurrence = once) is -implied.

    1.7 Accumulator Function

    {acc_fun, fun()}

    The accumulator function is called to accumulate the contents of an entity.When +implied.

    1.7 Accumulator Function

    {acc_fun, fun()}

    The accumulator function is called to accumulate the contents of an entity.When parsing very large files, it may not be desirable to do so.In this case, an acc function can be provided that simply doesn't accumulate.

    Note that it is possible to even modify the parsed entity before accumulating it, but this must be done with care. xmerl_scan performs post-processing of the element for namespace management. Thus, the element must keep its original structure for this to work.

    The acc function has the following format and semantics:

    %% default accumulating acc fun
    -fun(ParsedEntity, Acc, GlobalState) ->
    -   {[ParsedEntity|Acc], GlobalState}.
    +fun(ParsedEntity, Acc, GlobalState) ->
    +   {[ParsedEntity|Acc], GlobalState}.
     
     %% non-accumulating acc fun
    -fun(ParsedEntity, Acc, GlobalState) ->
    -   {Acc, GlobalState}.

    1.8 Close Function

    The close function is called when a document (either the main document or an +fun(ParsedEntity, Acc, GlobalState) -> + {Acc, GlobalState}.

    1.8 Close Function

    The close function is called when a document (either the main document or an external DTD) has been completely parsed. When xmerl_scan was started using xmerl_scan:file/[1,2], the file will be read in full, and closed immediately, before the parsing starts, so when the close function is called, it will not need to actually close the file. In this case, the close function will be a good -place to modify the state variables.

    Format and semantics:

    fun(GlobalState) ->
    -   GlobalState1 = ....  % state variables may be altered

    2 Examples

    See xmerl_test.erl for more examples.

    2.1 Handling spaces

    The following sample program illustrates three ways of scanning a document:

    1. the default scan, which leaves whitespace untouched
    2. normalizing spaces
    3. normalizing spaces, then removing text elements that only contain one space.
    -module(tmp).
    +place to modify the state variables.

    Format and semantics:

    fun(GlobalState) ->
    +   GlobalState1 = ....  % state variables may be altered

    2 Examples

    See xmerl_test.erl for more examples.

    2.1 Handling spaces

    The following sample program illustrates three ways of scanning a document:

    1. the default scan, which leaves whitespace untouched
    2. normalizing spaces
    3. normalizing spaces, then removing text elements that only contain one space.
    -module(tmp).
     
    --include("xmerl.hrl").
    +-include("xmerl.hrl").
     
    --export([file1/1, file2/1, file3/1]).
    +-export([file1/1, file2/1, file3/1]).
     
    -file1(F) -> xmerl_scan:file(F).
    +file1(F) -> xmerl_scan:file(F).
     
    -file2(F) -> xmerl_scan:file(F, [{space,normalize}]).
    +file2(F) -> xmerl_scan:file(F, [{space,normalize}]).
     
    -file3(F) -> Acc = fun(#xmlText{value = " ", pos = P}, Acc, S) -> {Acc, P,
    -S}; % new return format (X, Acc, S) -> {[X|Acc], S} end, xmerl_scan:file(F,
    -[{space,normalize}, {acc_fun, Acc}]).
    +
    file3(F) -> Acc = fun(#xmlText{value = " ", pos = P}, Acc, S) -> {Acc, P, +S}; % new return format (X, Acc, S) -> {[X|Acc], S} end, xmerl_scan:file(F, +[{space,normalize}, {acc_fun, Acc}]).
    @@ -231,7 +231,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_sax_parser.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_sax_parser.html 2026-04-20 17:49:12.233881902 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_sax_parser.html 2026-04-20 17:49:12.233881902 +0000 @@ -764,7 +764,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_scan.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_scan.html 2026-04-20 17:49:12.273882150 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_scan.html 2026-04-20 17:49:12.273882150 +0000 @@ -1112,7 +1112,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_ug.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_ug.html 2026-04-20 17:49:12.317882422 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_ug.html 2026-04-20 17:49:12.321882447 +0000 @@ -133,16 +133,16 @@ structure and data of the document. If it is a simple document like:

    <?xml version="1.0"?>
     <dog>
     Grand Danois
    -</dog>

    The parse result will be:

    #xmlElement{name = dog,
    +</dog>

    The parse result will be:

    #xmlElement{name = dog,
                 ...
    -            parents = [],
    +            parents = [],
                 ...
    -            attributes = [],
    -            content = [{xmlText,[{dog,1}],1,[],"\
    +            attributes = [],
    +            content = [{xmlText,[{dog,1}],1,[],"\
     Grand Danois\
    -",text}],
    +",text}],
                 ...
    -            }

    Where the content of the top element is: + }

    Where the content of the top element is: [{xmlText,[{dog,1}],1,[],"\ Grand Danois\ ",text}]. Text will be returned in xmlText records. Though, usually documents are more complex, and the content of the top element will in that case be a nested structure with #xmlElement{} @@ -184,41 +184,41 @@ <!ELEMENT motorcycles (bike,date?)+ > <!ELEMENT bike (name,engine,kind,drive, accessories?,comment?) > <!ELEMENT name (manufacturer,brandName,additionalName?) > -<!ELEMENT manufacturer (#href_anchor"makeup erlang" translate="no">3> {ParseResult,Misc}=xmerl_scan:file("motorcycles.xml"). -{{xmlElement,motorcycles, +<!ELEMENT manufacturer (#href_anchor"makeup erlang" translate="no">3> {ParseResult,Misc}=xmerl_scan:file("motorcycles.xml"). +{{xmlElement,motorcycles, motorcycles, - [], - {xmlNamespace,[],[]}, - [], + [], + {xmlNamespace,[],[]}, + [], 1, - [], - [{xmlText,[{motorcycles,1}],1,[],"\ - ",text}, - {xmlElement,bike, + [], + [{xmlText,[{motorcycles,1}],1,[],"\ + ",text}, + {xmlElement,bike, bike, - [], - {xmlNamespace,[],[]}, - [{motorcycles,1}], + [], + {xmlNamespace,[],[]}, + [{motorcycles,1}], 2, - [{xmlAttribute,year,[],[],[],[]|...}, - {xmlAttribute,color,[],[],[]|...}], - [{xmlText,[{bike,2},{motorcycles|...}], + [{xmlAttribute,year,[],[],[],[]|...}, + {xmlAttribute,color,[],[],[]|...}], + [{xmlText,[{bike,2},{motorcycles|...}], 1, - []|...}, - {xmlElement,name,name,[]|...}, - {xmlText,[{...}|...],3|...}, - {xmlElement,engine|...}, - {xmlText|...}, - {...}|...], - [], + []|...}, + {xmlElement,name,name,[]|...}, + {xmlText,[{...}|...],3|...}, + {xmlElement,engine|...}, + {xmlText|...}, + {...}|...], + [], ".", - undeclared}, + undeclared}, ... - ], - [], + ], + [], ".", - undeclared}, - []} + undeclared}, + []} 4>

    If you instead receives the XML doc as a string you can parse it by xmerl_scan:string/1. Both file/2 and string/2 exists where the second argument is a list of options to the parser, see the reference manual.

    Example: Extracting Data From XML Content

    In this example consider the situation where you want to examine a particular @@ -243,22 +243,22 @@ {Tag, Content} or Tag where:

    • Tag = atom()
    • Attributes = [{Name, Value}| #xmlAttribute{}]
    • Name = atom()
    • Value = IOString | atom() | integer()

    See also reference manual for xmerl

    If you want to add the information about a black Harley Davidsson 1200 cc Sportster motorcycle from 2003 that is in shape as new in the motorcycles.xml document you can put the data in a simple-form data structure like:

    Data =
    -  {bike,
    -     [{year,"2003"},{color,"black"},{condition,"new"}],
    -     [{name,
    -         [{manufacturer,["Harley Davidsson"]},
    -          {brandName,["XL1200C"]},
    -          {additionalName,["Sportster"]}]},
    -      {engine,
    -         ["V-engine, 2-cylinders, 1200 cc"]},
    -      {kind,["custom"]},
    -      {drive,["belt"]}]}

    In order to append this data to the end of the motorcycles.xml document you have -to parse the file and add Data to the end of the root element content.

        {RootEl,Misc}=xmerl_scan:file('motorcycles.xml'),
    -    #xmlElement{content=Content} = RootEl,
    -    NewContent=Content++lists:flatten([Data]),
    -    NewRootEl=RootEl#xmlElement{content=NewContent},

    Then you can run it through the export_simple/2 function:

        {ok,IOF}=file:open('new_motorcycles.xml',[write]),
    -    Export=xmerl:export_simple([NewRootEl],xmerl_xml),
    -    io:format(IOF,"~s~n",[lists:flatten(Export)]),

    The result would be:

    
    +  {bike,
    +     [{year,"2003"},{color,"black"},{condition,"new"}],
    +     [{name,
    +         [{manufacturer,["Harley Davidsson"]},
    +          {brandName,["XL1200C"]},
    +          {additionalName,["Sportster"]}]},
    +      {engine,
    +         ["V-engine, 2-cylinders, 1200 cc"]},
    +      {kind,["custom"]},
    +      {drive,["belt"]}]}

    In order to append this data to the end of the motorcycles.xml document you have +to parse the file and add Data to the end of the root element content.

        {RootEl,Misc}=xmerl_scan:file('motorcycles.xml'),
    +    #xmlElement{content=Content} = RootEl,
    +    NewContent=Content++lists:flatten([Data]),
    +    NewRootEl=RootEl#xmlElement{content=NewContent},

    Then you can run it through the export_simple/2 function:

        {ok,IOF}=file:open('new_motorcycles.xml',[write]),
    +    Export=xmerl:export_simple([NewRootEl],xmerl_xml),
    +    io:format(IOF,"~s~n",[lists:flatten(Export)]),

    The result would be:

    
     <?xml version="1.0"?><motorcycles>
       <bike year="2000" color="black">
         <name>
    @@ -285,40 +285,40 @@
     <bike year="2003" color="black" condition="new"><name><manufacturer>Harley Davidsson</manufacturer><brandName>XL1200C</brandName><additionalName>Sportster</additionalName></name><engine>V-engine, 2-cylinders, 1200 cc</engine><kind>custom</kind><drive>belt</drive></bike></motorcycles>

    If it is important to get similar indentation and newlines as in the original document you have to add #href_anchor"inline">{prolog,Value} to export_simple/3. The following example code fixes those changes in the previous example:

        Data =
    -      [#xmlText{value="  "},
    -       {bike,[{year,"2003"},{color,"black"},{condition,"new"}],
    -             [#xmlText{value="\
    -    "},
    -              {name,[#xmlText{value="\
    -      "},
    -                     {manufacturer,["Harley Davidsson"]},
    -                     #xmlText{value="\
    -      "},
    -                     {brandName,["XL1200C"]},
    -                     #xmlText{value="\
    -      "},
    -                     {additionalName,["Sportster"]},
    -                     #xmlText{value="\
    -    "}]},
    -              {engine,["V-engine, 2-cylinders, 1200 cc"]},
    -              #xmlText{value="\
    -    "},
    -              {kind,["custom"]},
    -              #xmlText{value="\
    -    "},
    -              {drive,["belt"]},
    -              #xmlText{value="\
    -  "}]},
    -       #xmlText{value="\
    -"}],
    +      [#xmlText{value="  "},
    +       {bike,[{year,"2003"},{color,"black"},{condition,"new"}],
    +             [#xmlText{value="\
    +    "},
    +              {name,[#xmlText{value="\
    +      "},
    +                     {manufacturer,["Harley Davidsson"]},
    +                     #xmlText{value="\
    +      "},
    +                     {brandName,["XL1200C"]},
    +                     #xmlText{value="\
    +      "},
    +                     {additionalName,["Sportster"]},
    +                     #xmlText{value="\
    +    "}]},
    +              {engine,["V-engine, 2-cylinders, 1200 cc"]},
    +              #xmlText{value="\
    +    "},
    +              {kind,["custom"]},
    +              #xmlText{value="\
    +    "},
    +              {drive,["belt"]},
    +              #xmlText{value="\
    +  "}]},
    +       #xmlText{value="\
    +"}],
         ...
    -    NewContent=Content++lists:flatten([Data]),
    -    NewRootEl=RootEl#xmlElement{content=NewContent},
    +    NewContent=Content++lists:flatten([Data]),
    +    NewRootEl=RootEl#xmlElement{content=NewContent},
         ...
    -    Prolog = ["<?xml version=\\"1.0\\" encoding=\\"utf-8\\" ?>
    +    Prolog = ["<?xml version=\\"1.0\\" encoding=\\"utf-8\\" ?>
     <!DOCTYPE motorcycles SYSTEM \\"motorcycles.dtd\\">\
    -"],
    -    Export=xmerl:export_simple([NewRootEl],xmerl_xml,[{prolog,Prolog}]),
    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xpath.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xpath.html	2026-04-20 17:49:12.357882670 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xpath.html	2026-04-20 17:49:12.357882670 +0000
    @@ -473,7 +473,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs.html 2026-04-20 17:49:12.385882845 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs.html 2026-04-20 17:49:12.389882869 +0000 @@ -344,7 +344,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs_examples.html 2026-04-20 17:49:12.421883068 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xs_examples.html 2026-04-20 17:49:12.421883068 +0000 @@ -93,13 +93,13 @@
    <h1> <xsl:apply-templates/> </h1> -</xsl:template>

    becomes in Erlang:

    template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    -    ["<h1>",
    -         xslapply(fun template/1, E),
    -     "</h1>"];


    Example 2 Using value_of and select

    <xsl:template match="title">
    +</xsl:template>

    becomes in Erlang:

    template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    +    ["<h1>",
    +         xslapply(fun template/1, E),
    +     "</h1>"];


    Example 2 Using value_of and select

    <xsl:template match="title">
       <div align="center"><h1><xsl:value-of select="." /></h1></div>
    -</xsl:template>

    becomes:

    template(E = #xmlElement{name='title'}) ->
    -    ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];


    Example 3 Simple xsl stylesheet

    A complete example with the XSLT sheet in the xmerl distribution.

    <xsl:stylesheet version="1.0"
    +</xsl:template>

    becomes:

    template(E = #xmlElement{name='title'}) ->
    +    ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];


    Example 3 Simple xsl stylesheet

    A complete example with the XSLT sheet in the xmerl distribution.

    <xsl:stylesheet version="1.0"
             xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
             xmlns="http://www.w3.org/TR/xhtml1/strict">
     
    @@ -160,60 +160,60 @@
         </em>
       </xsl:template>
     
    -</xsl:stylesheet>


    Example 4 Erlang version

    Erlang transformation of previous example:

    -include("xmerl.hrl").
    +</xsl:stylesheet>


    Example 4 Erlang version

    Erlang transformation of previous example:

    -include("xmerl.hrl").
     
    --import(xmerl_xs,
    -    [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
    +-import(xmerl_xs,
    +    [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
     
    -doctype()->
    +doctype()->
         "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
      \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">".
     
    -process_xml(Doc)->
    -    template(Doc).
    +process_xml(Doc)->
    +    template(Doc).
     
    -template(E = #xmlElement{name='doc'})->
    -    [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
    -      doctype(),
    +template(E = #xmlElement{name='doc'})->
    +    [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
    +      doctype(),
           "<html xmlns=\"http://www.w3.org/1999/xhtml\" >"
           "<head>"
    -      "<title>", value_of(select("title",E)), "</title>"
    +      "<title>", value_of(select("title",E)), "</title>"
           "</head>"
           "<body>",
    -      xslapply( fun template/1, E),
    +      xslapply( fun template/1, E),
           "</body>"
    -      "</html>" ];
    +      "</html>" ];
     
     
    -template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    -    ["<h1>",
    -     xslapply( fun template/1, E),
    -     "</h1>"];
    +template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    +    ["<h1>",
    +     xslapply( fun template/1, E),
    +     "</h1>"];
     
    -template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
    -    ["<h2>",
    -     xslapply( fun template/1, E),
    -     "</h2>"];
    +template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
    +    ["<h2>",
    +     xslapply( fun template/1, E),
    +     "</h2>"];
     
    -template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
    -    ["<h3>",
    -     xslapply( fun template/1, E),
    -     "</h3>"];
    +template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
    +    ["<h3>",
    +     xslapply( fun template/1, E),
    +     "</h3>"];
     
    -template(E = #xmlElement{ name='para'}) ->
    -    ["<p>", xslapply( fun template/1, E), "</p>"];
    +template(E = #xmlElement{ name='para'}) ->
    +    ["<p>", xslapply( fun template/1, E), "</p>"];
     
    -template(E = #xmlElement{ name='note'}) ->
    -    ["<p class=\"note\">"
    +template(E = #xmlElement{ name='note'}) ->
    +    ["<p class=\"note\">"
          "<b>NOTE: </b>",
    -     xslapply( fun template/1, E),
    -     "</p>"];
    +     xslapply( fun template/1, E),
    +     "</p>"];
     
    -template(E = #xmlElement{ name='emph'}) ->
    -    ["<em>", xslapply( fun template/1, E), "</em>"];
    +template(E = #xmlElement{ name='emph'}) ->
    +    ["<em>", xslapply( fun template/1, E), "</em>"];
     
    -template(E)->
    -    built_in_rules( fun template/1, E).

    It is important to end with a call to xmerl_xs:built_in_rules/2 if you want any +template(E)-> + built_in_rules( fun template/1, E).

    It is important to end with a call to xmerl_xs:built_in_rules/2 if you want any text to be written in "push" transforms. That are the ones using a lot xslapply( fun template/1, E ) instead of value_of(select("xpath",E)), which is pull...


    The largest example is the stylesheet to transform this document from the Simplified Docbook XML format to xhtml. The source file is sdocbook2xhtml.erl.

    Tips and tricks

    for-each

    The function for-each is quite common in XSLT stylesheets. It can often be rewritten and replaced by select/1. Since select/1 returns a list of @@ -226,21 +226,21 @@ <xsl:template match="line"> <xsl:if test="position() mod 2 = 0">&#160;&#160;</xsl:if> <xsl:value-of select="." /><br /> -</xsl:template>

    Can be written as

    template(E = #xmlElement{name='stanza'}) ->
    -    {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
    -    ["<p>", Lines, "</p>"].
    +</xsl:template>

    Can be written as

    template(E = #xmlElement{name='stanza'}) ->
    +    {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
    +    ["<p>", Lines, "</p>"].
     
    -template_pos(E = #xmlElement{name='line'}, P) ->
    -    {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
    +template_pos(E = #xmlElement{name='line'}, P) ->
    +    {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
     
    -indent_line(0)->"&#160;&#160;";
    -indent_line(_)->"".

    Global tree awareness

    In XSLT you have "root" access to the top of the tree with XPath, even though +indent_line(0)->"&#160;&#160;"; +indent_line(_)->"".


    Global tree awareness

    In XSLT you have "root" access to the top of the tree with XPath, even though you are somewhere deep in your tree.

    The xslapply/2 function only carries back the child part of the tree to the template fun. But it is quite easy to write template funs that handles both the -child and top tree.


    Example 6 Passing the root tree

    The following example piece will prepend the article title to any section title

    template(E = #xmlElement{name='title'}, ETop ) ->
    -    ["<h3>", value_of(select("title", ETop))," - ",
    -     xslapply( fun(A) -> template(A, ETop) end, E),
    -     "</h3>"];

    +child and top tree.


    Example 6 Passing the root tree

    The following example piece will prepend the article title to any section title

    template(E = #xmlElement{name='title'}, ETop ) ->
    +    ["<h3>", value_of(select("title", ETop))," - ",
    +     xslapply( fun(A) -> template(A, ETop) end, E),
    +     "</h3>"];

    @@ -279,7 +279,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xsd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xsd.html 2026-04-20 17:49:12.457883291 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.9/doc/html/xmerl_xsd.html 2026-04-20 17:49:12.457883291 +0000 @@ -771,9 +771,9 @@ several times towards the same schema it reduces time consumption.

    The result, ValidElement, is the valid element that conforms to the post-schema-validation infoset. When the validator finds an error it tries to continue and reports a list of all errors found. In those cases an unexpected -error is found it may cause a single error reason.

    Usage example:

    1>{E,_} = xmerl_scan:file("my_XML_document.xml").
    -2>{ok,S} = xmerl_xsd:process_schema("my_XML_Schema.xsd").
    -3>{E2,_} = xmerl_xsd:validate(E,S).

    Observe that E2 may differ from E if for instance there are default values +error is found it may cause a single error reason.

    Usage example:

    1>{E,_} = xmerl_scan:file("my_XML_document.xml").
    +2>{ok,S} = xmerl_xsd:process_schema("my_XML_Schema.xsd").
    +3>{E2,_} = xmerl_xsd:validate(E,S).

    Observe that E2 may differ from E if for instance there are default values defined in my_XML_Schema.xsd.

    @@ -799,7 +799,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    RPMS.2/erlang-jinterface-28.4.1-1.1.x86_64.rpm RPMS/erlang-jinterface-28.4.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-jinterface-28.4.1-1.1.x86_64.rpm to erlang-jinterface-28.4.1-1.1.x86_64.rpm comparing the rpm tags of erlang-jinterface --- old-rpm-tags +++ new-rpm-tags @@ -92 +92 @@ -/usr/lib64/erlang/lib/jinterface-1.15/priv/OtpErlang.jar efd15759b25420ef34155c574663a4635ae1abb28656bf3b6c192d34b89dda7d 0 +/usr/lib64/erlang/lib/jinterface-1.15/priv/OtpErlang.jar ef6ff7677cb944033a8e4db3c9db4d88ce58bfa5008b271dafef188bf223219e 0 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist comparing file checksum creating rename script RPM file checksum differs. Extracting packages Package content is identical RPMS.2/erlang-src-28.4.1-1.1.x86_64.rpm RPMS/erlang-src-28.4.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-src-28.4.1-1.1.x86_64.rpm to erlang-src-28.4.1-1.1.x86_64.rpm comparing the rpm tags of erlang-src --- old-rpm-tags +++ new-rpm-tags @@ -1964 +1964 @@ -/usr/lib64/erlang/lib/public_key-1.20.2/src/PKIX1Implicit-2009.erl f90174dfe27ebebf74c7171fe6064fb5362023b28e61b4e65bc1c03908f8fa5b 0 +/usr/lib64/erlang/lib/public_key-1.20.2/src/PKIX1Implicit-2009.erl 8a69fd162bfe18840d01fe2f2b23bee2fcc02ee8bc35f213ee2c1a80ea903d04 0 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist comparing file checksum creating rename script RPM file checksum differs. Extracting packages /usr/lib64/erlang/lib/public_key-1.20.2/src/PKIX1Implicit-2009.erl differs (ASCII text) --- old//usr/lib64/erlang/lib/public_key-1.20.2/src/PKIX1Implicit-2009.erl 2026-04-05 14:46:59.000000000 +0000 +++ new//usr/lib64/erlang/lib/public_key-1.20.2/src/PKIX1Implicit-2009.erl 2026-04-05 14:46:59.000000000 +0000 @@ -165,7 +165,7 @@ getenc_CrlExtensions/1, getenc_CrlEntryExtensions/1, getenc_PolicyQualifierId/1, -getenc_internal_object_set_argument_2/1 +getenc_internal_object_set_argument_1/1 ]). -export([ @@ -173,7 +173,7 @@ getdec_CrlExtensions/1, getdec_CrlEntryExtensions/1, getdec_PolicyQualifierId/1, -getdec_internal_object_set_argument_2/1 +getdec_internal_object_set_argument_1/1 ]). -export([ @@ -1476,7 +1476,7 @@ enc_SubjectDirectoryAttributes_AttributeSet(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, Objtype = - 'PKIX1Implicit-2009':'getenc_internal_object_set_argument_2'( Cindex1), + 'PKIX1Implicit-2009':'getenc_internal_object_set_argument_1'( Cindex1), %%------------------------------------------------- %% attribute type(1) with type OBJECT IDENTIFIER @@ -1534,7 +1534,7 @@ %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), -ObjFun = 'PKIX1Implicit-2009':'getdec_internal_object_set_argument_2'(Term1), +ObjFun = 'PKIX1Implicit-2009':'getdec_internal_object_set_argument_1'(Term1), %%------------------------------------------------- %% attribute values(2) with type SET OF @@ -3305,43 +3305,43 @@ %%================================ -%% internal_object_set_argument_2 +%% internal_object_set_argument_1 %%================================ -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,3} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,3} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520CommonName'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,4} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,4} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-surname'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,5} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,5} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520SerialNumber'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,6} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,6} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520countryName'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,7} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,7} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520LocalityName'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,8} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,8} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520StateOrProvinceName'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,10} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,10} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520OrganizationName'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,11} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,11} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520OrganizationalUnitName'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,12} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,12} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520Title'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,41} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,41} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-name'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,42} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,42} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-givenName'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,43} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,43} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-initials'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,44} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,44} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-generationQualifier'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,46} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,46} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520dnQualifier'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {2,5,4,65} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {2,5,4,65} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-x520Pseudonym'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {0,9,2342,19200300,100,1,25} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {0,9,2342,19200300,100,1,25} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-domainComponent'(T,V,O) end; -getenc_internal_object_set_argument_2(Id) when Id =:= {1,2,840,113549,1,9,1} -> +getenc_internal_object_set_argument_1(Id) when Id =:= {1,2,840,113549,1,9,1} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'enc_at-emailAddress'(T,V,O) end; -getenc_internal_object_set_argument_2(_) -> +getenc_internal_object_set_argument_1(_) -> fun(_, Val, _RestPrimFieldName) -> case Val of {asn1_OPENTYPE,Bin} when is_binary(Bin) -> @@ -3349,41 +3349,41 @@ end end. -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,3} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,3} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520CommonName'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,4} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,4} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-surname'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,5} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,5} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520SerialNumber'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,6} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,6} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520countryName'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,7} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,7} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520LocalityName'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,8} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,8} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520StateOrProvinceName'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,10} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,10} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520OrganizationName'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,11} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,11} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520OrganizationalUnitName'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,12} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,12} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520Title'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,41} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,41} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-name'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,42} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,42} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-givenName'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,43} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,43} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-initials'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,44} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,44} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-generationQualifier'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,46} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,46} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520dnQualifier'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {2,5,4,65} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {2,5,4,65} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-x520Pseudonym'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {0,9,2342,19200300,100,1,25} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {0,9,2342,19200300,100,1,25} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-domainComponent'(T,V,O) end; -getdec_internal_object_set_argument_2(Id) when Id =:= {1,2,840,113549,1,9,1} -> +getdec_internal_object_set_argument_1(Id) when Id =:= {1,2,840,113549,1,9,1} -> fun(T,V,O) -> 'PKIX1Explicit-2009':'dec_at-emailAddress'(T,V,O) end; -getdec_internal_object_set_argument_2(_) -> +getdec_internal_object_set_argument_1(_) -> fun(_,Bytes, _RestPrimFieldName) -> case Bytes of Bin when is_binary(Bin) -> overalldiffered=4 (number of pkgs that are not bit-by-bit identical: 0 is good) overall=1
  • {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,
    @@ -176,42 +176,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(),
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2026-04-20 15:17:53.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2042-05-23 04:36:20.000000000 +0000
    @@ -24,27 +24,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 @@ -77,48 +77,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).
    +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);
    +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 @@ -128,32 +128,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 /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/gen_udp.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -832,8 +832,8 @@ 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 @@ -841,8 +841,8 @@ 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, 9216}.

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/global_group.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/global_group.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/global_group.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -26,7 +26,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 /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/inet_res.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -49,15 +49,15 @@ has expired.

      For queries not using the search list, if the query to all nameservers results in {error,nxdomain} or an empty answer, the same query is tried for alt_nameservers.

      Resolver Types

      The following data types concern the resolver:

      DNS Types

      The following data types concern the DNS client:

      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.
      @@ -483,57 +483,57 @@

      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.

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/inet.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/inet.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/inet.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -49,19 +49,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}}

      POSIX Error Codes

      • e2big - Too long argument list
      • eacces - Permission denied
      • eaddrinuse - Address already in use
      • eaddrnotavail - Cannot assign requested address
      • eadv - Advertise error
      • eafnosupport - Address family not supported by protocol family
      • eagain - Resource temporarily unavailable
      • ealign - EALIGN
      • ealready - Operation already in progress
      • ebade - Bad exchange descriptor
      • ebadf - Bad file number
      • ebadfd - File descriptor in bad state
      • ebadmsg - Not a data message
      • ebadr - Bad request descriptor
      • ebadrpc - Bad RPC structure
      • ebadrqc - Bad request code
      • ebadslt - Invalid slot
      • ebfont - Bad font file format
      • ebusy - File busy
      • echild - No children
      • echrng - Channel number out of range
      • ecomm - Communication error on send
      • econnaborted - Software caused connection abort
      • econnrefused - Connection refused
      • econnreset - Connection reset by peer
      • edeadlk - Resource deadlock avoided
      • edeadlock - Resource deadlock avoided
      • edestaddrreq - Destination address required
      • edirty - Mounting a dirty fs without force
      • edom - Math argument out of range
      • edotdot - Cross mount point
      • edquot - Disk quota exceeded
      • eduppkg - Duplicate package name
      • eexist - File already exists
      • efault - Bad address in system call argument
      • efbig - File too large
      • ehostdown - Host is down
      • ehostunreach - Host is unreachable
      • eidrm - Identifier removed
      • einit - Initialization error
      • einprogress - Operation now in progress
      • eintr - Interrupted system call
      • einval - Invalid argument
      • eio - I/O error
      • eisconn - Socket is already connected
      • eisdir - Illegal operation on a directory
      • eisnam - Is a named file
      • el2hlt - Level 2 halted
      • el2nsync - Level 2 not synchronized
      • el3hlt - Level 3 halted
      • el3rst - Level 3 reset
      • elbin - ELBIN
      • elibacc - Cannot access a needed shared library
      • elibbad - Accessing a corrupted shared library
      • elibexec - Cannot exec a shared library directly
      • elibmax - Attempting to link in more shared libraries than system limit
      • elibscn - .lib section in a.out corrupted
      • elnrng - Link number out of range
      • eloop - Too many levels of symbolic links
      • emfile - Too many open files
      • emlink - Too many links
      • emsgsize - Message too long
      • emultihop - Multihop attempted
      • enametoolong - Filename too long
      • enavail - Unavailable
      • enet - ENET
      • enetdown - Network is down
      • enetreset - Network dropped connection on reset
      • enetunreach - Network is unreachable
      • enfile - File table overflow
      • enoano - Anode table overflow
      • enobufs - No buffer space available
      • enocsi - No CSI structure available
      • enodata - No data available
      • enodev - No such device
      • enoent - No such file or directory
      • enoexec - Exec format error
      • enolck - No locks available
      • enolink - Link has been severed
      • enomem - Not enough memory
      • enomsg - No message of desired type
      • enonet - Machine is not on the network
      • enopkg - Package not installed
      • enoprotoopt - Bad protocol option
      • enospc - No space left on device
      • enosr - Out of stream resources or not a stream device
      • enosym - Unresolved symbol name
      • enosys - Function not implemented
      • enotblk - Block device required
      • enotconn - Socket is not connected
      • enotdir - Not a directory
      • enotempty - Directory not empty
      • enotnam - Not a named file
      • enotsock - Socket operation on non-socket
      • enotsup - Operation not supported
      • enotty - Inappropriate device for ioctl
      • enotuniq - Name not unique on network
      • enxio - No such device or address
      • eopnotsupp - Operation not supported on socket
      • eperm - Not owner
      • epfnosupport - Protocol family not supported
      • epipe - Broken pipe
      • eproclim - Too many processes
      • eprocunavail - Bad procedure for program
      • eprogmismatch - Wrong program version
      • eprogunavail - RPC program unavailable
      • eproto - Protocol error
      • eprotonosupport - Protocol not supported
      • eprototype - Wrong protocol type for socket
      • erange - Math result unrepresentable
      • erefused - EREFUSED
      • eremchg - Remote address changed
      • eremdev - Remote device
      • eremote - Pathname hit remote filesystem
      • eremoteio - Remote I/O error
      • eremoterelease - EREMOTERELEASE
      • erofs - Read-only filesystem
      • erpcmismatch - Wrong RPC version
      • erremote - Object is remote
      • eshutdown - Cannot send after socket shutdown
      • esocktnosupport - Socket type not supported
      • espipe - Invalid seek
      • esrch - No such process
      • esrmnt - Srmount error
      • estale - Stale remote file handle
      • esuccess - Error 0
      • etime - Timer expired
      • etimedout - Connection timed out
      • etoomanyrefs - Too many references
      • etxtbsy - Text file or pseudo-device busy
      • euclean - Structure needs cleaning
      • eunatch - Protocol driver not attached
      • eusers - Too many users
      • eversion - Version mismatch
      • ewouldblock - Operation would block
      • exdev - Cross-device link
      • exfull - Message tables full
      • nxdomain - Hostname or domain name cannot be found
      +
      {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}}

      POSIX Error Codes

      • e2big - Too long argument list
      • eacces - Permission denied
      • eaddrinuse - Address already in use
      • eaddrnotavail - Cannot assign requested address
      • eadv - Advertise error
      • eafnosupport - Address family not supported by protocol family
      • eagain - Resource temporarily unavailable
      • ealign - EALIGN
      • ealready - Operation already in progress
      • ebade - Bad exchange descriptor
      • ebadf - Bad file number
      • ebadfd - File descriptor in bad state
      • ebadmsg - Not a data message
      • ebadr - Bad request descriptor
      • ebadrpc - Bad RPC structure
      • ebadrqc - Bad request code
      • ebadslt - Invalid slot
      • ebfont - Bad font file format
      • ebusy - File busy
      • echild - No children
      • echrng - Channel number out of range
      • ecomm - Communication error on send
      • econnaborted - Software caused connection abort
      • econnrefused - Connection refused
      • econnreset - Connection reset by peer
      • edeadlk - Resource deadlock avoided
      • edeadlock - Resource deadlock avoided
      • edestaddrreq - Destination address required
      • edirty - Mounting a dirty fs without force
      • edom - Math argument out of range
      • edotdot - Cross mount point
      • edquot - Disk quota exceeded
      • eduppkg - Duplicate package name
      • eexist - File already exists
      • efault - Bad address in system call argument
      • efbig - File too large
      • ehostdown - Host is down
      • ehostunreach - Host is unreachable
      • eidrm - Identifier removed
      • einit - Initialization error
      • einprogress - Operation now in progress
      • eintr - Interrupted system call
      • einval - Invalid argument
      • eio - I/O error
      • eisconn - Socket is already connected
      • eisdir - Illegal operation on a directory
      • eisnam - Is a named file
      • el2hlt - Level 2 halted
      • el2nsync - Level 2 not synchronized
      • el3hlt - Level 3 halted
      • el3rst - Level 3 reset
      • elbin - ELBIN
      • elibacc - Cannot access a needed shared library
      • elibbad - Accessing a corrupted shared library
      • elibexec - Cannot exec a shared library directly
      • elibmax - Attempting to link in more shared libraries than system limit
      • elibscn - .lib section in a.out corrupted
      • elnrng - Link number out of range
      • eloop - Too many levels of symbolic links
      • emfile - Too many open files
      • emlink - Too many links
      • emsgsize - Message too long
      • emultihop - Multihop attempted
      • enametoolong - Filename too long
      • enavail - Unavailable
      • enet - ENET
      • enetdown - Network is down
      • enetreset - Network dropped connection on reset
      • enetunreach - Network is unreachable
      • enfile - File table overflow
      • enoano - Anode table overflow
      • enobufs - No buffer space available
      • enocsi - No CSI structure available
      • enodata - No data available
      • enodev - No such device
      • enoent - No such file or directory
      • enoexec - Exec format error
      • enolck - No locks available
      • enolink - Link has been severed
      • enomem - Not enough memory
      • enomsg - No message of desired type
      • enonet - Machine is not on the network
      • enopkg - Package not installed
      • enoprotoopt - Bad protocol option
      • enospc - No space left on device
      • enosr - Out of stream resources or not a stream device
      • enosym - Unresolved symbol name
      • enosys - Function not implemented
      • enotblk - Block device required
      • enotconn - Socket is not connected
      • enotdir - Not a directory
      • enotempty - Directory not empty
      • enotnam - Not a named file
      • enotsock - Socket operation on non-socket
      • enotsup - Operation not supported
      • enotty - Inappropriate device for ioctl
      • enotuniq - Name not unique on network
      • enxio - No such device or address
      • eopnotsupp - Operation not supported on socket
      • eperm - Not owner
      • epfnosupport - Protocol family not supported
      • epipe - Broken pipe
      • eproclim - Too many processes
      • eprocunavail - Bad procedure for program
      • eprogmismatch - Wrong program version
      • eprogunavail - RPC program unavailable
      • eproto - Protocol error
      • eprotonosupport - Protocol not supported
      • eprototype - Wrong protocol type for socket
      • erange - Math result unrepresentable
      • erefused - EREFUSED
      • eremchg - Remote address changed
      • eremdev - Remote device
      • eremote - Pathname hit remote filesystem
      • eremoteio - Remote I/O error
      • eremoterelease - EREMOTERELEASE
      • erofs - Read-only filesystem
      • erpcmismatch - Wrong RPC version
      • erremote - Object is remote
      • eshutdown - Cannot send after socket shutdown
      • esocktnosupport - Socket type not supported
      • espipe - Invalid seek
      • esrch - No such process
      • esrmnt - Srmount error
      • estale - Stale remote file handle
      • esuccess - Error 0
      • etime - Timer expired
      • etimedout - Connection timed out
      • etoomanyrefs - Too many references
      • etxtbsy - Text file or pseudo-device busy
      • euclean - Structure needs cleaning
      • eunatch - Protocol driver not attached
      • eusers - Too many users
      • eversion - Version mismatch
      • ewouldblock - Operation would block
      • exdev - Cross-device link
      • exfull - Message tables full
      • nxdomain - Hostname or domain name cannot be found
      @@ -846,7 +846,7 @@

      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").
      @@ -1998,9 +1998,9 @@ 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}]),
      -    <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info,
      +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.

      @@ -2351,7 +2351,7 @@

      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 /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -70,7 +70,7 @@ up to the handler implementation if other processes are involved or not.

        The handlers are called in sequence, and the order is not defined.

        Logger API

        The API for logging consists of a set of macros, and a set of functions of 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.

        Log Level

        The log level indicates the severity of a event. In accordance with the Syslog @@ -80,23 +80,23 @@ must always use the atom. To compare the severity of two log levels, use logger:compare_levels/2.

        Log Message

        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.

        Metadata

        Metadata contains additional data associated with a log message. Logger inserts @@ -235,12 +235,12 @@ proxy configuration.

        Config is any (zero or more) of the following:

        • {handler, default, undefined} - Disables the default handler. This 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)

          For all other values of HandlerId, this entry adds a new handler, -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})

          for each Filter.

          FilterDefault specifies the behaviour if all primary filters return +calling

          logger:remove_handler(default)

          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)

          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})

          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 -calling

          logger:set_proxy_config(ProxyConfig)

          Only one entry of this type is allowed.

        See section Configuration Examples for +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 metadata. See the kernel(6) manual page for more information about this parameter.

    • logger_level = Level - Specifies the primary log @@ -255,31 +255,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"}}}
      -    ]}]}].

      Backwards Compatibility with error_logger

      Logger provides backwards compatibility with error_logger in the following +"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"}}}
      +    ]}]}].

      Backwards Compatibility with error_logger

      Logger provides backwards compatibility with error_logger in the following ways:

      • API for Logging - The error_logger API still exists, but should only be used by legacy code. It will be removed in a later release.

        Calls to error_logger:error_report/1,2, error_logger:error_msg/1,2, and corresponding @@ -315,9 +315,9 @@ 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.

      Error Handling

      Logger does, to a certain extent, check its input data before forwarding a log event to filters and handlers. It does, however, not evaluate report callbacks, @@ -330,20 +330,20 @@ about report callbacks and valid forms of log messages.

      Example: Add a handler to log info events to file

      When starting an Erlang node, the default behaviour is that all log events on 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).
      +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

      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.

      Example: Implement a handler

      logger_handler describes the callback functions that can be implemented for a Logger handler.

      A handler callback module must export:

      • log(Log, Config)

      It can optionally also export some, or all, of the following:

      • adding_handler(Config)
      • removing_handler(Config)
      • changing_config(SetOrUpdate, OldConfig, NewConfig)
      • filter_config(Config)

      When a handler is added, by for example a call to @@ -362,48 +362,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}) ->
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2026-04-20 15:17:53.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2042-05-23 04:36:20.000000000 +0000
      @@ -24,13 +24,13 @@
       post
       Erlang/OTP 21's new logger is
       a great starting point.

      Note

      If you find that some common Logger usage is missing from this guide, please -open a pull request on github with the suggested addition

      Get Logger information

      1> logger:i(primary).
      +open a pull request on github with the suggested addition

      Get Logger information

      1> logger:i(primary).
       Primary configuration:
           Level: notice
           Filter Default: log
           Filters:
      -        (none)

      It is also possible to fetch the configuration using -logger:get_primary_config().

      See also

      2> logger:i(handlers).
      +        (none)

      It is also possible to fetch the configuration using +logger:get_primary_config().

      See also

      2> logger:i(handlers).
       Handler configuration:
           Id: default
               Module: logger_std_h
      @@ -47,10 +47,10 @@
                       Arg: stop
                   Id: domain
                       Fun: fun logger_filters:domain/2
      -                Arg: {log,super,[otp,sasl]}
      +                Arg: {log,super,[otp,sasl]}
                   Id: no_domain
                       Fun: fun logger_filters:domain/2
      -                Arg: {log,undefined,[]}
      +                Arg: {log,undefined,[]}
               Handler Config:
                   burst_limit_enable: true
                   burst_limit_max_count: 500
      @@ -77,69 +77,69 @@
       =PROGRESS REPORT==== 4-Nov-2019::16:33:11.746546 ===
           application: stdlib
           started_at: nonode@nohost
      -Eshell V10.5.3  (abort with ^G)
      +Eshell V10.5.3  (abort with ^G)
       1>

      Configure Logger formatter

      In order to fit better into your existing logging infrastructure Logger can format its logging messages any way you want to. Either you can use the built-in formatter, or you can build your own.

      Single line configuration

      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

      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 in kernel/include/logger.hrl.

      See also

      Configuring handlers

      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

      Debug only handler

      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 @@ -147,30 +147,30 @@ is all. Then the debug handler is configured with a filter to stop any log message that is not a debug level message.

      It is also possible to do the same changes in an already running system using the logger module. Then you do like this:

      $ erl
      -1> logger:set_handler_config(default, level, notice).
      +1> logger:set_handler_config(default, level, notice).
       ok
      -2> logger:add_handler(debug, logger_std_h, #{
      -  filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
      -  config => #{ file => "log/debug.log" } }).
      +2> logger:add_handler(debug, logger_std_h, #{
      +  filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
      +  config => #{ file => "log/debug.log" } }).
       ok
      -3> logger:set_primary_config(level, all).
      +3> logger:set_primary_config(level, all).
       ok

      It is important that you do not raise the primary log level before adjusting the default handler's level as otherwise your standard out may be flooded by debug log messages.

      See also

      Logging

      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
           what: http_error

      or the below if you use a single line formatter:

      2019-10-10T12:14:11.921843+02:00 error: dst: {8,8,4,4}, src: {8,8,8,8}, status: 418, what: http_error

      See also

      Report call-backs and printing of events

      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)
      @@ -179,22 +179,22 @@
       single line formatter, however you can also use a report_cb fun with 2 arguments
       where the second argument is the formatting options.

      See also

      Filters

      Filters are used to remove or change log events before they reach the handlers.

      Process filters

      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
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2026-04-20 15:17:53.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2042-05-23 04:36:20.000000000 +0000
      @@ -58,12 +58,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"}}}]'

      See Also

      logger, logger_std_h, disk_log

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_filters.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -128,8 +128,8 @@ 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 @@ -144,11 +144,11 @@ 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
      @@ -193,9 +193,9 @@ 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
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -79,9 +79,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 /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/logger.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -24,20 +24,20 @@

      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:

      • the Logger facility in general, see the User's Guide.
      • how to configure Logger, see the +following in your sys.config:

        [{kernel,
        +  [{logger,
        +    [{handler, default, logger_std_h,
        +      #{config => #{file => "path/to/file.log"}}}]}]}].

        For more information about:

        Macros

        The following macros are defined in logger.hrl, which is included in a module -with the directive

            -include_lib("kernel/include/logger.hrl").
        • ?LOG_EMERGENCY(StringOrReport[,Metadata])
        • ?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])
        • ?LOG_ALERT(StringOrReport[,Metadata])
        • ?LOG_ALERT(FunOrFormat,Args[,Metadata])
        • ?LOG_CRITICAL(StringOrReport[,Metadata])
        • ?LOG_CRITICAL(FunOrFormat,Args[,Metadata])
        • ?LOG_ERROR(StringOrReport[,Metadata])
        • ?LOG_ERROR(FunOrFormat,Args[,Metadata])
        • ?LOG_WARNING(StringOrReport[,Metadata])
        • ?LOG_WARNING(FunOrFormat,Args[,Metadata])
        • ?LOG_NOTICE(StringOrReport[,Metadata])
        • ?LOG_NOTICE(FunOrFormat,Args[,Metadata])
        • ?LOG_INFO(StringOrReport[,Metadata])
        • ?LOG_INFO(FunOrFormat,Args[,Metadata])
        • ?LOG_DEBUG(StringOrReport[,Metadata])
        • ?LOG_DEBUG(FunOrFormat,Args[,Metadata])
        • ?LOG(Level,StringOrReport[,Metadata])
        • ?LOG(Level,FunOrFormat,Args[,Metadata])

        All macros expand to a call to Logger, where Level is taken from the macro +with the directive

            -include_lib("kernel/include/logger.hrl").
        • ?LOG_EMERGENCY(StringOrReport[,Metadata])
        • ?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])
        • ?LOG_ALERT(StringOrReport[,Metadata])
        • ?LOG_ALERT(FunOrFormat,Args[,Metadata])
        • ?LOG_CRITICAL(StringOrReport[,Metadata])
        • ?LOG_CRITICAL(FunOrFormat,Args[,Metadata])
        • ?LOG_ERROR(StringOrReport[,Metadata])
        • ?LOG_ERROR(FunOrFormat,Args[,Metadata])
        • ?LOG_WARNING(StringOrReport[,Metadata])
        • ?LOG_WARNING(FunOrFormat,Args[,Metadata])
        • ?LOG_NOTICE(StringOrReport[,Metadata])
        • ?LOG_NOTICE(FunOrFormat,Args[,Metadata])
        • ?LOG_INFO(StringOrReport[,Metadata])
        • ?LOG_INFO(FunOrFormat,Args[,Metadata])
        • ?LOG_DEBUG(StringOrReport[,Metadata])
        • ?LOG_DEBUG(FunOrFormat,Args[,Metadata])
        • ?LOG(Level,StringOrReport[,Metadata])
        • ?LOG(Level,FunOrFormat,Args[,Metadata])

        All macros expand to a call to Logger, where Level is taken from the macro name, or from the first argument in the case of the ?LOG macro. Location data is added to the metadata as described under the metadata/0 type definition.

        The call is wrapped in a case statement and will be evaluated only if Level is equal to or below the configured log level.

        See Also

        config, erlang, io, logger_disk_log_h, @@ -1718,26 +1718,26 @@ 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, #{}}]}]}].
      @@ -2692,8 +2692,8 @@ -

      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}).
      @@ -2756,8 +2756,8 @@

      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 .

      @@ -2850,8 +2850,8 @@

      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 .

      @@ -2883,7 +2883,7 @@

      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 .

      @@ -2915,8 +2915,8 @@

      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.

      @@ -3574,13 +3574,13 @@

      Create a log event at the given log level, with the given message to be logged and metadata.

      Example:

      %% A plain string
      -1> logger:log(info, "Hello World").
      +1> logger:log(info, "Hello World").
       %% A plain string with metadata
      -2> logger:log(debug, "Hello World", #{ meta => data }).
      +2> logger:log(debug, "Hello World", #{ meta => data }).
       %% A format string with arguments
      -3> logger:log(warning, "The roof is on ~ts",[Cause]).
      +3> logger:log(warning, "The roof is on ~ts",[Cause]).
       %% A report
      -4> logger:log(warning, #{ what => roof, cause => Cause }).

      Equivalent to log(Level, FormatOrFun, Args, #{}) if called as +4> logger:log(warning, #{ what => roof, cause => Cause }).

      Equivalent to log(Level, FormatOrFun, Args, #{}) if called as log(Level, FormatOrFun, Args).

      @@ -3619,12 +3619,12 @@ useful in scenarios when the message/metadata is very expensive to compute. This is because the fun is only evaluated when the message/metadata is actually needed, which may be not at all if the log event is not to be logged. Examples:

      %% 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.

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net_adm.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -363,8 +363,8 @@

      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}]}
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net_kernel.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -26,9 +26,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 @@ -592,13 +592,13 @@ 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 @@ -632,23 +632,23 @@ {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>
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/net.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -448,13 +448,13 @@

    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).
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/notes.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/notes.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -18,9 +18,9 @@

    Kernel Release Notes

    This document describes the changes made to the Kernel application.

    Kernel 10.6.1

    Fixed Bugs and Malfunctions

    • A vulnerability has been resolved in the (undocumented, unsupported and unused in OTP) inet_dns_tsig module that leads to a validation bypass.

      If a request contained an error code (forbidden by spec), it was treated as a response and skipped the verification of the MAC. The user of the module would then receive an "all ok" response, depending on the use case, this could lead to such things as AXFR or UPDATE being allowed.

      The code has also been tightening up of the client side to make sure too large (bad) MAC sizes cannot be selected and the limit is the output size of the algorithm chosen.

      Own Id: OTP-20012 Aux Id: PR-10825

    Kernel 10.6

    Fixed Bugs and Malfunctions

    • The built in DNS resolver inet_res has been fixed to do a final request assuming that the request name is absolute, as customary for many DNS resolver client libraries.

      Own Id: OTP-19937 Aux Id: GH-10494, PR-10576

    Improvements and New Features

    • Added support for zstd compression in the file module.

      Own Id: OTP-19860 Aux Id: PR-10385

    • Release applications, tests, and documentation are now placed in their respective directories. Source SBOM with more packages.

      A make release application places only the necessary code in the release folder. The main change is that the documentation and examples are not part of the release folder anymore.

      make release_docs places the documentation in the released code under the doc folder.

      make release_tests places the tests in their own directory. It used to be the case that some source code was mixed with the tests, and this should not happen anymore.

      The Software Bill of Materials places the examples folders as if they are part of the SPDX-otp-<app>-doc packge, instead of placing examples as if they were running source code.

      Overall, this change cleans up many things that were not quite correct by definition, and everything should still continue to work as expected. To test a release, one can still run ./Install -minimal \pwd`and add the release to thePATH. After that, one can run tests as usual, going into the released tests directory, enteringtest_server` and running the emulator.

      Improves the source Software-Bill-of-Materials

      • The improvements adds new SPDX relations for asmjit and zlib to be optional_components_of the Erlang/OTP project.
      • The autoconf scripts in make and erts have now been categorised as build_tool_of the Erlang/OTP project.
      • All remaining configure, configure.ac, config.h.in, Makefile.in, Makefile.src, EMakefile, and GNUMakefile are now part of a specific SPDX package with relation build_tool_of the Erlang/OTP project.

      Own Id: OTP-19886 Aux Id: PR-10434

    Kernel 10.5

    Fixed Bugs and Malfunctions

    • Fixed a shell crash when calling io:getopts() when user_drv process is not responding/terminating

      Own Id: OTP-19812 Aux Id: PR-10283

    • logger:get_handler_config/0 will no longer crash if a logger handler is removed concurrently with that call.

      Own Id: OTP-19837 Aux Id: PR-10308, GH-9997

    • Fixed a bug in the shell that made it incorrectly output a newline after the output already containing a newline but followed by an asci escape sequence.

      Own Id: OTP-19847 Aux Id: GH-10299

    Improvements and New Features

    • Receive buffer allocation has been optimized for socket socket in that an underutilized buffers' content is copied to a freshly allocated binary of the right size instead of being reallocated.

      This optimization was already implemented for the socket:recv/1 functions, but now the same buffer stragegy is shared between all socket receive operations.

      Own Id: OTP-19794 Aux Id: PR-10231

    • Option(s) to create gen_tcp and socket sockets with protocol IPPROTO_MPTCP has been implemented.

      See functions gen_tcp:listen/2, gen_tcp:connect/4 and the type socket:protocol/0.

      Own Id: OTP-19814

    • Support for the socket options TCP_KEEPCNT, TCP_KEEPIDLE, and TCP_KEEPINTVL have been implemented for gen_tcp, as well as TCP_USER_TIMEOUT for both gen_tcp and socket.

      Own Id: OTP-19857 Aux Id: OTP-19814, PR-10390

    • Limit size of sctp_event_subscribe on Linux

      Own Id: OTP-19863 Aux Id: PR-10321

    Kernel 10.4.2

    Fixed Bugs and Malfunctions

    • Fixed a race condition when registering the standard error process.

      Own Id: OTP-19832 Aux Id: PR-10290

    Kernel 10.4.1

    Fixed Bugs and Malfunctions

    • With this change group.erl will not crash when receiving unknown message.

      Own Id: OTP-19796 Aux Id: ERIERL-1264, PR-10248

    Kernel 10.4

    Fixed Bugs and Malfunctions

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    • The internal inet_dns_tsig and inet_res modules have been fixed to TSIG verify the correct timestamp.

      In the process two undocumented error code atoms have been corrected to notauth and notzone to adhere to the DNS RFCs. Code that relied on the previous incorrect values may have to be corrected.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-19756 Aux Id: PR-10146

    Improvements and New Features

    • The rudimentary DNS resolver inet_res has aqcuired 3 new functions inet_res:gethostbyname/4, inet_res;getbyname/4 and inet_res:gethostbyaddr/3, that all take an option list argument.

      This option list can be used to override the Kernel application's resolver options when calling the inet_res function directly.

      Own Id: OTP-19737 Aux Id: ERIERL-1209, PR-10112

    Kernel 10.3.2

    Fixed Bugs and Malfunctions

    • socket:sendv/3 with 'nowait' sometimes return 'completion' without 'CompletionInfo' (Windows only).

      Own Id: OTP-19661

    • prim_net nif used incorrect encoding for family resulting in non-functional address selection.

      Own Id: OTP-19674

    • socket:accept can return unexpected 'select_sent'.

      Own Id: OTP-19684 Aux Id: ERIERL-1242

    • net_kernel could be blocked for a very long time when selecting distribution module for a connection if the DNS service was slow. This prevented any new connections to be set up during that time.

      Own Id: OTP-19702 Aux Id: ERIERL-1241, PR-10029

    Improvements and New Features

    • Improved documentation of CompletionStatus for asynchronous (nowait) socket operations.

      Own Id: OTP-19670 Aux Id: PR-9930

    Kernel 10.3.1

    Fixed Bugs and Malfunctions

    • Fix bug where calling io:setopts/1 in a shell without the line_history option would always disable line_history. This bug was introduced in Erlang/OTP 28.0.

      Own Id: OTP-19645 Aux Id: GH-9863, PR-9870

    Kernel 10.3

    Fixed Bugs and Malfunctions

    • Fixed an issue where output to the shell would not print the prompt on a new line.

      Own Id: OTP-19228 Aux Id: PR-8820

    • When in shell is in -noshell mode, and in latin1 encoding mode, io requests in latin1 encoding will not be translated to unicode and back to latin1.

      Own Id: OTP-19296 Aux Id: PR-9013

    • Fixed a bug where a composing unicode character would bind to a character not available to the user and deleting that character would cause a crash.

      Own Id: OTP-19297 Aux Id: PR-9005

    • The -noshell mode has been updated to read data lazily from standard input. Before this fix any data would be read greedily which meant that Erlang could consume data not meant for it. It also meant that in order for shell:start_interactive/0 to work on Windows an API that did not support reading of Unicode characters had to be used.

      Own Id: OTP-19313 Aux Id: PR-8962, GH-8113

    • The Erlang shell no longer crashes when a shell prompt ends with an escape sequence.

      Own Id: OTP-19414 Aux Id: PR-9272

    • code:get_doc/1 now works for cover-compiled modules.

      Own Id: OTP-19513 Aux Id: PR-9433

    • An infinite loop in CNAME loop detection that can cause Out Of Memory has been fixed. This affected CNAME lookup with the internal DNS resolver.

      Own Id: OTP-19544 Aux Id: PR-9587, OTP-19545

    • The internal resolver framework has been fixed to wait with the first resolver lookup until the ERL_INETRC environment variable has been applied.

      Previously, on some platform(s) (Linux) a first lookup when figuring out the domain name was always placed on the native resolver even if ERL_INETRC was used to disable it.

      Own Id: OTP-19555 Aux Id: PR-9543

    • Fix logger:add_handler(default, ...) to correctly replay events generated during startup when the default logger is set to undefined in logger's configuration parameters.

      Own Id: OTP-19588 Aux Id: PR-9595, GH-9436

    • Enhance specs of timeout for improving documentation and dialyzer analysis.

      Own Id: OTP-19604 Aux Id: PR-9574

    • Removed the default values for SCTP send (sndbuf) and receive (recbuf) buffers.

      Own Id: OTP-19627 Aux Id: OTP-19576, GH-9722

    Improvements and New Features

    • application:load/1 slows down as the number of directories in the code path increases because the call to code:where_is_file/1 for the '.app' file must scan each directory for the app.

      code_server maintains a cache of the contents of directories in the path. Re-using that cache when searching for '.app' files in application:load/1 may improve its runtime, especially when loading multiple applications.

      Own Id: OTP-19194 Aux Id: PR-8078

    • The Erlang SSH daemon now uses the same backend to handle multiline functionality as the Erlang shell.

      Own Id: OTP-19226 Aux Id: PR-8805

    • Added support for SIGWINCH, SIGCONT, and SIGINFO signals to os:set_signal/2 where available.

      Own Id: OTP-19278 Aux Id: PR-8887, PR-8938

    • Add net_kernel:allowed/0, it returns a list of nodes that are explicitly allowed to connect to the node by calling -net_kernel:allow/1

      Own Id: OTP-19287 Aux Id: PR-8207

    • Documentation chunks (EEP-48) has been updated to include the following reserved metadata fields: behaviours, group, source_path, and source_annos. The compiler has also been updated to emit this metadata. See the EEP-48 documentation for more details.

      Own Id: OTP-19306 Aux Id: PR-8945, PR-8975

    • The erpc:call/3, erpc:call/5, erpc:multicall/3, and erpc:multicall/5 functions now also accept an option map as last argument containing the timeout and always_spawn options. The always_spawn option can be used in order to ensure that the call operation will use a newly spawned process when executing the remote call.

      Own Id: OTP-19343 Aux Id: PR-8642

    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

      -type meter() :: integer().
      --type foot() :: integer().

      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

      -nominal meter() :: integer().
      --nominal foot() :: integer().

      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

      Own Id: OTP-19364 Aux Id: PR-9079

    • Improved open debug for gen_tcp_socket (connect and listen) and gen_udp_socket (open).

      Own Id: OTP-19386

    • io:standard_error/0 has been updated to write via a NIF API instead of a port. This allows it to access the dirty-scheduler pool and make sure that writes have been written to the OSs stderr when io:format/3 and equivalent return.

      Own Id: OTP-19401 Aux Id: PR-9116

    • Added the option exception_on_failure to os:cmd/2 to make os:cmd/2 raise an exception if the command fails to execute.

      Own Id: OTP-19404 Aux Id: PR-9082

    • A socket option {otp,select_read} has been added that enables keeping a socket in the VM select/poll set between calls to recv functions.

      This increases throughput by reducing the number of calls to said functions.

      Own Id: OTP-19451 Aux Id: PR-9344

    • Add a configure chapter to the socket usage guide

      Own Id: OTP-19522 Aux Id: PR-9508

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    • Increase the default inet-driver buffer size(s). Also introduce kernel parameters for UDP and SCTP to change the sizes when creating (those) sockets.

      Own Id: OTP-19576

    • An experimental API for a native debugger has been added. The main components are the following:

      • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

      • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

      • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

      • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

      Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

    Kernel 10.2.7.3

    Improvements and New Features

    Kernel 10.2.7.2

    Fixed Bugs and Malfunctions

    • socket:sendv/3 with 'nowait' sometimes return 'completion' without 'CompletionInfo' (Windows only).

      Own Id: OTP-19661

    • socket:accept can return unexpected 'select_sent'.

      Own Id: OTP-19684 Aux Id: ERIERL-1242

    • net_kernel could be blocked for a very long time when selecting distribution module for a connection if the DNS service was slow. This prevented any new connections to be set up during that time.

      Own Id: OTP-19702 Aux Id: ERIERL-1241, PR-10029

    Improvements and New Features

    • Improved documentation of CompletionStatus for asynchronous (nowait) socket operations.

      Own Id: OTP-19670 Aux Id: PR-9930

    Kernel 10.2.7.1

    Fixed Bugs and Malfunctions

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    Improvements and New Features

    • Document default buffer sizes

      Own Id: OTP-19640 Aux Id: GH-9722

    Kernel 10.2.7

    Fixed Bugs and Malfunctions

    • With this change, disk_log will not crash when using chunk_step/3 after log size was decreased.

      Own Id: OTP-19605 Aux Id: GH-9720, PR-9765

    • With this change, disk_log will not run into infinite loop when using chunk/2,3 after log size was decreased.

      Own Id: OTP-19608 Aux Id: GH-9707, PR-9767

    Kernel 10.2.6

    Fixed Bugs and Malfunctions

    • Fixed bug in call_memory tracing that could cause wildly incorrect reported memory values. Bug exists since OTP 27.1.

      Also fixed return type spec of trace:info/3.

      Own Id: OTP-19581 Aux Id: ERIERL-1219, PR-9706

    Kernel 10.2.5

    Fixed Bugs and Malfunctions

    • On Windows, using socket:sendv, a large IOV (size > MAX), the tail was not sent.

      Own Id: OTP-19482

    • gen_tcp connect with a sockaddr with loopback address failed.

      Own Id: OTP-19560 Aux Id: GH-9541

    • Remove debug printouts from gen_tcp_socket

      Own Id: OTP-19564

    Kernel 10.2.4

    Fixed Bugs and Malfunctions

    • Behavior for socket:recv/3 has been improved. The behavior has also been clarified in the documentation.

      Own Id: OTP-19469 Aux Id: #9172

    • An infinite loop in CNAME loop detection that can cause Out Of Memory has been fixed. This affected CNAME lookup with the internal DNS resolver.

      Own Id: OTP-19545 Aux Id: PR-9587, OTP-19544

    Kernel 10.2.3

    Fixed Bugs and Malfunctions

    • Clarify inet:setopts documentation

      Own Id: OTP-19416 Aux Id: PR-9248

    • Fix bug where log printouts would go missing when application_controller is stopping while log messages are being sent.

      This bug was introduced by OTP-19078 in Erlang/OTP 26.2.5.

      Own Id: OTP-19418 Aux Id: GH-9163, PR-9274

    • Fixes a bug in the socket type spec, which caused Dialyzer to reject some valid programs.

      Own Id: OTP-19429 Aux Id: PR-9295, PR-9379

    Kernel 10.2.2

    Fixed Bugs and Malfunctions

    • Fixed a couple of bugs that could make global's internal state inconsistent when a connection was reconnected.

      Own Id: OTP-19381 Aux Id: PR-9377, GH-9112, GH-9117

    Kernel 10.2.1

    Fixed Bugs and Malfunctions

    • Fix the default group_leader to reply {error,request} on invalid I/O requests instead of crashing.

      This bug was introduced in Erlang/OTP 27.2.

      Own Id: OTP-19444 Aux Id: GH-9237, PR-9318

    Kernel 10.2

    Fixed Bugs and Malfunctions

    • 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.

      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.

      Own Id: OTP-19225 Aux Id: PR-8789

    • Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.

      Own Id: OTP-19260 Aux Id: PR-8884

    • inet:getifaddrs/0,1 is improved when using +net_kernel:allow/1

      Own Id: OTP-19287 Aux Id: PR-8207

    • Documentation chunks (EEP-48) has been updated to include the following reserved metadata fields: behaviours, group, source_path, and source_annos. The compiler has also been updated to emit this metadata. See the EEP-48 documentation for more details.

      Own Id: OTP-19306 Aux Id: PR-8945, PR-8975

    • The erpc:call/3, erpc:call/5, erpc:multicall/3, and erpc:multicall/5 functions now also accept an option map as last argument containing the timeout and always_spawn options. The always_spawn option can be used in order to ensure that the call operation will use a newly spawned process when executing the remote call.

      Own Id: OTP-19343 Aux Id: PR-8642

    • EEP-69: Nominal Types has been implemented. As a side effect, nominal types can encode opaque types. We changed all opaque-handling logic and improved opaque warnings in Dialyzer.

      All existing Erlang type systems are structural: two types are seen as equivalent if their structures are the same. Type comparisons are based on the structures of the types, not on how the user explicitly defines them. For example, in the following example, meter() and foot() are equivalent. The two types can be used interchangeably. Neither of them differ from the basic type integer().

      -type meter() :: integer().
      +-type foot() :: integer().

      Nominal typing is an alternative type system, where two types are equivalent if and only if they are declared with the same type name. The EEP proposes one new syntax -nominal for declaring nominal types. Under nominal typing, meter() and foot() are no longer compatible. Whenever a function expects type meter(), passing in type foot() would result in a Dialyzer error.

      -nominal meter() :: integer().
      +-nominal foot() :: integer().

      More nominal type-checking rules can be found in the EEP. It is worth noting that most work for adding nominal types and type-checking is in erl_types.erl. The rest are changes that removed the previous opaque type-checking, and added an improved version of it using nominal type-checking with reworked warnings.

      Backwards compatibility for opaque type-checking is not preserved by this PR. Previous opaque warnings can appear with slightly different wordings. A new kind of opaque warning opaque_union is added, together with a Dialyzer option no_opaque_union to turn this kind of warnings off.

      Own Id: OTP-19364 Aux Id: PR-9079

    • Improved open debug for gen_tcp_socket (connect and listen) and gen_udp_socket (open).

      Own Id: OTP-19386

    • io:standard_error/0 has been updated to write via a NIF API instead of a port. This allows it to access the dirty-scheduler pool and make sure that writes have been written to the OSs stderr when io:format/3 and equivalent return.

      Own Id: OTP-19401 Aux Id: PR-9116

    • Added the option exception_on_failure to os:cmd/2 to make os:cmd/2 raise an exception if the command fails to execute.

      Own Id: OTP-19404 Aux Id: PR-9082

    • A socket option {otp,select_read} has been added that enables keeping a socket in the VM select/poll set between calls to recv functions.

      This increases throughput by reducing the number of calls to said functions.

      Own Id: OTP-19451 Aux Id: PR-9344

    • Add a configure chapter to the socket usage guide

      Own Id: OTP-19522 Aux Id: PR-9508

    • The license and copyright header has changed format to include an SPDX-License-Identifier. At the same time, most files have been updated to follow a uniform standard for license headers.

      Own Id: OTP-19575 Aux Id: PR-9670

    • Increase the default inet-driver buffer size(s). Also introduce kernel parameters for UDP and SCTP to change the sizes when creating (those) sockets.

      Own Id: OTP-19576

    • An experimental API for a native debugger has been added. The main components are the following:

      • A new compiler option beam_debug_info for the Erlang compiler. When given, most optimizations are disabled and debug information suitable for the native debugger are added to generated BEAM files.

      • A new +D emulator flag. When given, the VM becomes "debuggable", which means that when modules that been compiled with the beam_debug_info option are loaded, the code is instrumented so that one can enable and disable breakpoints on executable lines.

      • An experimental erl_debugger module with a new debugging API. Essentially, it allows a single, local, process to be registered as the "debugger" process for the node. This process is the one that will receive messages notifying that a process hit a breakpoint. This way, the front-end implementation of a debugger (such as edb from WhatApp) can be decoupled from OTP.

      • The erl_debugger module also exposes new BIFs to inspect X and Y registers of a suspended process. Together with new code-information BIFs, this let's a debugger show the values of variables in scope for a suspended process.

      Own Id: OTP-19609 Aux Id: PR-8670, PR-9334, PR-9604

    Kernel 10.2.7.3

    Improvements and New Features

    Kernel 10.2.7.2

    Fixed Bugs and Malfunctions

    • socket:sendv/3 with 'nowait' sometimes return 'completion' without 'CompletionInfo' (Windows only).

      Own Id: OTP-19661

    • socket:accept can return unexpected 'select_sent'.

      Own Id: OTP-19684 Aux Id: ERIERL-1242

    • net_kernel could be blocked for a very long time when selecting distribution module for a connection if the DNS service was slow. This prevented any new connections to be set up during that time.

      Own Id: OTP-19702 Aux Id: ERIERL-1241, PR-10029

    Improvements and New Features

    • Improved documentation of CompletionStatus for asynchronous (nowait) socket operations.

      Own Id: OTP-19670 Aux Id: PR-9930

    Kernel 10.2.7.1

    Fixed Bugs and Malfunctions

    • A remote shell can now exit by closing the input stream, without terminating the remote node.

      Own Id: OTP-19667 Aux Id: PR-9912

    Improvements and New Features

    • Document default buffer sizes

      Own Id: OTP-19640 Aux Id: GH-9722

    Kernel 10.2.7

    Fixed Bugs and Malfunctions

    • With this change, disk_log will not crash when using chunk_step/3 after log size was decreased.

      Own Id: OTP-19605 Aux Id: GH-9720, PR-9765

    • With this change, disk_log will not run into infinite loop when using chunk/2,3 after log size was decreased.

      Own Id: OTP-19608 Aux Id: GH-9707, PR-9767

    Kernel 10.2.6

    Fixed Bugs and Malfunctions

    • Fixed bug in call_memory tracing that could cause wildly incorrect reported memory values. Bug exists since OTP 27.1.

      Also fixed return type spec of trace:info/3.

      Own Id: OTP-19581 Aux Id: ERIERL-1219, PR-9706

    Kernel 10.2.5

    Fixed Bugs and Malfunctions

    • On Windows, using socket:sendv, a large IOV (size > MAX), the tail was not sent.

      Own Id: OTP-19482

    • gen_tcp connect with a sockaddr with loopback address failed.

      Own Id: OTP-19560 Aux Id: GH-9541

    • Remove debug printouts from gen_tcp_socket

      Own Id: OTP-19564

    Kernel 10.2.4

    Fixed Bugs and Malfunctions

    • Behavior for socket:recv/3 has been improved. The behavior has also been clarified in the documentation.

      Own Id: OTP-19469 Aux Id: #9172

    • An infinite loop in CNAME loop detection that can cause Out Of Memory has been fixed. This affected CNAME lookup with the internal DNS resolver.

      Own Id: OTP-19545 Aux Id: PR-9587, OTP-19544

    Kernel 10.2.3

    Fixed Bugs and Malfunctions

    • Clarify inet:setopts documentation

      Own Id: OTP-19416 Aux Id: PR-9248

    • Fix bug where log printouts would go missing when application_controller is stopping while log messages are being sent.

      This bug was introduced by OTP-19078 in Erlang/OTP 26.2.5.

      Own Id: OTP-19418 Aux Id: GH-9163, PR-9274

    • Fixes a bug in the socket type spec, which caused Dialyzer to reject some valid programs.

      Own Id: OTP-19429 Aux Id: PR-9295, PR-9379

    Kernel 10.2.2

    Fixed Bugs and Malfunctions

    • Fixed a couple of bugs that could make global's internal state inconsistent when a connection was reconnected.

      Own Id: OTP-19381 Aux Id: PR-9377, GH-9112, GH-9117

    Kernel 10.2.1

    Fixed Bugs and Malfunctions

    • Fix the default group_leader to reply {error,request} on invalid I/O requests instead of crashing.

      This bug was introduced in Erlang/OTP 27.2.

      Own Id: OTP-19444 Aux Id: GH-9237, PR-9318

    Kernel 10.2

    Fixed Bugs and Malfunctions

    • 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.

      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.

      Own Id: OTP-19225 Aux Id: PR-8789

    • Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.

      Own Id: OTP-19260 Aux Id: PR-8884

    • inet:getifaddrs/0,1 is improved when using inet_backend = socket.

      Own Id: OTP-19264

    • Fixed logger:report/0 to mandate at least one element in the report. This fixes an issue with overlapping spec domains in all logger functions that use logger:report/0.

      Own Id: OTP-19302 Aux Id: PR-8959

    • Fixed deadlock on code_server. Multiple calls loading the same module with an on_load function loading call would create a deadlock.

      Own Id: OTP-19305 Aux Id: PR-8744, GH-7466, GH-8510

    Improvements and New Features

    • The Kernel application now recognizes the epmd_module and erl_epmd_listen_port parameters, similar to -kernel:connect_all.

      Own Id: OTP-19253 Aux Id: PR-8671

    • The inetrc kernel argument will now tolerate atoms again to improve compatibility with old configurations that relied on atoms working by accident.

      The expected type always was, and still remains, a string.

      Own Id: OTP-19280 Aux Id: GH-8899, PR-8902

    • The file:io_device/0 type has been updated to clearly show the difference between a raw and cooked IoDevice.

      Own Id: OTP-19301 Aux Id: PR-8956

    • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

      Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

    • Added the kernel parameter os_cmd_shell that controls which shell should be used by os:cmd/1.

      Own Id: OTP-19342 Aux Id: PR-8972

    • Added logging support to io:user/0, io:standard_io/0 and io:standard_error/0. See io:setopts/2 for more details.

      Own Id: OTP-19372 Aux Id: PR-8947

    Kernel 10.1.2

    Fixed Bugs and Malfunctions

    • On windows the socket:recv could return with success ({ok, Data}) even though not all data had been read.

      Own Id: OTP-19328

    • gen_udp:send on domain local can leak inet_reply messages.

      Own Id: OTP-19332 Aux Id: #8989

    • Failure to create an UDP IPv6 socket when inet_backend = socket with certain IPv6 socket options.

      Own Id: OTP-19357

    • net:getifaddrs does not properly report the running flag on windows.

      Own Id: OTP-19366 Aux Id: OTP-19061, ERIERL-1134

    Kernel 10.1.1

    Fixed Bugs and Malfunctions

    • 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.

      This happened with low probability when the OS signaled that the socket was ready for reading in combination with an internal time-out retry.

      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.

      Own Id: OTP-19235 Aux Id: ERIERL-1133, PR-8837

    • 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.

      Own Id: OTP-19258 Aux Id: OTP-19061, ERIERL-1134

    Kernel 10.1

    Fixed Bugs and Malfunctions

    • 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.

      Own Id: OTP-19097 Aux Id: PR-8503

    • Opening a disk_log file and combining head_func with rotate options did not work.

      Own Id: OTP-19104 Aux Id: ERIERL-870

    • Fixed an error info printout for erlang:is_process_alive/1 on non-local pids.

      Own Id: OTP-19134 Aux Id: PR-8560

    • 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 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.

      Own Id: OTP-19205

    • 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.

      Own Id: OTP-19208 Aux Id: PR-8672

    • Corrected socket:ioctl for genaddr (SIOCGENADDR).

      Own Id: OTP-19216

    Improvements and New Features

    • Added functions getservbyname and getservbyport to the net module.

      Own Id: OTP-19101 Aux Id: OTP-18835

    • Introduced enet | esock variants of inet functions, either when called with sockets, with explicit inet_backend config or with the e inet_backend kernel config option.

      Own Id: OTP-19132 Aux Id: OTP-19101

    • The function socket:i/0 now uses the net module (instead of the inet module) for service translation.

      Own Id: OTP-19138 Aux Id: OTP-19101

    • 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.

      Own Id: OTP-19199 Aux Id: OTP-19175, GH-8561, GH-8690, GH-8785

    Kernel 10.0.1

    Improvements and New Features

    • Polish the logger documentation.

      Own Id: OTP-19118 Aux Id: PR-8534

    Kernel 10.0

    Fixed Bugs and Malfunctions

    • Fixed a crash when calling file:delete/2 with an empty option list.

      Own Id: OTP-18590 Aux Id: PR-7220

    • 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.

      Own Id: OTP-18878 Aux Id: GH-7718, OTP-17734

    • The error information for erlang:phash/2 has been corrected.

      Own Id: OTP-18904 Aux Id: PR-7960

    • 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.

      Own Id: OTP-18930 Aux Id: PR-7993, GH-4992

    • Calling logger:add_handlers/1 with config option now works.

      Own Id: OTP-18954 Aux Id: GH-8061, PR-8076

    • The code:del_path/1 function now also works on paths added through -pa, -pz , -path and the boot script.

      Own Id: OTP-18959 Aux Id: GH-6692, PR-7697

    • A call to socket:[recv|recvfrom|recvmsg]/* with Timeout = 0 on Windows could cause a (case clause) crash if data is immediately available.

      Own Id: OTP-19063 Aux Id: OTP-18835

    • Improve heuristic for when a characters is wide in the shell for systems with old libc versions.

      Own Id: OTP-19087 Aux Id: PR-8382

    • Fix reading a line when reading from io:user/0 to not consider \r without \n to be a new line when erl is started with -noshell.

      Own Id: OTP-19088 Aux Id: PR-8396, GH-8360

    Improvements and New Features

    • Added file:read_file/2 with a raw option for reading files without going through the file server.

      Own Id: OTP-18589 Aux Id: PR-7220

    • 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.

      Kudos to Alexander Clouter that did almost all the work!

      Own Id: OTP-18713 Aux Id: PR-6985, GH-6985

    • The ebin directories for escripts are now cached.

      Own Id: OTP-18778 Aux Id: PR-7556

    • -callback attributes haven been added to application, logger_handler, and logger_formatter.

      Own Id: OTP-18795 Aux Id: PR-7703

    • Progress reports from before logger is started are now logged when log level is set to debug.

      Own Id: OTP-18807 Aux Id: PR-7732 ERIERL-985

    • The code:where_is_file/2 and code:which/1 functions now check for existence of the file directly instead of listing the content of each directory in the code path.

      Own Id: OTP-18816 Aux Id: PR-7711

    • Type specs has been added to the logger:Level/1,2,3 functions.

      Own Id: OTP-18820 Aux Id: PR-7779

    • 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

    • The shell now pages long output from the documentation help command (h(Module)), auto completions and the search command.

      Own Id: OTP-18846 Aux Id: PR-7845

    • 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

    • Optimized code loading by moving certain operations from the code server to the caller.

      Own Id: OTP-18941 Aux Id: PR-7981

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • Application startup has been optimized by removing an intermediary process.

      Own Id: OTP-18963 Aux Id: PR-8042

    • 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.

      As of Erlang/OTP 27, the function code:lib_dir/2, the -code_path_choice flag, and using erl_prim_loader for reading members of an archive are deprecated.

      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.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18966 Aux Id: PR-8091

    • The undocumented and deprecated file:pid2name function has been removed.

      Own Id: OTP-18967 Aux Id: PR-8092

    • There is a new module 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.

      Own Id: OTP-18980

    • Error logging has been improved when the io:standard_io/0 reader and/or writer terminates with an error.

      Own Id: OTP-18989 Aux Id: PR-8103

    • inet_backend = socket has been optimized and reworked to be more compatible with the original inet_backend = inet.

      Own Id: OTP-19004 Aux Id: OTP-18835

    • Add an simple example (echo server) )to the socket users guide.

      Own Id: OTP-19042

    • inet:i/0,1,2 has been improved to allow port numbers to be shown explicitly.

      Own Id: OTP-19053 Aux Id: #6724

    • The socket documentation has been reworked, and due to @@ -1680,12 +1680,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:
      /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/os.xhtml differs (HTML document, ASCII text, with very long lines)
      --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/os.xhtml	2026-04-20 15:17:53.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/os.xhtml	2042-05-23 04:36:20.000000000 +0000
      @@ -536,19 +536,19 @@
             
       
       

      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.

      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 +output and standard error of the command, and returns this result as a string.

      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/2 call. This option is a safety feature that should be used when the command executed -can return a very large, possibly infinite, result.

        Example:

        > 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]
      • exception_on_failure - If set to true, os:cmd/2 will throw an error +can return a very large, possibly infinite, result.

        Example:

        > 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]
      • exception_on_failure - If set to true, os:cmd/2 will throw an error exception if the command exits with a non-zero exit code. The exception reason looks like this: {command_failed, ResultBeforeFailure, ExitCode} where ResultBeforeFailure is the result written to stdout by the command before -the error happened and ExitCode is the exit code from the command.

        Example:

        > catch os:cmd("echo hello && exit 123", #{ exception_on_failure => true }).
        -{'EXIT',{{command_failed,"hello\n",123},
        -         [{os,cmd,2,[{file,"os.erl"},{line,579}]},
        +the error happened and ExitCode is the exit code from the command.

        Example:

        > catch os:cmd("echo hello && exit 123", #{ exception_on_failure => true }).
        +{'EXIT',{{command_failed,"hello\n",123},
        +         [{os,cmd,2,[{file,"os.erl"},{line,579}]},
         ...

      The command shell can be set using the kernel configuration parameter, by default the shell is detected upon system startup.

      @@ -841,7 +841,7 @@ 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
      @@ -1012,16 +1012,16 @@ 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.

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/pg.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/pg.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/pg.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -742,7 +742,7 @@

    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]}
    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/rpc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/rpc.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/rpc.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -956,10 +956,10 @@ 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 /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/seq_trace.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -29,9 +29,9 @@ how it can be used, see section Sequential Tracing.

    seq_trace provides functions that control all aspects of sequential tracing. There are functions for activation, deactivation, inspection, and for collection of the trace output.

    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 @@ -127,68 +127,68 @@ C-nodes built with Erl_Interface too. A C-node built with Erl_Interface only maintains one trace token, which means that the C-node appears as one process from the sequential tracing point of view.

        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().
        +    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}.
        +
        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}.
    @@ -761,11 +761,11 @@ 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.

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/socket_usage.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2026-04-20 15:17:53.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.6.1/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2042-05-23 04:36:20.000000000 +0000 @@ -57,59 +57,59 @@ socket:sendv/3 with asynchronous (nowait) on completion systems (Windows).
    Observe that this is not an illustration how to write a asynchronous sendv function. Its just an example of what kind of messages and results that can be expected. The example below basically (re-) implements: -socket:sendv(Sock, IOV, infinity).