~/f/erlang/RPMS.2 ~/f/erlang ~/f/erlang RPMS.2/erlang-28.1.1-1.1.x86_64.rpm RPMS/erlang-28.1.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-28.1.1-1.1.x86_64.rpm to erlang-28.1.1-1.1.x86_64.rpm comparing the rpm tags of erlang --- old-rpm-tags +++ new-rpm-tags @@ -2918 +2918 @@ -/usr/lib64/erlang/lib/public_key-1.18.3/ebin/CryptographicMessageSyntax-2009.beam 49b4adadadcdeaa6eba7d831c849a2f011fba0b45592c7f541dd0c7fd36a6d5f 0 +/usr/lib64/erlang/lib/public_key-1.18.3/ebin/CryptographicMessageSyntax-2009.beam 8a6e82ee60fee6a64292287debd970b883e34028510d0d1c0f63866bf90c0ab0 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.18.3/ebin/CryptographicMessageSyntax-2009.beam differs at offset '8' (Erlang BEAM file) --- old /usr/lib64/erlang/lib/public_key-1.18.3/ebin/CryptographicMessageSyntax-2009.beam (hex) +++ new /usr/lib64/erlang/lib/public_key-1.18.3/ebin/CryptographicMessageSyntax-2009.beam (hex) @@ -1,4 +1,4 @@ -00000000 46 4f 52 31 00 02 97 08 42 45 41 4d 41 74 55 38 |FOR1....BEAMAtU8| +00000000 46 4f 52 31 00 02 97 20 42 45 41 4d 41 74 55 38 |FOR1... BEAMAtU8| 00000010 00 00 46 b2 ff ff fd 85 08 1f 43 72 79 70 74 6f |..F.......Crypto| 00000020 67 72 61 70 68 69 63 4d 65 73 73 61 67 65 53 79 |graphicMessageSy| 00000030 6e 74 61 78 2d 32 30 30 39 d0 65 6e 63 6f 64 69 |ntax-2009.encodi| RPMS.2/erlang-debugsource-28.1.1-1.1.x86_64.rpm RPMS/erlang-debugsource-28.1.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-debugsource-28.1.1-1.1.x86_64.rpm to erlang-debugsource-28.1.1-1.1.x86_64.rpm comparing the rpm tags of erlang-debugsource --- old-rpm-tags +++ new-rpm-tags @@ -1298 +1298 @@ -/usr/src/debug/otp-OTP-28.1.1/erts/emulator/x86_64-suse-linux-gnu/opt/jit/erl_alloc_types.h 30c75ee69a728a2240ffddeab5fefe9964dad462427798f13790d6f2d63c151f 0 +/usr/src/debug/otp-OTP-28.1.1/erts/emulator/x86_64-suse-linux-gnu/opt/jit/erl_alloc_types.h d94342630b01dcf726850bb55f4692bc91acd95ec22043cca6608f0a6dd9cf62 0 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist comparing file checksum creating rename script RPM file checksum differs. Extracting packages /usr/src/debug/otp-OTP-28.1.1/erts/emulator/x86_64-suse-linux-gnu/opt/jit/erl_alloc_types.h differs (C source, ASCII text) --- old//usr/src/debug/otp-OTP-28.1.1/erts/emulator/x86_64-suse-linux-gnu/opt/jit/erl_alloc_types.h 2025-11-05 07:53:15.000000000 +0000 +++ new//usr/src/debug/otp-OTP-28.1.1/erts/emulator/x86_64-suse-linux-gnu/opt/jit/erl_alloc_types.h 2025-11-05 07:53:15.000000000 +0000 @@ -7,7 +7,7 @@ * ----------------------------------------------------------------------- * * - * Copyright Ericsson AB 2025. All Rights Reserved. + * Copyright Ericsson AB 2041. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. RPMS.2/erlang-doc-28.1.1-1.1.x86_64.rpm RPMS/erlang-doc-28.1.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-doc-28.1.1-1.1.x86_64.rpm to erlang-doc-28.1.1-1.1.x86_64.rpm comparing the rpm tags of erlang-doc --- old-rpm-tags +++ new-rpm-tags @@ -602 +602 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-B93E08B9.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-701DC811.js 2 (none) 100644 root root 0 4294967295 @@ -2000 +2000 @@ -/usr/share/doc/packages/erlang-doc/doc/404.html e2a8be04af81d1dcb61b8c3a5b34e3885edb5e6cafb90c76e537d649c77456fe 2 +/usr/share/doc/packages/erlang-doc/doc/404.html d3f871cb994c073836f5197908c175d6ba7842d45873114875756b3f97009128 2 @@ -2008 +2008 @@ -/usr/share/doc/packages/erlang-doc/doc/deprecations.html 4e0e8030ab0dcce28ee6b23b66706adf47220ef0a5a80358f1764e8b374ea885 2 +/usr/share/doc/packages/erlang-doc/doc/deprecations.html 736117bf318781a480ac5d0320f4483e2afcd4c19d2724872e66d23a0d5bd4b1 2 @@ -2037 +2037 @@ -/usr/share/doc/packages/erlang-doc/doc/man_index.html 4e2a147e72ccf64c99f3a59bfffa6727ac8a45c5d9f644ade2b31a40f2a0ae86 2 +/usr/share/doc/packages/erlang-doc/doc/man_index.html 9b1bf50112206b33e474e75660f2d9e19c314433f2c7fff99b1f12af9234b32c 2 @@ -2046 +2046 @@ -/usr/share/doc/packages/erlang-doc/doc/readme.html af071ef069b1199f198e1225ec2516ac2fc50723dbc4f17e6700b986789a9f2b 2 +/usr/share/doc/packages/erlang-doc/doc/readme.html 8ceeb951042c6ee26f944bda239db061ca38912fc9bc5b5e81c326340f6fabc2 2 @@ -2049 +2049 @@ -/usr/share/doc/packages/erlang-doc/doc/removed.html ae2ad3fcc538e95f5be3df698fb1ae172227e3b6b1565ee817e1e663c5c3cc36 2 +/usr/share/doc/packages/erlang-doc/doc/removed.html 0b7b305ad139d2b8ed5479e24c00e4535c9adc7b76d602f89a48b518d5f0f4b2 2 @@ -2052,2 +2052,2 @@ -/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html eebbef3a89dba9ed7d46a53dbf209d0f1d9a0f2c317e890cf9478ca2424d91ec 2 -/usr/share/doc/packages/erlang-doc/doc/search.html f28f4ff970a42ac9dbc9f6cfac002e6ba2cd585e5584a4ff7583bb740a408045 2 +/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html ab275fbea2eb0894a80e5a1f593b1f89a7cc0c48f7a9f7e55ca488424d363a68 2 +/usr/share/doc/packages/erlang-doc/doc/search.html 91a666807ee6ac4a9eaf6753f105eb987787a0dab24df806402f4b8d8d72595e 2 @@ -2060,4 +2060,4 @@ -/usr/share/doc/packages/erlang-doc/doc/system/404.html 4b3b6497b6abc2129ee4b925d70c00a5d399bb635cb69134814c7d218ed80499 2 -/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub fcc9077b7cc1bd79205375a431b45431345cdc8cf6a493b260b66e3f20bfbe7a 2 -/usr/share/doc/packages/erlang-doc/doc/system/applications.html 17fa4e9768746935eb9738ee668bd02fbe3e164e0d9073d90e4f5a1cffeff376 2 -/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 07ce78409ab5db2c76aba640a760f95aacaba627351b90894fcd5724eb551ed2 2 +/usr/share/doc/packages/erlang-doc/doc/system/404.html 076f561a85451d6d3da251b86426f02d94cd820809765408a0ef05e81b3c6afd 2 +/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub 8d3a9794dab89b315208cc5607882fd0bc2a3a12e74a5cbd5623752bbf78c187 2 +/usr/share/doc/packages/erlang-doc/doc/system/applications.html 10afed6169772c852412dafe52462a94bf2bbd2159a193d0013159b088c30970 2 +/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 32d715b42a0e636ec3c079cd67d85f218425a55cb94d2a00f709072e7507d6a9 2 @@ -2074,14 +2074,14 @@ -/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html fb182a789416e7d936330796798c6a98660c8247ada770c5f9ecbac746e7aa6e 2 -/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html b5266dcb8929b7fc0aaf341de578df3ef91c2fe44b470dc5538ffdee2d27522b 2 -/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 789e31fd80e100e05efffcf18285d87db06f9e5feec2523cca6b2c3f0f03f230 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_port.html a7fe3c782fce8c9b8e0713c04729ffd683599e045aa4e84880b7e6e0801d2dd4 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 77c5902f1d8ed4a6f13bdc480c009af1eea0326561e89f056ab4e8119a92d727 2 -/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 751059611edc709cd39d1f927c378ac568f2226f3a50fe2f85bed54b714b3936 2 -/usr/share/doc/packages/erlang-doc/doc/system/cnode.html dbdfb0aa869f6e20a2816e195a820081e959374cbb255835a2e8e0db6595698b 2 -/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 4ecb0bc0a6ad3ddd412b796803364fe1316c21854cb1a479f5f80d9e2307b621 2 -/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html ff41b7ae2880f3f4328ce2870ca0165561ab0d3d4f51c37961289b6df5a3eb47 2 -/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html bbdb23f5967fc61b92198c98cd6f955cee58dab81bc26624b2c2fe9bd7b2be2a 2 -/usr/share/doc/packages/erlang-doc/doc/system/create_target.html 5448a1544105e044b342f49ceff9ba008743889807309f6a41ab89315ca6907d 2 -/usr/share/doc/packages/erlang-doc/doc/system/data_types.html 37c069edd309c955d3d77033a9b9e0244d94d50efc0feb2137428a930d4f07c7 2 -/usr/share/doc/packages/erlang-doc/doc/system/debugging.html e56ef7013f39c6bc3003c78b87acd9f867e0e17d653bbe8464607d87b059d522 2 -/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html ec4fc3cbdfd1cab94c199e5c11bfbf5820c3e850e1aec588d25e3a818e6e442c 2 +/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html 5035ac9c9b5e335886ee1b8b1dbae9846966024f39b4265c69e52df35050a949 2 +/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html d3a4218080f7b4b8e8c1af163c45135acaf6ccaaa4f10a86a9d6ac8693b7a823 2 +/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 7b4b98aad86cf5f117efd0e4ebb907a3bb0d189fb99189ddf6c5c0eb33c86086 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_port.html 8d3ab080d5ebcc565114d7f245ab5dcd469ac796a8e69b1285eb65c0c0b0789f 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 06daf5e3de189fb3ae9e62af195d691749ccf662f5f89ec276b3393db434ae6d 2 +/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 96e462f54abf7a5ac9dc070d7fbda1ed0992ed3407db093084c8bbe1fabfc1c9 2 +/usr/share/doc/packages/erlang-doc/doc/system/cnode.html 9d1ad00dad285c7919ef74a3b0c0d9140a016bdb096bcc51c92f3ca4d9e2091c 2 +/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 0aace8c9f572e5e9aebe1614d261fad31bcd8998e90eb95f4d29abaf6c72b9b0 2 +/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html e9ec1d3e2e227597a339b9f356ad689be3ff5df9d246fe33ce71af5ee15fffa7 2 +/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html d7c53ccad624b4ad74fe28b9f3dd6d0a6b63b8cfce37a88f62522f3860e09bf5 2 +/usr/share/doc/packages/erlang-doc/doc/system/create_target.html 0aaa9a0f65a708df50f81c81e53ac69f0cb0af7bab1f1115bbe8489d1a438721 2 +/usr/share/doc/packages/erlang-doc/doc/system/data_types.html dd895b58baaf6d5c22fae49f61a5fbaa3437733b124e20412e90b6afbf66dc31 2 +/usr/share/doc/packages/erlang-doc/doc/system/debugging.html 592a24bf9f30a43497abc4d49b8f516b55cec7dd84a681ad2b7935510d583cec 2 +/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html c30ef61059309cfacea97839b2d43e6daa567d75a0f52d8599d96c826a8681e7 2 @@ -2098,20 +2098,20 @@ -/usr/share/doc/packages/erlang-doc/doc/system/distributed.html 26003138a3f0711ad18d4b2e8a085d865343174cf877da09c56e2dcc4cd09a1a 2 -/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html e450a4cf084781e0968160356d910ff75a9d3a8988099ceafda033b8eb166475 2 -/usr/share/doc/packages/erlang-doc/doc/system/documentation.html 2aa44cd24bdf1c33dff03f95212e153ed09b46ec0d221caeafc0f04dddcff73f 2 -/usr/share/doc/packages/erlang-doc/doc/system/drivers.html a09c123113534110904b07b8872ba29e28a5bdfca991e93d49baef1a1c1e86f1 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html d91989a4c9376afd6a2c06a2daf13996ae65b9c976fe9496df27177d823cee58 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html c9f5ac7746fac182efbd7cb5fb8860d191e955ff709fa514adf732abc8ca2f97 2 -/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html dbe1f11f3977e17c0d3e3a065db0efccd6c7614b78c0307fe3ddf8de9acc440b 2 -/usr/share/doc/packages/erlang-doc/doc/system/embedded.html 1128744822567297eda09801f1ede1b6502eef420a98ea61f0cfd97a9780b550 2 -/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html a0267fafb2376c8f1600740dc1d9753c7136944f6c41b9f084b3554f75b71040 2 -/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html 0feab09666b27fb3006986152aab662c8cd306ad5e1b5ff9642ad8c215a277d5 2 -/usr/share/doc/packages/erlang-doc/doc/system/errors.html 2ec08ea975fcceec5aa26eb8452fe9bd08d930368e4ae1a2600140e09ac0098c 2 -/usr/share/doc/packages/erlang-doc/doc/system/events.html 659441500b305ae780117ba1caf9fe316ade00510bc5d01a326c999f3ec6c2a0 2 -/usr/share/doc/packages/erlang-doc/doc/system/example.html b54364562df2077681b971556216d0e7731ee97b315e96133058ae250daec2f8 2 -/usr/share/doc/packages/erlang-doc/doc/system/expressions.html 0acd0117871e61f63200daf362e54c84f923038a8efacb7c9fe47eb1fc0a66b8 2 -/usr/share/doc/packages/erlang-doc/doc/system/features.html 34671fcddf02993a285baa1548e7b1e81924c76d316593ace9fcfd27c2fffc01 2 -/usr/share/doc/packages/erlang-doc/doc/system/funs.html 0ca70c983704d786c68a121fd7ef7489fe5f9143ff7432074a6ed1e598d689b8 2 -/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html 18b75ee2547d296eb92d758aa589dbc66f2a9b22ec853ca12398ab7a1c070f6d 2 -/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 26ca6262e48bb3538753e251482ba266b38e56e3170f1f29bf69b8b617fcd992 2 -/usr/share/doc/packages/erlang-doc/doc/system/howto_debug.html b654d12bb544033eda74cbbe6c13dc3862bdd6e62021de22ddcdd6d28f5a291b 2 -/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 004d35a2d0526a395cd65d5604b1421e346acb80f47afe546f053f454df5d958 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed.html f346412dc08df08615d49e1a0d32d3fc99f37a64ef3f1e5a354f0a894220076b 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html ff761f7044b7474a2d102133a7af45ed538d187cb147f5512c98a298faee7c7f 2 +/usr/share/doc/packages/erlang-doc/doc/system/documentation.html e1f5a744a2093f27bfd1f984a9c370aca072b5327e474869637f440dceb0f445 2 +/usr/share/doc/packages/erlang-doc/doc/system/drivers.html 59fa0dea07323c767053fb8b828b475394ca6892d4ac188cb9537fde406a5597 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html 8ba7cc632a5940a3a1b8e7a401b693fd0699f4184e4eedb66fccc9258b9ec1e7 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html 0e61de1b5b77bbf31f50d93733a44cf23216967fd33644085b5e6178618fdc95 2 +/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html 448e4af4258c060fae724c23cb3b4984cdaac36cc4bd478b5d673b0462d0c7e8 2 +/usr/share/doc/packages/erlang-doc/doc/system/embedded.html 6150c40e7a09fd154dc509f3fd4066b730165bb08f053ca2343469d23664b2e8 2 +/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html 831b67ce2a9bd49371f8ad2a528d79851e7bb7ab84d748360b88ebb89f35a3c8 2 +/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html 3dce9c748ea045274394e7aad04af1a2ae029468b529686ac4a9c2ec92de0dbf 2 +/usr/share/doc/packages/erlang-doc/doc/system/errors.html ea247f76cbd69d9253dab58aebcc03c1c68d64395ebc9e636614673cd603d0ba 2 +/usr/share/doc/packages/erlang-doc/doc/system/events.html 7f7a2366993a24a6cacec29f22748f4037df7ae3eecf3dc90293746aa868d865 2 +/usr/share/doc/packages/erlang-doc/doc/system/example.html f90f5204f16976c768942bc7d548f22f5f033445de2ed53c853cc987d355ac9b 2 +/usr/share/doc/packages/erlang-doc/doc/system/expressions.html 7553986ae74e47a68b163f6dba4d1780b556c39b23622dae41b79b9bd49a342b 2 +/usr/share/doc/packages/erlang-doc/doc/system/features.html f5eeb7e33c7085fc4317816c8d741d5db627e0818c1dbe454e5758318675d0dc 2 +/usr/share/doc/packages/erlang-doc/doc/system/funs.html 1766b1c41d4132727f64534b2dea9fab48416d6b0a9df7ec46bb53d0b302dba9 2 +/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html ff737dae54aaf825663ef4384b0c9e56c4a870af64f2497a970746b94cceb360 2 +/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html a115aa3645dff6086e0abcb9417d4334fe6860c80a98db3e400f295c32e0fc3a 2 +/usr/share/doc/packages/erlang-doc/doc/system/howto_debug.html b1c614f8e7ff5e12b6c3fbe795dab36093dd5d73ec7bd47c31d192d362e89bc1 2 +/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 324a94e9a7d69e6684465776301113eb63318bf1b841adccad6353e8c883638f 2 @@ -2119,42 +2119,42 @@ -/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 7dc345f554d4924e515b49a56992857a665c4a6b0432981e092dd2f1e69d11ab 2 -/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 98f45d600c76981ecec79a9e88dad0ea8e4ed2efd50f111e5a6be9ee8fc65d9b 2 -/usr/share/doc/packages/erlang-doc/doc/system/install.html f23612639b01fb90be7b30d621dedd2b86761369db8e664bbd6fa40ca5158510 2 -/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 460d5f1159fb060c15be1b125b8ff9f954b5a667d70f392f144cfa7aceb52701 2 -/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html e030a39df095251d270eaa1a33a2b7a1edc117dadbc8738e32710f32d8adf6d6 2 -/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 9da56a5cdcc6f512196ecdd6bda4fc760badd1ccc4236ac2dda52bcd60af77ec 2 -/usr/share/doc/packages/erlang-doc/doc/system/macros.html 6a5126c51a6ef47538ba0de74352d733f7e5a605f00f0cdde1d0e48a45ac08f4 2 -/usr/share/doc/packages/erlang-doc/doc/system/maps.html c5609bb89d9990e24b234a1f69482e918b3647c0d50f3e0c8a56520abb5d4cd7 2 -/usr/share/doc/packages/erlang-doc/doc/system/memory.html 620ddf8639525e7ea910aef0140a9311ddbe3693ab6e1ccd1c434a2cc9a2840a 2 -/usr/share/doc/packages/erlang-doc/doc/system/misc.html f06c541fab6ad42dea9a9481e1be86e6d79bf184d42354da8022973c731ae1c8 2 -/usr/share/doc/packages/erlang-doc/doc/system/modules.html b88e74cef92a14a429d594803971fbc1832308122b08a85e477f07d25538e701 2 -/usr/share/doc/packages/erlang-doc/doc/system/nif.html c725c7bd99626fe3801eb20309365936ea3bfb0dfbef357a822ccbb075aa2efa 2 -/usr/share/doc/packages/erlang-doc/doc/system/nominals.html 732ea3d75ed2ffa511428ece323dfc2ecc1e6f2a1a0c675c5dd2b1ae4527001b 2 -/usr/share/doc/packages/erlang-doc/doc/system/opaques.html c9b83691f385416c4a6f23c49ab30eb0ebbfb11e80a233732d6696aa7b5a9486 2 -/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html 7a145ef9ed5d70e3d8db0119c5ca49997ee154c8d68a6112ed3ce8bca768ec66 2 -/usr/share/doc/packages/erlang-doc/doc/system/overview.html feac7873c65e313bba267cd92cdc1ea99857378d6ba3629b4da1563ea699db12 2 -/usr/share/doc/packages/erlang-doc/doc/system/patterns.html 3fdef42c104f6cf17cb677e1d735e7312830803b7df638c85e157a87d8a15363 2 -/usr/share/doc/packages/erlang-doc/doc/system/ports.html e25cb4854317c688ba008dc50cad88fad52de78b52f0225969b55df8ef9097c8 2 -/usr/share/doc/packages/erlang-doc/doc/system/profiling.html 145f78e7b4139fb15f19a67f87edf9aa26df1ec5131e7dfdabccadbd5af530b9 2 -/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 9de5f13d80904af6f047d4e9a681b46e654235430071664717fe046182520046 2 -/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html 7369ac6137a917074c2b76e2129fa37b47a3ae9450afec6f629009fb8dffd6c0 2 -/usr/share/doc/packages/erlang-doc/doc/system/readme.html e928e21b8f64a31d2e1ac13144ce64dabfeced6ed25bdbbb737c246d23c405b9 2 -/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 8da020c91c73489866ca676421cc44cd357edc9f2d13482713ac86182bf01d9a 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html 4cbebae50dbf91d475c4d5494e5e558b79baac4a978a9f75c64926c671611a7c 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 3114956cc4599c710beafccd180d6137a3fb6d5dc0b7bf179acf14b011bb6403 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html f01e991970ac212d2fef4a3a7ac34cc8ab1e196ff5099b34cb67f60ec4237a8b 2 -/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 60dc7f9401e75583c4cfae43759d547b4983429576707b047545e2f0b806df04 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 6f440be56faa0ed6f960f262db531fc6590da7365ec459b43666cca6a85cb568 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html 4e3fa80fda4be987a61afcbdac7b4d8cf3c99d79a921334027348f5e326e0c3f 2 -/usr/share/doc/packages/erlang-doc/doc/system/robustness.html 45917467b277a98daf6b14b3638acdb5928ac73e987919ff7dc1135cc79c0956 2 -/usr/share/doc/packages/erlang-doc/doc/system/search.html e998310591007a57c56d589d13cc909f43c6fd62d520bdb9398111be76640d27 2 -/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 832e9c46ab91c156f82e2dcdcc31e1e21ad346a124b4e5450d2ca5cd7c524fa6 2 -/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 421e81eab5c71dfa5561e459e9a40252a6e45827f53848cf3f93069f0019e509 2 -/usr/share/doc/packages/erlang-doc/doc/system/statem.html 6065c8df2c8335de1527f52b8d8fbc44075a52fae89fcd3d706f869110488eac 2 -/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 4463440a07307adf5d7c9710daf74baed083b178f98a271ee075bc88cc7953bc 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 868dab7fc87772e681b66b3de4d1efc2d8b87d6ea9e410d694ec145934e6a383 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html 826d52b29af8c5bf9d937e9c5573f5ad86b29dbe331730f597dd696d266877af 2 -/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 6d6488406c609652e26c580a037afe81081a50b9296e71a90955a3acf6857c22 2 -/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html 309d1d854a479142d34676e85c13f371fc7df5b5f90a08e594d7926cda11d4a7 2 -/usr/share/doc/packages/erlang-doc/doc/system/typespec.html 41b5910c0a097def10596109d70fb9a5aa11150c05d0f31c8795768853210fd5 2 -/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html e875dad8d2c634f4bbf1c477d2be9c5f3991a827e09d310fb8f599caec56637f 2 -/usr/share/doc/packages/erlang-doc/doc/system/versions.html 9be4b936d0e4a20e15d63ec571d6605e087f08218e75afe26f62683bb85b2077 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 209f319bf9060507bcae5d5c0138ee9d45ac5cf264be7d21abfd7d921f769bd8 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 874c7170caa511509aaab3fa0ea792d63c1b0e5160d8f312fee651b6f1c86330 2 +/usr/share/doc/packages/erlang-doc/doc/system/install.html 09a3af4851119ac409c4336c303aeb60f9cabdf4c87f086322a18913d2a6318b 2 +/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 25c5e3ad1bdac75b63e2d59e5c35c62dfe921c285ac72ad28352e11979b1628a 2 +/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 5b0d4953644382ddd9f1143c9216bdbbab093895da2e2c7a5e246f3a184ab7f3 2 +/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 0c6b5d9549918f572454e9bc33222a20aba2f0b85e0b45afbebb6c26d8d5314d 2 +/usr/share/doc/packages/erlang-doc/doc/system/macros.html de8cccaf2cff0d09219ed484b6f54b24d3ad8d15224fe9c41a1885288c98fe62 2 +/usr/share/doc/packages/erlang-doc/doc/system/maps.html 73b5ec159146223cf4dbd05b80e1f2b6023fb130f7f0fbe72b115fc45cd4f5a6 2 +/usr/share/doc/packages/erlang-doc/doc/system/memory.html 7c4aee1b6292ada3c20d17a7efbcef622e7ff2589b996e1bbd11c6075343a40b 2 +/usr/share/doc/packages/erlang-doc/doc/system/misc.html bdf0a7b9746ba544106708e312eb2dd65628c3fa426c8801e31a00fc66329a69 2 +/usr/share/doc/packages/erlang-doc/doc/system/modules.html 9855846f8c86be066d250940bd525c908bef2d3945eb341121b9c47d44c19828 2 +/usr/share/doc/packages/erlang-doc/doc/system/nif.html deb3b2c8a549f4c836d61b55c2ff7e181b742625f499d41b45697cfeea9426bc 2 +/usr/share/doc/packages/erlang-doc/doc/system/nominals.html a3ef0979f8e49585c5216c6675b9985f6ef0a96f7cf34bcbd87e8c193a19fe0b 2 +/usr/share/doc/packages/erlang-doc/doc/system/opaques.html e09de496de5fa711f3b55781c570b0d6ba70cdc27ad0ddf42a5816adfd4db0c0 2 +/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html ea3552561162dacdbabf7ba59980fa6db4072221ff153e27d3b79c637be4277d 2 +/usr/share/doc/packages/erlang-doc/doc/system/overview.html 3fc34607c4143680c5bd6445e83411bb700e1d12a4eb3f8bf18bf7862163a1c3 2 +/usr/share/doc/packages/erlang-doc/doc/system/patterns.html 21f0ef9675615a9f4b05b838677bb5d5f043a062ba59cc1125041c29dffece98 2 +/usr/share/doc/packages/erlang-doc/doc/system/ports.html ff07649178d8bbbb81b2236c77eef41aaad4456452dbde13456a6ae947d57fd8 2 +/usr/share/doc/packages/erlang-doc/doc/system/profiling.html 33d3223702a47f66bdab921e6995c1eea78ffa2082db291d538ae21c9f6cafab 2 +/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html d6f9f0916714b68475e36fe6dc95c08ec118afe0eacf525870b5d5ec894acd21 2 +/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html a0088356fcc6d6c9c2f1fd0eac1a4c36a164dcafe5d4b97a309b339fb9fc4235 2 +/usr/share/doc/packages/erlang-doc/doc/system/readme.html 094f195e72d57149ddea736f31e95c896e70bb5bdb9fa03fb7d4dd8a49189889 2 +/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 39e3a2f9d46b4452ec27252dbab7241672bd6fac0bda0e719435cf8a6d06cc7b 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html e1094be9357dcf4ad1146d7d74d22bd78ac25138f904f870e643e7c2193e85d1 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html a5b5e39f0631545ed080973decb453b08deb48915e1c1fc816484525f6e008dd 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html f395d54da43e3ce24870464d3d3af81be31f9551ea176ba8e4cab7ebaa03acc9 2 +/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html 6c0dd4adc3b663a5268372e49966e0bed719272a87b36c6ffb366e1d414fe4bc 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 0f62bb21533eedbb501cc9729d63d9eff6e014a305fcfe6c4c4b602458966553 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html cc47a6e3224789390f17198fdb0fdb13837f330b51a111a02402269eb614e660 2 +/usr/share/doc/packages/erlang-doc/doc/system/robustness.html c5121496b7c2267b6aa80a0a25a550e6c3ee5fed268b271c954d781b67f1f7e0 2 +/usr/share/doc/packages/erlang-doc/doc/system/search.html ec6e18cf91b9d9cd341bea2d5004a7d8a3eee57f70ad8102b7c5c83cd8522c39 2 +/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 7b07e65ba6791af0608a58bd3b4b8e5b368a4481253a5e6f4f66c3c6e24b859c 2 +/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html e2b0ec2aa67ab3e9c4a263f4051e3ff29eb348f0f66dc4418740d54c24c13d59 2 +/usr/share/doc/packages/erlang-doc/doc/system/statem.html f1b2c809f812182a18d36369222d53b446f299792761c7c7672cbb43e27d7aee 2 +/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 50c081cc4c792217d2a336bb65919b080a21f62b907fd24ef2b262411004ced0 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 6c7fc9a117985b700d271577fe9b386d201bee1301e8f12b375e18b332a8c7b9 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html 50e41d78c4fe3b64fa78143568a0c58d8f5d43f454a21a253df0fbc3fc753ef2 2 +/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html 40582537b8caca68f811ba5b3cf6278284cd2012c06a1664a04dc689eca79b24 2 +/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html 7a5d8005e274ffaf86db962f331637e134fa6a8c94e60cb0f4c622fb8259c686 2 +/usr/share/doc/packages/erlang-doc/doc/system/typespec.html eca3b4f336d4e8a7d752fcdba0970a6e39ce200eacaf293f2b3880f84a828f1e 2 +/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html ec33837e18cca12fbc802627e9f00831a42dfeb8f559e1e71b18b4bde5df2585 2 +/usr/share/doc/packages/erlang-doc/doc/system/versions.html c9fc55d29afdb1ad6da32cb1ba222ea3458e1a3ded0a711dac6cd484f3588a6f 2 @@ -2165 +2165 @@ -/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html 334ce0bffaa14cec0d84a5f412d7f1c62e900c9ef7b776b647ebb3391d46992d 2 +/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html 770c22d8a3c654de730cf0b10ad9640780e09884913541c25553db417b3d7272 2 @@ -2171,5 +2171,5 @@ -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/404.html f814eb591ab0ee67c3d395ab909a149bb285223e4eb42e7055ffb1aea8c0bf9e 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/absform.html 43b77847de1aca3b766f5611d644f732c2f770baf2d786dda9ed3eb6bca19731 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/alt_disco.html 57d737cb0df048905772ef83184e648290c558882188e27a68b1a1a5b97070b7 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/alt_dist.html 63cac0ade95ca6b6324a41d5febc4b700c98d397b95f5b495615b0d6929514a5 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/api-reference.html 72a760962417d5e94fb84c84bbca0918031f1f83b176db151d81534459b276d3 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/404.html 065adbf51da586f4ef17b6c7bc78500e0e97d8296c45400afacc3b2e13e70022 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/absform.html 2663a16b5fe980984a28f97f54c345a4224691d93fbe3f8af34508bc8b0a58ab 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/alt_disco.html feb3d329c26814fb38772513affc1f974651c32aa0bcea08ae76d981f30a347d 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/alt_dist.html 93d0edd88757df9abe1bb741cc77e7603a142963a44f31d8233b7c5f82a30360 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/api-reference.html f1a3c5578d9bf162a6040053f6fdcb35144e6f38829288712f02ba639a41541e 2 @@ -2191,12 +2191,12 @@ -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/atomics.html da068af4d524774fca3c9468ffdc1852b1341dbd8250cc44c0728e6dc9197cfc 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/automaticyieldingofccode.html aacff314a87606b92651ec8fdc4f4aec0f89bb3fffbbf4da5a78248ee1aecbde 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/beam_makeops.html 60db88237f72cf457660eaf5d6362a2c5bf024648ffc8719f4c15d7f26e6e57d 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/beamasm.html dee86387493049a738f88e232b5d81502488c49e80db59b96e106571edffcc1f 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/carriermigration.html 597f9bde32dfc9d01bf2bbf7abf8152b5e178d0d5e6620436c780f739d371778 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/checkio.html ff87db2bacbe3fc6c15483b19518428257645610f99f2f4bdd7fc9cd31d3de23 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/codeloading.html b7876a49175bafaf0560961e4cd33b81afc0642320961ec67fb011a0307e9fd3 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/communication.html c1f31a51a4945c3d48c957cf6cf19a408ba52096c6393ade53f9746350a3464d 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/counters.html faf82e063f2c8bd4d1e335cf4819e7d47c9a97f225735ef3af8ac1870ffe30f7 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/countinginstructions.html 4194f850d8c58a85109bf7ef2eeef27f928890366ba65105dadb845049af688e 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/crash_dump.html 76d2444d14a57cd545083b221eddc6494edfaee731a3117c6f0169bf49f74185 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/delayeddealloc.html 60d4dab3df252a6764a5960b2affae934a9a6e0050d35b8a1a5455358952c92f 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/atomics.html 4a31852e40e510452440b0f3109a5c727d8fd3a82423ee6faacac2bc96a93310 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/automaticyieldingofccode.html 371ff8dbd1569eb338331fba11a640c3e3be9c33e818becc5c320d0d6a25ca69 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/beam_makeops.html dc83c9b7d01b9bc090db5758dad4a05adbf06ee5ef0394fb0a76a4bbc2b62206 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/beamasm.html 4bca247ca2791494fa0d3a69d24d7be96715c960fd3da00bc3103293c1ccfc4a 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/carriermigration.html b5fc015bd3ee69a4c27bf4e2a0c30080f12bf8e2dabd203dbb126148d6193331 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/checkio.html b88e4eba11cf93258b8e845e4e6fd69f5a2dc55504e775ebdbccb2ca952751d8 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/codeloading.html 6e5554c9de08d8a6a402828cb169d28dafd5ab70ab694b9edbb8a15e6b2a3747 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/communication.html 36eb38d3aef5f1cc7c2c89f62c8f36b2185b42cbbda2ea367848171b9e8bf573 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/counters.html 7557ed7cb34c337a571082d94d05362e87e262c44c8e0508b0945576ec8a0065 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/countinginstructions.html 158a92e5fd4524cd6ece71796792f4d764cfcd64ee8e4473823ef0aba0a3e74e 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/crash_dump.html d32e0e8c15688e10a7317c107bc051c0fe958e082e3c10f0d0a6a5d62184792c 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/delayeddealloc.html be2d2f9e7cc0f36dacfcbed5bb4d054d047ae04d040f3413193c91f87f5e5aaf 2 @@ -2213,16 +2213,16 @@ -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/driver.html 369ca737f3ff86d66dcd33b2396e0331f222cff3ac6590e7836ddce7d7cedfc1 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/driver_entry.html 5229a32b75a38e39fbfa8b0a2c4d64772a1ccad84d5664e17afb8f3e92084a6c 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/epmd_cmd.html 08eacb972fc668ec2df5cf0d56e11bac280b635b0b8dac185d1880efdf22a505 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_cmd.html 24a8d427032a6b00de597c2c25ae446a3439370beb94d52187dc3ce18ba8c579 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_dist_protocol.html 83f0c554a8dd1b5c838f79c9688a489d811311788e6ce1dee5b3b30e32432967 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_driver.html 82bee1cee1785590f89e533d48a7d178ee7a2e9e59e4d2b0b63c248a5913930f 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_ext_dist.html 5ed7c12bc96fa210b400fa589c78dc9181711b7dc9b87b94e49522680ba8a30a 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_nif.html dc5cddb31d6ca2803b1d72233323d842d209e0324631c77dc3013bdb4f8f00ea 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_prim_loader.html 28f4b697857a5fd2d855320b28391961a97a3aecfc0ee785a2ffb61d323e84d1 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_tracer.html d7556422eea8ac9c3efa5f40d42399b1dfc1756a584243efd9764a091174b335 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlang.html b1c3d820257521a3a301260b1d5597040b372928238e5b17188587e9ae166cb4 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlc_cmd.html 42ee8ece9db6fbf7afaac9fd87841383a7b602cdc4330696f3f1caa3739cea24 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlsrv_cmd.html e87417d0840fc98e30da198a7919db86ba24d8ad38033c72759985149f5e6c0f 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erts_alloc.html 3f819aa0c42732b845db5a1e6afb27777c9ff6de8374d8f026fb79e01d2ea187 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/escript_cmd.html ebb0ee330d78d84879eb81c9651eb43daa74fec60290ad3e1fe6c32f3434b322 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/garbagecollection.html b3964f2503015185a0456a5daabf3a0b7c0e25085e510516af6c4872bd27a5a9 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/driver.html 1ae72dac5f6dc5747a5a561147c8852e57212c0f2ac41a5d495c4eef17831551 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/driver_entry.html db30b6ba972f373a27792e7051b43ac2e3b6ba8b142d1bd4dbb8f29b4883d4f9 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/epmd_cmd.html e5e75caa8b429a5e5d1165df236d2f1eb13886d0f8168610df9c661736d8fe4d 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_cmd.html aace4966d52121c17e6baa7f42d347a792a26483bbee0b0fd9d537ac7ed06b50 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_dist_protocol.html d36bd8865e9c66f5b6bc851f1ab59c4ece3dc3b14f67bbec4184370fb96a0112 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_driver.html 1df44c757171296b32ca91ca9b7a259997bd286ff5c5ef9314364443637ae6a4 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_ext_dist.html e8593780acb7b1c5674ea63dda861d438c5a15651720544b6d72648696063cae 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_nif.html 23707f67f0832af8503a0d633e9d06e0199e730fa248fcaf6c338ce32cfdee72 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_prim_loader.html cecc95787ae8bd35b96f9d9bb389b0c90b3ef529693c82346aeac9d8ad3b6c5f 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_tracer.html 8050bd05ebd90454079213c172bcb4a8dff31190afd7b26026e6d7f72175751e 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlang.html 5712df342ad73d5d1f7361a789832207f45500fa6c40b63a4cc2abf845777e86 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlc_cmd.html 85f907daca0c600cc1b48f4e987bb13a6895f89401823b3d8e7b494de3672be6 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlsrv_cmd.html 9b48d5f2e7c7a9a993696f64ec7e29cb7925d91ce95afc9e343b87e291585f17 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erts_alloc.html c8c8b3b7b7eaec203b4bc55611a309c4e8cbec95e1aad4643b8749e42a845c4c 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/escript_cmd.html df45d386a031ca01ff949bbedab16d17794f203907cce14be77fffa92f570670 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/garbagecollection.html fcb286d248503e0b542afb9b71b027777f69fdbed37ed8bd4e8e8c881d5df7d8 2 @@ -2230,20 +2230,20 @@ -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/inet_cfg.html 42e2c9a7b96fd6e334f13838060bcb116889dfde92a3bd58302d1a5221f44309 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/init.html 2a48b89b344052752d64b4c432389e71c28abce12f16b71e11b8c2f8ee8d1351 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/introduction.html 43d442d86328551eb501d018eda426da724ad9d0e8bdcfc113600b3a2cba732d 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/match_spec.html 2e8eca4765b01ca833193d0bac8cb1cb27ba54e02455f1f24d4975d403ebf883 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/notes.html 0c9624b23eaad2e759314a8330c4bc467d3008bd4c19700f1793ab98a859f26c 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/persistent_term.html 9b2acc4b6b277a625f6461494be3edc1fa8f1a53aa98f824f2c0e56d6fa59b86 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/portsignals.html 084f1db5c3b8a5ffe0dd380d5371750e7d69a2260f8e9ecd68398009ac9b7e4b 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/processmanagementoptimizations.html f5f56dc07531e2d191581fb29e2568c7bd7dbe6c4c66985c9d56d8c18c557175 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/ptables.html d33cad8322dd104ce605e9db01dd0583ebed262571ca2a0ea42f8f59a56444a8 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/run_erl_cmd.html 515cb0a799bebdfeff6ff747dda3ea075117d4278aa43504f4743e2d68e6ace8 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/search.html 4e31e10d0062a6e62aadb1d35a28c082829e9e8c7799e8650d14f3109142fe8f 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_cmd.html 9fde683b0faf9843acfa125af9b65da21ba5e25012da2759f05215b85d82a449 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_erl_cmd.html 5dc8b571e1ab11f877428a910ea8aa70f8d31fb19154621d23b9f8422d352d04 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/supercarrier.html f335f6cf3136e8c2451757fbc70966b3bd01e4dae375764f8c86c05656bf6370 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/threadprogress.html 92601f2e443d5ab873fa2153aea4aa28be6ed3d9a71c60516deac26f8a98ad19 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/time_correction.html 0965f9aa7acca3f14f3849bede3997bd5fc1868560c8fba13fdc5f8506ed6ea0 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tracing.html 9db12e3c1431177409e2e8a4d0fe653921b17791c4c7442d7d6c93ac20dcb1c6 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tty.html 9a2c04da1d1033d60ae0df4493566702dca2a72203796adba12e31fcd17d8523 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/werl_cmd.html 9b4aee5384e4875b5e13c1ac03023422872614bcc95f819b05812bebd4d563d4 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/zlib.html 4b9ce0136a916e97b7241671996eab833e547d5f6c24b1a99d86e310339556a1 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/inet_cfg.html 5668c78eb4450e55b704a17d4f68a32f8ba4f120efb431aaaad7dffcebe794dd 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/init.html dad93a8052e24506fbedc8735fee730f8aa42f38c9acbee6a11673e33d213bc9 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/introduction.html af91343d9c86cfa5efdddafafb778dab25926630c6f2c06598aee8c4aea3a814 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/match_spec.html b46db34f0b9552fede6d6f4644343cab4eb11d5f979a10969daeaad7a2b984d2 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/notes.html e53e85735ec4ee0b2c063708dfb6d459852afe50c2bd1b0f9fb45da89325141a 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/persistent_term.html 287db9a667e200a22f0a5facc133a029e5e7f94825d0aed18da56052b0164d6b 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/portsignals.html c8d093dd299643cb815c2d7f066343cbd91a5917b15da3f40975b25b9fbb4f2b 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/processmanagementoptimizations.html 2166a88a0d93326b89868734d63c386ff719f9cef5d8803183770c923753d148 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/ptables.html 817926ae1f23d603f2c4f3f67ff10a4d709bbb6bae827cf51a02d9bf36c8e1ba 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/run_erl_cmd.html f213bb4f9ac0741ec0be3e3c4a4dd7316acba1ba725a042913d3a236ff9ca497 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/search.html dac4028a7650a1041c8f0d3e418ab96c6d8aa04ac2599c8064d23b3765424c3d 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_cmd.html 63994275321d06a44112c00ead8fd1432d771a05b7dabad033827b98d27ab1a5 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_erl_cmd.html dc799b0a60654a19b5b3f57de7e7d8704934ee0c75052020e2d3ba7a7ae52794 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/supercarrier.html 2485a35d4f868095b0f95aaaa60e950a85f8254156c3488304864c6aa2e94284 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/threadprogress.html 2543374a12f5188003d2c9e72565fd61fde92f774a168dece22ffba7265b81d8 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/time_correction.html 2fc8a5469b21e89d637089fe5b89dc42038c254c2a1fdb38db7ce719c79a18a9 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tracing.html 88b4546539fa1e717e1f4ff2a94e310274ba2d8724de1dd84a5c94265b0acf79 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tty.html a1b3dade8dd804924e658373c9b9f772875845f2c966f2d9b5563976f163b85c 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/werl_cmd.html 18ed7389265196da2f56fe3b17462d2bcffcc5c2517312b7a776e253863fbc62 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/zlib.html 89628eda99c677a44d3ca56106288ebcfe5be1b41331f4986ab8077d8389d2ad 2 @@ -2254,8 +2254,8 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/404.html cd546988d7e8cdb6af2e4470ea96fd633171eced5792e25d59cef9ae11267a87 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/api-reference.html aa996176a4c5e90c2d7b0cece2a038e4518c54bd7cf10e1ceaf0373a5120e911 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub f2b65288a50a47352907428a16806b0253dabb911f14cedef3a1785fecd2affc 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_getting_started.html 8a192e4572c1154ec4f542a23688d8cc4d949dad983f2d7517f9d7e4986cbb2c 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_introduction.html 29e9271a3d82ce10eba25f8ce4ef1dae4cbfb9aaf1b965d51feb4ec504fb04e6 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_overview.html b4d4010b70555f66e2cc2371074303f697544fd27aa131299a8d456cf726f368 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_spec.html 3c2c2eb927a43978c8810f3815a5a53d48d181bff5fe0cacf23ff1b16df81df6 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1ct.html 54160cbc3e2e57b45190438faa903640b14ea9b6b2e596881b772c6cfb15d50b 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/404.html c6e4797d777eb1e1e54a56777021b6d7bfb976b57ff619615287c9782ffa7889 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/api-reference.html 2ba5d0eb42c8cf0d4c1de94f5402965645eaef99cf5240d1cf9da37e0f8ff9ec 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub cdae8a676e262ffbddba5c941b8c2847ce7fecab487cf0f136fd09391546aa8f 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_getting_started.html d6764c17f5c3c8c483aeb0a33555b34968d063da0907cf7246ef9bee346fa9bd 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_introduction.html 26a4e76d7c12a6a9715c92e241f8214264ed8667d5a02de1aea78e639ff53644 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_overview.html bc75fe651babcfe3a154aeb4d0737c4d8817990b2fde648ba8eab8ee576af164 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_spec.html abb21997c0ee3f8b905a336ea24a021a77bf26d7abeb32f1a1169c9bab8dfe3c 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1ct.html 31f3e40cb5c13625e6c7b455108cb7ee52581e8d506c0f3b4444c993f3eadfa3 2 @@ -2278,2 +2278,2 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/notes.html 7a0803bfdbdce6d4913eadd4fe8ccb10161e0216f0a10678cf224c707247fd37 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/search.html 58ff104f2d01498884ac7d61c5d34fde10c997fe5130b21bf9367fe8b804e48d 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/notes.html 16f98cb851b1e10ec7bf498173f7ad00b7b33229e816db39052101cdd4fd3169 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/search.html 9cd3ff33a564b3b62795bc82a0573fe481a451f3c25fae36c73eb7509b26dc5d 2 @@ -2283,2 +2283,2 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/404.html 17cd564d67decadf459af9094779c06c6469f0f06887a4576152cf66bc525427 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/api-reference.html e59e74c55198bd8fd5c379e84392173be80196317fd4977a5b2a23a86aee61ae 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/404.html 5f5e05f8acce48e8546e53263bfa1b41c7c5fcbbe65a7480bb2a7a05e8c6cc63 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/api-reference.html 63e7679ff126f40d1a22aeed7f2bcaaf82b704b61edbb05137176d134cc3c8f0 2 @@ -2290,24 +2290,24 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/basics_chapter.html 8a95508397490bf9dcb557e500732163ad1f4ec7aebbcd44b2429c273dc7df8a 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub 2f6204ab3a61dd782d90d3af947760963278ec0c6f55b81fe615dd5514c41555 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test_app.html c91a80b62d9a27161cc286e4f1cb53b1d4f6d25a4bb9833814b6254afaf45156 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/config_file_chapter.html e15111b0a5f9eaa53d5181e2f7d63ce2a7b3ef3cf90d000d57c4a3c52eae7a39 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/cover_chapter.html d6d861202c16f3f5c2fe46d49fb955c4b67e0d151301e816bfb120b477b1b907 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct.html cb3da6879497330e45b5e42f3cf53e5f446cc879da566ec2c2903aaf37d7033d 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_cover.html ba8f9aec3072a813895439408f8ae04eb44875244401be4bda6613edb2ee309e 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ftp.html 8ead24fdc009ec2729e5a51b1a8e9695791ae71c942390ef855eac1390f79659 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks.html 48e6057e53799929dc72f0bbd44d1caba702226100cc167cf44cbea299e52048 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks_chapter.html 1c3caeb9c625eb637560fa4958493dd9350efae383e396bd80fda359ae85c837 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master.html 762e67a763252c4884919d21a5fe962e2c48ee765f8bb192b2fc3acf480d4088 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master_chapter.html 167cf409412a8bd2eff245ebd30157d6cba8f2a62398c8f335e49fd760fa95a0 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_netconfc.html e95d35e34b8578d624620605dacf20c5e0cde8a54340c41e38f34264211e44ec 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test.html ccc05074e755bbeedf1421b3ee91655489fe3ffc90110f786f35a489eb52a2a9 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test_chapter.html f05df1a4e6c96b27e37aa9bddaf7ce2005e601f7aa150c340ce6e82323916aa1 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_rpc.html e225b44556dc60f48e11464987ae892d183a1a1a800509df57d255a2b37769b4 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_run_cmd.html 0e51dcb7d4ea4a24b5f6c10ab5dd4c9ced141fd2d48959a72eb3eaf5f44aacea 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_slave.html 37b55c5ddb4fc483e04e2527d6b9b8849059201f0c669e08953e372c1f428e73 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_snmp.html 1cb038fcd39614acf0a3df886b91dca904e2d3cbddc23c21d9d8c350205d9cd4 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ssh.html 87d6788010a1a24cd8256c0cf9bcf6df276c91485d3f219d3a4698bbf70adb48 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_suite.html e8a43910e646346df6a6e9ee16679442475755e8b82d1e9bba0a0a24a785e933 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_telnet.html ffc4800c3c7c9cf9eff31d13fce53eb467d7388c221bfbe915646e18765f5430 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_testspec.html 0524418d9a8e0f4246e676543e8a51ef55b54946a07231b47b62071d14ebbce1 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/dependencies_chapter.html 528b6c3266922a61a6be19b6bac584097e6fe7555d145da14c593849e767ad14 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/basics_chapter.html 92f422e66c99c2c000a4da1f5dcd57a738f0919110b6f17671ea03c6ea38d854 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub ad7a64ce362f892c3c785fc64a9ff0b2fb58da20d02c5fe1705f3add22085da3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test_app.html 601c7aada29ef39481fb04c21653d5d7e9142f687ec79307a65c438608a8d52c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/config_file_chapter.html 1f915a015b1c52bf3a024dc782bba352c6233e9976df6f023f339908f36f59aa 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/cover_chapter.html a08d26ad8a21474f3f8786c6107ba094c441cc2851de77f0322801b1c0df573c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct.html 00538c6f3a093a6ea789aa023118f8968e581b47b84391d17cad57dd1c4c313e 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_cover.html ebe5200deb0ead66586c8e4f888b8db1c9cc864a1c479b7cf3388d780d241dfe 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ftp.html a173c2cb9c2bd055c911e53b734763031853c99f9150ca8c23059af917ca4d18 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks.html 185fb1fb697348af572d5b645de0e3c3b0abec629908b760994c9e9a58131bb4 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks_chapter.html cb1771ccf4a993c68a6ebf8ba497320ce737234cf26230336cf40427d455c471 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master.html 57d7ddcca5932d5c85925adb7d9eaed264eb12e2dd3dfbb4e430ec805aa695ce 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master_chapter.html 63de11dedb251fc90a640d372d8093a3761baf7d410fa3b3a0b2997311a59973 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_netconfc.html 7042490714b674fbb5bba714e3d919757f1a8bf5f6d9fae6eda93d8bbd7133fd 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test.html afb37d3b8b2f2251b3b8e240646992a2210b3af2feec756b821d7734e2b9419a 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test_chapter.html 671be9b1063a15a3b1166437cca476b75b210c90d14530c933173ab1852339c8 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_rpc.html d0ad93f603399f803007b6edd597ac075a26de1418fbb0f730b7bfeb271439af 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_run_cmd.html a8559334dd7490f667cf4e1544de2180085e3d1145fb6cd599120c8af365c81e 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_slave.html 3992984597f0d32650b0749da7c08fda456b9698a3ef5fecb466d9b540820c66 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_snmp.html 3a360a1af7737351e5dbae7bac37ab8c25867a91cc26d55601a3eef0eed76092 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ssh.html 65995aea75bdb3486e5a45a042d138d52d5dabbbea83d9a73115fc864ccba566 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_suite.html 951882be3f334b38531ab10c486b9aa2ae7e534663e6413c7bff615881a52fae 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_telnet.html 220d349b4b2e131e27396788bbe920facf727c46317a5f38682bb1d685452362 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_testspec.html 04014d3c69c48139a1a3068e743bce6f99e331a11c8d7c64777432a447635ba7 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/dependencies_chapter.html 6612f16aff2aaba61c069f3f4d0025dd187464ebbb01d3ae806883f1c415d9da 2 @@ -2324,3 +2324,3 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/event_handler_chapter.html b2c77ca892cfefd3b557277bbb9fde7aa00d5a2b64c3543613d74e2672799448 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/example_chapter.html b68e21ac533f66b1773c5f4b0bf10e1b890450348e27ca7ba32c75a98c1bebc7 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/getting_started_chapter.html f2c1454a1c877aeacacd12ebb137bf4d8bf30bb51219cebafd006260c1f737b7 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/event_handler_chapter.html 411458bf8a26224eba44b6b672f8ce1571fd7c3886ba8585e3fc9e6557859f33 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/example_chapter.html 797980ea75efccc3573848f250fa7823e616164caa7070015f8579ca9af64d3c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/getting_started_chapter.html 56e3dba074badda42c04da865f2196036b36cf159f1d2a3ace1e5052b68d26bd 2 @@ -2328,9 +2328,9 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/install_chapter.html d5d7648a17d041f5c773a5863f1be63ba9ebb1bb502c1aea63b908a95f8eff58 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/introduction.html 8d6d167a9fa9bd9bb5e479f773d889ac30318d15164b423862bc74506bbe9c7d 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/notes.html 3a90b7eea262e4e38f00abacfc53f2a4bab462034b2316e6f9aa64d3f51be547 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/run_test_chapter.html 99fa0fccb8110e3a1a7b8d7b2f937b090d3fb023635b351b1132e15d0037c18e 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/search.html f9931b868aefe720470211deca4306222eaa7e264a92680e0ce801f17abc97a6 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/test_structure_chapter.html a64d0a4b051f7ec8cdcc6738205069ae8e2064837414960a480c0faa4f937f72 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/unix_telnet.html f1a6994195ee01d4c9ba9207fbf6673d0391b1113eba256740ed5cc0ee340660 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/why_test_chapter.html 92b89a4ad87f1ec44f8ca622d2a94af8f7fc0e0cab13cfe8ed6796473c29ffa1 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/write_test_chapter.html 8b8b43fa4c0b0338f17bfc4d43201dc97d43fce76eab1f36b50de55fd8470ea6 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/install_chapter.html 4a48fd255cf2c9a6bef66c390224d4721bd2c5ec12f80594a46895927d386e3b 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/introduction.html 195644cc13492c0f26d54f3875a4cc8a60a31ca0b909989606a8e5073e5575ed 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/notes.html 5a3035a6c528bd179eec0e473698d3534166478ca0e1301ffb4857c94a7b27ff 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/run_test_chapter.html 9ff5a4d12b7a3f6533c5fadb5c1cc650785ec3c5657783e5257800adf7fc8f36 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/search.html db94189ce29b3b88f3dae0a0a7c21abb8512903db3af3f8994b9fd19e6476277 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/test_structure_chapter.html aec8d64bf5c49b164f6a38cf389492f55d20031f1cf1023c61cb09bc2e3d5cd3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/unix_telnet.html d5ceb619a08effd3c742423fd71a14376b3908a659c6608285ba9ea532c96fd8 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/why_test_chapter.html d1321f451c20cd73bad34e91ea73d5158be2fb8313ea37ef8943d4e69396a925 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/write_test_chapter.html 9accfb834f80e9321e04245ec733f5d8474ae09055f028a43f6e37eb9a80ba89 2 @@ -2340,2 +2340,2 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/404.html 1fa7f1516fa7ea35cdbbb0669bd4a677411edc0c050440ee6e93145929308b09 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/api-reference.html e220d0eaf3684a6603ba946a79b9bd0315aa4540fa213350e66dbf93982d3b27 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/404.html cdc287ff077758120676e122fda56c61b828ad0274c9bf4defc15659237393f3 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/api-reference.html a03738ed91ffd993095be3baeda9d0e188a299246abc603b20dbdf854ee5004f 2 @@ -2344,6 +2344,6 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/beam_ssa.html 1bcbfe9ee68d60f0d181d05659226e955c0dd3dd6db89ddaa4b8d4354a348e13 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl.html e9382cdb046d6cf221fe81fc9fcd910494062456b54cadf35c5c0753d4dee76e 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_clauses.html 0bfef897df8c9b9f06e547424912208f90c61bde58e8a06f69bf279837ad0692 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_trees.html f647d1fc013bc9aa267026037f50d850c72c10e7247dca05f97ec5e241e94fab 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compile.html ef395b1ec548806a5b646217b164379d744c54373daadc0324558c18ce9514ae 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub 76f37623d92d2938fe0718c384b122a42b600e1197f66cd04082dd8da6cf11eb 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/beam_ssa.html 71a80f325cde219219f35e1abccac4d07a37b47109b0d33935d1452eee1d007d 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl.html 583a039251e920b5e50ebc7a1ce5306d847d47269487b891145736a7ce0ad2ae 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_clauses.html a91308c01f3a0af781e5de4518c9cbca385872e036d9cc8641f8fa6a4b451300 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_trees.html 4f8949a69affc89be679c12671102bcc7e1c6a2ace8fcfcbe509cfe1326320f9 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compile.html a12a6ce45cd7825121ba51ac1445af90e329286e1817697a86d23df26697d16c 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub 3328e06eef8edca545a5a9149f6545e0d3f25971b33ab70fbe6f42a054bedf98 2 @@ -2361,3 +2361,3 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/notes.html 4d11062bc8185001dc9224594470394ee8694772e4bad176eabdc19ac0bb4678 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/search.html 780a6b24b923724302559246a73390308e994da687414efe31e8a95494a3d874 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/ssa_checks.html 33c5042c47494683354e1caedd485cf845a5b9a5c4fa2c9b2e92a3d00e1f3596 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/notes.html 90c7e835a74eee4249ec492f4cf7eb0a202ea196f2f83bc1bef159db924a527e 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/search.html 363569d82245f312ab1334938636df7cdbd374782fe94d99a99074dd94b9210a 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/ssa_checks.html 87dc1d98f7855a1c7c1dcfe3844e69b1116f837d96e9f801046c0ea0c51a057b 2 @@ -2367,3 +2367,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/404.html c988125e4b171851fa4c05ba07cc9d2c793792576bafe242507445adb668ceac 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/algorithm_details.html 09a15622da1de02ba32c3d1d66b92c416eab8d0a100c2b91032e922004ca344d 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/api-reference.html 92e30960912b26dd8abd1337860caf05b46c43e06bf13d190e3a6b623f31ded5 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/404.html 34f72c2e8ca2596c1961766864f48107793a5dff159777f11d2eb2b33728eeba 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/algorithm_details.html fed668c76213867ad8451c3d3937bfb08c28d64fce2648e73636f98283102588 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/api-reference.html 3f76c4ac89413037b80dc9366a57f188870700bf68a4fdd17e741b0fd3eaf406 2 @@ -2372,3 +2372,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub 90c0cd871808b464b6ce1a1a2d23082f154a79d0b10ed076b7d540bb52276000 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.html ecf4d7c4342379f91f9b93086ef21fb56bae293e3f5ceed8bdb64b98d205f53f 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto_app.html 0fddab8a71d8af420c5cfcd937f326a792c43d2560e4aa73a8272042b21c266f 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub e6ef026f1b5f5780b515155466f9e70485525e81127ab585dfa6ed86a7e75c68 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.html 5b5866102f0bc914904438ae7e34b9da6fbbb4704bc67c6ef8513c1924c51d73 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto_app.html 9afc3bfadf161e6180c1d69ebd5b7d326613f3a130a88faf4f26401c0526365a 2 @@ -2385,3 +2385,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_keys.html 8ad27c49321ef52dfb7b66b17454f8f4e3b126a7a3736954544d3b4dd29dbba4 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_load.html 55ba665ef34695c056a3eb7680b8b626a5e1f8cf973623491ef4342e321ad1e4 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/fips.html a9498b294d5a304733dd1cb315d8c99e369219c26d3cca22c8c49fb95c0b5dca 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_keys.html 09eb2244f7cad9c2e97b9e7e9589881e792457ff19b2edeea499d062773e0208 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_load.html 024859bfe3dc5b0d7c6fe056a09ca70211216508c388ed9df8776d36f491a97e 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/fips.html b25d5d4493da92e2523ff9890fb8d5034c47fb76533a612e38b5796d9214a332 2 @@ -2389,3 +2389,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/new_api.html a2a47d90aa0a4f102c808ca02ebe760519cfa0acd818fef4b3b02210c3626593 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/notes.html 97b06d4160f4bd02b7cd1607a0dcab755f75d8924f4c1bff0ec660ce505900f6 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/search.html fb9a83cc709e6271f75db5241c858498691596174d14e66d1fa3c0edaa1732d9 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/new_api.html a8b959c81a1f9c568abdf97e89baf078561d5a77a82f71d903c44525c54c944d 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/notes.html 48f70ff130244696ed7bf9d6e7c01a468a4021167c8c46523b09a4565cb55ba3 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/search.html 04c653266081c36aa491a7ca560d94b407d7b910f525e049f40dd65160046442 2 @@ -2395,2 +2395,2 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html febbe734479273fdcf8d02dd8a284965c5dfc3fd13277971b6cb8417990b7128 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 71e3aa1e5f8cacb8333d11533e8e09eec37709366fffd2fc4dd311f46076652a 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 57d4694811218281c260691a6419101af3e6e5655df8fa87a2a83cb53f43a606 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 9f8af4405a8443d7dde16eed09d323dc0277122650986b00b66caf09377fca25 2 @@ -2406,3 +2406,3 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub c195df65e05a553c0c5b6b7677a463f093651cc337e583698f2e760d51636184 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html 5394b45df530ac6fac1e9ff6cedfdd160a96a36579dcbaaa959eaf59403e8f89 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 748da4f92bde3f55be776930e440fd716f48649d5d2ad849a9823b62e468515e 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub 3cec72344696102382e59cc3bfc576bbcb360b8813d145d15ea108ac2d625e97 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html f0b16fd9b2b0bb7799f15abbb6b94cd656f01d1997d2bc27ccfe209ac4962f21 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html cc70d59a96fec02d9fed9e81adb6a6da7ff4c86b676b10f6bfdef39a266cf572 2 @@ -2419 +2419 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html f4af590592942f844fb851dd3a050d151a3eb7004438dda94f34c318a72bc738 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html efe7487fd91b0f223c5c78d974677e92d9a8f188f4496a6694df191ef1a7084a 2 @@ -2421,4 +2421,4 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 19cd311696e031dcfde7a8e490e7034a8a4af300980ebc61587a7ae5a5da9f8e 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html 859e88e0100b9c98491a7b1835c5f316f2cc98da51a70766eabd9de1fcad042a 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html 635bb0db9481c8332fe54c9ddf5c333d989870b3972f27bada6c7510ffa53297 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html 1e6c94de3288d9e1a53af0ce9f1e148d47c8f9f0d9b7b06c789204f3994c0ead 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 35a7a15b103cc34bb813eecf3705218301d1df3829955058948ca7fa75ef33e2 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html a5abe894d023514919dda561782e94e9bf2ad39e03258b590e7fc791693452cb 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html cb481f933103708fce29af8b8fe94f2fd843b956c20dd3168a6c169062392202 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html b91ff57cf86d7bb80be9f93e52f889969edb2fed69c4f26cd5659075a1805059 2 @@ -2428,2 +2428,2 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html 45546644f6101d2a3f4d35686d3ef8c2130360df692583ceecb0bda5ed435e95 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 1faa8adf9b5d7417fa83eebd1d575674db8c39a8c733a5ae869b0c1d17724c12 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html f47d14551afea20be3eb03ea3f9b1218c7fa17304f6533dd1b4e1486d154ef44 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 8e846ac48e5341998e0bf7583c8b542ed12736b616b5e1f1ce61362880649c24 2 @@ -2432,3 +2432,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub 74a2b6e12e8da46cf2853d93103c0198446a82a7ba7ba8ac98963b47221d55bd 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 227e699d9efaf30ede09cc557ca7bc2741151d55c63414ddf8fc7d3f38ea28a0 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 3672529d4152eb7f5a0eb4dc5f4cd7b394b7d91117a3762abf0a7b38e79a3957 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub 1dbc4bc853c397e01991fb6e9890edeeba30ecb56420b6cf9da95d4401d97933 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 2ce62905312f0c64b5f2b916a779543e3917faf2427064aed88271eae7b74ec4 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html a637734cb167b13f28e1227be0be31ce03f0d85963a4e9b9d7ee03beb61bf3c0 2 @@ -2446,3 +2446,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 1c40c8b3741888e73b62a38c75749d1d75dc357aba59a9e2b2631f9608719d3e 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html d14bc1655f9ec79a7e2b14bc07778e893a75df88ffa38e3080223e0fe5c2cb83 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html b830dcb00a7695f18a5cb6ae86f87e52fa495cae02f80d31193a54006809c5e5 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 616c82580725f7a43e0aa819eaf44d32039123de57c499f4d74578f6117c8f76 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html 02468bd4ad4a31ae3b829cf024cc32cd9c73e37a7e120b0e8d75dd163d758eb2 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html ee7e79c366cf2e2aea47ac406b300dbc2a2cf363f34985071627f3c8e5e28797 2 @@ -2452,2 +2452,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/404.html 82e0eb6f0464070e1bc25f2aacb24e3f2168c75fa8742854c2565ac1e583c16c 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/api-reference.html a62dbe5ba45247526079faf02dba5c5af8ed51fd5c57d81726666e576589ebf6 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/404.html a15fcd4ed55b968002a1b92ffde19072188b88286ad09f77d94acc11d12644be 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/api-reference.html 90265fb4b772d9ad905ac3f57001bcefc17c5588125c6af665e1706a93a589bf 2 @@ -2456,15 +2456,15 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub a8a93fd01595a9763ff5f1d002ddcd1492ebb138083f48e6ca1d7bb37bb11b82 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.html e535af7dc995a3adb70a198171463c9ab8b935d0737665f67a0a7193d9b8f588 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_app.html af0b1ae379b66480c9937131a5d6da07fd8f1b0b358517343e57b59929a2894f 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_codec.html 9db7a24634e13fabc58beffd679a1466da4534353ad38ec6e81fd1cacb3aa452 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_dict.html 9feb3379e3b476260bc485b46ae28812c514755675a9d6f93878217bbf83aa41 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_examples.html b8a5ca6a7971085e1239ce7119c8a08650fa3a8332a3392c22d89f752b970190 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_intro.html 90545d96bf727ff9315230ea8b7ef5f2a5c2156b877b77d16c31ac200834a2c8 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_make.html 780f02a7bbb7d0d4edd02c900486fae13e42aa29ca52a2e2375fecd28dacb1a2 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_sctp.html 7f9be62b07bc216508d907a8c35ee6f308e6e5fea63c28c3bd10dac88a715724 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_service.html a7e7a61dd098be08cbc049e12c431b01f159502b773b95badab0e500271b552b 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_soc.html 15320a3091b6f2fa1d2fa5eeea57df5715f110f0623e5406f398a8ca46c59b3f 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_tcp.html aed3b8682656c8c84991bd50bf11198f5770aaf0483691f167e21bf47cf9d78f 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_transport.html 578e64a5f2f5344704448cd726a00d7e930ae1422b11d1ff577029590dbdc72d 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_using.html 16326ea3a61bcd220e491af39c830e648db402cff156f6c78d37984d8ebb90a5 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameterc_cmd.html e0920162db20c1ecf293ca09eeb1f4b4366f91a7c1d346e6ff179d7f29cc9505 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub c2708973f3834796f114867314e7a2eb7af996a77cfe71ad9e7536385eb3d931 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.html 1873733e90340dcb809e789d13d3b4a805a4816f630b66e3c43999092368ee84 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_app.html 1c3620b9b6160b7bc1d78882987df32e8f6b418823703808ff03a2d5c94388b3 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_codec.html 281096224a449d2dbebbb29d0222454089c3441aa0ee9731c49dc0d877b0bfb3 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_dict.html 401d915483684a565f9ba2ae8895b1409ac20db69bfec98c161bc82f1a59b978 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_examples.html bea51f92c25fd397594d6f3e76409fe4296e9e560201d061181bdfeb7ef9737d 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_intro.html f46a4f7000572f6faf3d521afdd9288041b57912ddb3548e7f9f63f768564376 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_make.html 8a5128fbb282473f3c3ddc99219ba23f13cb8bd38324ffe15a6777bd233f0a5b 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_sctp.html 7c2793f333d58d817d5efd947372f5d0be8652d78562b6a851338bb071ac9564 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_service.html a21d861ec9196dfa90493d43f511b9ae3edc2b862b3276d4adb27ab7102979c4 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_soc.html 3aec07020b3332ed44e453cd3138787c184daa6168ad54876f49aba3eac89855 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_tcp.html cdcaf241770310c987838cd64b802e11c3114ceb26bdd34089923728cb0d6b88 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_transport.html 7cb68a02bcdd1d6781280bef28273f3f3483ff9d88facddbd7967514b8ece209 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_using.html 988f7453d8a36a201119a296f3ea9f9ec40bcddfacbbd8e8f773f154f699de5a 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameterc_cmd.html 961656c9b43fe2e45672a50bc0f1c79723030e6f27bd3706dd3b51964aefb714 2 @@ -2482,2 +2482,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/notes.html d6aa72608ae32f0e527c7f0e63cc87bfb43a89b3c62557a6118be6cc4e81d4b1 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/search.html faf7d0461c214041ae327a682e920c3fe7dae3f880581ec8174a45b969df9a17 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/notes.html 6e0df07a614e8ddc601f30c5c35f1efa85787f8fab5f07f3e2c7c54c7ef91942 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/search.html 23a80b0fda156d54715b98e3604a12131a72d3229d9b27e27c30f746748d3deb 2 @@ -2491,2 +2491,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html 6f8250ed428446dbc7eb2c96729237973c40cc1748781300d383c66be0502776 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html 96460466e8c2a5bbb03930c91246283fdbab077faf44bc0e35d19831eb28aded 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html da93f72aa863e6404d92bb4dd38b45b32348cd03c7d119f29dd03c897b5041ac 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html dc7a41acf94c1f42c8b5a26a06490d80fc471b391ea3e57ce485d227165013fb 2 @@ -2497 +2497 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 4ec201f5ea1370b8b60c7fe533e816bd7c65040cb607cdd2eaf53714616f014b 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 51b331f2488e130c1d59b06a20e75bfe57379468e2d34c4775c6162e03a03f0d 2 @@ -2506 +2506 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-B93E08B9.js 65cb4d0c5bf42dcf8e9465bb7d74752e8a6b4b948ef9d738316e817bc800a8c8 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-701DC811.js e369c2608006d5862174c5b31541a5c9d8f23410909c38ee1a36a6455fcceddf 2 @@ -2508,12 +2508,12 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 7c9ba369218b024ebd2f6aee051d152c70d64a2165c62087ede127d6b8845cf2 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html f65500773e0390c54e5f1c87b1eacc8725bec62947637f0bb7cee8d18bf9015c 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 5c85059c66f52e3aee05fa2b0ebf89cf1eb603458cfc46b7544c6b4a809535e6 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html a2b5f2c765246aada1254e4f920fc37cd90e398e122c7fa2d5be094e150f8213 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html 08433b66e8253d1f804012bd7ab82186c92ce47b5b3745c2d8f20f7167bb894a 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 6f22a43a3c074ed13f77734b4325e3be812b323bccd327df7256382c06e97aaf 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html e795785bf78bfd38736ce997ba05feee9b4744a74fc23bcb2307765e5d0b00e2 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html c8962e5ad71542d274137e190edb36ea6ca4b3ad95339e21d987461752139149 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html d6c68fa5a4614081177371096c7e5d90caa9b1a4dc7906909b78479d0ab644ee 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html ec771d398b9a811096584445b7ddacaa177c46d254ea7bdeb7e3a7e928ee592b 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 8b9847742b33c00db5e4c69c1328ac323dccb74a5ae25202e99b5bf992d728d7 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 80c0879ea312773fd9a567f0e909ef9ecc80d8a8c363452736ef381b623e1c08 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 0e4b37a26459c07f652ab9a7c912c2608aaf085dad60e7d4416e324afc8bb700 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 6ba56bda51762f83db4d008b28ce1630b1eb3dcc2e2b277facf0b779bc57b7bd 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 1c954b08be3ce8441a9fa87b2de433fedce59abc609528c5bdb33fff4cdc42db 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html 987b2a3a46e097cda0b40b636f5c8a07f70f9030543a070317a2cb2f810d2159 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html 5e76610d5eeaa9a47928800db2f9393d5cdf72ad0a4a00b5dd6091290709912a 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 33cc51928d2f6f1d5a41e4f912e9c3e830942910b76a16a934602045d9a78fca 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 027c6d229fb927440c2b6e903a4f99329e168f6902f8eba76b039bc7a31f824f 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html f14656773d2eb2bbc823ff83df711f7b321738df00c95feb539e9798f7c88bd4 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 0a404cd47b0d2c74ac79ef83ba0c597567ba40036573a5df9114e28e991ae7ec 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html c9f0c072ff132a9fcc403ea354cbfd9015e413b130fccaebd2dccedc7817fa52 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 52faf1e23901c86ee0792a5b8e5d4bc59e80907e8fb1f586ae87c218767df149 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 59a15094a4d824a8615dc3d79efaf3898a00f83242806329ce0ef46cf9da9442 2 @@ -2521,2 +2521,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 00ea0be5c0f11229c5af6db636d01a4d92d95e251fb191eb1d4893bbf5a94017 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 7a9204e85502fd7693555836ca6691681ce74cec63875682cc24f90b560242e2 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 0d677f1f31f8009b5224178598f5a8cd244e8593c6f8afa7cf0fb75396a625de 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 525f4b353a50b3131a444ec298b17fb63f666b49199220cac20aa236e6fa1d49 2 @@ -2526,2 +2526,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 60baee8df33d1dcde2ddc5e2485505ed0bb761bf115929e94ec5ee45e3cc7d50 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 343955980350c2ca3992aea65e65bc9e658a25b1dafb2c4ad7ba4c6812a46087 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 24cb5533a2e244ebf2efca34de41a10461869e5f37189ae511f8c851c87b7168 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 2d82a22149b89a046c73b2fb35f6e89ed387cd98e08e6b305014d67755be704f 2 @@ -2540,2 +2540,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub 259a88b5c6cbba7151edff03b33cfae892a2c13c39c862b5541e98d060018364 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html d9152f486bbc602347a12470b3bfd9370a4a08343ee2f9a6b8844a3198ad2e0c 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub 9c111ed7b5b7aec19a15a6b24543cdefee254ce6d7c7a3cabfa00643ddfd3407 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html f312b644e23a083c0407db5d8caa421352bc74ecb05ca142601dd95887b02e66 2 @@ -2543,2 +2543,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html eff0090a41afe6a346818687fced7f08d511429f019568c7e91cd34ed8412d7c 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 719c314d6a17d9bf089389cb57023c087de5004533a3988aa9cab8546ed96fa3 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html e407bde5cc0bc2855a76630e5f7b10477fea51adb6ba0825ff8943f9f038d9d1 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 60314a7d8650b050a8f4d78a15dfd2dac8158c6750d2c860d734e3b157aa3c05 2 @@ -2548 +2548 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/404.html 450854c06ac6979d4dc5732888e3691f2df5b66295f0d1ae04514860793a2a32 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/404.html ee5b6cef59558ec1576ed02dd8cbc51bba5e7bc42d5b4054ad4966daaca9de0b 2 @@ -2561,6 +2561,6 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei.html c0d42b32d486afb1972d8de35bfdcc92aa76c69b8046d9f3932e9f28b1bb5183 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_connect.html ca450c9c9a78984df695416a333e4364c2730bb141e08c2a3058677e76069abf 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_global.html 9abe75b89e8b6f54fdcdc66dbede3f6fd6a8acc7bffec357add772438f520394 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_users_guide.html 448407e38a8e9e485f2a157d10efe99cb53eb965589a3d96536c22dbe8ceb6e8 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_call_cmd.html 846374aab4363b2da7a40fb8bb6428fdde89d60cb61f8aa158d77ef76d5d03a7 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub a8a953ff912c27dc00894c5ea5533ba68edf3b8c893dfc78bbca1abbf8f7c818 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei.html 6c3fabe12d99d7a935dbe425e558556a4ca9ac6b7f8fece3d67ce658bc6855ae 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_connect.html ce331bdf5dff5eae51a3b2b9e735bb344bf68d0b3e8cdf1f1d55161210158eeb 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_global.html 8a3e4d6c9cfe3cd9619375d7d04bb0c538557a1f7ef159f8e2e8530c0196cec7 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_users_guide.html 84687230a7c5e8c6c32849b5a80144c36833a0fc36d9b4d66e827c9f28a6f86c 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_call_cmd.html e7240fe01159716b3e70f2d165d20f6d82d72e34fdaca174e390f5dc4f45562c 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub daa30dd9d31bf99bfdd28ed838dc1523afedf897dda4855a4c4a1b884e8f33fd 2 @@ -2568,2 +2568,2 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/notes.html e589a7e5b2afe895087718ddcd766826950db57361d5d4679972a0df36193851 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/search.html 02d1373efe33b7a680f125987ba3ece840a787cbc3be17d96ac212cd06e061eb 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/notes.html adc7b4622342b78b55c4b82c34b9aaa9d739834b4125ad65c31adcb2c17d6c59 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/search.html bc02f835de5b2067b5797c5b411be799832def65a738130f58b82c56256ec478 2 @@ -2573,2 +2573,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/404.html 35b20094d6e32d70396f76508f6f8d140f0a392f1a242b2437fcfa217923c5c0 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/api-reference.html b958cf268fd053729006a09f73a9f082f32d1ee7b5887c26a2026b914170d672 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/404.html 6528eb69f482160f92c50c7dbc7f51c77f35355e0c1ef3a30bc1e83e73dcc912 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/api-reference.html 3bd67f90c3c42d0a193124eaa073443bec42cde40d2a6c9f7d891063a5365774 2 @@ -2598,9 +2598,9 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub 2736564681133b024fb38295e2e2176388eb83d40d4dd563d2579404a8332757 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.html 9cc670f5d34a22fb7fb9b6f3753238d8e2036481d74f8d131064b02eaa654f82 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_collector.html 0f38baca4b30c0a6f990fde141dd7e0189a345602043ecca81f3849a3913fe1c 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_desc.html 499d527706ac85cccc32e7fce41a3936a9cb42ab637afaa23dc7de4cbe7d08fc 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_examples.html 8cddc2ae7490c310ee8460c1f1c6d5961c25e2e62f6234054a07511e7ec68a11 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_intro.html 025b64157676d597dfab094bc2da7a0e6541a1179ae10c6db5602aff27bd9a18 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_selector.html 47cd7fe21c8a81a694f87c82a28270238ce5c413b5040f9ef64af6ea6f77fd39 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_tutorial.html c8cb88b591eac601400d521d5b258b5a857d5893bd39be93f27de9396caebb88 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_viewer.html 7519ceb5c706d78264d85b2e9a294cd48dc8186b18da591baa2f72b0a2b6f932 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub b1567d17e046769695f8f89bd4e89f2053091b2a2df5fde37d155733b8c90ff4 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.html a5d9e99404e5fd46e376d0f57cb782b8c7c982f6875bcaae7662d9d7db3c2f90 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_collector.html ba5ef2eb4b294206cc4a04d986b20eb1f0e5300dbfb7ddbef7b18a7f48d068a4 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_desc.html ba6b0c979f87ed3882b9cb7a427d6b64a50144eb8369bda56c597da003f4a240 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_examples.html fc242a62a6b424869d8640399a84f7fba7948a69199cfb0b30f7fa697f777a1b 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_intro.html 39e83eb8def14de1e283f7c67f9a67c02485dc8915701bf23078eb75886b6b86 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_selector.html 32826765052573d0e2cda9ed86dce382a94c784fe528d5e3ebce77929346f311 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_tutorial.html cbe656a8de67f0ce46d6bff347ee97c4e24624eac474dbbb97addf2e3ef11f74 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_viewer.html 2cdc47a3dbf182d4f37cada40d271895271e102670bea746d55adaee5d83d47d 2 @@ -2608,2 +2608,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/notes.html 91a6bffe6c356468c39d78971efd34ba09efaed4457c1088e2dede5ebccee2aa 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/search.html f9137939fdb7415efd11165718f0d192ad14e4b3b8f365fc5a347f589642b1a1 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/notes.html 11798c1b55c2c8a5a3839e6debcc528d54f4b3ba83c897abcf98b45b76dabfa2 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/search.html f14ca69a631d942533639f96a12b0495c6ad5ea047a63578bf1fc4f3e2d76b7e 2 @@ -2613,2 +2613,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/404.html 57c86000ca09b9ac44e8f7442701747c56a175b0b232298a0124115370b30627 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/api-reference.html a401203265019c156ffcc1caef5903b78a7f2f1e7d05fbb0ca704668c43742c9 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/404.html ef78a34b7922f5b94dd9c00e7d1c2835468d02cb08a0bed451485b8f0c05ff9a 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/api-reference.html 5205cd3068a18f7885b8515096701f7d232595e21a8a9d02b3069be6de2f5da0 2 @@ -2617 +2617 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/chapter.html 7f9d53093ca173c81ea0eb34f618852e6760447a1a35e2ca81ac3ca7ba6c23b6 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/chapter.html 0f835370e61e2a5309f4a4b38983517343b91ccf25d5d1d1279c99376d1d0086 2 @@ -2628,3 +2628,3 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub d4ba33c15957036e8c8cc9875d98e5d924476fc424a459328df876430e6fc55a 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.html 4687bd1609202750d4e5a872e7f2aa4a3e6cf7af8022a2b0b021630ff7c29476 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit_surefire.html e03c70851a9a2a37838ae793a3e88cf64ac9d1ad67a1049dfa23861879379089 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub 3215215c3d3a5d58321ba0f23056b2adb61bc7edac8d34d348af21cc751c44ea 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.html 7b6f16a922ad6732c66cc33c571d4f147eb48d36d11694b05858aec715b0ef41 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit_surefire.html af4d26969b574b84f3040ff928b009cf54c3cf16b0d64ecc5e51b8def544253b 2 @@ -2632,2 +2632,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/notes.html a0c81476dce56ccbf0b3d2ceecb5d4348b8ea0ed887013ee9319492c7de89ebe 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/search.html 799c1b812267127bc63c9290ca84b01e0f6229b669b2cca678a6fd54e63e1c26 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/notes.html 822ea637339e6f90d7f390b8b0f949c155de5e1f865725e9d088581273df1f78 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/search.html 155caef78a57d8a6c231b65727a8e8145b77de6daf2920750433f25268e77c9b 2 @@ -2637,2 +2637,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/404.html e1253964ad14250db3e3d3faaf2dc3d2f0c3f080ae25dd9061af489dbeb834b2 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/api-reference.html 566f3edc311016262ed7ca22fcc053b3415622b3cf9ffa99a787ad6bbe408177 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/404.html be466af4707df3221761862559e3f76eb80e4177b15cd93f0bbda546df305ef3 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/api-reference.html 1a5d25d7aeed7b8041edc2e1ae885dee47866c64753245503ed0cf2e7a7e6c53 2 @@ -2651,3 +2651,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub 99fd9f259e130529a44973026fa1289d338a1fd336c7574ce700b31a4add2079 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html 7b0dc1b2cefb61549a918a5c0cf101bd27e11a45fda5691036f1b80ebdb904ba 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html 7bd0b003033f0d6691cec0638796d4250e2a4b454bbfb97b4868200e957d47d2 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub affeea643a3a204867ec35b4c5be27c8e7f0f5d8e8628a88ee6b46198f7ce66e 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html fc0d95c2242e3366f0e510ed2031834acff595ba0147bfd687f30b332f307d1f 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html e77279176fa0efd3b9fb919a999876d6ae62955dc1cff2bfc3207a193e021d88 2 @@ -2655,3 +2655,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/introduction.html 108ae48949741b0b464e356f14d5b097b0ebda1273c24a9281228dc26b5d29a3 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/notes.html c2a1acc60583c5f204f98484b9654ce9e6469a017b2fbf3796d03eaeb953c92d 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/search.html 0b89e8afe7b2701228aa2ec9038f711a993bb22fe2954174a5ff577cb9b0a650 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/introduction.html b45d6af2bd5fb1b0921960d7768a61967ba4fe28b59296ca31cf01b456f81532 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/notes.html e33f7c3f2c02bf550366a56cf2979127f5e85bf079053311c963a57f0f2bbbc6 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/search.html 869839e701a0cddd3ae736d51ecf38f6daae619ee71dcac8372e08b86c2c1cb6 2 @@ -2661,2 +2661,2 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/404.html 11ae102033599f01409c1998a11b3a3b76322b12d93c5c0f7515e2b29c5ac311 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/api-reference.html 4b06156ef7622b25340cd19075af32dc2dedfa3fa618ba0bd673a41173bd629d 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/404.html 26889f96ba04882a97569b68c82f2f0c9b983be73781bdb9fdce9ea3ac506180 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/api-reference.html e350aee2e51e610afe51621be6c94df9abec72c1e684da0ec3109bc3c22c38a5 2 @@ -2675,8 +2675,8 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_client.html c94cf6e0795e8c91e92feed8cd0a0129a8a5da3ce63d4721b3fb22b87943bbd8 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_server.html 7cd8de7ff184fc0b45149571c3060eb7ad7b2be77f798debeddb6bdc12ad6ff1 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_uri.html c4c0839342f12ce182c51ecf6598bdb4c560439340fbdaba1b6c3c80660dfb77 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpc.html e810b0b633aec1e59362b215e721542daea6303953b1854bdaebe14661b28f45 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd.html d012bcd06244699dbc5b4fe2404e6d44eebee9d31c5c5a0e4b7b2f56262d773c 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_custom_api.html b9921255cb593c7130cf8676020b13acbe50ea55aec6c77bf7d9bf0e359b2396 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_socket.html 84fbcb944c7b8875953e073efeb2f0e4114869d5d4499a7ac48f243d57034ca9 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_util.html dc07c6c6afec89dfb0c116c4078a399ab9055db9bd8ee5a3b653511eb33c5d6a 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_client.html fb2c3902371f2e237c097f643ce4b4e60db8c2d003f6a61296fd39c4057f6c5c 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_server.html 4aaabfb1ad19f60c42d32e30bf0cedd668a1e9a612a0347ba3e0816e48fdd741 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_uri.html ac413495f96fd7b97e8f31279414690c8bf1f9f8115fce9f73a6a496d711671d 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpc.html 9f670e55ba2d984016b23180bfb36d889d19d9b1db467c0b2871487ed77b0ff3 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd.html 92a085301dd7169afb0b8f5ca822219578458a2cf302dda931c78fe820845f53 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_custom_api.html 3e76f9dacb26ec010b3842f2c91ea77ec7988b116cec08f9e1a691d7778ec125 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_socket.html fe25c4ee469ccb820e0281c04b1366fce650f9c423af45613df7b80805fc339a 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_util.html e629029f6f9103893670048be05548caf9fae4fcb1be77e9a0d1615d3a48d097 2 @@ -2684,10 +2684,10 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub 2bfad7f854f8043fc7dc0f3717f2878590c4de7526ecd5bd14924f750d845f3b 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.html 37588f0ba2265cbe15ae8e35eef5b46b2f1a6b066e9dcd018941301fdfcfe683 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets_services.html 9bbf0d2093e7534db6627c432906c5b04f5851763d59179c81df37fd278c2443 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/introduction.html 3b8c2b437d02f5a41c635adeee3daafaae93f5d2e3c959b6398a927266c629a9 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_alias.html e4f960bc9c33498b8aad1545ce5bafcfcf52358264f0038331aadac3b5987cb1 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_auth.html 76e583e3381a3847453b8cfcacc5b807774730a3042124ccfc2dbee3b6bf882f 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_esi.html ade43d744ce1b0a6473e12cd9e5315f47b726979dd8937a6ff7e03157c8c3d0e 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_security.html 459d913e6b8e2e3a645d47f8b04d7d094a03d7167e134d564255070582cfaed9 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/notes.html d765e842c109a6b86f7927406b489719213ae37090df01f4bfa3ce03c31d6f7a 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/search.html bc08509b346049b0a3288876976b2c07dd3647f0210a0e80c273b69bfb4e263a 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub 14a58e12021312ff1189fed9e51197019184e91a4cc71417738afc46a7c71ab9 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.html d1079c22723a0d258407f82db5c5f6156a40829265d16ec01790d7fbf5dbcdaf 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets_services.html 24da7e5364b210557a14ec12bbe603dfdb691cc0dece574a39b71fd123b0b7d8 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/introduction.html b82e5c53af3b0f651802afb697a5b263dcbdb44197524d21cd2a9f39155633ac 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_alias.html 76a1bedc4f84dd59fa75b937f5aff9da52c942eff1897b6c945fb6104057505f 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_auth.html c874a69d76edd9d80772309deb3c28de1de6b1652edf6364e2b382a39ca293b0 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_esi.html aabfd7649decaee7ac4684e37b5fa0409407768a2c39624ac22b2e554f48273e 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_security.html 1401482a9ebaed6ae249cd52aea65a85b3ced121306ee69b7000c5e529bc8d51 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/notes.html 8bb91581d3757a38ef05ad9102d43135f4861c0c8851bc32b461d70049800ba1 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/search.html 8a0234f1c1dcbb2e2be4771608a0beb8058a62ebf3752fe95fae75b90d95ab9b 2 @@ -2697 +2697 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/404.html 5c32c0ed5836b3a177d6927d3ceb42412c604a1d408abadc86ad4e5ce28f4d83 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/404.html 581ff8527e4777d1f46a1bcd2831acde61bb79ee424f888dc1fe33c900690d77 2 @@ -2700,2 +2700,2 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allclasses-index.html 0cdf5de89520ce434046c37137d9f5e4758471979e506598f2cb7e2c4b12a21a 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allpackages-index.html 2563d04bf07e2b23ddd15294bb5f8d77a188ddcdde2e68c15b7af6538d86df7a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allclasses-index.html 30bf8f982e5eb8c7d35412e0d4ff5f5c995441b8386f41a10c58389f0cd5e3dc 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allpackages-index.html 5ab1b99ab626f356c0c18dbb1aa83971988ce97ee6a24fca14ad54f9fa9c6632 2 @@ -2706,61 +2706,61 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html 9acdaaeabf1bbfdab60238f29b162b23239a7a04b2668618a69ce8c2e8318f86 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html 578ed4c60beea186a9793d669a98c9dc98851268afcf04650cbcaa32571aafdc 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html db9d75bda23ab145308ad919f818ee2b430e5335bc16f3237c61cb5f9c09d565 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html cde828cbe960cc818329695b106c716efa016fbca04fafe8c38650e2277cddcf 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html c4fee6b809d7b04d30adaa1ae3deb2f7c2b9856b5f64620d3024432170f099f8 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html b624594877a809bdcea52579f19caa45948f6f10698458683baa45e98f6c3046 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html bd142b4ebd4846368816cb9a0c749b0780270f7059a6ee0ee66718a62eb98c53 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html 4efa032091fd03053c663710eacf4b6a36d4258758e64137138b9338467ed9fb 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html 0ea5bdbed63d2ea385afe8d206431415434fb0d072be86978bef2f54b1a64274 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html 17de918432f762b1772d25cb273fd3fe4a8101ac1e989cb5e3638da472ddd943 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html b76c78c7a758b4a7a84715a3f5e3378db7a53cb5e295ad0c534252e5734e4c9c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html d75d5e01ddbe056f45457155dfbee3d5a30f827d102820d1e983ea6fb666e09e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html 47654baebd016e79c1e880e45afc9258cf2c4ce0bf747c4d78722344a2de8c8d 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html 7ffa1aca46842672aa73941150ada279f7ad7f38f86e80a2ee61318847a81282 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html 5e843f0389cfafbc120838f661fccb05b591bd79129e2395ffe99a478a9606e9 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html ee97b0334a3db49eb9c2439e94200dddcb3864e0f8c19ad1a62a1ea5efdbf63b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html dfd1e0fa012f79edd1299a1c336b21e5cf675a55330796ff729a42cba99f7a97 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html 35375c0b47ee11dc98d0c61b42615c245d0e7fa57d66cfbe27d057d90763c850 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html 3d453113bc07f49fc6f476676547604dee27c577d904b01d268f52380d420a79 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html 93136a4f3de657b5ceb2a5967f6ee9c04366d0633d92e7dcd0488fa6cfedef01 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html e60750ae32b49692f6b0268fb63d53130ae5487e32dea105d61ea0ab56f86ffc 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html 06644007ae8a13580dad8c2afb10dd72a49290d94fc2136ca6752e2ccc2d09a0 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html 46a3f96be5ea16ea0941358d0818ba67b0b7a23c041befd79b6a78a750782b84 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html fc527c3a844743b35d5dcb423ea0dab127bb5a854c0bfc98b18a0c3e4c43b35e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html 30d9d6d85ede48485a472301325667e9f026ed029b636e8e9ede1ea3f8a9cb8d 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html d7815e19881673782f2d9f5dfc1dc28c05c3797a89c732924666b6d617d4aac9 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html 6ebf5a770feeb09721fecd97bb5e4ad1f369fff06a3df65c929b8c47845d074c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html df78970665eb1645cd8f4042f795113a826a32833dc69b768476dca0c8386173 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html 72abbd3d8ecc6f9aec7ceeeb7fd872a0b64daf056d7f816bc1024e9fb8f206a0 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html 8dcc85550cda7a9a882ead17429f20ab3e27eb3d3f1c07a2e22f32a99ff80c49 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html b83412a6a962781094a3ebfcc2316b6288dca179603614961988e17621b5fd5b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html 6c8ff292e04ea9d72565d664065d7f21f0a567d9a6985a3ac6a602498059a039 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html 946f0fb1db5a1d402705d7eedbfa8e8a30aa0de661ec9bc634521beca519526e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html 28bc9e3d701b6886bd427f885e63ff5fc4a60ee7d7597b278ff917d88f212ff9 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html 64794a6cd0712b53dca91a6f61b7476e7e8aa4ea74925e7af2d0c9551f924c63 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html cb029289c07548332f9b96388ad99b82a84f597237045d9eb1ed3e52f0c298c6 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html 601228416a275a298140100302d29ce37a0c6edeb31f6bdeb059316df107073b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html 4da99dc41bd47d72fe56671af33f98de4c495cd6240330c8d2d82a63e99e4113 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html aa6326506669a39da499116c56ed6c3af43e39f8f5791a98fdd7e0e9636ed6e3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html 87aa384ac92dd64be5de80e99b8bad1e8b7eff62c61554d401cc9a2652712e59 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html ae68d2f69552159a9808b4f0610495142240f9c9fc071505962602741b3f1df8 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html 0ecae5276d61337d0ab616ba521217e6289cbdbc182119ac58b815c0da883e50 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html 25efb14a94a767b27f605473710f1f3ffe1dbc81707387216802e9d61000e595 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html 313ff32681e14e8e4ea4a9cf0fae45897732fd5f25f9951ae30046dd96a5aa23 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html 6234ea9b584ec99d18c35a4eb76abbad0e977a372988ec37b2db508c04b96c10 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html 172fa5ef881f3d0551ed822bb53d01ae456b53705875986eb692c19a886f8206 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html 0b85d173216d9e120dd5cec1aef0591b94625d7245866cf9c73ae0de0ff4abf3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html 4e45ca6ef6e23042911c2dd4d0e3e3353fc11e2f85b61e3e8d35c92b218595fd 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html 8995f93ed8a95b4773d3d95fa3e5c3ed2578ea2c7cbf10de36fefdaa8000671f 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html 4d15a7e83c03a8f365dec901bba5b9b79fa7567b80c0bf5c0aa34160d2d1dc7b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html 43aba4121ed47cb1a838ff4b3a8f525298cc7d46e13a9ee8f36985dbc0676550 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html 57c0db3f8a88cda1586464ce8c63b80ec90699d436b96e7f52de9ac9a1f76dac 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html ef17f7303908b8b53c07af36937af946403f9427fdd19ed7aac21a80702ce864 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html cf7fc0751c5b27e088ef2afefb2899bcf872757dd3a522db39043cc909998a30 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html e7ad81170550511b4a0af81d593e57cefed34e98e1209c7a25b40cd91aefb9a3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html 1b0b9f8e70328be6217bec6de0af87c0d5f5472b7407ef375ff04a7c319c5fa4 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html d4b5825ccd605cb8e7b71df497f51a91d9bedda129d2d5f48a853587712a95ef 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html 5dc24f4fbd424aa98249448585e27466a671e9cda13fd31ed71829732ec6af61 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html 809e3668b20d38041a561a8d5a87b264792a4b9882d1b1067c44caf2f2f2ca0c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/constant-values.html f1d05fe18cc5dc8d8eebdd5ba4f77bf30f951d5adf3378dca2e69ead48937a45 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/deprecated-list.html 219309d8347b9c79a74962a451345635dc3437e21701bd7f052f213a393d15d5 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html 8d944f1553f345be8196f35d647226931a1be06cc61e4afbfcb429ff8965b702 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html ef82e2cefb4415ed20a25766c2958a6ad81785a9d3332ace9ee8d136daf2cfb6 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html 88f785dc7c8183122ba56d3e82af1525ba5913b3aae030c34d5f05072651b506 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html f0fc403ab9055561a4441be3c3889679846aac4941c0dc1303a799d8a82ddc11 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html ec9d22c5a2e376ad3e39a3981a4576ad0dcbaa3d6f3245e39c33cca5e31ab5e3 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html 29278860ca6d7f1d1d0fb60dc15ddc330ae79b2c395ba75e3b7b863f04be82ca 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html cd03b80b6dfc93586967f2cec06cdeffed12eeaaa375109a9d663445ba5943a7 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html 1ec0fa576a6dd87195778c1efb1ae0a368005919b4534d3eddafa72c9ac2daf4 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html 909e91f0f1e327e531eb0d08dd3a6274c20e89d8efc2bb46471dd7116ba50475 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html 9d9d56d461753cb872f0217c08c7669959bdd055fe9d867010d9bf4749760f51 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html 4147f9809a16883fdc833f1868c09518dcc5a47529cd6394a7e987c3ea8bd895 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html ae14fdaae94edad22841e139f6ec3214ee09c9b1843edf30f83815f42b469de8 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html 4fd492aba3c5a8aa9bd10e475965e76d448475eb678b26686f07c819aeee7e97 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html 98ac20b3d133bc4d7e09a0e4ec59dbbf431a37e4dbd3a177ae942bfc75e1127d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html 992751f8904c94b30acab300daa527711ed1c576534f165ba0516f3162dd716d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html 589878fa52254045ee5b10e3c2a8d4d49d5bf0dd27526f74e75c6c310040b2ce 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html 820671e125bb0a812e5f2c79ab73a656cba09faf7236fed70bb0e0da4755ebec 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html cadd02615678621d3ef7ed9eb8e31122dccbea40bd84b9745a71b5a12bd72ccf 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html e80eef4648083978a6b3ff04a70867951d6adc51dd870210b0666c1b905a9039 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html 499c6231a32c6cb1c29c6648105e36b8701a82179ec254d7d729691d9f2b19a2 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html 97806356bec546715722da6d5accc0a2ba2727d88b037e45af2468cb01235756 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html 0fcd96192dc7a454e25aab0a7c38695b702e547cdaf20626a045af04c3e9599a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html 6a00e3abff54d786e817b00f18ea24f7e0d76b84ca268f1efc15a5275688b1e3 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html 554e441ce5e10939e5f50476dff0d50d714803325ef07e884cf60f6f2374300c 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html 41e23d9c902190f42540353746604a21a92cacb81ba8d229ac5fc99cb47053ea 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html f616f3bb5b33c7e15ed2fba3e2cb02fcf17f95f7d3c47d3228e6759ec0f2653c 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html df95a93c1358f513f87dc4fd7d4a02d592473d746b1e13eed7fe7a01bff2c9c4 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html 67c2633188db150534f6052811572185f19bde344b92c6662be87b8a2bcacf04 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html 95d3bec27c6c94e987f514ac4293fc253a80c3806b6f10c518351e5b45da5b1f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html 04f4cdd6590fd1e7745fcd62da420739068121bcb5a0c555d002964ec3b8b9b5 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html 5432391e0e300576c066ee71ee66eda22416b646411b1e5aa833a519e8f2fe92 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html f77cd243c99403aacaa8bfd46e7c0c9c49d43532b5db3005d3399d5a32a07907 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html c2ba17c6280f219e8ff8198265c7e05379d5fac088b168616b2501230aebefcd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html 0cd970fb68dc79a316e9c11474a79c3ad135e6cf8f93fd876d6eaa7948fca3dd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html 761e4fcc198be11e8da05ae0533fab1722c31369d075ff3763ba5ef46e4448f5 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html 0bc07cb1181ea3bf7776299b22ad640db23cf88e226216dda28d9985ebc101fe 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html 703c31170f7c74047aa5ba74eea8f10b9728ad0fdec8cad92b0a7c48f8a8398f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html 56fa50f747b2f5ae282356df85454af1e3034e9dfd9f6641dcc104f386e6f7dc 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html bf19c95c00a2614827ae7aa4ac0e71c1d30e0fb64873fa3adf6e5757b2b1e50c 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html 1a51eacece08aa9ec0f55cd666f237030756521f2e920a0eff507a2e26733c54 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html 8e063b1d93dfc4da048348cec2fed985589934c0ea5897ca3b980b5acc54de5d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html 519b58a620ab3a9c7ad9c70c7ef91642fd321c7b01238f051d287fa4aa153aed 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html 3c2bbf5b7df8314a41b04403dbcf3df128900d7346551f27c68c3f295a72bd3b 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html 634b7b04e7ef0eb7330effe5a4b4e275b1c465e93d223bb3575fde7fddadb79f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html 46c57a236b1d2dcb781b3bb5effad85a47a844ed4fd92758380b52c3c516cbef 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html 6af45af1649c03e2df3b2e4f14bbfef71865f181d525d87668fd6d2788332987 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html 8515b8e24701bcee31ea62de8ecbb47874867e0c352992cca0293786a952d931 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html 82a5bdec1357e374e16c5b0b062271cd47470d669305921db0568e4fcdf0e377 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html 8411292cc599e056e0875cc627614486ce25cad3812a80a37ce03b0b1ab82ca9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html 13f7458dcff0ffd62703b5f82cd96ca3fc196f6d7cd4b386017753fc2ac6f48e 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html 0939fa418d748c24dc9563ed678ce297544a309cdb0caa37d933d5a3e083bf53 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html 314daadd3e8ee74d2676e423bcc40d9f193127c08e3e69fae892890ec45d7b14 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html 1860dafa5189da496da8c985acf3fb70e150ac50fffa6b904ae92e968bb5bf38 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html 66a872c6289a33edfc2da3e2b88bf71e827919316a620276ab6fb1754be93c9c 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html f26a2701107f628d59809349f46bf977cabbc843f0426713124c902a2d777c73 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html b4598286d7f134ee60c79f886a54cc9b27e4dfaeab9a10ba81ef5fc7bbccc3b6 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html 5b4c1b690cd647bb15b510761f26ef28776ad2e54b83d4a5d9a1f9dcefd3af67 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html c24a4bc11a23f6eb52c8c8341e114ba83987b3e2696527af5eae3f120ceadb39 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html 83f388a4dc9bff5f7ee38faea29c992e6b25bf7c41c271746c83068177afe787 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/constant-values.html f7e78502eac51244af44794f2e3d01aa278142340e178de141b8fa6e4ac63011 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/deprecated-list.html 501c30e3a656a2441fa13f5582d1c008189477bd35ebab62fbf6caeeb1151a8c 2 @@ -2768,3 +2768,3 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/help-doc.html ecbde203ed041a4a18ce4bfcfa1175973ea3d565e6e59aa0ebe2c5e01ad4505a 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index-all.html 0bca16b49097ff41898ce57a51f6021ced801ff2c41753ee561fbf6fb5fa2c83 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index.html e0a2cfb2cf31158939162d1393f08f21bec3b645d55795ed250f03c6827ffd6f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/help-doc.html 2d621e66a98de2d36e3da457d831b818698190cc857062f62de576833aeb0ca8 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index-all.html 08cf7f9d86eaef01b0d5373cacf61c3f06954afba25485913d4bb98bcc2486df 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index.html 482d0202e70e8e9cd524dc74a80ff424f942fbd2f31e5e2e64527334c332d19d 2 @@ -2780 +2780 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/overview-tree.html 75409d1c2b59509749bddbd1ad0fe591f9552c26e55780e230da7990a917a55b 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/overview-tree.html d6449646b64cb3d6a6f78674834155fcd2b8a36bab0ea2315b89754fa6ff2e93 2 @@ -2823,2 +2823,2 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/search.html 24046ced761464161cd920c6941af1588bdc2499ddb492dce1696340cc5c67a5 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/serialized-form.html acb9ade58fc69d4c3ba9c8ec73d658a9cc47ce24d24af4fa226c907f6f5be291 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/search.html e48fb53d299ec1b4f4d89e77d08b217ee00585bc4d8b5fa6b317fdcba69022ef 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/serialized-form.html a94855074b2c4da41d7d82dd8d8e50862c8fbc98895f51cbfe1651eabbecd964 2 @@ -2839,3 +2839,3 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/jinterface_users_guide.html 18b809f8936032fe0d72addecf88b660d7af060d16bcb1df5a2df5dd78ed716c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/notes.html c482024e43430ca30a462687994f21b9def75f3eab0ec00282112e5bc8f5f0fe 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/search.html b3e14424e552fcf30524bb8d6ea274a762a9f9bc86a08536e4be4f17be0a8ce4 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/jinterface_users_guide.html 6f218c68f189f1d3bb676f3f5b3351fa622578b3cc11ad5185ad13a41391d6e9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/notes.html c9d2ab11835d60675a745b166dfb909b173860e8e233410cd18d5177e42f8df9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/search.html 0ca125aa6afd3f4a0a324b752d672d713fd4a609322894b5cbc56554ff692c64 2 @@ -2845,4 +2845,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/404.html 214d0189bf489b10fd4050b498de5fdb2f02ff4aaba440aea421f4d690a130b6 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/api-reference.html 95f9a7a865602cd44ca74c77036925721d88c1fe56e83eee2e42fb75161e23dc 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/app.html a7665b2e2bf240a065a2a32a6bdf508b7c291e2f87931501f117091d65de340a 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/application.html ad7854993a04ca2917171010ada90558683af704b3fb2cbfe42b07142c4e14d0 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/404.html 8c5694676392b790781e61fa296540f2e9a0f9053e3043e5885aa7f4ccdc9e8a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/api-reference.html fba4a539dbe4c92fd64646971b4a47f570f652c7726b692793d4f83a7dedd021 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/app.html 627eef63464df8b677dc566a2c55211e083531468f2df7d0f92b0115a88e3224 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/application.html 44dd3fee14814d7c8ea19aaf957d220c71b3369057179ff0344e14dea03d540e 2 @@ -2851,4 +2851,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/auth.html f7198f895cb51c046d69a0aa544cc5a958a35b5dfce4f18ea6f29171bb6595a4 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/code.html 16c5faac77c0668a74adb3862cc8ca84571f874621abc908edc157a2b9c4956d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/config.html 9b02ce0bf6f4bf450d6faedd03211d21cb21d5e75b100804dcedad2e3aa441b7 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/disk_log.html acaa3ac4b9e773e574513ef3df235f52c3f45531d1855649ab877ac44f5bff2d 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/auth.html 870bfa940329b7a4c2faddc8d11c5779c3ac40290bbdbe2fa9c2c307f820dd77 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/code.html bd31a2c31ac2fe5b5b0fa693f519e1855d165f64e24fcb001e15e455ae66c8df 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/config.html f4b5ae6594a6d174441c8409b77706e4123d8fd719f41a013186cd6b926c5ae8 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/disk_log.html c712c48445b49352b5ac1a18d28d2a1f2510eaa39222e6a753942073090398ef 2 @@ -2865,15 +2865,15 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/eep48_chapter.html c0ae6e861d5f031c5dcc97cb31f4aa8b9a098d70cd70ffc907ea9e88985f16bd 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_boot_server.html 5e173084f7494b58b56ce91d257c41a08971441888d91bad0abcec70eaad9f86 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_ddll.html 1b20881ee56c3cee2ee88bb631b2b42265905cc40195258b917bc424741d4fbb 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_debugger.html 83404df265696ad91bf0c460204159efb549e92fc0802408c31fd1c17acd81a1 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_epmd.html d0373b9d1c2451bb8f9ce2167ea6a26480c098d259d7e5963cc9aebc0baa4e72 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erpc.html c1a47ca48422364edb00cbcb4afbbe450e40a12699e7366db205a9c6630bebdf 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/error_handler.html 4814d3569876c3518156e0764b02ff2ec541cd6bc8e4266f41a911959546adc4 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/error_logger.html 7c054458de02d3d62a171a3c73aa1c59506f77c6a36a47a2fedf17647e888b66 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/file.html fcb2cddc62fc8163cb7a5a5f87e2a68c20207450cba9aa6c97e75b4ab59c46de 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_sctp.html e2f4ba6ab218f15023d51eb578feedcf1a1dcd6f3646c8437550dac75b6aad2d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_tcp.html 35d4cb1a8eacaf54bc6f8efd7bcc0cde5c6fc3fd1a5dbc900145e1e92805910d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_udp.html 303f7da882ee591b77f7dc5062a7e63aa088ee975d88c9350f85344a20f98a71 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global.html a64c2806dc70a58f5e5ccb852fb06822e08f248ceb57877d7cb46c1d089165b9 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global_group.html aba5c8c672b4f9a71bf702a721290e49f6b5ca11367fa1f9b4d44ab2e8a5c9de 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/heart.html 54390611feab473639ddcf00ccba18e82c39557300151389af777d7acea1d309 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/eep48_chapter.html 7741591315a95d0697ea5b4297931af3a924b1d5cb18b57c3c9bf2ec160a12ae 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_boot_server.html ace7c0cdefb33636a2163fb2fe43348f267e518902120bdddd0d49f1e7e73296 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_ddll.html 4aaa17650f29241256c96b0e14f7c1fccb12d22f7ac64f5fe6fb47e3aac036fc 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_debugger.html 5d4aff29b97e8d402b21c3508c40e4c54a658a74fc9acfd150a5f88abef4aa1e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_epmd.html baa699f0924c009a563f69cd61357f3e5c46fb1515488c918dab377110cc32a2 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erpc.html 323a4b03ff52963ecb827f4ad6ca42b4f47417df822f0f3178c325d740092567 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/error_handler.html 760e2933fd61835e57e2d72ca3bb2325f0682742cd1c1e0942e45bb4f16588c9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/error_logger.html c81feb2a02d8ab74771e7796349ca6cd6e7c091b7794420741193d1eac40947c 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/file.html afbc72e274d127cd97f3dde1cd5d4a3cea93a2072f625507ad378dd4bd712c62 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_sctp.html 74477cde4be1ab3fe58d7e0e9f3842daa443dd0057d14d9857ba8502e80722c5 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_tcp.html 21a29a9c314bb3e0d28d059904313321fac1d4e7b04866e5a98c6700bd71d8f6 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_udp.html dbc1537c393e79cd38bf6da490d967a2ffd2da88a45d2b43eff07242b5466aab 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global.html 334c1e6266e34911da975b88cf7a5279fbd7dc2525c798d1ed50abdf7c0953e2 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global_group.html 29856d66e7d0ef40370412cb7d56aaa84cfabcd3341cbb5840c63559c6b4673c 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/heart.html b838c53b21bedc49d0e0457caa2ba84ff9f47d9c06a741487665724f3894d025 2 @@ -2881,26 +2881,26 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/inet.html 58120faf3e860749a991589860faefd6540d5ad6e07ffacb4117ec893f256538 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/inet_res.html 9cb6323ef6c0ba28d92c1b18c03cdf8ee562f2d1723cdf3befeb5f2c7980da39 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/introduction_chapter.html 45d72a2032eb0d8c17b29555964bb50ae2ef8f0d9ec712a4e84aa1eb299322a2 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub 29a26142c33bca554eb4cd95754d29697db129ffdab89fb056248e3cc2034435 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel_app.html 83c031a569633f511a9c93733aaebd5fd838b4efa69a130e8900e60cf27e784a 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger.html badafeab72014bd08b426f449aee8c768872681c6ff27550f541ce22de6094a8 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_chapter.html 481fe5959253429dbbdc6dcec73fd6edbfef96f535328ec66118dd3df156781d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_cookbook.html 1d10fa1ab78ec5328570883749c6823a88fa0207b19254fa544e1759b20de9df 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_disk_log_h.html 589eff086405fbcc6dbf2cdbc2a3920d1b30bec36680f2901b28b73af35c5137 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_filters.html bad06ac0b360c3364eca80aec56cd94874b9931a039cab754cc4a7ea61c3d4a0 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_formatter.html 37be4b0ff520e6e72f2fbddb1dd01015e65634e2cf97c3fd636d52c2535ddcdb 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_handler.html fc374eb9501a0aebe72a35f864cd575b926514b759dd12f1409bac1cc676c520 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_std_h.html e75b2c902cd07962f90ebfbccd9635a1396bfa5758fbfa63e0ee6981098a4b31 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net.html 28444e91924ed485884a5d67eaaf36b05dafb93f5d3a8386668a12fecf9df2ea 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_adm.html 9aaa3857a2c7667b1e9ec4133bb7790e74ec9a5571a16299f6e1522fedae7203 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_kernel.html 0a240ea68a352c608e5cbafdb1542986c9eeb8839641c7263294fed9ea6dc6a7 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/notes.html db1f6878a76b52cb68cd405d13850d66f2914a23e0597f39586b4c297ab5413b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/os.html a4566c82132fb23f0097384e8e595695cdfb515d976fe6a7e80e512161b0f797 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/pg.html d2a87e6578335acf21c433822a0bf5be5408c25b0624f7d476677f5fb9dc1a30 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/rpc.html b8caa8f2f292f035922033d82eeecb55e3e260952706a045f4eb6fc393fbbe32 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/search.html 7825d3503c3bfd41dd6b380528ee5447d0efb114a79ef2bb9385e8af1400ba02 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/seq_trace.html 84d19bb969270208b4c883da0273c64f8f1905f3c1d0b068b7106f35d6eb2bea 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket.html c6179d62152ad29c0d6fedf3a0f524b6ef639e3e423cd0ab266acef01d05ea73 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket_usage.html 7ad9539321384f1497fe39984e3ad3061443fcb5a4e1626f27a50f8e731addc2 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/trace.html 42f34e90d86fda0c6e932dfe454ff175e9008711db0c3858e04b796547264df9 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/wrap_log_reader.html c8fa2bb2e63d8b4fa89e10a129f8d14f25f0da1dda565d4c35454a6d0c0f59c1 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/inet.html 735bfcf50b921275debfec16040d1238ada64d9632ffd8e5135243f739165218 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/inet_res.html 24d6a2ab3c2b002b633490edf6915d6c0919a2ce551c66ad4e613560c30b981e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/introduction_chapter.html 9d23eeddf4594e0e8ca6d28777a06ea9a7e6ead34321bdb3077cf6cd84db6fa1 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub 8910e2af465a3899e01c8a88a78791e1ec86eb3229fd24d41810f3f1df8a1b83 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel_app.html 54422feaa44f2a9e35f0768a4bcc17fc3ee00217088a247737a51c028e5e37a8 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger.html 3f8fd36a182925ffc746d1f0c718f2bb16103f0cffed4fd7d607e9525bd833db 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_chapter.html eb6a8eb78be7b67fe8767efc1628bbdd8ea63169144e3b723d466fbfc159c633 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_cookbook.html e353b641270da3ef0e6a58424f1d1feb1ad59b619404d0b1f3c12b253cc87817 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_disk_log_h.html db4422578267911af1b4d71d74b998caa994b474ee7ccfe124b29d4871d1e9ad 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_filters.html 6ef6db3d0775fe86e4a716a6cb8699eced9008fdc20725089dfd0568623a08ef 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_formatter.html c9976154d3eecac2a20eae82db3ee24da6b2dfe2c288f5f9b0d50beed551fb69 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_handler.html 59353b718539685ffccddca806e3428edb5210bdd9e190f8978ead65d9c51913 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_std_h.html 94191c0bd78b4010bb200278cb1530f44da83d3531fba870e9b59af870fb2daf 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net.html d0570ed251f43b70df8223e9ddd84bd1cee694d1c6c00c3fe97b425194741b7a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_adm.html cfaeebfb469d8bd3e7f24a3efc1923c2bca579ad47f32c725ae72daf17d0873f 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_kernel.html dd60650718610d5a3a8e998496e4673cc558fcf30048550dae30112cfdeca0d8 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/notes.html 8a121c21d2bbac473a485cddc7d912524cbaf213d1059d6170a31c49105d8ce7 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/os.html bb4a866e1199eba548ab311b18212d7c38a3523735b49be1a8e59fed44b850e5 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/pg.html 04759045485bbcdb4ea84c432d18756d76d4d16d9214df6aafc70dcb6185a035 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/rpc.html d956806ef41a9b1598a3e547b9e117543dbb84aa35366dce3de9af141bd6faa0 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/search.html 6299747ad572861f90e74a85b92dd48ab491007f2d3d7adf940f4dd0112a76e5 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/seq_trace.html 0c921a6b9f170b2e90ab864424ec85878ae15688c179c3d44877542f56a3c712 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket.html 4405207adfc5e12cc331e52cddb275bbe35bb5e47da4f1f0763d22b21a1e7309 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket_usage.html 740b08c6138b5efb2d3759bf2e9ed9a294531ede0ed006bca11900bfcacb7c00 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/trace.html c2247503bc90d3609162d391ff4704bb91130f61ccc9626431b22535d3ecf592 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/wrap_log_reader.html ecea4ba6754db4fe205bcc217cc5db50ac2c1686c2d7226ab310de3328cfa722 2 @@ -2910,2 +2910,2 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/404.html 7fdc4602e5a735afe4091910b37df1e09e923d9bf8bac1c71595fb995e234590 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/api-reference.html 7b5c8713a176b87ba9dc00c1b57107d6d967a7d5ef8f6bcfc252ecb1b83efc05 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/404.html d68cfe0e21f697393abe0f89571946b1219bcda23021241d1d569dee48151f69 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/api-reference.html 71e531ac908676147fb25a7664d13e2633ec535176e84b8a79006652b377066d 2 @@ -2925,26 +2925,26 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub 4d6ec32d54962dda5c8f0349aee4a290059ce9d7bdceb45dc0de8b046582b519 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.html 3f9ebacdb77506f18a3dafa6540bc1f0eb03613e685a96032f8a4a1a4add3de3 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_architecture.html 5cf693dbd593343901f011633ab5c17afd8ec08f0cddba320c97f2328ef8cd13 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_meas.html 61465b801dd3e52ee4d44ca640aee63e0d817a5e269f0eabf31b19d658214a62 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone1.html d68f8f71b8f57d76b0d3e23887d9d0e43531f4fbe6b1923f7916b84cd73dd4fd 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone2.html d035e4d9c30eb7461477cb2e30b7c1c981dbcc71ad98d7a2cebb0eb3b10071bd 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_transform.html 19b3425035151330a078e7043e2fb43b7e80a213dc8a19bf2bab9d13cc6a89fb 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_debug.html 2abdf6bcf73e7f6becc032a254299432e04387c296410535ede301ca742b94f3 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_digit_map.html 176a0d0c72ba85bd0469ddf4d9f1caceca71f26541b91ae011269715f0083012 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_edist_compress.html 6c71e27e5d47a62da91206f453ad6282d4a20b69b1b14461b9954c9c3615e16d 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encode.html 27143c73779a547b124923e6cb69e5918b04b5b28dfb9ad864328c35231272c7 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encoder.html a42dc7d34413276a5bfc497a0a4d207de79017fa618f8968e70b8ecee0b10a93 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_examples.html 555d690475a716cc2e4655811ec54ee19f217e7ed9159f61fba984649c1cefba 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_flex_scanner.html 7075a0028e1b83cc13df049ec853eee519f0f0c328d2261a73ee35b7f70fdfbf 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_intro.html 20d312f8b8d4ff2b4b2304c610f0b955e16ec7637c40a2384661b679713e6df6 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_mib.html ad812a29f590cac99f52ebadb440ea209609947025dbce80f78145c038734b00 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_performance.html 565516386dd8d39e44aef8865fce884ba51103bae4cfdf03edaf4a13ac0d39e4 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_run.html 308bb454ee25f8e8070887aeacae0fe61ed8f3513cfdabf3869feaa2df649e41 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_sdp.html 62f20a31b9d2b7a691337e46c728ae3298ed2cf794efe3f92214b019c1284fd5 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_tcp.html 1bded6395945fe383e214799c0e6d2f01923ac92bf19b3129cf6099a7aeb8de0 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport.html 50c626faddd82f2d1550b2d789f50731c2d87ad353de99736eacc2bd7759f48c 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport_mechanisms.html 43b8a4870bca579b4596445abdaf77694b1f95964296cab72d02783767400f74 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_udp.html 81a146b9aff8624dc541edc903f11e03894a4df751157206969ca057dec7e88c 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_user.html 52a73b3a05f6e901c822ba180a0d4462ec9452f08f4b27983a8bf9b6e57fdaa2 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/notes.html fdede2be7c82f12b517ec0cb3c4c8cf035797df689b02a92eb6642ea2121e31a 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/search.html 20fdaf227d7adee1643efd2a22ce54956239b69e6548580e0058529256572cff 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub 4e8024590da8ab58388b5f170207a7645785dd170c0c6b6d85cd7562b4373a92 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.html 457477c7a36286a7997dde978eb5ba0414586a0e6935f088e740f4193142a4a9 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_architecture.html da1a694b50fb290420aa728b48aec42534b247a6c5925ff9f433963a1d8361e8 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_meas.html d9d496211901de0e0ed754e9791a748879d4fea98e9f51d9b34e0ce9317cac0a 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone1.html a3926704f7901e3603ca5fb64c7b8941e005847fe56838f2191c5883a66878cd 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone2.html a74c86d27ece1db11abcfde10fedf6a0a8daec2ef6fc52723da320763180a522 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_transform.html a0db7f4e78a502d06c358f68040b34ed17aa9677ab2a5e7b5968fa63fa1bd7ee 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_debug.html de0a64d2f2bae7955a584e5ef1e5a335d4960a4925feed7b9061158135644386 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_digit_map.html c491aa43c76bd6be6fdfb86c58beb6b9e1fefbc6a83f3ba18fe6b3414bd77257 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_edist_compress.html 5b392817e8d0a1b857b2729b9402b0910ee33275b3b8dc303cba86c97551b30e 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encode.html f3398efafa455677b155f6411d6ef5b2af69caa4f36a47f9c95d6d729a087785 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encoder.html f12ade58c9b8fe3f5b8e500287115006fb00cb3a48b86d5f46f8a4a54e967c9d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_examples.html b50137181383c150c0dc7a49b65ed2ed42177491494795bd9430c9da81176b65 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_flex_scanner.html 962cadab200de798e438c9969dbd13e60df4654b39eedf643df38c476aac360d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_intro.html a15b0a0b1a500965e5f7a9a6780f77e84f5f2307caec248346abb3bfad6b4495 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_mib.html 9ce36f923748a2b973c5b10cb43dc392ab2090b023dbcdcaa2e1da7067522bbc 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_performance.html ebc9dac545b414c48cf0c0dbfe97ddadb89997a026dbfd5bff8168eccd6b9cd8 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_run.html bed51748a1256be0bddc982b98735645db6fdb950a9434b46c3e68dc8256ebd6 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_sdp.html b6e0476f7d583279d73663ddaf4fc318ce66e6ec015e18bc4c72faca8499602b 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_tcp.html 2a6d0264fd271781bd2f7eee0e1f4f8d6983148cd522998b8a39d9b06b532a96 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport.html 48f72f48aa2da68daa7df4c8018f9372525271433a08d82cdaebef9e5098dd86 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport_mechanisms.html 1ba7803c864b9c5da72eadc3cc22c6bdf673977755fb7b0bf23a347948d9cd75 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_udp.html 8380df07ac9240107fb75aedbb5ed03430fbc745473b07453524251da3b16f70 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_user.html 33aaa2491d8cb676020d8f3cdcb4ec8b9af8aea5482a2f3fdd307127a7546105 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/notes.html 71e47b2c05cb61fb28cbc21cd3220b881c86f4549822518a54e1748edb6dba06 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/search.html 267a9b2bbf160a387e09d948cc704f1c93f96e96d775e9c73e59ed8dec2bf153 2 @@ -2954,2 +2954,2 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/404.html ee5de1252e61cdc4f09dff81c4f20e0e06d95bba72542bfa7999547d31de487e 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/api-reference.html 2923d009dbc058f17f246bf9491d2451fce8f3d85670da8b16bb3d96094651aa 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/404.html 2972406d987d150484f387abf9fff13a845a5c13cb0aecd33c79fab7d7e3c70d 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/api-reference.html b79cb2092b56c559edaa29202b88a52854cec7db6a51ee2b9fc4e5cbed49a5df 2 @@ -2969,17 +2969,17 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub a267280f3f3d0822aaf6c49ec5327e2d9e791bcd466c0eec2bf60191f805c441 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.html 3f1e1f00420ca3ae1f840fa39caae7714a7eebd413b83a9910a7e425aa382c2b 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_a.html 97b3f44a8bdce2147539b372e33e4398e0dbee0f1a9914edaa468f17a5acaf5b 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_b.html 71c493f4e7314697bf173baf5cb0146ce781629ee712921353f575944bd535fa 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_c.html 2d3b518bb45232ac1c90527e7d3ea5f3b1ed352088a681ab3a5a5ce74aca02db 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap1.html 1557bd2a9f9358209b92224872294c32fe9a1a0dae4e67b1b30d9b52726bb932 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap2.html 8360bdd654c0fb2ee94e36530ecc8494b8fead0fd28a591641f50def301b65a1 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap3.html 809e896db595c8d8fff914f32af54d81a559035b13bc8d753fcb8ce7b94effb5 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap4.html 8de99174c0d8d1d7db8dfbff3f2aff50fdb8e0f60c201cd0bf91f5f61f782b24 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap5.html 02fe3a64472b3ee002baf6b733639fd260bd2a09e7befc4522e9f50c8fa5dbe6 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap7.html b5e02086bcb966019e95169f3ba648ed1b3840b2975bbb3caeea6da553a2d6ab 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap8.html 128c1febaf1f5bd9f9651ee29a0b6765d32ac42ec3f1830f2401df0dd819fb8a 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_frag_hash.html 98840f8989db9a0c535fcd4e05f3627c6d7e1c0a91c50bc74824b08323560768 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_overview.html f343c8b4d1d677cb94796dca7182c92bd5dd87ba375478e1bdbe4f3998704376 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_registry.html 4812b498248f13772eb63e761b08791d2f2a23717e40655b95bcd0547592f983 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/notes.html 84514b3e02cae56a8a2291672d7540934d5aa99bb2a00f664305d4d57d7de9b1 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/search.html 591d9d8d4c7b4d14cfc01d303b77ee87277fe2b8e44b1c89751183cfc11a8edd 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub ffef19f5492eed6377d3d17a5bc55e665720f1108f92103682ec568d8e25fd58 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.html cebec1c52c8470e8cde9e0a904b85f06540d046bbddb2854738b808324df90e0 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_a.html 9ebde05a74cfc47b0d87511ab3d28d467bbd31e3d6b7ea052ecc847e9f2741e8 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_b.html 42fab28ccb052a7735876c74df1bf65b2eb407a4dd063f5df4ab91b8207e5371 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_c.html 158bf3e8a7d87afb6a24d90406df73e7a612858557ab4a2a540ef181d300a1eb 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap1.html b91855fd2d6d58cf212558992cd448aa8a3048fcc4bdc2ec1fc8945ba5befccc 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap2.html ef0ae71c6d689227e0156671b72de5a16da0ff80bc4e6fb5410fd299b7384240 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap3.html 8189728f537f54fa5b1b5a9be2638f48bec6e9ac3f1b9a1d54ff156b6b1ea365 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap4.html 72d37bcde80ccc8a5325cb2347afbea6da4943d2a106d6873394bd49a2b83ca6 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap5.html 3319e1a846680e41b2b7be58ede51bf52bfddbb8473002c1816ff7e4e6b52c86 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap7.html 368018a061de64b19df1da0e5524059ca07ab9da5ffaf860c2f799c5455197f5 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap8.html 84171140c37672cc5bb26e068c3474211c116ffea29ba7d7ca26f1bc3e3cc8f6 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_frag_hash.html b2b6b7f0b28d20f288dc25417beb59dda8a25b45e0ef9253295f93d9f5983040 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_overview.html 52c28d75b606f83be957f2a42c5e7eae838fcfed4e0ead044f8d483dc1d4aa29 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_registry.html a2f2b095118eb2acb5451866cb390998ce74a77a31d232824e52a869a775138b 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/notes.html 1150c7c1bee0fce246fd71522751596eb4baa915659f45d2e67578e4a36ba2d7 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/search.html bdce9d36610edf3670be3c99b0ab57cf32b9db713d590957cfd24d78fe85efcc 2 @@ -2989,2 +2989,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/404.html 20a882daf28444c3dd92f2cad9262602b31f0ac92a5121745800e6fa7c51e163 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/api-reference.html 6a9c0dac831d948d70f71f3c413f70d5e6f8e506b36a2a363c3ae160f9e23bb4 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/404.html 6e64e6ac63039f7cac97b455afb87288ccd4013a23175a917f82f5dde6a1ee9e 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/api-reference.html fb3102bc451747d1ee0541054ef4e76cf33c9ce5620e7677493f7e371c25a1cf 2 @@ -2995,3 +2995,3 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/cdv_cmd.html 3f6b7062f32fdd500651ac1943e0a8af38e524cacbf45e08f7b214834d193e18 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_ug.html 9f366fc28e6b0d24da4c8fd88c3f7613718d03ff117287654b233329b443722a 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_viewer.html 136a4f7fe1df98a815bbc5a518535e267d1ae526a0b105100a5bcdbba2de5207 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/cdv_cmd.html 7d52bcf4365c0e32514bf17f11d63c17d60b985086148fb4ff7bb2e4c1955d0f 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_ug.html 8aa937139edc1c8634da86fb5a2fd9be3b953e62e96ac29c1e95d680ba2f2bc7 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_viewer.html b2df0b1696734f0a9370db83fa87f5845beb23cbd3a89ba023a31bd72c916c37 2 @@ -3008,2 +3008,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop.html 7ab8e6e96ddef367cd641c355cb58d4cacc8c570cde11ae07418445d27ebdebd 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop_ug.html 7dbb069e74f412f9a9d7a34185af3a5f74463aaaa4e5dd62a7faf7785329dc00 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop.html 24e893207317345299f6e2bdecb649c065563b4c43024953e4290c5b85b477ee 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop_ug.html 9ac1cfeb458c0a0559969cc883762e747241ff8f18f1c9dadc76417d52462af1 2 @@ -3011,9 +3011,9 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/introduction_ug.html 3ffcec323793e43200d5a4b988ca7600aa68b4c186c896206b0fc05d6885ec2d 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/notes.html 6aa82848b7320b0dab15d32c90cd06a1b96c4f22bf90c66d928ad2e366fd4a73 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub 465cac2aa0bb9ca453dbee6a5bac41f9cab5f13f613e48de219bc2d694a91e32 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.html f23f52dbb7b3863ecf747e31d8114494214519dce04b10e2fa8d482e46a48cb6 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_app.html 5f9b93654973c379c6582250cb2eb8ed346374d133ecd5004c2556cd763db6fd 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_ug.html 546cd5d1d9d283ac00c45fb341b224e898df5cdf7590f9a33df6aafd359dc245 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/search.html 8c8b4ea39ac62f24226d9a4b53bcf1d8dee0db6ffde547dc6a0cf54e6e8dceec 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb.html a522c9eff8d047178014afb9409aeb2dd946c03c9bc67548451b3910cc67877a 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb_ug.html 575d5f104814e6a54c048eeda3e37d879604a48dedfe8336cd164c56498b82f5 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/introduction_ug.html c622ea28d1718619fa1f9142769b45ad711a27df323f9a6d8111836224035eb0 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/notes.html 0bfa9abe6ba6ac07525004bb026b04794cd940c762ebf3e2c2e95466b2fca452 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub 0ae5d93d9ca1495fc8a18f743ce54bb87edaf5c30c220820333b865e425a60ae 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.html 018b13880a5c0386dfec284352f318571227d90bb955e6f9798cf289912bdae6 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_app.html 7c2d2662e5f1706494b28e351adb9d68c0314394df2358efe295749d84d006b0 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_ug.html bf24583b8646c7e582ee014c99dd7882750681bf13e744c6f33e5423ea6e639e 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/search.html addabcd2031cc7548aeef4ade4009803675944c6699d98ae29a6721ad9da9eba 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb.html 3b568deed06a66095f0831458eb2abe7de65d102bdb1c7e8096e7f0524161969 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb_ug.html 87c7370f8b621a5f558e7bfb95679c488c9b28ef664ffc476f8fccd53eb65ad5 2 @@ -3023,2 +3023,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/404.html 1ae93afb59aacf471d868203b57175975a931aaf074e8be60ed66ca5a8bb6e57 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/api-reference.html 1d25295e92d2ba14c02772624ff020ed044ca6566a129ee5e4009b3acb456e0e 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/404.html 725f52b470e106ef4e415b5e3cdcad2030acb165c0b9b05c5277fa032c5c6736 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/api-reference.html 1d2bb65e4d695d672303cdd4f0c6e17be955ddf4ab01984c1620df3260ce9ea4 2 @@ -3028 +3028 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/databases.html aa0c53fd567232b03f77a26c058673db58504d1c007f22d3dc4770c2c0e5d1f4 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/databases.html edd135fcc4f8f2f19775e87f92433f0508c146e02748f6a180c7bee7aaa137be 2 @@ -3039,2 +3039,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/error_handling.html 0c28eabf9f0be10516a90184cfbee33edbf7db011e23f0cadc512c2517596fbd 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/getting_started.html 8caf6af4767b518b2f40f20ef9d043a077329c86cd45fb07856b29523c743ff8 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/error_handling.html 25587c70cd4ce565b515f1de335bb34583c9b7dad5b90d72826dbeef63b4a1b2 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/getting_started.html f285f7b198a65f4b6685c6849fdd5f98c479514caceab99a30c7f3815cebe36a 2 @@ -3042,5 +3042,5 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/introduction.html a51e3a75ca30d4d776aaf97d8917c36dd2f0d3ff6354f66bed38fc23f45abc08 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/notes.html f9c3b4e506c6f7137957a0e82ac54bc82ff0c6a43821560cbb166e01fa86d4e6 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.epub 2d8833f7d28621b42be07a754111484943d6e5567e78f98e1d9efc9c5d657042 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.html ba37d2ca23d54b5cb90c200b7a60477d3bfb4b1d75df6789269d71088a4d19cb 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/search.html a3161f3d1c883be05e3dbf9165513e45e8dfca8d88e9dec4012424d5d41e9b44 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/introduction.html dde7c8c523b9070a9d3ad3426c5130492b5b3783916489cb52bbb7d220558b5f 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/notes.html a9daff421bab305991af5ab8e075db6247f44d28eb2924bcf7e378e56c6ed330 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.epub c318e758d1fd6e10fbdbe97238f5db1794d6bf32ca300864a5eb66ed1209166c 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.html d1ca621c120f74813ffee577722fe70cc0427394999dffb7f70992bc2e611775 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/search.html 89333aa804afc3a2a04d109254a6ce16558982f23dea4dc6bdf0413c1934b990 2 @@ -3050,2 +3050,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/404.html abddfb0b3af24d497562478ce4e19872d210269a27d40b5f1270a76510764716 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/api-reference.html 03b60d5c3c441e820b8b51fa216e922631a567bfba7cd96c06346d172517c9d2 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/404.html 390c26f7498575094fffb83c23874de98637e54e1a226103309efba33f7ba5bd 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/api-reference.html ffaa4a07afda88a660a61636d7ef551bcd8236e00f024f7b4021303de55e11de 2 @@ -3054,2 +3054,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/cpu_sup.html 9f46ea86d6d23dc72abb914352c008103971b6d401374d160cff7b1aeeb748d8 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/disksup.html 2e9adcb07003e9540e2c474a6571551b6988fd4a27f4e6425d063b7a3a58dfaa 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/cpu_sup.html 1e59edede0bbaae62ca370c325eadb8ec3ebedc1854f94820ba69d42721c1409 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/disksup.html ec87a30e4d03d871ef9746e8dccfcc3d006ced3ed90def75dd67d09e409664ce 2 @@ -3067,7 +3067,7 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/memsup.html 797ed75c2ace1f7e8aedcc9382f27e0bc3074a317edffb2a2ab4b20341fb7715 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/notes.html c9938ebc72575dd6dbdea8ad6021e63ae3f385a685defc83b916c4f33d98edc0 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/nteventlog.html b224cabc3394e5bc387447617f2fca6c8d06729cf6f009eb1c201ffef4a4d922 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon.epub 0c25e9d1102e2fe314c6079d820a8af837ba3056c48e8371c494ac3222f77e57 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon_app.html d7759825c6935a0f61a02e8840e8053781fbfa27b006439c4b7d5fc349a0c25f 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_sup.html 94e92dd392d1b35199a46de40fcc0ea4e4b63bde687f54e2b06e061281a5b0cd 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/search.html 552a5d2a853abc9681a671af0fac74ab366c8e26cf4b81be62fdc51803149a36 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/memsup.html 6cb789781078eb9f749864b9110cf83c872ce7b788c4b807932ae3f615ba59a1 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/notes.html 1054c097f9dcbec59dd3f7ed1b1518eec124a4a819bd37c7de9994281763b003 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/nteventlog.html 7177332a5f493f8fc5453a10b02a8b412484ff18516aa828729e15ee92ea0c08 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon.epub f387cf540e44c28e52a13d142069f1f9be8025e74b190b39a7adc49082de634d 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon_app.html fcae8c52ccba7fb7cfba8d064dd719c126400f6fa99e29f64f49e77aa38758fb 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_sup.html 044f25be722550bab3f3361b4214285c0b7849efd345b29c7eb85061c48fdf13 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/search.html 7e4ec07c4cd4de0edb847fa59dd94555017f273b24c376d5ffd9c0bc965c08a9 2 @@ -3077,2 +3077,2 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/404.html 0fa652c52ea1182fde7e1b0b1909d739ef376484e90f9be14ad1b4c44ed432dc 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/api-reference.html f6dec33b18de079c0897d007b437026c19eb8390fb529cfe0e9937002273b093 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/404.html eead836c71d01e4b1fa49a24122d2076ade36778170c21058fb0c5901c12c430 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/api-reference.html 43a5597482033c11f9bd1e7ebe6508c647e134117f722b6baf1dea6829f5d565 2 @@ -3092,5 +3092,5 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/leex.html c26fd1af781de6135f90bafd5bdfc120187f9318614422e81347447623f1a1ed 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/notes.html 215db492b65885b131ce4e5c59e98716833234000195894ac8c04a4200d2eb02 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub c81f44c4856675dc3085fb2c53c21ae55c0f330d16ea631422b168e98518a7c7 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/search.html cc748be01beaff13c19da0e76485c2fa49b56560dd74e9617c3368fb81afe532 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/yecc.html ed36325ccf9785aa5cfd7203e716dcb205ae68b8d5919fedb0fbe7763bdbfd05 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/leex.html d4fbf2109fcb33a1dcd37a993384f4ccb24a2f67d7296bada43f45f062274465 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/notes.html 914feeb6fb9de1c9a9be034b1e5fd20cb898a81e3033ee6712a262c0a012d7c7 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub dad1f4e6a50f5b5f0d6d91a4a2bc4b3df844dad411dd85ea0dbd4d18f45cb01e 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/search.html 42ce6fdfa21d2fc9296d6b398d6d58fbca90771efa80d8e4ccc16aa2385bc5cd 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/yecc.html ee6ed874bb6329799deab14e73ed951ab5c422fff09a46ef7baa0fdfcbf13ce3 2 @@ -3100,2 +3100,2 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/404.html d6adaba0125a6a0516e5684a5eab8d24339de01435262b0605cf69342b8fc107 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/api-reference.html c0e984003793d7ce4168bf3a5ae161975c33f324d47cde578d6d39d6f4d25b62 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/404.html 2eaad529eee460f49186bd6e97044e2b94c6e9f3dd96f52e65449b4afdf0bde2 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/api-reference.html 3b2f9ef9948031be8417c857c7ca54f200535c0f9b0c5fd47edcd662dd06867d 2 @@ -3115,7 +3115,7 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/notes.html 4267dee694f700910ebe85e2b77b56d418c6b96719d55470c0deabd8d8447791 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub ff4b61164e0600345c385687b441ce6b2eeb8d937d33ad835d9a21883fd8cdd1 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.html 9f4a446db39ccd8d8b4c27448c426bc8fabf98ebedc17d42a76207ba025d5c9b 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_app.html 69778f54d27ad9bfc32a83acf3d96573b2a4a8c8ce1c2c8cabe51dccec06b6bd 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_records.html a8c38f5f790ab4ff4a3626e12cfd5865bbda4cacd8ab54d38e00915d9fef7525 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/search.html 6e0fa785754de2f41514c456fd6b154d661e11cdb8a96c565c0b2406d46b7064 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/using_public_key.html 18cafd2955a695d1aff12806a920ed27e583c0829b7039854f6d2dd3e3212e6f 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/notes.html 7fb124b3d87ed46c98e41395a65bfb76e0e8d25c44158d19e8144d0b929c76d9 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub 726f956602c7a0e72f5344b61004409fcdb741f7c637fc4aa4bfdc6a33fa0249 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.html af6de26f0030c632c985dad055bd783815d2da63a5b930128f07af5824836ba2 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_app.html accde6180457016d98e66f018f66571ed258413b52aef6414f153e8cc7a05547 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_records.html 06c686281f2c608f5cd66cfd85d76274152c93845db6ecc47b38eea4a865fa95 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/search.html df95aa31403a05767f4667ccfc4b80c50b6fb0f5e15bcdb4f3822f466374c89e 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/using_public_key.html 4e77aa8a756f552002e7a56d9ea9af51f8014afbe3d1f61952fd6281d65587ce 2 @@ -3125,2 +3125,2 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/404.html 280c185defb2466b9994e8b1da07b2314679d45adb18b092e1a57849bbf961cf 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/api-reference.html c3dca51595bb7e11db96d406e28219fd916e6e48eb4bac56cd450f14171e48df 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/404.html cff50375905be98e2c3c43b8193031424192b7b6cc21a9ea9fe99a3b161d9f22 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/api-reference.html 0024d2227802efa8bbb1768c2ef0b4199abce3ef51ddbd054e8e8cd3ec898e3d 2 @@ -3140,7 +3140,7 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/notes.html 25e9c8244b0c2223b9ab053fb165e655720003029f212a9da1974bd0f5645017 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.epub 67677499da211a5094c9b9e17146e0ddd070987436c05fd70ec25fd22212dacd 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.html 5e6395e94fb92ea8593f85a8ecac1cff64e5a1ab660008212c6d5788f0000a01 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_examples.html b1b13f60b53b04f378795bbfa20912337cb71cef99b61c12c324d9589f978508 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_intro.html 7f462cd4dcd2ae0c30d6d2e9262e109da2c9b54694a06baa37b1557549036792 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_usage.html eba3d169ad75c37578030068fd101b5eebd402dc44141fb0c1927df10a4ce618 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/search.html ca4c2359fc1d2cd4b4c6185b3da12d7fd4a32dd81981accbbd4116a2eab06bde 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/notes.html 229b61e3bd4c1e14e1eb3e712c69d256335e7e6810346e09e5fc0eddeb636ec4 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.epub ccc37e1b8cc7fb95b813a1a18fd8489f3d0d8312e3338efb354f123547317bf0 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.html 36b82b6f31ccd3fb94b163678c3b8bef7317bc8cdb40ce2115676ff3ee787d30 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_examples.html ea3e04f715af249caef7035ddc43e595c39b688051fdb9c1e5669899c6f39fd2 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_intro.html 1ddbbf3adff9d58d2c613d1d65de29abaf53f9349a5d49116e008b5b17022846 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_usage.html 274c364270f396fc4d161d973355b9bf4812eb75666556d3139a4dbab32d3d21 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/search.html 96c30ac5bfc2d3cc91d1f610bfe9d2e828c9d2e85b1b954819773ddea33c09ef 2 @@ -3150,2 +3150,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/404.html a635fe24edadc7e02a74f04c13e75d64cf69203fe182954ebc1cf6d4e0606b6c 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/api-reference.html 86b028d60c6cecb62bfe257817ad58a86630f334239ca7ee190319845fa6ecd5 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/404.html 7b542aeca81a78afa881281cdad6b82feea65a5037508b7e16bba7aa6839e4bb 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/api-reference.html 0651ae77806d91b210b8759bbf97f999bec8b30a6ebcada4e7f014d66b27d06d 2 @@ -3154,2 +3154,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg.html cf8c25bad59aa14fd99c1ceb8ee090093d79fbd4e61360b04d16b3618e0b3e81 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg_guide.html 2aed5f3ac54bf8c947005cbba8b5f65b02d5bd44a1ea12b146f05b6ee1615753 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg.html 884bf4e7f78ef1296c09d7bdfe5b88efc01672656ee4959c3dbec56b4f3facb6 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg_guide.html 8860d62fd7af45295b45c166cf25a1800111564f74ab01c4f83013608cf5d8a0 2 @@ -3166,2 +3166,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dtrace.html 384f4c0ceb089a940e7239fc1b62438da72c3ccc66cf24418f5b3677ccb84ab6 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dyntrace.html 71c180fd206a63e9f5901c14cb8a4c3451a628df1e408902921b04413218f8d6 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dtrace.html 796428d97f5fc7cf6c1aa8caa08ef2eb275181fdd04aec87d591ea8825b047b4 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dyntrace.html 505d0ffaaea28d5db9a998b6e7de526a20da602db60e95ef8e5f02b398e0c107 2 @@ -3169,10 +3169,10 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/instrument.html 5c28e112a6e8ad528c177d9d1a71c324de417cafa919850c4fd73adfbcab9989 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/lttng.html 54b9676b4a65f17d601fa6cbe2eb0d343bec4267542b85d6f218c42184f48fa9 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/msacc.html 6cb50b07c4b0f2050bd192f7811bce562efaf28ba85c489873d4f2865cc135e8 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/notes.html f3fa7a407e53b9c26b347257892b6e5b5887afb45ffbf1914c4013d220d468aa 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub 63ce895cfe1981e122795021346ad6aec6382536634cabe84374f1e7b2ed3f71 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools_app.html 3c04ba8f9983099d0330a51f57ce4e60bac9c7fddf820b852d80147024affd7c 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/scheduler.html 548c4c0d5f33543ddcbedf8b6c138b11336e4440d36fc0c954e02dd5b1e61c60 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/search.html fdc77cc698fa1028dec2fe2ed394de11bb6518e686c25a0572f94dc25c5d450c 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/system_information.html d1cfe18945087053795027647e4376fd0b78185e8adacaf39c546743d32471b9 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/systemtap.html 0aafc78769cea742251393403bcc0b2f98944204b0134acb6c452379b56ff592 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/instrument.html 861e5d0f85acdf10f588e1805c9490acac756120cf788eb8d3818e369956417e 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/lttng.html 24f1537502ee8bad2f5d559fc5a48e1cc1a964ea5a3264c32a9d6019a225c224 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/msacc.html 6c7f2a82a11f3620e649b5392d4b599cf8b61f656b0ef9853034c88dcd2bea30 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/notes.html f2454d428faf5db4aa4cd461f167e42b711a4def291d8ece6c032ac85de06a0f 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub 427f96b4c184f5ff0462e02ea18bcad02d07985f2700a8bd0cd76579b62f7467 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools_app.html 8caee402cdb8465f60a6592aaf4e207866a5408cd3e7c48f7258e22264e81536 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/scheduler.html e32b9c53d52ebe8e545b327150f70a049ee54339e9b54d234d2046b56afb27d6 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/search.html 25cda15aba8f58219c1c28e2dba4918007339073f86b90aaac8e89aa25515a8c 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/system_information.html 4020958ab3f5494c64a04a2a14ee257e4250477ee58f449de6b2d53f07928199 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/systemtap.html 532a14fee546931af62ad560bb00b61bf6132d7d47bdf45938cae64ad00c3d3b 2 @@ -3182,4 +3182,4 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/404.html bdb2117f83fb41a10fc8271a734e240ecb6fd0ceb17d6dc766dedfc6df9647d7 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/alarm_handler.html 7d4e16d2e7eca6e479ca9a113a0b550d134ce6e9c75a75671b8906c2bc26cc10 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/api-reference.html dcc038e9789b19fb7969f3b6fce322ab718a65d8e3724dc02f93f5174392fa04 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/appup.html 9b54ca030a865ef23b28bf756fa741cd65b3774d5b11afef5b91d07381468fea 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/404.html 80d5d81d4ee34c7621e5129b968a74ef49e09e7f709c6a8fddebe040ad0ae979 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/alarm_handler.html 242b2be76ebf2081db25770ceb4a1390f09c8f7ebbc51d647621bf4f54abd793 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/api-reference.html 5223daeade79276fe5297854e13b505395fa3c42eb9e9b61d22cc4aab567630f 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/appup.html 0d4abcaf0338de6c3df455affbede16f69134ccb5397339fa07cdef00c4bf02f 2 @@ -3198 +3198 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/error_logging.html 90028c3f5b7a21581b549d37b3e111f059f071a82d88040816ba38d7ad9c9b3b 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/error_logging.html e58fae803f79839c88af02d8ab3fa748ace18322820271107c048c85a48dc037 2 @@ -3200,11 +3200,11 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/notes.html db2168930dbff1a6351025a8bd028e82e17a8148b6f4785f8d1bc1496d52def2 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rb.html 669a99ff76d25ef11b805de02362188b0491fd0444216434ee17226b8245367b 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rel.html 7cdd0bd03e18c9f770a12c8a85fa8473bcd8dbccd318ad812a46596f558d87e7 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/release_handler.html ab208ad67b1baa5e56d3975b23c9c5112e32f1986cc166a68f1d5f7c285d118c 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/relup.html 986665b1debec81b6940a68022342af2a65989824b4b1713abe48a6cc0c323aa 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub 7caf08b7649130873b5b06e8eb83cefb108415008ee560208e9c6261843fd684 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_app.html 025a3765d617a1e3af96abaa2cbba4b5a8ab0e395228d2644ac835627c801d76 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_intro.html 7dbd9ae48a982fc5e0e0c40377df47be2045f2c9ee933f27c4551d29f1acb53b 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/script.html e37e35f7485bd2a34eb7259bbe3a2c8b5acc6720ee0b6ff7acce2a2ae540a3ae 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/search.html d8f52b7a76725461698adb0be6e494a755dd1586e1814d52ce5f4f1e1ce8c6ec 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/systools.html d8aec9b8334d101320ccbe648f46fce445d95e532cbef5053df3d4814390993b 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/notes.html f361bd62a8ad476dd72081171eb2a6ec581f80284b57a21f46780bf0307ca20e 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rb.html 66769b8e72cb75da3ad9c41cc80af0309cb3f6da0ab385b23f1604d139a92c17 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rel.html ce04281f828178d476668840906590ac1b0b68c5ebed0ff34bfe2f3555ee22a7 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/release_handler.html da4737dd38ccb3977fc8b41540bdc15001a4d8e1569235157e39f04054364d1f 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/relup.html 473e09288fecfebd851c33a9bfff81796a2c6a39c4063a3beb5ed13e47385d3a 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub 8cc6f1d35d05869eac7e5356b5a38a04b1e4329e31074bc7bc33f6a295eaa47c 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_app.html 203ba909ebe468dee7b41f6710d678275f2e29da26a0fc4d18cbbd59c394fa47 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_intro.html 6a6591ab053f3a642509706574ea582ddb2d09b2ddc5f1fa4269855bfd6ecf94 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/script.html 4b2f6572e3d46f6a3ebdd14f1028ee2ff5ba4843eedeb72aad653f629bd44171 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/search.html 0b464817a866b48d7f57ebff1c5e3315cbc81a9eea7bb2d504b46555eeec2b3d 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/systools.html 4c43764170c7961523388d13c2deefede4b07d6d51473a9a69cc65d4afab0901 2 @@ -3214,2 +3214,2 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/404.html 1bf262aafec9fc48ad22f6084e19132e93a24e4511b4f90699f726c9980f47ac 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/api-reference.html 106b3040289563731a0ff2914a404bdc57b6e88b806d66b5d71c88f2525e1276 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/404.html 5470a3750b1c392d7cfe78742c86f4625d123507b3438b1edba112e02827559e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/api-reference.html 39a9e41b66f1d703059878daa654eb003d2c3eb0586c684c5c4a0cb39cbee81d 2 @@ -3249,57 +3249,57 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/notes.html 0ee533b1b80dcd4ee50056a9969876d2517cca872c2e56b724145e2b26453da8 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/search.html 4f8553934be810144bda3581c66c6ad2166e7db2240bfa64a4941e39565a382e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub 14217a033acd2fa8e2412b2943978ae97bb458ea3d313f9acfb449955ae2a542 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.html f56b3a47de9098ce42503b8508df6e49444003fc3838a6516f66001924bbe3b8 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_advanced_agent.html ca48b181cbff1e33d07e7f0f876d79e77c92239d7827da5bf2a4610615ad18d5 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_config_files.html d0eb838aca26e9653ff1205ab45543144cc08c621b8d285bad67244fecaa95e6 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_funct_descr.html 99f8d63e32150cb3bbc1101567eef01f56681e341a08f4c25f2e49c393b314cc 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_netif.html 648652e39369ea5756ca8cd1ed9bb184305d8001a83bce0fd8af5150dc729578 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app.html 8d9104be10b2e31111361c51cadb777adde31dd9a5f5b3073477eb7f53644182 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_a.html 7cbdc8fcc29948270d2f622cf0b4097fc7fab93e99e9032d1dcf7a3c9a8a751f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_b.html 707ca23fd9b6e872fcdfaddfecc7c6777afa27ca6073889e5edaedb0e79c477e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_c.html c93b4412094b79884c8e1a439de2e9fc0709dced9b1eb3265ec813f789a7818e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_audit_trail_log.html 7e56e42c6a40580df24e3c4bf5ef3a953f7dfda282e765e935c121f4c3600ac3 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_community_mib.html 4f17eaa562d15a6b7f06676d71d8e2960e72fde6d0da24521a1fc426b5ea0dd0 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_config.html 574a82c56fcf442235c6d556bc15ee9779838c7830a76730069d220ba71ae751 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_def_instr_functions.html 58144936e2d3daec05d4ae96afe625b3b197aa90fbd597938194cfaf7eb58aa3 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_framework_mib.html 32043d4e5b572cc6b77f44ae2b5d877c543394aa90ffe4e4e6de6b6bdf52a483 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_generic.html 7fa9c1cee3b8b6401d4fcf6a59bfd88ad55e46e6ce46e476e9707a7d72e3c1bf 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_agent.html 79984d1241a0e2d6d377105ea01aa2382b9b648bc6ab0f698d21d5a8acf0fcf7 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_manager.html 3fb7806a90939399c326d3ea4f25d1a6cda27ff3f6ccc855b0277fa5ea26c101 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_index.html d5572b700f9264cfdc464c85461e6f6ecc14e10ba4899184d15f056ed208b7d4 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_instr_functions.html 0e09f742a4066003cf0e4c6ac97327d850f9171b452b86b1d3db0def4bd78947 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_intro.html 0f3d77ad6c79e4b95f7a8f7caa3b1229af7424cbf88a3e14b70f1664b09fdd62 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_config_files.html 139ead633533f65d06ae9507c07e6d8e4c16b69778b7a1ca8b75283b395cc614 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_funct_descr.html 69ffb1fe7e4d2ca687848975e1e7cc95572331aa8df86861ab4f8e2e3a0a0232 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_netif.html a00797ee453928b813f9e6d58796a5204254d0025c55e0c9a2e8c4b047919fb7 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_mib_compiler.html f8c60424292d9f633142f86b76f53b5586441511c88bbea075eadc863e51bb52 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_notification_mib.html 609498b137fa5b75789bbc7f6172fbdd201fea6d06a23f07ca124bd01d36b376 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_pdus.html c33bfc0063d9706f415aff52436ceb4bf4787f686c50c5020c156bf35100387c 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_standard_mib.html fa95efef3f41d34666f240d060dcedaedd4b4ebf474dc2cbcc94315f16cc379c 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_target_mib.html 2898dfd64c007e575e9544cd62652c952898a6fb876d18a20f16cbf4a40630ae 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_user_based_sm_mib.html ea3f7c2c3912d51a25ff4bca97404488d6b03aaafa04a92508a3895ede47d741 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_view_based_acm_mib.html 6b7d4ba9378d73491a2c4b06eba9036340d0e28eb632b44ea3275d9c493e59a1 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa.html fca219a87cd6409ca0fae11c9b93ade92171afc905b10e2c2af43edae4f033fa 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_conf.html b0e99f6021329aef147c890f4c8f58c39fd09245345748f84df9e51d87dda572 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_discovery_handler.html a25f94d8206792a21b690448863a2db50a3585519a49fdb506bd8c4f4db85eda 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error.html 6c28d64679fce6ae7264744d44c0dcbd8589a0b8bab63c43a75d3a63b6a38d81 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_io.html 86e2cd5ef2096a570a374d5cafd37b13059bdb7411c8f801f9be5478b90cea34 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_logger.html 98b398bd68158f69a067514db147146e18d797c7e808c75573a991cd40850099 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_report.html f1866c50e63cfcf77d8cab742d1da1dae87b65e0e03a5be3048f4869b82f93dc 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_local_db.html 2b605f24520de2417b690de6464bf65a7d945f0b146d42bc45aba64e84be75b9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_data.html 338f1ccc280b9532bbadd75577c9bad8c526c194bada1dbab5be4ff74618482f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_storage.html 5ccedff197ee8d0cbc1f7550431426e606ebb040ca2e6cee3800bc33a082988c 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mpd.html c3333654653934c15f788eb76abd7e18b7be1b528c3abf1e39ca434cd33f8138 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface.html 875a1e3a76ed9473df4ab580952cc0694a7d79e73a70cd5c805ebe3422bd58a3 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface_filter.html 321a906c036dc7ecd78ae092299b28db3b6282533d5d4efa8a69c0b7e4ca6c64 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_delivery_info_receiver.html d752cd43fe84efd6de3329c492a8f96ed306376bb897cc5749f50679d8a515cd 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_filter.html f190dd0d5520753fd02b9326f6f1572cef99bfbbff38863d768e8d515269b82a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_supervisor.html 90fdab9117dd7930ade194b240d871f2139fde5c0efdef136c74d3b1d1fb5f38 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc.html fd584069ac0c2fed7a609d5547f16461c9dc1f8db5ad739d79b7a6596ba95859 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc_cmd.html f5b6999353dc4a35d36f97ab487bd26ccfdaca21db8efe46edf59cd7d57930bc 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm.html cc4f03216bca9f9ed6458b3831bcc7b312209d8a9434efa0ecc8d95be1ce3c28 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_conf.html 2b93240e1d259d5daafed0483421fcf2d7b61101fdb1a15d2c0a01bb3140ce9b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_mpd.html 5516a3eb424dd090f308312794481c0b3dda0195c181358c77f057ecbfd4c8d9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface.html e4d836d999362968220a6834236ab2287b66eb9abda1f2b3896f625ca3263559 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface_filter.html a5d335acd5b0619e6f3494c3048a789494aa11d421d0ee4c31a10756286f3c2f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_user.html e18cda23a0dfeb957bc695a760047cfcd388560623d421c02320c38264fb3147 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/notes.html 33129ee7b6f15b2d2f810dfc61f189ec2cc2c84bac5b57cae2ab2556e8d95b8d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/search.html bbe823b7e462cb4ded3d589d99d307642c0f242042ab480191977bd95d380da4 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub 5c85c6c2e6f4d6206c25b531344c1189363cad7d5ed177f43b7efbd4697e4700 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.html a15fdc96af6171014f6d67d36d43cc18e547c7ef2b74b0a8e391eb70d812dd75 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_advanced_agent.html 93d51b2997f09d3b73b83fd15ae9ac3461c467ef5f6aeb56b4fa16c42ec37f59 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_config_files.html 5541b3493e07f13b5b0b74ff06cf72457c010d1ad6ec93b5f61c3d61256b5b44 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_funct_descr.html 8691507f6f5d454e61ea8556281b7c0120f53109072657b228f890848540fa80 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_netif.html 7adeffc819359343fed5d9352cbb5dcb3860ae59261bce5e6f9aa3f40b29f0df 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app.html 3f91a7108143c10afa22d665e67017f25496ca5bf637bf4374aa4a5e12da13da 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_a.html 71e75104df8672fbd0f19734ff9a9f4c033a6c56557d8b09d81b749cdcd941e8 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_b.html bb25b87266a2cad0e87fe103cf92dc9e7878bea4473daa7a10fb30c6f3276fb9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_c.html 42dff229c4f72a1aaecb931e7c5299183d45f615d02018dbf4af54022220ca58 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_audit_trail_log.html 7ebb226c1f51f34eb4e931b7578bde52df3b2f526c264e1925de43dc30ae8234 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_community_mib.html 0c3b755d2878348168e4c4bf7d457415b9a05650b5e06e9563ea6cefbb4c61c3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_config.html e08df2c164494df128a5c2b2c9b09f2a84ddb9864a29b14390f3d6e249465aea 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_def_instr_functions.html 2b0a5a2ec0a14dc48e32583ad06f7fcbf68b6ad93fd52458030f9c1a576c1c4d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_framework_mib.html 8c8bada7ab0c4dae4f8a651dd6e2d67fd5c6550181017de8cba7298f68e875ce 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_generic.html 78e5fd96f6175975b9d5587665877c977b9afed5902e1bfa3bdae098c32f5950 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_agent.html 1b95ef7bcc9e05702f5d2e9feadb44469d7dc29665d5bc4425635ee459e80edc 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_manager.html 2eb626a0d1806dec3eafea34036cde01932000215cc6ef2ed5e10a20a6d2ed4d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_index.html ea7f922f27d9b0fa39265030ebfdc89a3a6647159ec6da1e13d9a3adf920875f 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_instr_functions.html ca2684b554d933a19e05d9fb9c097d67d37752cc3b1d21070f1b9609a4dbe88d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_intro.html 97e9b54c015faa5b82e92065fb4650b24b9722ae9c38982d6edcbe4370322707 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_config_files.html 4d6c3799a74708f41a91b16aa56cf6f8285f5404f7549f3321d2821831e0ba62 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_funct_descr.html 0b3c0911ca17a66d21cb74d1ba3e1d7f9b078d25a9ff245e59d664508663debd 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_netif.html b1d8d221ca8656ace68b64a88956b5d7167690942e856bf069ccefc2418c9cad 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_mib_compiler.html 9f47689604bf93a4ad7728e99c4de31ec1b83dd65ddd09ca6f83807a1505d0bf 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_notification_mib.html 96e3ea1b8e14c09fa09c9a3a306d5311ca0d804d78d911785c82320bf31abb0b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_pdus.html 6c82c8233e936cc6e6f5dd185a2d6b3558fe692bbac7eaacb6fc1b55e0b97f82 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_standard_mib.html dbb62f839aeb50bdceb342bcda9b1954de859340e1b26abb33065f71978654b1 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_target_mib.html 39d61dea3573561cb28fb27bbc91c31f396822874058ec75b4e21adf7da87bc5 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_user_based_sm_mib.html be0072ba494bff9567e6aaa21b836ab3f9fdf6af7f09721504abbe34e20b8235 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_view_based_acm_mib.html 4e617ed267acddaba815e61a404b5f9455f54dd5be87458356e235c89036679e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa.html 6667a9a80435176757eba99e0769e2401ae3a4e3d7088538d8aa59feaae32951 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_conf.html 98f4c96c3d4aa4343759ceb9a073e47667dbf432a773d8f04790680dba75d57e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_discovery_handler.html 2c512fb685caf51e67286b90e9efd725b50df0fb1f977733603b805b0c19b777 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error.html ef4e5426c5afe06cff6bbdcd4ad2cd80e68b376aad395432516ed8e18fece364 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_io.html b8f76e91940118b99544788b44c99da71b2a5c4d568d73c77347c3729ab48df9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_logger.html 13153102caebbe50ea4ebb6d086f54e9fb1b6d9285c8e56677f36fd10a1f3c3c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_report.html afc3a155852cf4e1ea34b9abaa12b4f923c485e262dc1e8795899acf8dbc865e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_local_db.html 5728d106d002f25933d5e013b4ccc5737158d59728c511545caa358a7505f4d3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_data.html bed347b57e9aa5b695f5ed422d44bfe78573f954f8ccbd4a3425da1375dbdee3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_storage.html 80653ef2ec1b8ac8b7914d8e7415c7a40fbd08a88fd9a896a09ecdf65d0b6b8a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mpd.html ac09dbffd07749088a70b0eae5d54245d1c16190432551ddfd01cfc893e21c22 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface.html 31c10fbc9858658fa2440d091c2776019ccc81bc8f7b7076c801082cb9693063 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface_filter.html c361da4625b2b2359a5dac8bc0b4a1e8faeb42d5cab52cacc0d7de391ac0c983 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_delivery_info_receiver.html b51b76ff3e9a79926465b48f50a2e45b93cff33e3e36bb405e938ad5365e832b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_filter.html 4e14838cb7efdd0478f8d98bda6ca31adcf2023149a3ade9a93dd997f08dc99c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_supervisor.html 2b483b4aa7a9276df5c2b31676a29c39f14a2a83531355fbb12a94cfaf8fcf17 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc.html 90adb803109e02a1d25bece05bb77585afd49c794b06832df73364d532d27f93 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc_cmd.html e32147464ded938f178eb466687e61a7345e922639535eb80fd4a9d36c5b0a43 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm.html 4d6bc738f5a5724ccacd53491fc187fc7b9883895a44099cf81b6db33886a735 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_conf.html 4a53141cec14e0aa8475d606f49a5590f8d4308736ec3fde89c5a5255d6de0c7 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_mpd.html 083083222cb7832cee3d95eb7ef49e5467ace2a1d61ddbbb1fd367b7f163a1d6 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface.html beaba1be3ca17bd7f7a2826f774a9258bbffd79eaad39fbf77c46bbcd8729351 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface_filter.html cc3a533986110b67bd474e4838f0a2a0ec0cb6bfd92a59780d339ee050f3481f 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_user.html 0d0882e8f527db692a2cee6de873a182148f31741e1671d940722d779251b651 2 @@ -3309,2 +3309,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/404.html e85146be6922afc3dd1fc7d11b11ebe3aab66d77f233e9c96ff2ec81af572422 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/api-reference.html f3249f205bcb3544b9e5ee0318b3f13bd20f64c39181359cc6e3f9b36e346bf9 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/404.html 1a21ea56942c60e35ebea35874dfe573266a33db82cefec0d82502dbbc01519e 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/api-reference.html ca870eba4a399c7b97a5352bc8d401ae189c059ecd9b7017a52c2d5a0d135b13 2 @@ -3314,2 +3314,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configurations.html 7e6a1021565bd17b176e19966c1f3ff1bff8c971ca71d5353cfe9b66cb39682a 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configure_algos.html 3bc33de97451bf83aebdf6dfd5b220d170f67edb9d41b9d0e138f8e6cac4de68 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configurations.html ef8fc4542a8df7086f1d3208ee8e033aa290766e649f74f7887dfdd33ac3f5ea 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configure_algos.html 9762367cc4c79b5f4708b91fad49668f17660b6ab867525d6bdc69ba8301d93e 2 @@ -3326 +3326 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/hardening.html d65f6d7501a3e6367255340abf282837f336a681fd07de16e1f35e86fdbd5668 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/hardening.html 456389cd0aa57a2aea755fdf3d086ba58a0390eb573230b61132afe072a06ea7 2 @@ -3328,17 +3328,17 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/introduction.html fa2a9a102bfcd70ae68763b26eef99642de6b0f1cb1345b3a4da7bf96749dc2c 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/notes.html fbdd7b37680f126abb475e8c1fdd633194ad797e857aabadb62843ecd16506ec 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/search.html f2801881e86ac77e8c795c1153f4ce7704b3fcf17cbf94cfb9a26bffb766a7b7 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub 8313acea765f3d791c4337bee22e4044d627bd99cc43f571ef8d258713c52537 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.html 88f2f93a1fcabb313a8ea4b0349eb28a401d89256d201ede479be969be62aa08 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_agent.html b95a5ce2dff259b2b8eab9f8264b7115bd4bdcab67cbc65965b0e18e09833791 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_app.html 96c60921eb1a5987748739151ff6176749997e848a42857866b8f5e626a9e33a 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_channel.html 8d4e0a7be1b88673f7dd3aa820b7f77d7058da40760d5d70ca0c56efaaf72fc3 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_key_api.html 98ea8100850afb1b6c01af7cb9b8223905735f89bb23c68101dab46ded088a70 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_connection.html 3c638e2ec75870f0aae5db9bebc5b45493be0f725da546b34fff853cab0890ac 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_file.html be50bde0990a4b758137d44cff186cd39aa3c74cab45c073f6e3e0a35a8ba9ff 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_channel.html 37e35bbe1fe8873fda5f3d3fc4393c5cf1971cbaf6c2cd859ae03540d29965a5 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_key_api.html d79a0346cd72e9a0563f835c7528e866b0593483d5766bbf33aaa49a19677cf2 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftp.html ec7011a6709d315fe2774e204ece28c91aae684b97736d9338c2e9e9a5e0ebd6 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftpd.html 3fa8e823cca234aaa05744edfd30e876249cb608794910c8b1acd20930efd256 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/terminology.html d62c919b094c138c02e52c9c5813e30bdc504807338ad897a1d0875604ef77ec 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/using_ssh.html 7134212835df7a45da9f46ee6b7f70d61946e7dd44c1efaa4338a4abb6e859cf 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/introduction.html 8765862e4533e45d929cdb730da4ed55ab9bb055266d8557ac79484a7acede27 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/notes.html 86258c2ca2dc693f0c828aa25ad76235d0dfbf57c81fd4080ea09753783a789d 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/search.html 2571deebfe9bd469b3b52300b9c783802c1ec0a41cfbedf480145cdb8d657ee3 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub a30e70b692a78d8fb554baf3cc3fc0d75b8d3e00c5ac4ed97175c898ae4f51c2 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.html d0cf4167a826d35c884d47f615a2719837e45d14382b9b7051b33a29274f862a 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_agent.html d9a97b6771be5158206cba7d3f54b9054e627822a2ccda4b797b7433198ba262 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_app.html 34635880c16e22f93031405aaffbe1e6a56d17d387de63bd0ab43e61558cc083 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_channel.html 9b34d77bbbabda5787c7b7bed65b5802b14aa849b43a13e4a31fca0a2b3d1a02 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_key_api.html e71c24698fcaabe7f11857dbcc5ef10f49ef8b6b7883c80b56b1427319d95175 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_connection.html f42d8745744b9565e1246304fcb51798bb7bf04b7d075b56f5d01c4d530ce145 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_file.html 34273a0702416162de8d99fe72ccf6cad00c9a19ac2a4276cee0d198b9255e0c 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_channel.html 5915605eaf1a33962c6c9ecb9146ecf9031524ed9d5814ec7bcbab588ef08647 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_key_api.html 8d840ae6936e0714308a3f56fdedcb6a4aebfe40a17dc2e782a00a70f5192e0b 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftp.html 213d7b26e18df385d7f49dff1ef02c59e97fc9332ce7cc046466dfe4eeb9f602 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftpd.html 02bf3fc58a0c29b87204226f40b9a678202a14195215b3fe7cece1b15f6c66b0 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/terminology.html 25b85b06da488f4c9823b8c149eb871f40461f8c595de4cde2cfcaea3eb88c4d 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/using_ssh.html af4c1c3f7e23e66cbb26ebf2d7673c03436d05ca44fd475536db9a0facc595d2 2 @@ -3348,2 +3348,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/404.html cb7349e92e57268acab02083909f9bb12469fa9a039165d57da18e714f78cf92 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/api-reference.html 251b70ae28a1150567e203ba788c7bfc3ce3c289d98dc4b8665441dd3a4a3491 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/404.html 0d0052663a1f16be372d46ad5ca98d7ca1dbd193384771d5c30402b0fbbda3d9 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/api-reference.html 1ad21ab416949599707c00ad160d7969d44f761e4a480f4a6a21df0aa876d4ae 2 @@ -3363,12 +3363,12 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/notes.html 75a9b51d1f84cf91cc65796c0cf041ab2e7dfbc2fbadfd55a2ad4107c32ed538 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/search.html a2c03ca87e9d7bd6d0f562647c1c0ec1b33c1782a4545ba19bd7407b8195ebcf 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub b955e226809043b71c3c04a1dee35ed72ce9cebe2b38f7c52f170d4f718d2d19 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.html 575b6fdf4107c8050f07e53b9e183e45f3a4e902485bd5070d5ca39f761f59e0 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_app.html c3b37aff681f400294385fa14b23023c7e475319855d10c94dfb6fc42feacdc9 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache.html 21a921363de6cd1490a350d8e19d5d50bb22093f6c70ef7f6a1e5c9bad5a9bd8 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache_api.html 0be9fa9aaa218021d2f4165546517896972a8a17b8552c944ed45ea4af88b79f 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_distribution.html 4c36c00bc0aea51a8ae8b8ff9a19557e39415be9e078d834ccf9edfb5bdcef64 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_protocol.html f5dfa35f26899019e6ee1ddd0b5691d4ec0d0c0aa3331deed4bf8c8700ebc647 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_session_cache_api.html ebd3ba64b8e1e6299026d096396651a3bd8d08ce395f67dbbb0e2493430e1075 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/standards_compliance.html 30827414aecb681b27ce6d683a738da4d6eb21b95417d83688c0c6402842f1da 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/using_ssl.html 8bcd8bf1ecf8730312956fc5264345956c36f2d95ddaa549698678c71b5d3976 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/notes.html 4c311bd8598b531cbb3fe956fe94ea17bda56fa79befc0315b36f184218452e9 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/search.html d6c3a53e27c90abb23b71b527c4bf4daa58e12aace578f23fa52e4b6aa106e24 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub 7e184146145be0061f4ea6a3b5956039d97cadb0d677112567314b18e799b6e0 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.html 0d85bff215c80450d76b100d96489effa2e60759044693cce6f7d3eddf91cb91 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_app.html e88cf07ad8ed40253f687f0708c9dc6c227dc6648b90bd599dbc61507d2b1b4d 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache.html 4de941b32869df536064407ac27b5b5feb546c6a9838feafb971b727e0e49c8e 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache_api.html e4c08b67e60df5aa9301d411ec56c80dcadaabc7ddaed598f1953880c7f4b9f3 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_distribution.html c4f8aede6a9820dcd8c1bafb571680212686cc64159c82411886eafac9a6c7f4 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_protocol.html 97dead9c413d6f5f04b73fdfaa91fe7b19ccdd93da3d80ea4bad23d6bfe64d8c 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_session_cache_api.html 923cd102620afbcf8106784c748b54c9103468c6b0161c011a04bc5694edb018 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/standards_compliance.html 229fda77d4e6140564d23bad56f5915cc3173e2780a307cd9f523cb1cc5a2bde 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/using_ssl.html 3eccae34ef5a2243247b2ad4fd80eb222fa8326ca682ca956ac1735072180102 2 @@ -3378,5 +3378,5 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/404.html 5257d4e513c580ffde30b41720d122b8519aac2ec2d972c29e5f5cebe294ff05 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/api-reference.html 8a0eb4200d1a4acbf4b441a73c62b3cb44726a0e574de9851f25198cbeb66994 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/argparse.html 139273757c6886f06aa8fa25110eb2c223756411a0af6e883e50a2a58c47153b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/array.html a190eec7de041f31349f1af9396c29b87d037d25bf2445744fbc8285558b95de 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/assert_hrl.html 80ffa6be1a48266e140a4d97b7220ece0042b51ea1c4deb683e09f661c84b128 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/404.html 1482d1825a936c68c0aa9221dee0ac3fb01b3ea1f9b36cf819403ff2fc1f0fce 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/api-reference.html d470106e06ae3ed5c2e95ff12ac2f4e1c07f8359d7a843654795c1ef96c53b8c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/argparse.html 4ebe4a25b927ee9f746b8f1cbf142cb86980c44d771c7f89c4b5d871c1ae9c28 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/array.html d0e538d202689c17cba2087badd7afc80becbb1e9a0fb5553c1044b1e7143a4d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/assert_hrl.html 20402bb45742116bb9f4ea5c8bc99178b15f1950083888b3c42e394514753896 2 @@ -3387,10 +3387,10 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/base64.html 675ecbe0670c3266731ddc2856ddb5e643f0a19dcd1de0cc10effc451e1caac5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/beam_lib.html 188131cd28db39350cead12446e1a5db6177865ff61f87f9f24bc123e1096d6e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/binary.html f35929e65e9cc3a74ad04e77263b668fb2a7e7448e6813475e878f43828d3037 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/c.html 6c97db536d84c9dc70ff9b5412c3593d2987df3a75d0069a82b28ef4b4c8c68c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/calendar.html 55d3edbe4f3f6a40d81965064397cfaf8e2d2700a2b94bf66f10773ad86428f5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/custom_shell.html 2c8c0c5d570a242b23d279963c4e04b5b3ff941df4b1d0836d803bcae1c1b476 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dets.html b62bdc6215476b3537f446ad0c822c613adf56178a666dd05bef791a787e01ad 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dict.html 24448d7f30affa581a2574235150a0fcfdb2f46803b0db80b8baeaa7db9a8573 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph.html e8e43993a058a51ef6f26592932201580d33fcdb573fd6c7b4839a7481c0dfe6 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph_utils.html edd5ec1c0e2c7760d8a347cb8c9dce096f22ff5622ee5223025b59ff8622e87b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/base64.html e43232eab9d07a0f814bee9c85a9a7babb08cec73eadf5b0acfb5afe61a3bb92 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/beam_lib.html b8fd0b22e700221cc8fc8ec93b0daf987906f9f1bced820604f083fc2b5b8329 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/binary.html 50641be16a23b814a994bad2a7233ccafd4cf53c294da0b5b10848aff3a2898c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/c.html f51aa8d43cf9db56b2479c9c5e7ef53d4b9b01a8b1af9a824c65bcc66da18c3c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/calendar.html 1832509597c616291a05753b67d0dc92a6a5002b2162342c69540733cf3951c7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/custom_shell.html 8cd233727e049aa40a17a2416c0d75edcfddf8187a25e2dc013672397c908524 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dets.html 2485c1db479412bad12fe815da6a8a4c36035e78728fcd8869dc586b5ebb0c51 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dict.html 74b7328e581dde6291e9d9d94d5c608e62bf671a7bf759f65e21e1a1a9768589 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph.html de861f849b69dad40d14b99f30b6c5840d9c8b525c0a0e408b05c551d7439f05 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph_utils.html 6ac9ea74280e8a4fdaba751bd83559ec0952d1591d15f9800ab00e55c7656111 2 @@ -3407,26 +3407,26 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin.html ab339a121908374b9bdb20ca5fc7564b899b4797be631301506419c815515491 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin_expand.html 868a88001d11dbe91eb5b20b1d09562a76a0fe7f589153025664d891641069ab 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/epp.html 79c4efe3cf21e376791c0bccb5b64ed81be65f4c93bdeaf6b48cfe9f292df674 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_anno.html 203d077c9497dfc77bb7e6a7121cfe972920b83a127901d921d32190bcb98a99 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_error.html 777f3f0ed469106056792e9ba88f058c9395654431887f7923fae45628030f23 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_eval.html f96eb51ec39be49bd5ecc60e30107ec0ccfb6369b1f62e9ce8d34e0f8bf8baf0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_expand_records.html 8a9799e32afbc6273b95351294dc7da0f729bd4356f83400b8f610ad9a1ce576 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_features.html da4bd29449d7963fc65ee5962bfb66beec8aae62f67063ded3268e7843315351 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_id_trans.html cdf7d63918f5cbf74fcc22619c9931f210e5663b482517cd40287508a239d978 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_internal.html dcde038dc49a8ac1370dfa302e10b16745081486ae02bc3462ac3cf20f2aea93 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_lint.html 344ec655bb55f91d5e3546cdebdc1bf404772a0b936d16857e9975ac7379efcc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_parse.html 50da0b00ef36816488ed2fdf0099fd2adebb2f37cac96d82a707f789d6a2eb79 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_pp.html de2944ffc1bebca7769b923cfa3c2b175269769aee86e8af9b2bef195189bf28 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_scan.html ec1b12209d1a87fb0db32cad67fbbdac9476ca9313c66fc3ea3ed512ba5f109f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_tar.html f33784a0df87ac1802a7ae88b613881d1937ecaa83efdea0ff93112c097aeb0f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/escript.html d034f83990fca529e82342e2e9fd8129d1e6d045ef3a5e69ef16ccede67e0b52 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ets.html b1dfa6533423e030856a72f7afa4c6bec1b3980e88771fe892e83db829c000d6 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/file_sorter.html e94e6df627aa3d23b03debe4adbdb23866eddb4bc431431fb8efee0c69e5e5f2 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filelib.html 5971a19baee7c15fe86f4e6b9e7e6f6922a6ed0412dd094e700ce928026a8706 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filename.html 2fee9b65e8387536d6900d282496eee9582e11b5a87ceae1a29fde8f033a2b19 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_sets.html 805d53f26bdeb44b6a5b7d711932ca98ea8246e483543673d55595a76734019e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_trees.html f470252f24e43b996198f2582b688fad9421f7e42a20535350c8254eb165c6db 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_event.html a75a3e9f14165e114435e07ec739352157deab91100362c6fb741983db9dfed3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_fsm.html a2a0067e44e863e724b14a6ba72d5d0a50fda6c0b14c6b8d4def12a588cd488b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_server.html 137d7ce63f5b9d2402aa53300ebc5d839304102f02dff6b7665c7deed38c5e32 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_statem.html f1e1044e5d6d1511f05f6d449c4d2f1805c3f6fcd976f3f7518a225b01825712 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin.html 1d216d5cd54011fa177df680773a736450d72737389194c11169d134195b2c36 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin_expand.html 24446e788843bf3060692e81ed264278284397be85123547823a97b870571f0c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/epp.html ebdf846980572d7f20e26e0055b66b975c0d4ddb294f1d4654af473b697c5afe 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_anno.html e115c8c9722c28bfbe0e43f25b88083ac5fecda61eab78050e5e303a9329a644 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_error.html bb7246c5a187ca07c2996dca4eb1c2ae4ef7dde32859dbdf5d7ab7644a525199 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_eval.html 547792c0f6ecc2a8c6da57877e63802ed61fbc1771902ea221309aa5092060fb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_expand_records.html 2261c6a75e1b9df2a85d1133e818e7b56ed317a02fee510b0e0a9db90ad26ee7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_features.html ffb91b80c5a986580c4b0daa0c061455232a1caeb0d5aed1358b73767eb7ccb8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_id_trans.html 1157af77123d99c5399dc2993d662a8ee9dcaa414dbaf732459024bf13a4ca80 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_internal.html d922fb8977ef227873814ac84998fc2e631d9dc255428a5a45ec3a95a5de2714 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_lint.html 9abb46bdb1ac9fe676631d9d4f73df2e68bbf327de248d2c9c2988c35c6cfced 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_parse.html 42b7706f42b2ca038dbbe9329b6265d56aa12b9b603c61bb6364ead910ce08ee 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_pp.html 8dd53848e481149d004180921e77fd27c903aa08086467ef7fde6aa2088b04da 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_scan.html 54779e362e1eac3d05ca6176076d8f3f420f2eb7ae8a92bcd68eaeca9981e150 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_tar.html a0dcce0863cf2992053153bad208c515ebe342d32965f68d7d6eb38484a27b65 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/escript.html efdd59e60271623f079569e1638b67c1a078a3fb6540e11a1f7c7d2e8ccbba4a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ets.html edfe6bc6787f56eff043301e6cafb68e506995805716d36612eec9293f77acb1 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/file_sorter.html 07220ef532f1234d0c412c11a69e4217c195d8a1e81487b195a8d97392c5dff9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filelib.html 2149b92a90ef312eda8e91a559178fe80838b391c16b46499701793b94be4c63 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filename.html cc88ade3f7b2a0e36f82918acdeca57d04deada5cda485fca943ab96b7b8b954 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_sets.html 2b5f0292351ebeb48add1d653f78c05abb0fd3cf702f442e156761bb269a60fc 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_trees.html ff0128e45624ff45d19b142461a22d208067c315a50febef0dad4f525414654a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_event.html 185660c1e773228e2ccec0a603ee8ea0b9c960984487aa12188451104ff5c490 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_fsm.html 8d1cf5c7f914632163054358a603dc73b7b34dd2080583bcc3e78d7e19d3c940 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_server.html 275d2c8826004c49c19f3f79867b726eef51f0c4fe52b771f75149b14c225136 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_statem.html d19020201524cf2ce5aa5ba0b1ae57f369c9b5e692556dd17a1cc08b2def20fc 2 @@ -3434,45 +3434,45 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/introduction.html 31e91d9a0e042c5aeceee2526f73d88e9fe75dbf26209266190e78dfa954d97f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io.html a9dc3ffa0d903379e8ef1d8ea1c787851fb449d49de4fc3d3db8118a0b433603 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_lib.html d728c89eea46c764223c6e9caddecb916cd84a224623f3bc337851991fc3ad1b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_protocol.html 950f941b756ed9368fe9d8b52ea2cb7be93cded585bd286a18e533e501fefc68 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/json.html e8cb8a1ca4bd679c358e8b446c5c7af070fc369166b9dabd39bef700a3069b31 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/lists.html 5b52da6363bd1a6257aae3dc9bcb5c6b6a7486afe7d43bae6879d34ce9c0fd36 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/log_mf_h.html 3159bd2025f2c221ec44e5c982206cf785feff5bbcc44a952588acfb70f9dfd9 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/maps.html f84ada5055522218f66eb562683872a15740e7861c588b36cc4e3599d206d991 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/math.html e00c160067745d8061b4ce1291946559cb15c983c485c660a136ec40af8feb43 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ms_transform.html e45e2baa6956b6e3df5f33881b3a514af82fd2489016bba20dd094bf6f17de20 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/notes.html 13bc82376b661b380552b2ac3f71cb68f40fc1c090e7dea01a6583fcfe90af6e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/orddict.html 169061fcd00dba1c4eeb77349f68f43f696cc9192be5bf4c1cc4d69754a06d0f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ordsets.html ee30aa34b63122adcbe9ed3101af2ccf29f533b12e69e09f12440e235303833a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/peer.html d71290e6f373455c108b405c19d988ea89a2de3a8cb1d7696d52c2c619f06a37 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/pool.html 5a7e091b5a8b780b9a3bc0050fc4a95ea1729d164f5a30f7be8519aa5692aecb 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proc_lib.html e2d1bb603d8d5b26fad1e0f6d87450f0c1772ba8fe57969fe89699fef25ffbda 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proplists.html 73a52513448c69bccb202c3e2b42d2cd9c99138ee1ed4d9758bba83ebc33727f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/qlc.html a94a7f132897fa0e08d7ba39a1127dd9a49d53c52b64d78a27e1ede9ae52b5ff 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/queue.html 3b9c55498b330dd0482d54943177dfd5ee346f08cf8433942d42e8349128221a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/rand.html 43067c5d430c0ddfa4dfce765bfef9e8ae9c5ed4e61357c075ca081567d26ca4 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/random.html 9c7732c9ac045ac7f6d504d14795aec33d274661613f2883f00a4493697de808 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re.html 015d4e1215e1b51118bb73f7dc9112713355f2d8f9c0a126fa80d05a0a29efa9 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re_incompat.html 2d20a15cfdbc3d02b9264c5643bce3ed6cd134285c53bbb5e6403ebb42b4d2a3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/search.html b7dde5889cc444a4c3ac40fdc788409139c6cbbd8c962b5e7477d762df125f29 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sets.html 0b7cafbf6601402cdfb1e8015113880f48684c8d3c2cd263bdcb3589f04420cd 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell.html 906efc27b46bd00b811e629e48494a07674235ab6796fda1bd4ceeef89417add 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_default.html 22a0a8fa0e5dc72f2d195364f7a822d8c7ea1f9a186f664cef99433d2152f402 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_docs.html 00549fd776c61b987bb292c43e44407f1edd674d620da42d33021ca258c5026e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/slave.html cffdc5f014aac792507db1de5e5dfc1e960a84a92b6a20f063f84246721de5ed 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sofs.html d41db5ee7dfe90852a8b9d24c880224b7912f3f7266f30f5104b3c5054699728 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub 1c52f38fd3e7f46edd758bb891e4044cbc11e8995d50ed7da0665efd67c544d0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib_app.html b75615ed7d3f1c19421b64bd3f0746c6a89f0cfd47d9d019670c678a01ceba17 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/string.html c8e3ebb09ccdf2db8cfaeac1f84f7b6d421840b9d7819515177d1ab1f2ac4575 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor.html ae313c80e1da3e1be7d83e1e3dfcca6bf6e5c8453f4449b1bb68e4396dd79773 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor_bridge.html 702c330d3b412b1d182992e082116c3981a540b7360073b460c7a8f2f7ebcf4d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sys.html 36fc88dde528ec2f5bde6a1fbcf69521b182bef11a0e86c4561fd12f1fbd3cf2 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/terminal_interface.html 729e8c43d409500f22c3e6003a510b64c584187c3cee2b5f4570599892dfd529 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/timer.html 7e7b7a1d70228231dc6a51d2bfb95b576b540f8d35754ac76dc6b8c0a2a57662 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode.html 77e57769bd7071bad5ac2b6b8135c2ee8d73a0fbef48c99f4f093fa6fb175ff1 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode_usage.html b676e21ef97b40920258969aaf7597d2042b80b565f2a082a897b7506eca5c99 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string.html ed499c70bbcae25552091a17266a66e39fffcf65338bbc88d85bbbf9e1b25bdb 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string_usage.html 41427aae683c1a5eee2fa01cc01968904cbb39b0606155edc543ab74f759b7a2 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/win32reg.html 0c19f93c43c2d9ecd5b0ba995e4d9a624db73a0064b812ac5258828b45a0a025 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zip.html 584464bd8c6c003c39544d726d57ebc4e5d0ca15063acc21cb081d8751f7322c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zstd.html a7ad33f5089627553fbe8d549d8c00ae3827fe9828d9b7591d2300f46fb6cbf7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/introduction.html acf08dcdd8f3d974eec008f485da005e6d8e3711fe19066735ca0ecc616392f5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io.html 248787bcb6fb413c786967729b73bc5eb3b63dd4dc7a5c28a9252331315261f2 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_lib.html 8d3f0183939a247bccafb046f7f1ddc14572beb6a70cf91dcd52c55c8c82cc54 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_protocol.html b368cbcfd051eddbf0f526669990ffa3f20868d29f1c34f3f6ebe04bc84f2281 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/json.html c36baf0dad138faa8f0bdcebbd0b9db7dde1c7fd3d78da9c0e5761a2cec600fb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/lists.html 616b13ebcb1386d43d157db797905bf1b51bc3bc109e8a03e90fe8fc57257583 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/log_mf_h.html 5b7b39389af04db2118d8170dd59a3550b01b111c4d9a9af76769169731de3fb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/maps.html 96aa197156d763d2476798592ef5dc95cd80dd43be9b01206293507e4b285b3d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/math.html 7df1b3ecc7a211b933e6a0e74bb2a1099aadef003737f83850ab508b54177215 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ms_transform.html 0c1cd80310d2f3c733b45c3ffd698184addf422b3b3f84229f499289e597e5cd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/notes.html 05a460e13249c90d91918341b6bdafa10c3b0c2957641768e51c600cc2cc0e84 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/orddict.html 24f15de8f40ea152236f2a84e947b9c1682cc6f324f7a531c37ff2125aff6481 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ordsets.html 80c1005ce658effe69b51068e0fb00e6909fa9c16a2e93cc3c079d05b3b1e676 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/peer.html bde1592a5a56cee4747f7198da3f0a09d5bb4652d1836a0f0427749249786901 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/pool.html 479c46e7d78d047809e8d58ff0626dbcd5514f2a4cb3a4404fd5c5d125731fa2 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proc_lib.html 16d2c68bb96c51eec0a6ca3521333819e932f1170817cf780b2796f0ae4b5872 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proplists.html b2d44bc8ab24ffd6fd69b6f0b51dff318f0cbadd35c14f2b63a9454506cb0b07 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/qlc.html 01f73b0b76c78d3529dbf9c2f30028204a83776499520d4895e6a42b6bffbf7c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/queue.html 17ab34e6aacdfa623a5049af50c163a1a341429cb00a48981ba60db13c1fb30f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/rand.html 8c3b2162f64c5da02b91563f1939368e4405d32f6e66024920b9313eac0cbcf0 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/random.html 3bb033b8c39f055de85a49b44e9cdf5e1ce5bb70cea377260bedbed2dff7ce25 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re.html cc02d88a16c3673d6b1a152503fe310526c028ceda95822e2ab339d0ecbfd9d6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re_incompat.html 57cee4a75ced3285668755690be6a57878fd144fc363d261e4597934e0da78f7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/search.html 99a8ce5dff6452c6efb838b779e734e660d36e66b6afe883c17baa9de0bf8b0d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sets.html 0cd606f4717ef03102681b5c6f8dcbb9c3d3582caccd31dc7d66ec6e72ba50fb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell.html c49618bbf94b986a3a1ca34da8f2b8c3ac3cdfbbe9a7c1dbc9ac1e72d636ee52 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_default.html 6833937929d84bf5c350e4ff5935c45c105d75795ddc840d06080751c72acc2e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_docs.html 9c89588896bed3f8ddb693d46366bcbc619822e8831189203769939dc3a15e09 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/slave.html fb9330db2f50ebb1a3bdecac43de612420840ebc9d6caf01ce66b2122b10510b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sofs.html b11b597182dfb6483c657dc8f2b54690913fd102e4ca9ba93a8ed60e3ccb9114 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub 1aaa553dce5fb5cfbc3eff117ad106ff1132f82f58688ea10cbf9686d8a4a06c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib_app.html e74c7704db7b56d6509fe35f20c1ba74d6c49e305a65dec00e20d7239f1aaaf8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/string.html 59971064934d569fabdba55a3c6d27b8ae17fbdd9ca663c501f5117e9e1b03b9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor.html f44ad556749bc990ed535bc4b44af552f60f1f2bf6ac0662246bbb54d26c4c82 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor_bridge.html 2b15c553fbcca1b97ea00729a642cacb2c9c9b9264beee2ee0f537e27f8e14b1 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sys.html 61dad6aaba7d229fb7fd5f28191a908257c91af72714e877b02f0efbd52abf7c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/terminal_interface.html 4554fbac3061c79d41e6c1286717b98c47e91bda162f4200470c5d687b30191a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/timer.html 9c5d5541bb8c2521ba5993d9dcdaed714a52df44567386af46d138bdb82b4fa4 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode.html 045aa6d4ab08fdf638e8074fe77bfa5a2bc1edd057bcfc48a7ddcf2c5514b4f3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode_usage.html b252f5778e5b3356d157bd968cb9a22aeaac7a9f249042ad70c717918226476e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string.html e25ba47591624657afc33def7509b1995f0f776d0c0d983866552fd1060577e5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string_usage.html e43178e3ba1094b7856caaacbd0f2df39ed502219234598196711d4b1e49b344 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/win32reg.html 27fa925da8de3f7438d4f30bd26e675c4cd8cc9a297d031704d023bf18844b41 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zip.html 12f1111ccc972b051c0cd251835a84fc126f2c4bbfabf6ae2aa8bd58391e523f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zstd.html 4a60f301ee48249bbc2a7bb9adb014fbaaa3619b42deabf8bf183eff42fbf8c8 2 @@ -3482,2 +3482,2 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/404.html 1dd62398817501e532b900d50c4ab6ce1baf687ec78f9db131f01db007e6143a 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/api-reference.html 6a889f0e0d71c3b77e46774c3c23d78af57a7bae2be3c466394a612f05a5e1ba 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/404.html 5bd120604c439cac5a7284b7956c90ff65d6454d5dc4ae91285ba06914a9ce82 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/api-reference.html e5bf084214cc8fbd99a6babfae920f0305138de6b47fc0d16d19de1f0f2a12a6 2 @@ -3487 +3487 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/chapter.html 8d4031ed01bac39ae1e13e96531d4d6675b5ab0c9f39031b36d5ea38998b6435 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/chapter.html 4c911c8d1ca40403c83a31b5fa06cf9a669f52b70154390d9b97b9ca8b9c247f 2 @@ -3498,6 +3498,6 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/epp_dodger.html d34b1b18d0f1b735ccb41d28683f414ca5af0555475f9dcc54aa26bb4fcc8119 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_comment_scan.html 3d138b074303d96b82fb6bb32dc65d801f4fbb71c5d60c25d97c531a289476cd 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_prettypr.html b1c62789ba4aa57a8cdf0c9ba9f43ca3ad615e08c9c3dc8b11b597a287eda385 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_recomment.html fdd56a87d4004bce436e786637e257a29179411ee226d8c46ffc61e03c7a4f43 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax.html 039c96ac3b6d14ce6424e9deccaa0eb720bccc8b0bc0be770dc3cf5de11ddbc2 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax_lib.html 5d5dc323370910fd669b669c32742675d4bae0f846a1d24feabf26bc79400b95 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/epp_dodger.html 3c59141b646de576a15f982e5c8af70cd101419dc95fd7a90fe63dbf6e2215f1 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_comment_scan.html 1ce3969678fde8dfad17e2e49fddc39a6eca9abce75f41600822adf377bae1db 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_prettypr.html fdec6b7f80ccd305e4431be6256619b61c0c2dae6a5841b6d17da78ee69cf84b 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_recomment.html 01e2ad5e5893f4d7d7de2db0110dcdb02a793cd59992fae249e0ba7a6ae53a04 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax.html bf91c0a98dd735569357041e6026ce4b2e23451ebc74e93198f40d3449ddd580 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax_lib.html 86fea776bd5ff0dcaf06577b381e5d0fedcd26201273654e02c2ac98f0302963 2 @@ -3505,5 +3505,5 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl.html 287414b12e528d101873738aa80e2e2f8b87b9b7fd47c34e1cb14ed52beecf14 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl_transform.html b2a27bf0ec372082b9cc0ae9c05242918dffb3b468f3166263964f5a7ab2ecc4 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/notes.html c52f19cbcc631885e3f1234056e6e728a9c9ef4057d79806f999df9981b21b40 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/prettypr.html c640a66f2540581786693165124d52b540288bfa8484396c585ea11a22a193ca 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/search.html 4ca07865ae08b58cf92ed707ff6ca724ff151b86ee00e47c7aadfbdbeb71e701 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl.html d35c6151423d8359ff4defeecd9079831eec14a20fb31a925123daa58c7c09b2 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl_transform.html 3e3008522b215e39bef2d70efb9f5faf83d127068ddad58da10dbdcc597f0ad2 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/notes.html 111b34322fbdc2304881eb9ebdc7f8d14876e4f0ea69be61b7d2246bb4c5b28e 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/prettypr.html f36ba334a8cbdd551d8ab58063c7e334108d03000bee1ab4552fff162f5d3771 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/search.html bb7bafc9f86efe02f767c15bb0be3e13eeff9d441fc1c985d5fe2d3c7f9462a3 2 @@ -3513,2 +3513,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/404.html 0d2403e2b019825f787909325081af6159d0aa5610f803519a95bd3eb9c2743f 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/api-reference.html f0f8c293b2361245598e95ed326ba7c5dcc6c4e6c85a9e815b67601cc8919e51 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/404.html f677c78dc08a7f73f8d0f373920d7a983aa4268213d4fd2dc2e5d50f1909512d 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/api-reference.html 3dfc6f8787d895f5b020c9f77ab6dd3d1d11d93293b81eff7629ecb91f602dfb 2 @@ -3527 +3527 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/getting_started.html 497c0bcb4b2f53658afa08b650f7839cb5f62c1a60c74450b05bd348dd8972dd 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/getting_started.html e7b62d8d7d8b6e9155100e790339a1da3410f3b9be957574276733be98c32937 2 @@ -3529,6 +3529,6 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/introduction.html ec098ea52e145f63e9d36f56856d207bb445bbfd31d51193bef6e2d3af52bf25 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/notes.html 33fbca2e76fb3c7e6326e28196001f8a5da869834b9a0afb623ad09c7cd74f9d 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/search.html e55eb5656dde33437883442cd40264bc0b4d650242ac98f2ed3fa0d17954b5bb 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub f2166435a4a3c84e790b433e5b74c88518112e36956ef747f43b00aba69c9e48 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.html 69e8943d1f0cb7e9b7d3799446bb223c7e5952bf376fb081a8c31089137cc851 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp_logger.html da0f7ed969d3decf3fc170192f5ae036259d6c152c9b28121c8ab8fb8c8eecd6 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/introduction.html 75168448ae2f89e24d61e1d896ed34f52c4739b5b62c7a2a1f51e75bf878b1d6 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/notes.html 1532afc59cf78d5596a3cf559fe24abdcb15753d094921fb5c4723242c6e078e 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/search.html 9eb5a2a5614cb0a5013eb67044ce0aae01e034ebee612c1e0d71e179060663b5 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub 8e189d88ac66b113dda1ca9821a9c1733b8ccd1ef53310b077ab3262928ac96b 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.html 45b88021a722a44040cc3b9d8aa96c120535aec4ede67957d9fab460fe5ac8dd 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp_logger.html 90c7549fb60435687ac36b45316fdf85f0d2ec089980af0ad70f19e4f3c955c1 2 @@ -3538,2 +3538,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/404.html 969fdf7b3faefccd5475012e570cfb2568e1427748f1a2cb5caf35c9faa5b661 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/api-reference.html 009da27fee9266e9409c1eeb65fc8ed6663a568a3d7af5be7076c18d537be8c7 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/404.html 97297aa0f48e5686562903445bf8d8b27380ca7aab82a521ea0c49a7c01cf88c 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/api-reference.html fdfe913ecf99a021c77a56c4a2542cd6b48b130e23cec21aad98f67021df22d0 2 @@ -3544,4 +3544,4 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover.html a513545265df36f115dba6b0645f2b39fdc2eb97ceae3dbf40b93c302733d4da 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover_chapter.html a550725cabc4504b817bb3bf235f3b4c927cee8ae0f29d6172c4277defbabaa1 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof.html f77b25ad8533ddc8cd1ca6ae6aafc49fdf77d119110ad0d09f9bf0b6360d04ba 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof_chapter.html c431a4d769cce53b82e0166a060315b3ce7982b1397c6ac8dcacc508113da887 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover.html 961b1d0d0d08a2e52f5a1b8793161e9925297b1528f22b2493985f90be90b0e7 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover_chapter.html d97f5cb4831ceb1cd61883fdbd68edc6f5423f3d60bc62222ccae0b69f9d2aa5 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof.html a57c6f42e320736633d557a1642e1e5fcd5c761ecce65d2e63966799502cc85f 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof_chapter.html 54c18362f4a71630441da38d12b1247652adfb21f8de073d04f2e28da27cbcf4 2 @@ -3558,5 +3558,5 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/eprof.html 667816a90137181e9b2c2c88e05d6be5fe99611e1c395058b5ba212c4b12e065 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang-el.html ee55a718f99cea8ced22dd4c9b514cc28a3dc9148805fb570946a38fa4630df2 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang_mode_chapter.html ff7d475085bd1c4aae7bb842fc87106e7095571613a6d7484cc29c513572e6b2 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof.html efc005f18b7623c8d1d71bb24e0a94aeda00cecdf431e87a1ae0e16afab58803 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof_chapter.html a1b34f38ab9d2c1db34226b4d1f403a0418551515f4ae6e9501821487cb47003 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/eprof.html 568fb38d3f7dbfb8ac07d202b2126ebdd84243d534f08f4f4ab8b1606a32da0e 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang-el.html 3c60b58d4b8d518fd57db42b59f58c1444815d0a0d73abffaf905ce3d222aa61 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang_mode_chapter.html 4451eaa01b80052ba687e2e51e54483825ac666e8e544cf9e03f1278128dd447 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof.html 2e386a58a8832333b11b1917e6860dfb96708bd5d078707f3d63d98d5169892a 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof_chapter.html a40a0cfa9804b603f04ac1faf97e6ce8b34818bbfabcaac23f832f535c95abee 2 @@ -3564,10 +3564,10 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt.html e83bba973cde5c0b523f5b404b2698aac529ea05c0ed6c6e4d0e17c4dd8a37fd 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt_chapter.html c4bd17b585b56c014fb860d8d641bf2ae8bdbf82f88c70e6189e9fb9f5a39533 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/make.html a5e0471d0fb3124baf52fa811f09ea0c5bc3e31c3211fd0d9e61960be2fdaa16 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/notes.html 75d5bd1ca89ec56c1e8d7c87bc46b9ae0df3c21bd82482f3f2999a3e0705b394 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/search.html 76afd33696eb705720bb4326cae485134663049bfc90f56cce9d0ccec7f9f0c3 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tags.html d3977aed93cc946d5be581f2b5fdee960f30f3895f06076d53b9d5466a4e395d 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub 44bfdee5e1c4f474fbd65001aea98f97edfc04549b6452d6afe16275b0179cba 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tprof.html c0a74dc9b2872d93d27f469bc284256a1a23411f14164eb5d2415d3cdcd8c280 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref.html 9dd356626166f6f52fdc1fe9e0fb8d8243527e2cfbd66f7235f6d67c42653fe4 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref_chapter.html f492132f2624eff167165cb7344a382e300c8e1c6cc42818fd5d2543e5d938d8 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt.html 77e4018d037b96cbeee8b38915f30bc1e77e8c2a80657cd1d7f62dcfa68b2c8d 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt_chapter.html e972016796b4e91b2e481b46c36c59dced1f85d3bed08c2d4e30ed2c4ec07de7 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/make.html 15f16d7733c393516adeee9cd6527d6b14ab16c5397df48f08a102f8d53cc3d7 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/notes.html 93175182f5d569ab23ae5e8057a537f8db94e0b9cb091b4e5043bf7b7ee8584d 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/search.html d7b8d495cd6b95b77112e8962943db049148db3234d12d3dc46bf15bd1f77d96 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tags.html e93f02a95817c4bfbadb96a08f1f710ed4da0864654456355f322a3234dbf3c9 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub 827ba53b3558ef069863cb488c0cb103d7557fc48e12c30c5584b75da362efb6 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tprof.html 48bd351e9210158a778ce1a3d975d7be5719fcc928ccd2d89a8714ccb720f1b0 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref.html 15e78f0e29e77efb4630fe05ab6fc885dfba941feb334c24a5280f84ab99aa66 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref_chapter.html 92c03c07e143e642fff243bca7091cecded4fb0e896e7fcf8bf856094fb304c8 2 @@ -3577,2 +3577,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/404.html 0b69b516e268e85fca19fd88851f26788c3b92cae78011e0eb181d60c20fc6c0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/api-reference.html e3c224d2a21d7f367fa5b14a72393486319406e88fd39913c61eeccefce648f1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/404.html 8ca1ba9432df2cd78063eb64fa685de0474916add92602e7b897c854f0c22bf5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/api-reference.html 0001086238be43b35e38e6cf45895c4770a93a25bf34a5377372263ecd8f217c 2 @@ -3581 +3581 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/chapter.html 5a4414fcf09c04045a81c9136f15725b761de4f20686bb325f130be71a3e7494 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/chapter.html 90f571681520e94d4b8aa7282c66d68483a712bc3d73cfb6c6b7ac3ddbe253c1 2 @@ -3592,2 +3592,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/gl.html ea19fee1b3dcd5c5dc5709dd86bcfe63ec57220039d80cc7a1c85d66211d5d34 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/glu.html 958788b05795bf6f1b8fe758e64b064a0659faa4fa9fc3ca499597050430f85c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/gl.html 46ab0a401abda3861f378dfcb7e376c0368dde0efe5c331f264aac2123efefaa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/glu.html 5e8f8be916f80219098ee7496ad2339242798ea38e6a8e1ca705c1a08cc39e73 2 @@ -3595,239 +3595,239 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/notes.html 9eb33d9d470fff58a4052acd0baf72c37a58485bcd1686c3aa818264478ef599 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/search.html c75be5bcb9ad911a32180bc8619343e118067df61aa26a25cad1686fda77ec12 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub d501e3ee7f0d22639a63beab27f21cc1a3bf021738765466773ff2dd3d98b47f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.html e5790ea8945bab167eb06f0431a2c76f7776ac3e072f9b5b08185145bb1092b6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorEntry.html 49b6f2eb1c138eb9aa767d05233e8e53eddb938b05f811abf7b7f3d5391fbf54 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorTable.html 7ee0307d534d6508c4c243e781e9293f72eb3c4dc6a74159567f33014cb86a8b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxActivateEvent.html 3ba53092cc0dbd784f741cdb7422fb4eb3ed35d8bf343802ac6b2271ea9fbf7b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxArtProvider.html 98550653b41f7db693aaac8e264a486d585c7f270550dcb6af86761277189479 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiDockArt.html 7bfa8383f69abd976ae63244aa982c732690672f5d08640ade406557bb45537e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManager.html 117d9e1f5b6dffbca637fc49dc9afec6be19cfdda66c816adfbbd12525c90d21 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManagerEvent.html dfb5e4ecf33e4d79ea0e0a52e3f77ab96d3d6fb8c49267295d7ffcc68232c030 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebook.html 043d2da45b689302e259585fa559cd4c473bdffa238ac51320355c466aaa6821 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebookEvent.html f7134dd596a7fc8a2b9e5a73954ee1956d2cb4ca24f02537cbac7901ab63c86d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiPaneInfo.html aabb506f4aa9da5593fc6023c8bac019a72ef396ddfd29dacd677650e4f83e9b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiSimpleTabArt.html 8573d6b1889c38004644e15556142ccb1ddcf5a08530c972e76f8116a41fea30 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiTabArt.html 7dff6ccec833b7466e4556fce2fd48e22a282f116dc1c45f2d23c999e1064a91 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmap.html ea26f51b779707479c96e1514e9f09016271bdf3dc97956b2a510fe88f618763 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapButton.html 171c0028f5a43a544aa13210b99406b94a9e9bb053fc90deb100a04ce3554433 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapDataObject.html c93ae14dd3c25014ce02fbad1bf530fa18df4b25e626e6aa98c2f97a0df24735 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlBase.html 7fdbd428bf12f6ab6a3bee134a31e78ed35f01357ccccbbffedd896d05ef3fb7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlEvent.html 1c58a6eb2cd11600357daf05bb0430610d1872360e5f5eb1cb0a26b676ce8b8a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBoxSizer.html 4cf7633f1e050838ba5e21f2bf803e0b32ed208f748b1676a051948af036a7a6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBrush.html 16ee1390f4b6b4dd10fce01e9f9e977be0c4b23bdd1e1ce26a10f93d6e2a0e16 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedDC.html 3ce26879425272d76ecedc81a9ee53ee33d24f352adb8fd84a1091b1c9174481 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedPaintDC.html d8ef1f38058a24a76d74f8fd047bd1977687df5d516010e86a15f4cb267e978e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxButton.html 72fcd6ee5c52f5c0916065849c1c413392314bf7391f821065053f6e57530675 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarCtrl.html c947b5ef421fb5da6ab3c8912b377781cae428290ca2ff277c5c0d2977e3e786 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarDateAttr.html 3094279fe33247561c51fda6e66757b657eff70458c5783865c4ac380c89f53a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarEvent.html 64e0590a4dcaefc42889de17f7b7529a8446894a88b9eaba0791c13c61dfeac6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCaret.html 054e392b46593587043ee817b7488574bcbde74f29be208fdb0e69d40d929e8c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckBox.html 8ea682a851cc31640c77e1d0096663917acc55a01d497000b209ff805314b01b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckListBox.html 2e08071153f5343162c39d65b0d84625403def1df929546945fa968a811a7269 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChildFocusEvent.html 04fa1496ca1d73be2c8399b12402c9faa8036e7248af8d5524f7ffaf6f32d61f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoice.html 0b82b13a76ae239f79e815533021ec1b651b5b3f26837fb95157d27e9a0a082c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoicebook.html 81ec477ca652cc942f5aff7211ec687286875cfd567aabeec6e16f11bb3d20c2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClientDC.html 80f341e5e76734647ddd2c7be46fe43a9cdd14e9e9918bb927b6a3f46b8d0eea 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboard.html f34dbe50f1757d84938d34e7a993f04a7359299bf2e3f5009939e3f186e9de9f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboardTextEvent.html 7510649f427a933065a65ace6f9d30cf0755268a4434d58645a88ca73da0b30a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCloseEvent.html 79490b4503fda2b424b9be1a8f3c61be26902581970f8373ef7c7bc2ca6f5642 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourData.html 266123785f9d04c18074f64633d8f088cc3c1d89f8110629d6368cf30b907269 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourDialog.html e408b83b62b13ffdecf6740a29cb18cc8227306b0f846d726ac6d731f5fb332e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerCtrl.html c94199c8fb5ecf3b25f4e3d6e16f0319a501331e6931a7ed94898e8f18f43fb5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerEvent.html 311e302fb6fa9d921e5da06d5ed2e9c109fed25e035a299bc80c3d27806f98bf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxComboBox.html 571b923b3347cadc3eab12e750462218cc1c9552c585bf833c66679c60bfa0a6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCommandEvent.html 80b3a967370708430974de2c6a308f13be769c489dcd03849fc321ac4f0c89da 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxContextMenuEvent.html a74041a0538d08a575b0df0c7a6fa60e70af56bf17099ddb17f1ea39994270e9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControl.html 91d53709889f81f08c263732c3ce585429656aecd1f7fad6dacc2f4cb82aa827 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControlWithItems.html 28f4d58ea6b5a940a03f17df34e89997c9358001851a57cddd0d05faade31943 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCursor.html f130e89faf80e33ab693bbb4f983160e360cd6f76a5cdbfeb0883587e0768044 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDC.html d691ee247a656ab0b7a010a9959ac3c4de7d0d7901549a2d4150017f1f4b3370 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDCOverlay.html 593bd54f2661fdcf8888ba6a0ad3cef1fc7bc98536b1f888566f5ad3ed5688e0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDataObject.html 141e276e6bffe6c7ac0139894bcc5f9ff00e36af722dad4e06156649d71bf371 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDateEvent.html 9b07884290cd68d4b0763cc9887cfa63e95d4f1746aac0b527aaeafbc49752c2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDatePickerCtrl.html 8cb8154fd5f51e32bfc33558b7e4b2683f3751b417e30a8de6f51370a636b706 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDialog.html 9cd0d56e974595bc7d04352bec1986119a3e1bfaa636f548f22ff9365cc17d6d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirDialog.html a901f75abfed757c1580c6638689a8b090e812ae7d39dbca2b3def23d99b083a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirPickerCtrl.html 8ca5f773412abc774906219e678657b56460eade055f36b87c267be68763cb9b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplay.html a720266666f1946afe3e419ea7440e093f8db69e9687d16ec8f3a6c6c7d26b02 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplayChangedEvent.html 292334655056672c5005ca47a7da1d8976665e64d30e8b256a595e66b3e8ebee 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDropFilesEvent.html c33de46373506c7c8d291be8eb4f76653a887bc1911944f6d04ca79fcc99be15 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEraseEvent.html 8e276ab2cff8b63077d448d0a91eb4f281013e64a4027694d8ecec216f648a39 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvent.html 9e93bf8e409230cdb89041500ec056878ec1a8a55673b5643bd1029f1261a274 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvtHandler.html 2187303b2533e9dfb34dd21ad9b5c13608df5993a8e9d9a2480231b2a4729e30 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDataObject.html 3074d384ff7f7f13ffdf9160715101a944a627ddd884b1f6145b5552d7216eac 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDialog.html 63851947f28f07391d9b4a794e4016e26ef10bdd0294fa56dcdc16bb895b459a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDirPickerEvent.html b1eaf2b0ae8be23c2714e8fb9ac845a201be29b5b39dc8836c10d273848bbe2a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFilePickerCtrl.html 6778320162a621a8fe80a310f71004cfbce822bc8334e4b3b4bf7aed3928ca7a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceData.html 77d110211b12428892822a4eda6b6863d7a381a989589b04f300f3f9f43e20a0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceDialog.html 4aedf001a8c40884b5c870868cd6004f05298e58d739073a540c7934918aa3da 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFlexGridSizer.html b16c7474f3ce4be6990e9d0203902351e87f7bce245281dfe45792a50056519f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFocusEvent.html 69c051e4c6f4fdf10fbc905abd4ce9e8ce14a5a21b13ff3cfd5681e88b56c188 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFont.html a5681cb73f4bf8587b9c02b42d9f62643c27adfdfa212bcaa49dee6d17495a0d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontData.html ceaf4a3abf1e59d1d6e65d434bb749819ab2f360a339bfaeecd41945808f8e2b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontDialog.html 09184edec359683f0982fc3ddffdf1a7062b69d12153e4991bcd08744972954b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerCtrl.html f375ad99972ffca6bd8ed3ae46810e67b493745a8fd59cc76e441387e34fb088 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerEvent.html 5e39b697f558353d679756e0abe6a4acbfc8ae1fb065ed18a3711476283578ab 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFrame.html dff30305d58d76ea5bf3ce9eb90ad46adad44edbec6d6452fb89a7f5fc74d5d7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGBSizerItem.html 88c376948b5eb931508ef9f3841566cb313db26e736b867d2095ce8f734b0ccb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGCDC.html 3ac7a43789492d43e424bb9bb51397c4cbd76344f773dfd4b353f556eff82cc8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLCanvas.html 6ac6bffc8fb7fb8b7ed1a527a233c09e9471d2a59a8db61834f35f1595dc09dc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLContext.html 7db8c6ae3d6a30836c9716dd7c4f940df53abb1dbcb419bb4002da72e137db2e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGauge.html 4342ecb796a7251248c1780da5a1f770ab383f8704439494dc03edb5b5840288 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGenericDirCtrl.html 7914013b39a91200d96ec36c0cd83abd995d28ea58ba461e8617ad32dbc044a2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsBrush.html 32dbd0f8fa71db246e8ddf29f9752c88e344fa634c3f0a98aa388645f6b9bf4e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsContext.html f62a52e2be8c008463f895874f1cf6383075ae5ea24c57ed66df3bb40e5808a6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsFont.html ad4ef179d67d06641e744e72ad9bfafa8d04af93fc6b1d0e207af0f5e011b394 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsGradientStops.html c6a3f5fbae9a2d9e8b36b39b79c1bca1682de01302460a9c02a81af8594e1984 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsMatrix.html b25e04d41bd0c2542ef402e64c18fc6f4e755b3553b87c6a40399e8425f143f0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsObject.html 17384d34408343deb3326b55748539407d85213e12a38c4dd02ed4c7e1284b6a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPath.html 0f0602aebfe1a94bf71b7b960a0c1b56bf677074c1a56994957cd6ac4a024fed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPen.html 7ff042d8012b69b6d2a1284be12a978ae8d2bb6e7c8a0f0ef27529baa65b8cda 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsRenderer.html 5c7909deca4c4ec9c6c3cddf871c96054638ae1f52243159962ee1400910106a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGrid.html 9d0d300cc4c75fa45b240db586694a788dec1957f7e8d3dd43caf0922462888a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridBagSizer.html ebeecdb7fbb6d7ac2d13726c8be275add77f87998088b3463dfcf25065617e4d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellAttr.html 77ad32757df0a4951d6c44e15d0006526687bf29b1b2e2fffb9513c27bddbf3b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolEditor.html d2508d645edc5ca25ec70836317c58b173465ae88b406e0c7dbdbd958f80be3c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolRenderer.html 211c033297d343c4a962533589111f15161af5231c154a070488434241a59d76 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellChoiceEditor.html db7793262a23ee85af13cde27e43fd8166af2f309a4aad734e05ebbc373d9741 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellEditor.html cfe741c7c11ce820c3e672f1f8f42580b14b90f91e72c8ca2d029434b6c5262b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatEditor.html 4d41d4775878d731b6e3b0428fa4d31a394f5798594535184040deac30f03ce6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatRenderer.html 939cea535ec2b5dc520c0695a4ff005bbeab5ecd7dd3b27e5b634919cf55810b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberEditor.html 6c47ac2f754b87fe5b17d15993021bda73dc5cf830e5f04d15ed18e561b54ee5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberRenderer.html 4d358d03ac7940b1ce74f193be8a2e998934e9d21f500798e7618d50f40b7373 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellRenderer.html ef3c3aaedcfbcc0bb30eaf76e154a63576f8c418a22519b463759f554b1f9202 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellStringRenderer.html a88bec8285a7dcd157f466c93bebc880024b8d17e9a89d3b0227a6f295a8a1e4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellTextEditor.html 937eefc8892fe23f044a83c03fe8495483ea663edd8ae97f27f5ec5dce9140f3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridEvent.html 33640e051745dd702a4c7225463fd8fc5ab8144f56699ea97ccd5f52a8234bf2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridSizer.html d0b6750e419f0fe346e5713ad4a4accaf12a8fa0588ce5c8ccc8f015738a44c0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHelpEvent.html ad663a047c67280caaaed0cd66c1a17e2eb8b017b1fe463e694f4fb0c35604b3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlEasyPrinting.html 624d96dd19e3761c6c49cfe53386d540369a85889d9dad4a2d7878d0bc57db87 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlLinkEvent.html f7e847e446ec75e0ed680d1eff863000232e207f51c84cefa7f090c9c61d78c3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlWindow.html f6851dc49e11e023d5acaed4dc2b0b901bbbce3ea334c5e7bfff3a0907a30439 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIcon.html 0c453b0116daa1de9dbd4e7bfc2f45b1d71ce9b89f029f25cde87f1796adb013 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconBundle.html 0a62186b3f818a3bcf50649632174bfae45f9bba27d7fd0069be16cc3f2bb860 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconizeEvent.html 0913c083cef8bd95ecdd418f53d011b74c3dddc38a250978502f87a1ceba3fb7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIdleEvent.html ca8a306dae779f57cf9e790e9683e23b420ca0c309f39683d979d1e901466c84 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImage.html 2cb44bedd8ddb2486e405cff6e9322adf28f8209409557e63c15033c06176a0a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImageList.html a3c16dc572d747abdbded08c997f166edc6c478b27f9cd274ac8c6469687f1c9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxInitDialogEvent.html 51371066070bfc3895e097ead900ce883e02ddcf98f5e7d8aa94bcd0c00959c6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxJoystickEvent.html b228b9d8e4bda78011d88b1124079cf4e47434f5da4baafb364f7c98623408ca 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxKeyEvent.html 586696b63b476daffc8fed5c88e1724748439e1b4362f09418f1dff0aae41714 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLayoutAlgorithm.html eebcc81a7f74be14483b5dd5b5538a75044012685480a6d77994b920763be5b1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListBox.html 910ba29fa62bdceb3a4c6af15998e6c8e9c7722b6413e635b0ef1e4f5cfc1734 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListCtrl.html c120ee0f0fad7b7afa33286d57517c510151787c7bd866f7c06f24f0dd4cc782 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListEvent.html b20760ab80cd9a6caa78f0c830ed5f17576ccd72000e52c24461469f060c10d6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItem.html 10582aef5173fea6ae11a46ab585ec0c9084ee16e7305d5133b45e49fc2b5d2d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItemAttr.html a11ec338b38405396f41ac9f66480810c05f3bbcf83cb2b93341a6230158cc4b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListView.html 0d59aca9a4da396992f0defe91c5ff855013d0c82a083dad9e1f2806cd4309be 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListbook.html b9c64858f9d24bf36bc245264b805731dde9bb58fd4c2d9676f8a5eab4a24b3c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLocale.html 1ab2cdbe1f666b1f63270c8989fa422175700764023b53cf2d7ae17b0623aaba 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLogNull.html bc4e9223b3b497588ab4e0cfa88f478b7343fec01f77f32dd68be50ae9499413 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIChildFrame.html 118d00dbcab5feb07e5637cda01894f79854e0d6af1ed8a5c149db3c3c931c23 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIClientWindow.html 0a36e932a6ef8bb5260a99fae5d9ed04adac931cf7973876be2eb45a3e234dfb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIParentFrame.html 9ab29b797d75d2f63b6d0cf649956c0953b13ed92ecf19db5bc9f1ae68585b2e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMask.html fa0371923ccda8b795f551bbd27a8a141dd1b0eeffbd15938d58e56cf426b6ec 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMaximizeEvent.html 7cae8d9019faa9c687de15182d5728962f0199309026d5649ad18fd05914539b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMemoryDC.html ee8a0f8f27625064fd27fefbf96be877a7e959c1f276315e48312322d75ea669 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenu.html 67e3b87f8103113a2a0971aee111bc3dafe16c0b03f7fe1809dc00b9e47d1531 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuBar.html 90463f906813c0ea0d35a734d6129ae7f6cbfbeae28c17d1bfac3b9176c14be3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuEvent.html eba064d8be7105d0829d0d98c4a1daf169d30d3168929bba6a8eacb01b666149 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuItem.html 4174252a4542ff79843664bd5a4532dc21605084d08d55d7a48787df257abe74 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMessageDialog.html 7304532f17b12b569860e2eb6ce228165245703d92602f9ae94cc464e8e97f33 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMiniFrame.html 7d91b26e5b2bee7e8a038306702bdf55ae13f0e54344277045d64cc400dd79b3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMirrorDC.html d2b7b949686f9b222cc706eb20833abaeb01d1ec326ec60afd58edbb4fd08c29 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureChangedEvent.html 95b65e1c8a91877dd42be4acdabaa42aa6186855412098b4304a89d0780c4125 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureLostEvent.html a42db0b99d146cc773c521031203391c10282164fdfe9d7926f4d39f22e5a9be 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseEvent.html 2736b88592b938406d074baddb5bfb0ca1b510ea7e401bd15cc9690e9a219cf5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMoveEvent.html ea992ba444ecc547e23d570814b9455dacc4a92b13e013144f8439d776ebda24 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMultiChoiceDialog.html ed33e6083169bee09f47bd660b7eb2dc5dba0b0a099c5073f73e4908fab5c5fe 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNavigationKeyEvent.html 78aa98207ee54ee3ae43141d754e97f3cbb8337b7b6799634dad09525d24c2d0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotebook.html a3ed96757add6bd1f8b9809eedbca4a02cfee3d897ebe2021ffcfca66279d23c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotificationMessage.html 7ac03c71690d7497e2f5400cde1eb19e57ef81c961e694903230f2a27b42693c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotifyEvent.html c10349d82e52a0e6cae6720ee2266e854f145b3d5786f6d91ab217888aeccf99 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxOverlay.html 2568e83a66bc61b14b55bfebecefe0ba4d06cc097dbb7f3578721300e6cb5778 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialog.html 9dd44c343c61dcdeec9bdd53d5be829801977d70a922f3f670c147bc6b2ee36c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialogData.html a4e2bbbfe1d9b364d310691ccb7d51e14e0e5b16cc8508c1c5353cd56f6a4840 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintDC.html db3ac929f68a9426eba7eed963d15aca0948580111d4c9e828815b436eb7335c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintEvent.html 307d948bd4818d734cd3da6894789c56e37a61de587af94ceb23b6aaf0033343 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPalette.html 6304a9f0ef5b1729c3a6378ef4df4686cb9b87f4cf742c1856f6dd2cedb19ca9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaletteChangedEvent.html bbbd7cb86ce5cfd3ae479b92037bc090b48a3c59dcc342632b80ee774821f314 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPanel.html 2fe508afec97e17511dac2e7b6b0ae3fd57dfbf824e1758764d33ca544135bed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPasswordEntryDialog.html 82fd3ec3ba68cee90d4b7efa392107206234482a33dff56e1c8a712ebb2af9ed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPen.html f37c0711e4b7c4dae6adfa84b4e6a62e4655e2ca8a95875ad78eda859ddc0f95 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPickerBase.html 5625eaacaa9b63ac567a1aa0e0cec46e127fe920a602841cf37f9fe938ff97ac 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupTransientWindow.html 152bb7bd40907c795540497ac4399bf5717a72a6d19c83c44659084c8761525f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupWindow.html ff925a06568bdecdd8530f9d65cb31b5a5392c9e5dff147ccdaf3ad1b8876425 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPostScriptDC.html fb0d78d913de2d7900890d7b45db1ab894c057fa1bbdfc38cc6058ac25a179f8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewCanvas.html 42ea5eb1d2fdd878d446b0177b310ee93ad1298c5c4cfec22b5b3279a0958a6d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewControlBar.html aac532b7d7a9371171982bdf9b78da67fa060050c822d2f527bbb0c93e5f39e0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewFrame.html 9d730bfe73fc2d53622a312261f2908e714f1868a5eca518c0702c01c3b60698 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintData.html b2b1c75b2f1f4ce28f81b6738ec7ab68acb2e921c8dd99c4efd1cd20ff845a11 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialog.html eb8259daf5b10647af41a6cde0b7a5a4a6318e0260071465ba7125e5bc8e6cc1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialogData.html 3e9b7e8338ed0cc3701b250b7f11edaaa1f24c9782a5f18d6c20195852e9b880 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintPreview.html 1679f74fdcc28b9e84d2a4ec1605f12dc0639da4d8a0dce98e98ea98b5a02499 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrinter.html ed3dcfbb947842caa873b6811bd7a6189d9903c653726d5f6359b01fc397f133 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintout.html 2a0ed60c5456d33ad244eb2ccee42f66fec19f3d9896d79adfb3f1481c9d194a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxProgressDialog.html 81287f3d66835155bbedec7cfacd20aca2fa14b8040092ce552af3a97c8baef8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxQueryNewPaletteEvent.html bfe4b07272bc0572375890634063bdedc7d700227eebb7eb951ff1aad8a0811f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioBox.html 5d617e59b2736f4f657d22be7eb86961784cc2293abb5bcdcff8fa4d0988d24a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioButton.html f19586d41426824be7d84c1663303e97518e3c6c6323bc3beea1500feed94159 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRegion.html 4b7ee7e2fd65fb85b2e18fe979babf8ba53bb6f2d6052cb0af25586b0691df72 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashEvent.html bcfa9cef7774fbac79445760a8d4c6a81dfc465daf48f1b2f582e0219a152209 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashLayoutWindow.html 84e85b5d0d4ca45808d089b06eb0e8525f6748c0d9eaa81074425046bffced4a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashWindow.html 978fac97540c3fe2fea70cd1f7a48c38330f8af111246c0d4c2929aefb9c91a8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScreenDC.html 6c71931f7c72061a3ddb2993adddeadac97bedff3381d55e20db7021752729e8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollBar.html bc2ebb2d725885d30dd4d758ff2da6568f4d8f8fc89e9aec3d4c283cab71a646 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollEvent.html 6fdea4a3373a0779b4739c91a114e1b789b0ad483a739240359dd5b1930edf97 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollWinEvent.html e7648f2c918e9d85a13896806031ce06ef9a778d607dc2e8c0626d329ed339c3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrolledWindow.html 511656a99cd013fce79895ef9ce190c73faec42f622ec15f63ba77eba06926ec 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSetCursorEvent.html b6db2a93d0b8c7057353f5ca39b401071f45b2e89e9eb04fd0d64539369adddf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxShowEvent.html e5f01417f7e29ccb5d1b8a8b6e1d37f4108c929bccf0d3f8a5554e436187f801 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSingleChoiceDialog.html 7c8339e07432278457b3ffe43fe424fdb7bb9f0bbaeb4578ba601f7140bd092a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizeEvent.html e1763019c1034e10c82603281d24a6cd21cce214a8b4bf8c5d81e2ce401cfc26 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizer.html 4063a36b456bb1b781a0ff4298929ed6263b2faf8ce2f204337f1512a349aeb7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerFlags.html 64ac70c0175ee83f139eee08541eb22356afcc3266fdb2bf0e26287bbf812b35 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerItem.html 3c4dcd7d3093308399f4072fd4232dc22c587dffaf284cf8f70623ee0488ebd8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSlider.html 4750682c24e173541409f4e4de7fc709672660f6021540ff4349469db3141e03 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinButton.html 530f59c385574da3e0c4f5e948a60a20242a2fb034939085e0287ae244deb432 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinCtrl.html a9c65b0c7bac19fa4975a6092934ad4ef59488ec3f04eabc5ae5ecbe47187fe4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinEvent.html f96e535913b9c1ed915cee9b83eb3244270f8c7b7a7fe28dde9a957178230424 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplashScreen.html 397927c07d52d684752f01b3d48f804c43bb2c2dce696f80c6b2e2369aab3384 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterEvent.html b154a4a13ef93441b63901be1bf4ecd28e66027250aab1a4595263e2021164ef 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterWindow.html 930334b267924df0b02eb56015f41c5ac72d4b01d315321275c544f4c63217a6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBitmap.html 915a049c365ee500c1342505d9378573f859a6f20a4c9b1ac2e912ba92e1edf0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBox.html 94b2e3a35b6a48541f50a868fb9e96ca0a0383107d546169fd36d1e1655cdd6f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBoxSizer.html 567f73ba6336cf141b98ba300c2856faa89517e4e1fe19ae6c580650eddbea95 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticLine.html 66ef268dbaa882079390bb5f08951baf2766a6016db1ea111162b5bd7ffe01cb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticText.html 4034663317298e966a479f808e176b40f3d97f23b5e4f62c8ed37e1ab59338c5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStatusBar.html dd6dd13471d025e82e17912b8103f16c6ba1d52f70574a0d25a4a142e1a473af 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStdDialogButtonSizer.html 3417341c82a23dca4f873d182952cd78f8d72a8694633446a59f406ef8a8c648 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextCtrl.html 66b9d8ec6e7ef076eefda2800581c68ef8cf9519d5d5823da00015da4e6026a6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextEvent.html cfd82b20874f24e8dc3e24afebbbe5e85320319787b0779b7b8df6dab618b81b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSysColourChangedEvent.html 788e99f2f2f2ffc4c18527332b60f1ad2e00eb3a9ccdb268dee0f9fa73dc92e7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemOptions.html 5232e52a3a9076c41e6b7233d681aa5b18fbece49b0b6cd69f78065216d20af8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemSettings.html 49867bb58f6207046c964a5d300300433803f6f4454b90dd4f8cd481400362db 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIcon.html 18cf7ca0214df6bcd8fed35e5b263ab223d67292289f0f987f760ebb15a5737d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIconEvent.html de2ec25ce4beb18f741ee92b7bf73378e73e210ad0cf53ba050734b181b7b8e2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextAttr.html fb5f809251b7e7f71943820264f5696ff4c096b68ba4f953ebc1d00070ed19b4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextCtrl.html 3b53424b9cb0ac346c91078a3ad966e7533cd3b619cc7a5f47beb0211bffbee0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextDataObject.html 9b3c659db45b552110f3418ad48eba50a6bfb2341eddc6ad588e19d107ce4173 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextEntryDialog.html 8f9865f089d74301ef7344d86b3d74efe27a13c084a15cede1a0c6931a0fb97c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToggleButton.html 0f912c4cd0c744eab69734f300a42fca06aed8c378be231035d32acc9bea5527 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolBar.html 2ff6b3c7473eed191694f36632333666747db9d5b8d3cf434c066fa59f3b9130 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolTip.html 684382cceca704d3743a8f91f262fa24d17d1a564f350b1b95c7d3f5a41b360b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolbook.html d2270359021fd77c5f7a20870408d6c4cfb90619c57dcd44e18f609a927f5e83 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTopLevelWindow.html 7517a4c683838c2645c72a90fdaaec872de9b8d398a663b62c08fe32b8d24508 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeCtrl.html c9ccea54bf0dd85d7da9c71365f78f039bc0c16d512adf2eb2f07d0a3e4a5fdf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeEvent.html f349518bd4ba716118da7d024f284a6d994378dcfbc699e3e6f7dae4e1b1e59f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreebook.html d97f90f2d8828b0986ead8d0bf1838e165c492b6da06b66d994db3609df86198 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxUpdateUIEvent.html 23230fe7fe1f18f950f2b882a024e375c6054475304c166f861de3b6197d9af1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebView.html 4fc9cb1a4502af71f5491a7582aa95512e91e837770f28c54fc938f6e52ae4e7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebViewEvent.html e23bf35e9e9959a90373b8c1e86c98debd8ed3068014a314562055d36b1b447a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindow.html 4aa41d7ebdd650cbb783b956f1a3d42a98f4831672d3fad75289fbc8aa4fdc15 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowCreateEvent.html a51b1b2394120c66b97e8ae474c3efd0f74313502b993e6319ddc9cc97c9edd1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDC.html 270277911b4cc512e1499400834c38d421019a6ffeb71c9436dd77f2d98c4bf8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDestroyEvent.html a329af2e6e36f295a1529b0338f52f94bcaa8705c9d13c185595087fa8c7455c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxXmlResource.html d22a65976cbe85d4b132d7a8b18be029c7ddc5a07a69dc5bbe8d9c48f27f6e10 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_misc.html 2204e0bb2b5996fa9212b72a91a149ef875d9787b09d190f61f9475c8fcf5557 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_object.html 054dea95c6e0ac6e0793903998b9f8ba09feb9a98938d7940c2891dec8dc6511 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/notes.html 05322ec66136a6e2c857e5dccca8e5a29db879b46743139a009fca91a0429d66 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/search.html ba1ffa91783c6ade1fb77ab0abbd3e0eb305d4dbfbf9ca6d2219647df451aec5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub c3c7a82574d3c87d8f9ecc6d650c466fbd63ea81661973838be39eb7e2c551c6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.html eea05886a0d0f4552ef123c85559a7c8fdb730fa8db68ef79662397f38fde2df 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorEntry.html 7d2a736bbf99c3babedab280f6e5515562d9d926acf69bc51bb59b9c60a4b92c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorTable.html b206e424b08b787516e5bbf182247b566d9bb0ca4aace20215d7317514e9ad25 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxActivateEvent.html 63c24abac1748f58bdf4bed3e0ec96f6df1520184b5b9df85ad73387db375292 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxArtProvider.html 62ea46f8ea40de9b0bd9533561cca59778498cf964ae948d3234678dd8c9ec9e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiDockArt.html 15a510d79dc345bc29715a4a605d83b7d876613ff7640fc634117fa1f966145e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManager.html debec4a0f0073bb6ad8a8126218c4169bd706899858e1caded06ca470aa51212 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManagerEvent.html 69c36245be6380f0d9b370163fd12741234923f7dbd322ceb368a7cec2f262e1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebook.html 2945d6daede83ebae7230727b7f7a74fe8296e80afe31eeb323e5916aa89014b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebookEvent.html 4d4820221b78d90f4c533f054332fdeacf789b3dcade057b5e7f984a6c39e99d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiPaneInfo.html f7707967726c9cef9db8f95874aa2a959cf89e1c59cea7a02babe626c39f47d8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiSimpleTabArt.html 547764a37643ac1cb806664849b46613edb1b3ec5bfcfd72d1c3248451a5174d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiTabArt.html d528d029676fb086386c79962bcbc5d71b34685589832ce141a24d81e3ec505e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmap.html c4029a9a191ceb25d3e5c0b424e5fc41fd592976170328cd18b723f3b1bdf1cf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapButton.html 569a4e10d6f9af7fa4830505a86f774704d5d84fecc1c29823e3f7191ee0892b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapDataObject.html 3c6ae32476c645063a98335d39ef9da21bec20006973c5c334c0e51b40bdbcfd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlBase.html 7d0c2f3f8c4cbbea035b3e181cfbe706b3be1f9a161e2de16e5a02865a76cb2a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlEvent.html e9d2a28f1314ce1c121c6fe7f3716a7511f8dd7219c1b0020ad7559ed1d8cce3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBoxSizer.html c552c39c03eede9c31d5038f4ad5423219c56a3f29bc83a6f7a104776e6c99fa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBrush.html 43d89e759ae1627bdb453aecdd61f5fdd087e9826effea131b497e8eec84a764 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedDC.html efcf72dd876e5809f4ae3db93216d4a106e43bb42cd59154a7cf4a310e35197b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedPaintDC.html 55523344c8fc25dc5899793cd4f11cc0cbae800a174f011aefe74229d9c78c41 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxButton.html ff9eec8ad09ff10729d574ced1f7e1b001a211f33330d0a65baba5ba382cbef2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarCtrl.html 4ffa63b52673fcebd6fb86ceba6112885bd95f7cf6230d45e8d7bcd87df7faac 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarDateAttr.html 40c7ea56e03c37c3b34130fe50238a9143238e4378738487caff026093855dea 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarEvent.html b18ee49ce16ada17e1389792d3d763f66584d0ba110d6883fb52088089f4d0a0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCaret.html b4181a4d51e62a80a34ca7efc8dcf17b22b4838e881fde09d79703656f56ac3b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckBox.html 32a36232e490cb82f9e2065774fc6bf5d75cd20c54e7e3a1c611feaf2e535d24 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckListBox.html 320662e276f37ede6b02fccc209b528747747918b26abbd782188eabb868249a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChildFocusEvent.html ce181733bef61a897431ca3f0693069b6cecdcb846b5d55b6f7a4d4d53dad2c2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoice.html 65e6c5a6240a6b09bb273964a65c3126c7f215ecccafa8ada40796aa60551e7c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoicebook.html be853eae3772441cf0207196fb42484014676744e13663b19db3c2518d1dc0fa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClientDC.html 02171674b2be317906ca46bab46c90a59059a46c978e82b2ff1421ff1c4cd6af 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboard.html 0d89552f7d6abb5a33c89a414a2049828c8c33ac8349fd3d5167ecf9c4ef0799 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboardTextEvent.html 4b6c0508b524dfb8b7b434fda99ba0c559c951b6bceffe3f2e756e1618773e29 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCloseEvent.html 36c472bc30c49ee28a9780eb7f302e943506ec19f66a10d1b5ecb5549c1dccd0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourData.html cdb59e351b40730886c5f20ba9c28dcdb52e3bc9cdd82b9f9ef04e380b405657 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourDialog.html f64ee558b37e3cece737105ab3747a3e895ff11c68f035caecc7cf06def160bd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerCtrl.html 1f986bc40d0399989b9132c1ea092b81f85787b09fcba272e824adac8e2c5972 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerEvent.html 5c7009393301ae9ede3b76952d7c22da7e744536f090772115cc654b05168983 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxComboBox.html 30578bd8c0ac4315e449f869347861e21bed3b8283d2c6a3e9cfb025b1ef0692 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCommandEvent.html e9ac3d841378fe28adc0ea101a72694105768b26598e592f1543576d4e153c9a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxContextMenuEvent.html 472aadbfc8ed3d6de536ae98c86a6721109802e3446e68b9e9420f6f1fd2a9db 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControl.html 613883dcd77d6cfa68dcef33459ee9d953b36a9ef8a90e230e6e5ce15b5339b9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControlWithItems.html 9f19c98986ca3b7405bc56b9cd0238d920afb96c212573fb67898c56e79f2952 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCursor.html d8759094329353ce55c9475116bd588518a84d0da153966bfc432848319669ec 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDC.html 72c1a3b2c3f116b4eb04e4b16ad51ec62c9210a93c4a658133be1ff5284c20ee 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDCOverlay.html d74a4d51ca07da831450c0343171b135b11bdfaa620d90d1b79871734bbab40b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDataObject.html ee2ce5781622670bf7bc08127527a54c00ea2e09b4f01f971f51c654b75a93b5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDateEvent.html a2e903b5edaa978ff66ccc29fe6c61959bab74e1b27fda91ca43e5235ba9541c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDatePickerCtrl.html 69181677a018980d1989dbfd07abbe4d4a96b5e248421f8b4acc0811d4495a2a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDialog.html db2e70f6325a25951d51e69487a2f863499d4bde79de39b3a784440a52cd4428 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirDialog.html 044063bd64681dd234c02b1f5f98d1be59c96c2e7602719d5f8b9ea0968f7ad1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirPickerCtrl.html 9499857050d42bbff9543e0dbc5eaa3953767121ae401be74914efb2751139b1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplay.html 5374c43e09e37853c4b65ac0eec405d9647d6fc3553b04e8a7a98ecaaf2b9a61 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplayChangedEvent.html 166549938ac7eca54d5ff555e0915df37dc1a4ca384f15373a3a55a94448b9a2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDropFilesEvent.html e1f12ce9f4ba64bcd121e174822f58b2a0cc9f615ec5a404e5aede33119f1df3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEraseEvent.html 040885bdcfe601f6d803460f6bbb40dabd59b597ac31bfe5b5fb74c9a96efd7a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvent.html 738da159bef5c9bbf531b63784f4f56c39eecad38e3392e18141a77250625f5e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvtHandler.html 9d38f7aeb2cd18644cfcaed304ebdc1d3ffc01b4ee1534c7c7c441cb4cc58ea7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDataObject.html 2456ecc0561c80a2b369afe5ef3b2d9144e82154441e228e68df759ffff38dba 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDialog.html b4a3903afbe7a5325920795d788d490b8c8fdcdf7d026044e0201e5aae8f14a0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDirPickerEvent.html 94eb26045cfd6db078f61b44773d5224bc1d7a2b979e4c1ccc1013b7345b6489 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFilePickerCtrl.html 8cc15d06902debd57cf20709faac90946d5806023880d4f7665dd2d4564be0c0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceData.html 01ce3d23ea67afe366ff2b79b6597bd98090c5a597a3db3bc88fe1df8b36baa2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceDialog.html a193eb0b7d4952ea6e09681080183d8ddf1161cae0c4ce24fc4e075e4af5df69 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFlexGridSizer.html 06c50081e0d1adafe9da2cfc08db467796ad8c966548eade29b70911e63d3e78 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFocusEvent.html 58268b7b2177d955ddae7ade06fed990e297a0c6252964632702838030d95f7b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFont.html 43755642f01a292f9e6be643072342696ff4b026e416e5d32f5f01b363f7fcd2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontData.html 240d882858e9dffbd5342d21ce05c7f45220f71f9eecdcb2bd2804ff52168c37 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontDialog.html a334c15d4e03ac859e2571ba96b1202cc69a2f2c38a8a0b058ddb1bb5311e24f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerCtrl.html 17b98cd38290e77f05f7c1da903dafe486f8344636265fcc327f21bc38e382f1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerEvent.html ad7d6d25ea169e47fa15e12c7c07479e2676d551826368a60d89c591c013ad2d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFrame.html ec70173b80bc2677c301c7ed6081515d3fa16016321b61b91194560d10433893 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGBSizerItem.html 933572881c1d652e5f3f420de486bb44cd1ae5a698dbbfef59e0005a702bfb3a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGCDC.html 8a71fcbd9d4d1cf93d7f9c915c78c3f95372291e530b256c91e8c7f25aca4143 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLCanvas.html 4c3ee14167a77d9d430d464cae2f8f276a193ed6501d0d43bb6d88c8cae7695d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLContext.html fd19163ff14c78b7a08c484eeb5dcf23e6c4265e74331bf40660d403f9697a34 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGauge.html a4f11951279d4b20cbdff7e7e51a50cc6ffe8b148cb5d3a4eae9275e2143647b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGenericDirCtrl.html df39b321889c40753b46e1d95f2929beaf1c647fb2ba7d6a25dadef7114cb777 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsBrush.html 76444747aa8e048eaea13c43600627327fa94e8db7a6554fc4b997c0fbd446cc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsContext.html 466c8e51932d19537ecbbd2ce4be7a06a20795217604382fb9a02f91d90045a4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsFont.html 7fc0da5931f535ed348620544c07fa7237e43dd83e27598fe79579ce46eba2ee 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsGradientStops.html 9861435481980da8d4ebad082de7877a3329a34162736696b15563b1a6fe8cf1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsMatrix.html 65c648ee78214c1a356d4e618b3cb2747bc6535dda781762a48cf5dfb6190ca1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsObject.html d4f8dc99fcdcae2f49ba0ea57910e3cb12d2c0793c704e9dce132bde6928d87d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPath.html e3e21f8677e4b26b8d13ac2f8fa515e3a55bbdfc7bdb422cfaf0f9f375fdf4fe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPen.html be030bc77f4bf1c17660ec550ba606eb4e8cdb404f35c4dd200bba76af2edd0b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsRenderer.html b5ddd64544f48adf0f9a542ed916e1e8c8d2542dc5e3616bf2f32367c83df0d8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGrid.html 8e48e6580e129cba77e29f398c18552a7f64e8863857ea3a45e1a302a97c179e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridBagSizer.html 1be31d966e6c82374d8793d7ae940241d9e48e48ac45bd363933c1eab49b52e2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellAttr.html 543c9a0e29052520477b8d353b4f7b922452be9c237f5df1f5536fbbe8efc25f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolEditor.html d3ab5cf14a4230dd5a3d1dcce0901529fd0ead6049a80427ab4d077fcbcde413 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolRenderer.html 4fca958e2ffbee9f4876c168295a447933dc5ad0102bb466b255fe7a1c3f6d8c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellChoiceEditor.html 1314972c7ab3ddfb5e83ed6de46b968565c565dc1f09bade6b32b60724a82e82 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellEditor.html ac1bc0e7abcaf5e33caf0feefb4d66498df30f01d911ace5e6536024b4db24d6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatEditor.html 1c152afbf8af9821f5519121e8913bc99e41ad258b1bb0a5cfcd0677cb807478 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatRenderer.html 5637c551b815ea98d8f0f37bc4f1b5ed59de043696f2cda32f56df6214c05642 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberEditor.html 184c3c23f8ce41ad67f1e1ab33edfc264f4cdda4615c17d17fecd775071d76e4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberRenderer.html ab8f4f9fc84f00966d74c54596d0b3e118880977170a87f47984e9bf3710ce64 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellRenderer.html 9c3e021f05c9c6bafb685b71e3f60b16ce65fc7094a5e2a80818f82d510e4b0e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellStringRenderer.html 42a0813870573b6e70d8567867c16455c23617c4288d1699201a1240db7df984 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellTextEditor.html 49ab7c8b17a96f4c4e35d8b9e06d0dad4dec52b039320d128ff0188ed0762f05 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridEvent.html 3ef9a992b311d6f836be96fed96d35f9a59c2842113be5400a66f24f57ea6155 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridSizer.html bd2a6bf8020cba38321a3882cdff678e69c2c55728bcdbb2f6ed1817a8151e36 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHelpEvent.html 42c3c9105b20a36920c48d539f557564aa0b28138973abcfb1189ea139eaffec 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlEasyPrinting.html 7f275cbb866c933d3dde5c8449569fb9bade9bfd11454221383cc36ecc3dd961 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlLinkEvent.html 468fdcd43b4c8ae108e87f82521a861ea3430d90835913b7445ff75161aed977 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlWindow.html cf3d9d77e5e0b6c09cdca905a3aac6ca237a1210cb389632857b56672d5979b4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIcon.html 84dcdc4414c88f5baa31d12cf66fd1e3fb9c6e2438b43492b412070ddc8f7c66 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconBundle.html 9bf6aaa8ce3235d7f271e33a364da7d993dc0daac78f752dd583eca04104261b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconizeEvent.html 2ed5e1c6b980434f23495ca159fffc364eed8e8a5bdf01373cac71feb47acbaa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIdleEvent.html c83b790eeb2658a33d9c9cab858d72fc73998d9676c2f7d2cbb56c0c16162425 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImage.html 08719b1af098c49251aa9013adbd148869174af4174f73d79280228ef0ac1e6a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImageList.html cb3d4132720e62e44919bd1c9d9c0107d6fce19a20ba8cacddae769de28309c4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxInitDialogEvent.html 4ae47d8c36a19f6d621445eb8abf97250b65ca066173928a0c1afe8053f30960 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxJoystickEvent.html 71925e10c4a7fef298ce49b25d7ea6ec9685fd3062d41891cb4dba02ddbcafa1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxKeyEvent.html 095dd6cc556a4e8f0bd21f318a1b7858a5ed50a4bb3397f2cb9765bb0286cfb8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLayoutAlgorithm.html 607bb5dfbeebcc44eebce9b26e9975aca7ab98d026e827718f58abaa6875c6d1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListBox.html 110fbec04a3808364a797eb548ca41334d05d7da9e534f9e4f496d2e955c375a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListCtrl.html 1e17eee11f25f531e84bed33e82aba35bd72d56f323ce0e13dd1076618aa4a62 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListEvent.html 9bed3ef3a99ba0cec81f6356f8eb735d3d269293365e25b22b245e1cdd3bbe40 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItem.html a056c5e366917a678edeebb80efde17d80afa9761614e7579bc54b737edc48c6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItemAttr.html 44319a935a40a28ec50323809b13607ad7097f42877b4b8c984333cfa65f0a5b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListView.html f368287c7d50f47787c523d60c76afa8767a3cf3f2232bc12f9418b18b8e253f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListbook.html eca48bc5677be4e6b7837321d8ffa3f9c7df77aa844cbb39add86f8315c38fa2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLocale.html c96e675b9d90f109f7930b580c5e6c04b8045758019453a401e5414b76722298 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLogNull.html cadb58a94775de211f225753307a966163e6010f5e8360f5bffe3a6fd125a54c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIChildFrame.html 7bbe6901756e9e5812d8d01d788168609ea7d961da6c05b996138374a2adf8d5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIClientWindow.html 31f406aef34f080c34b9bd204256a2a8c28332ca64c5dac48eddcbe1003319ef 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIParentFrame.html 02caa14f42d1c7e868b673986a785b0b984563eeb93ffee7d5f43552a5333280 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMask.html 426451f7d4c543fbc9c36faa31970039c40949514c4272bb00aaa8d32f89d0a4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMaximizeEvent.html 09dfaad0bacd81ceb5047e9f37f23d67e82d912a42281f9c27c92fdf8d12308d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMemoryDC.html 1e74b12561f423bd33475765522c875a86c8d453e497baabe2ed488fa3656f73 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenu.html 50196bb42c63c742af221da5de52d831568912e68a9735b55a9820dc947378f1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuBar.html 83657948f11d5144e36e362cd189cfaff5d7c45914add88c29f89b48385bc4aa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuEvent.html 81da444fdaa6da6d9a4cbea2ef823a0101d492c9f195382ba13aa53116fdf9bf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuItem.html 47c6b4a3f50ae2f7126d5b1235f2c02fee4f919fd0e0820199df4568b97fcd4a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMessageDialog.html e1a148e32d457eddd12daccc3386a6efacbf36b2180262e5acbd329431d2695f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMiniFrame.html 94a145bb2c7f8220eca4b80912039ce39f3c8cc34b50a61a594057dafca6db7b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMirrorDC.html 0021c3dea9bfad5ba8e660c6087f0fe6f485820bb463e2e0b0c9de394951bf58 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureChangedEvent.html c3287d1a983139535f97699b35bc4287e3532de01964425ed1c4c07a825eb630 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureLostEvent.html 0ab343f125f4580755fc4f8b9c98f766fc3ba29b74db58c641b20b32f00d34f2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseEvent.html e41eee35aa74e780983a8857dfdb6981f2489e605a15761088340c64caf5f855 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMoveEvent.html 5114dc146d7c8d602ea61c50c885de2c8a2709a6c48cdcaafea80b34edb585bd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMultiChoiceDialog.html e49c4e6da1e0c40ad1ba9fdbea8cf63873cc0d07285c9d5096e2311c2d31c4b4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNavigationKeyEvent.html 456386119815b7c04add3000b49b7c1fae4e08a3f5dae2215c06ccae6ac2d8e7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotebook.html 6b983061464621f9a090e86b0663623fdeb80a0eceaf83cc51f553b6350a04bf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotificationMessage.html 5f49305ff6da2ac029fa39e38ee742c9df9292411b00159a80c4e691c36523d5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotifyEvent.html ff1beb428d625f07f4c4b8fe2dd704ccc8c2410000598d7f5e7f3e1462c0bcbe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxOverlay.html 3af7193dd5d90de142976928c97e4e73731acfe3ddcf9f70de3b4af479da09ae 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialog.html b1176dd0c501837b4b6627988c8373dd35bcd873e90ba9d56d21a52a25eb9a84 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialogData.html 4423ae56e1bf36d403989f3ac00c10534d1a9feea4f936734b30ac800b6b3ebb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintDC.html 9b556e21ae7ffd518acbc5c6b1d3fbda1694b809d797f73d5a84a1e2234a6775 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintEvent.html a026ab5379e12afdf394d8d9c8074c32ca179b755ede9f7b151d3283f0683796 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPalette.html d5fc8aeb3f3348b0fff7b23e9b4991d8e25687de62eb9a669772f7d17b998e67 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaletteChangedEvent.html 946df4a97a12bf376557dd20df3d39b03243bf8cfbb28a1ba5d8e67a2ddb1d4c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPanel.html 48cd6421073ab4e08941f689466995436f278caeaac01f3965d4e35f977dd742 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPasswordEntryDialog.html 2c860b2a441612aaa0a71bd341a8e25051ace84f125bf352e6112491d7a70f16 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPen.html 78f0183dd4ea9ae43581efc19167cfcecdb90a7ac4f2cd448faf0fc036460ac3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPickerBase.html 2430128f74efd8b37b2869366836ff274f59c1ead1f2e5c80df25fd2784fcccc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupTransientWindow.html fab781ec520e52edf5ec269d8ec3f8931261e0bc46d23e473c4e1a9a84ec4fb3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupWindow.html 2ba54627d9aefabaecaa93e0a05b66696e06423a552dd42e31daadbea05df429 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPostScriptDC.html c83f78d6e6ffcaab42ccc27411a7c935b9154678cea267583513ae003cecfd77 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewCanvas.html f64208a13d511d94ca3b6bb449d22ff94db60b3e273d19d7fd3ba743a7770e57 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewControlBar.html ba66b248932659b537a5e94853141c8844d036c1fbcff2c5126bee550da933e8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewFrame.html feab835ee387a6280f76dc7d3a73d0020148c57f325f94310f6f2caaa6fa5517 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintData.html 68ab364c03f5e6b61c0fee6054472147db690341a250ef48b969631c0e9410eb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialog.html 75a70eefe473a8f3f6c61d4929f9eda6f4dcb685a2af70a4aa0eb961f8703f6f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialogData.html 98fd9bb4de432c75d6edab8f930a3b11ece3e1e3db19688a71b8ef6b9f1f8eb1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintPreview.html e1d0c0af7e0f4c7433dc936e3d3601788a5716e0058ce7d987eaf10c1f96cf81 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrinter.html b84c0acc8934933afa203865fab3bcf88d859ccac130d6d255c15f037d24bd60 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintout.html 461c07ddbace12f78a8fb8541182f2264b368abdd407386ffea8446f59e2f988 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxProgressDialog.html bcef1e8f83c2a45c1731c9789a1682ddca966b48f43838f36988b1f431166d1b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxQueryNewPaletteEvent.html 2f5a0df8f539457ff10039147658e011611b4d44e5bd496d453ecff9fee1f05b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioBox.html 6efbe736bd4e8a1ff948d645083ae7e21982eb3a2c8bc89e9f3ec70ff970e450 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioButton.html 74adf1eef4aa3ab8e018040b5fd18d99efe9eb5573b57c4d809c1165ecb8badb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRegion.html 5069a5fe9fd1b2afd56dbc555f753a79bbd366efb81b1aa5d24109be4492c67d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashEvent.html 0afba7adeaed1dc0a0c882536162c14c1dfbb9af9c3540ee192afe6885fd5726 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashLayoutWindow.html 97b490a2a1587cd888c9be9b229aa67d89e5ef81de3b17fc9502e874cce2f641 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashWindow.html 9e6ac2d582e8748f07623a79981f63585f06a6f64925c6caea44518b31d9f6c5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScreenDC.html 5be21ff77ca2de27d2171a2f8c70defbd9147bf1700f57dfa56273ea38467026 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollBar.html 4e1c661497acfc72b048fc65f0f687439e248c97975b51733001835507e28240 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollEvent.html 2ec31d96477e2ec4772d9f09d82942bbe56fb8b58b8742d89433501e0eacb6b0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollWinEvent.html 512d90044c6df754e21a2457257ce8f26dd94890c034634b856297596e62f3aa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrolledWindow.html fd5c5424935859de4aaa43c57314ea2bca80c199e9e22feabd06a011352f0ef2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSetCursorEvent.html 4e5c688b0109c3cb9f6014c60888f0e788177f32dbd186e0aacba3998762a23c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxShowEvent.html 123e7e4796e8f1932be3f8fff2ff565b24ee888afa8fc6861345fbbd71b4c862 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSingleChoiceDialog.html 693e87ade789a1317f89bd2daea8a603f3f9388f25d4527e34c6867cca00d3fa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizeEvent.html 2da148513fd3b0131dee78835a06fd3ea0f2834efa1ffea1ac24f809d462f747 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizer.html 9aaadbe5bd365f1a49bd860e60f371ba46ba8b6bfbcab51bf682e0ef6e001bfe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerFlags.html aca3c3ec22c591d4b57884ce978597589dcd4e502f6c3f8a3634253ae67aba71 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerItem.html 0badbd651c304ebd0af37140b77a9ee69a4c3ce96a35cd76a6922e71b72df18f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSlider.html 0a89461d7fc827b6d196daf5c61e8a9557b20615256499bb8cc68fbcfd838f7f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinButton.html b5f40b1692b99b3002b15aac5b03acc9bc016ccb3b8779cf5e62cf51865bbe17 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinCtrl.html 7abe05f27babadda730cb809e2db400bc987c1a556d34aa8d963538d8de05682 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinEvent.html 9820b2c8c1a431c9264f2903f00d45d5a229fb70b52e867a25f52fe030a8bc45 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplashScreen.html 9a5ce00afdfdc7d7e908624b92a51d31068aaaa811f595dbb16be41a39281525 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterEvent.html 90ad635aaa41765ba6395d2cb7a202bb6f9b085aa8f50a439cd8c881220efcb5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterWindow.html 49fe9dbc2f50c55355020e67dabd991ab1015bc0409bcc407d53d7d13b50ef1b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBitmap.html 8cf1b5d3f15e4b86f409cb4256863181c4468133bb7547f1130050030c9b8646 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBox.html 81c31daff5e1c8cd19de5683bee21059fc709e68ca02556ab5cb15942d15c7de 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBoxSizer.html 504ce7eb007df6e6892c61f8f9870bc4c0f472c830fe28b91012d1684bd11ce3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticLine.html 31605cafebdd3d87cd7f52f6599c9e9420f72f1a325785a665e416fcad13c361 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticText.html 4db39150796e66797c9840bdae46e4897e97b740c07de2a54ebeade8fd048694 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStatusBar.html 39be281917ecd16feab1cf9fc2e7145473af7a468f1b25d8c65128fcd3ed14fd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStdDialogButtonSizer.html 49a9d6767d2b2e30686528d62c803e0ebbea1169a580a7596ab3c4f882a36cdf 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextCtrl.html 3d3293a75f8f3a59d857ac3ea5bc26dd421aac055d44250aabe6b4ce5d39e234 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextEvent.html e4def81e38832f13e5825199b364f48bc9d92aea035e4cc200e3e1afbd8e23d8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSysColourChangedEvent.html 5b0448740a2258c31e314d9461c1c754c83654bbc41bb49b47c877ac89440ec2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemOptions.html 18b57ddd703277f57b746344d4fd33eb544c5b64520dac14143d9b1e33ced643 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemSettings.html a2dc73fbc442adf724c079a0c79124ae52d9069acbfe1f6998a93dbc2b0c66e0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIcon.html d12ac26f7cf53abc35c25d31ffcdda07c316191bf775d3bbd4a7002272d6c3fb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIconEvent.html ab5c4f64e137ae879b101ebf40857983f6fb6734af6ae81f5680324d2f6d7f87 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextAttr.html d00047887b1432145a78e684086ee86f501f60f02a71a92ed689dfad4f3c7a76 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextCtrl.html 645b773bccf4513f5727d617ab3b01b867af5ea8fe0f686458ccfd2201e85070 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextDataObject.html 150935a3ccdc5e8a7229f236d91778c39fe2e64b414a0dc5b8234f0697480c5e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextEntryDialog.html f24bc6e2a8459322cf20bb73aa979f324945d52b5d5973945807bad4386af192 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToggleButton.html 1732f5fdefc67f77797387be55c65216c0f44cdbcf6a7b0216b85e70cf8bc9a0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolBar.html 585f1d82c87e75a873e3db4cc3f3c2cbe3122c00103edf798f077089be6031b1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolTip.html 33e4aef997f8351a76892845339a2beda2c1a8be362bde5d464ec1903bd49a58 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolbook.html 436b4dc42a236b24b9a731663312198070addeb469a27e79219bb7d6e2370066 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTopLevelWindow.html 95b86a4b96a8768d569db7bbae886f7780c3ffe6fc35717f18fa90f8e719a651 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeCtrl.html 7e66c90a1f9a55f5d7cd73c4e5a39ba14a8304a18d86dd0abfa99ce86dffc15e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeEvent.html 79d40ce2bddbada589f74280b19f3ecf8823b9bd8d17b318aaa8bdb7136313b3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreebook.html de2484ceeefe6dd600cf16ff321a106d88560773828d68dc55e8989772deb7dd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxUpdateUIEvent.html 7541fb5581c57fd3a754810c7036a162e61a58609ee98fcc7b58e3bbad6788fc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebView.html 27bb0a95f6a84c8a0379f316e1d2bc46612ef9c218609ba1afc8d4ee7804d905 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebViewEvent.html 558eb47a19ca873e07426ec349bead8bad8621d79c74eb47a70218f48cb245ec 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindow.html 47c200f889194b8848dfb770bf4172fae0b278bba2962cd3cd89af6f536d6430 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowCreateEvent.html 07fdde14e1827b86567072211e26b96d62e1b0525a36c90e537d0f31fddec173 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDC.html e19682c946aaa2db27033a01a4d5eb67c8cd0b5bf709962c0abe3abe63256dd0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDestroyEvent.html 7c51321bb7004b99a34c7a981fb838a8b10dc5243d67c1d3b1e11f654023c92c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxXmlResource.html eb69d86a5cbb1255bc27f6ad7639c696cc7f5141c4c3e5cc2cffb7cfc54959a4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_misc.html f5cf921b53bd0553d13c3377965b041f4fe3f891cf920bbe0003a99b372361b8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_object.html 5eba594982f3b89b1c11f784bab1b0d82eab91d3d9faaaf75c70c242526b4eec 2 @@ -3837,2 +3837,2 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/404.html 5917cb10df1d9b784c86f4fb6f2b9fc19172ad8feec9f439fac8542c2ef7750d 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/api-reference.html 65650bbd119c5a07e992a82a4fca01bbc7b7c7b087054d3dd96c6f4b0f72f70e 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/404.html 894c77b9408b968f6e7c994fe669d035cffe43d193219b2529bd47fdf488d3dd 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/api-reference.html 0174ac1e217269e8e8c2e64ae6ebd988bb4a493a1040aec90cbb48421a7c3d61 2 @@ -3863,12 +3863,12 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/notes.html 98bda871de077ad30be428a0d90ba8f3031cd585ea62eca37312ce3b2c9b4ae6 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/search.html 51235bfd1b5f9f9e8cb8c919c7f930c61c480805f221606ede3e739414d0d468 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl.html c975526cd64cdc09c095cd231588b024d0d626e9f4db051d43fcdfdf1e419a4d 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_eventp.html 16984edfbef91c9a34d0ea06e476af2f2bab2128fa85222eb7e9c401d39374b1 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_examples.html 265acb5d718354d209e18df065f3df7a16aef084594405ab92c570e525f1ac61 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_sax_parser.html aa4a84bbe557f573ea320dae8df92751844dc87103f80c20c18649dec5dce5b7 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_scan.html 723bf60a2fdcc484a77f062b63937a4145f64f12886364f68e20ac3c8378c6f7 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_ug.html b34bb5a2fe20724b11d3bb7708704b1202a57d1aceb996456c0e2b4163b27fa3 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xpath.html 2c8d7f7b7f11b97addaf8468cde2d6ea24f3edf3668099b97d4499e00d3812af 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs.html e21feee16e362d3173fad6e74c0dfe90fbd6ae3cfd998933e89fb960676b4703 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs_examples.html 058764272a0be4750b9e5f145e97b06e17559df6ed594de47bf7288fe4243799 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xsd.html 0ce571af2ef15151a1aae002e853f09226648e68a1e5c45a3cbe5bfabe6450b0 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/notes.html 945b2cb52d0a2d3e72af6edd91dce9ac3c08444cdf2d9d900158af0424fb1df0 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/search.html 26a3b0c40cac19398a52f4cfd4075fc4a9e3b14c251d90ccfda56548d22c38a0 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl.html 5eee5db5d358d64ed86d1a434b784a96a6ef9ac7bd34c3d162a78c90d54f234e 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_eventp.html bd644e5cbb6a1eef4190710a314e98e42a93d0e433043a7d4407d39ecf0fdb18 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_examples.html d7403fc11812a668d863fc5027365727196e569937fa93fa65ef8e079f256af2 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_sax_parser.html 6d710a8c3b4fb697f0c93e2d470b055c2e779de2fb54c7f967d6605810fce28b 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_scan.html 993ccfa2158b540d6fdff1065da8f1bf36537dfa2393b63514d6fb19000c7586 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_ug.html bc3ae3d9b79855bb33b08bd25962431f8756f5e39982c8af9560903d2980c321 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xpath.html 5f654e418e5c17ee1dcd4e9fae476ec8bb6fb5801c8d9cd1d5ed2eae8f67b8ec 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs.html 1a1c64afb899168c4280be261192014ea3122c7c3165afec7e2a9eed5617aad9 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs_examples.html a960d19f3d086917d38e97e0c0199b872a9b38083794988f96a30d42238b0a41 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xsd.html fe6f8315b31bf2920459fc69e8861a087aae27687bbf71907d7c652c8ba776c0 2 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist --- old-filelist +++ new-filelist @@ -528,7 +528,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.7/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.7/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.7/doc/html/dist/remixicon-QPNJX265.woff2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-B93E08B9.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-701DC811.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 2025-11-20 15:16:33.233930007 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/404.html 2025-11-20 15:16:33.233930007 +0000 @@ -104,7 +104,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 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 2025-11-20 15:16:33.257930150 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/deprecations.html 2025-11-20 15:16:33.265930198 +0000 @@ -196,7 +196,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 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 2025-11-20 15:16:33.325930554 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/man_index.html 2025-11-20 15:16:33.333930601 +0000 @@ -137,7 +137,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 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 2025-11-20 15:16:33.357930743 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/readme.html 2025-11-20 15:16:33.361930768 +0000 @@ -128,7 +128,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 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 2025-11-20 15:16:33.381930887 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/removed.html 2025-11-20 15:16:33.385930910 +0000 @@ -175,7 +175,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 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 2025-11-20 15:16:33.409931053 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 2025-11-20 15:16:33.413931076 +0000 @@ -151,7 +151,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 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 2025-11-20 15:16:33.437931219 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/search.html 2025-11-20 15:16:33.437931219 +0000 @@ -104,7 +104,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 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 2025-11-20 15:16:33.457931337 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/404.html 2025-11-20 15:16:33.461931362 +0000 @@ -108,7 +108,7 @@ Erlang programming language

-

Copyright © 1996-2025 Ericsson AB

+

Copyright © 1996-2041 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" 2025-11-20 15:12:07.000000000 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml" 2041-12-23 04:30:20.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>
    @@ -8587,11 +8587,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
    @@ -8623,8 +8623,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}
    @@ -8692,11 +8692,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)
    @@ -8732,12 +8732,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]
    @@ -8811,13 +8811,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>>
    @@ -8891,9 +8891,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).
     'π'
    @@ -8977,14 +8977,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
    @@ -9019,11 +9019,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.1.1/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.1.1/doc/html/erlc_cmd.html	2025-11-20 15:16:37.805957167 +0000
    +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlc_cmd.html	2025-11-20 15:16:37.809957190 +0000
    @@ -217,7 +217,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/erlsrv_cmd.html 2025-11-20 15:16:37.833957333 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlsrv_cmd.html 2025-11-20 15:16:37.837957357 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/erts_alloc.html 2025-11-20 15:16:37.861957499 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erts_alloc.html 2025-11-20 15:16:37.869957547 +0000 @@ -429,7 +429,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/escript_cmd.html 2025-11-20 15:16:37.893957690 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/escript_cmd.html 2025-11-20 15:16:37.897957713 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/garbagecollection.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/garbagecollection.html 2025-11-20 15:16:37.925957879 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/garbagecollection.html 2025-11-20 15:16:37.929957904 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/inet_cfg.html 2025-11-20 15:16:37.957958069 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/inet_cfg.html 2025-11-20 15:16:37.957958069 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/init.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/init.html 2025-11-20 15:16:37.993958283 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/init.html 2025-11-20 15:16:37.993958283 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/introduction.html 2025-11-20 15:16:38.021958449 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/introduction.html 2025-11-20 15:16:38.021958449 +0000 @@ -138,7 +138,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/match_spec.html 2025-11-20 15:16:38.053958640 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/match_spec.html 2025-11-20 15:16:38.061958688 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/notes.html 2025-11-20 15:16:38.201959520 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/notes.html 2025-11-20 15:16:38.205959543 +0000 @@ -89,27 +89,27 @@ -

    This document describes the changes made to the ERTS application.

    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.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.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-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/persistent_term.html 2025-11-20 15:16:38.265959900 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/persistent_term.html 2025-11-20 15:16:38.265959900 +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).
    @@ -560,7 +560,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/portsignals.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/portsignals.html 2025-11-20 15:16:38.297960090 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/portsignals.html 2025-11-20 15:16:38.293960065 +0000 @@ -326,7 +326,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/processmanagementoptimizations.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/processmanagementoptimizations.html 2025-11-20 15:16:38.321960232 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/processmanagementoptimizations.html 2025-11-20 15:16:38.321960232 +0000 @@ -253,7 +253,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/ptables.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/ptables.html 2025-11-20 15:16:38.345960375 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/ptables.html 2025-11-20 15:16:38.349960398 +0000 @@ -383,7 +383,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/run_erl_cmd.html 2025-11-20 15:16:38.369960518 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/run_erl_cmd.html 2025-11-20 15:16:38.369960518 +0000 @@ -192,7 +192,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/search.html 2025-11-20 15:16:38.393960659 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/search.html 2025-11-20 15:16:38.397960684 +0000 @@ -104,7 +104,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/start_cmd.html 2025-11-20 15:16:38.413960779 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_cmd.html 2025-11-20 15:16:38.417960802 +0000 @@ -141,7 +141,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/start_erl_cmd.html 2025-11-20 15:16:38.441960945 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_erl_cmd.html 2025-11-20 15:16:38.445960968 +0000 @@ -181,7 +181,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/supercarrier.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/supercarrier.html 2025-11-20 15:16:38.465961087 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/supercarrier.html 2025-11-20 15:16:38.465961087 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/threadprogress.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/threadprogress.html 2025-11-20 15:16:38.493961254 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/threadprogress.html 2025-11-20 15:16:38.489961230 +0000 @@ -337,7 +337,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/time_correction.html 2025-11-20 15:16:38.517961396 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/time_correction.html 2025-11-20 15:16:38.525961443 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tracing.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tracing.html 2025-11-20 15:16:38.553961610 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tracing.html 2025-11-20 15:16:38.549961587 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tty.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tty.html 2025-11-20 15:16:38.573961730 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tty.html 2025-11-20 15:16:38.577961752 +0000 @@ -148,7 +148,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/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.1.1/doc/html/werl_cmd.html 2025-11-20 15:16:38.593961848 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/werl_cmd.html 2025-11-20 15:16:38.593961848 +0000 @@ -159,7 +159,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/zlib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/zlib.html 2025-11-20 15:16:38.633962085 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/zlib.html 2025-11-20 15:16:38.633962085 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/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.2/doc/html/404.html 2025-11-20 15:16:38.653962205 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/404.html 2025-11-20 15:16:38.653962205 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.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/asn1-5.4.2/doc/html/api-reference.html 2025-11-20 15:16:38.673962323 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/api-reference.html 2025-11-20 15:16:38.673962323 +0000 @@ -118,7 +118,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/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.2/doc/html/asn1.epub/OEBPS/asn1ct.xhtml 2025-11-20 15:10:58.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/asn1ct.xhtml 2041-12-23 04:29:15.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.2/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.2/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2025-11-20 15:10:58.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2041-12-23 04:29:15.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.2/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.2/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2025-11-20 15:10:58.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2041-12-23 04:29:15.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.2/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.2/doc/html/asn1.epub/OEBPS/content.opf	2025-11-20 15:10:58.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/content.opf	2041-12-23 04:29:15.000000000 +0000
      @@ -4,10 +4,10 @@
                version="3.0">
         
           asn1 - 5.4.2
      -    urn:uuid:b18906cc-2f71-0ace-4773-d6b53488a2f4
      +    urn:uuid:bc063cf2-bd9f-7d32-8ca0-5bc375c04569
           en
       
      -    2025-11-20T15:10:58Z
      +    2041-12-23T04:29:15Z
       
         
         
      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/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.2/doc/html/asn1.epub/OEBPS/notes.xhtml	2025-11-20 15:10:58.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/notes.xhtml	2041-12-23 04:29:15.000000000 +0000
      @@ -17,7 +17,7 @@
         
       
           

      asn1 Release Notes

      -

      This document describes the changes made to the asn1 application.

      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.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.2/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.2/doc/html/asn1_getting_started.html 2025-11-20 15:16:38.813963155 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_getting_started.html 2025-11-20 15:16:38.817963178 +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.2/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.2/doc/html/asn1_introduction.html	2025-11-20 15:16:38.837963297 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_introduction.html	2025-11-20 15:16:38.841963321 +0000
      @@ -156,7 +156,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/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.2/doc/html/asn1_overview.html 2025-11-20 15:16:38.865963464 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_overview.html 2025-11-20 15:16:38.865963464 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/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.2/doc/html/asn1_spec.html 2025-11-20 15:16:38.901963678 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_spec.html 2025-11-20 15:16:38.901963678 +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.2/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.2/doc/html/asn1ct.html	2025-11-20 15:16:38.929963844 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1ct.html	2025-11-20 15:16:38.925963820 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/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.2/doc/html/notes.html 2025-11-20 15:16:38.969964081 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/notes.html 2025-11-20 15:16:38.969964081 +0000 @@ -89,7 +89,7 @@ -

        This document describes the changes made to the asn1 application.

        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.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-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/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.2/doc/html/search.html 2025-11-20 15:16:38.989964201 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/search.html 2025-11-20 15:16:38.989964201 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/404.html 2025-11-20 15:16:39.013964342 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/404.html 2025-11-20 15:16:39.013964342 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/api-reference.html 2025-11-20 15:16:39.033964462 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/api-reference.html 2025-11-20 15:16:39.033964462 +0000 @@ -248,7 +248,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/basics_chapter.html 2025-11-20 15:16:39.049964556 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/basics_chapter.html 2025-11-20 15:16:39.049964556 +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-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/content.opf	2025-11-20 15:10:29.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/content.opf	2041-12-23 04:28:52.000000000 +0000
            @@ -4,10 +4,10 @@
                      version="3.0">
               
                 common_test - 1.29
            -    urn:uuid:47fccdd7-4694-fbb3-951b-c710b26f1dd6
            +    urn:uuid:ccfd92f0-ad03-57af-8692-644ba14ea50a
                 en
             
            -    2025-11-20T15:10:29Z
            +    2041-12-23T04:28:51Z
             
               
               
            /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2025-11-20 15:10:29.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2041-12-23 04:28:52.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 @@ -154,80 +154,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.29/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.29/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_property_test_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml	2025-11-20 15:10:29.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml	2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/ct.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct.xhtml 2041-12-23 04:28:52.000000000 +0000 @@ -1856,17 +1856,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 @@ -1904,7 +1904,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, [])
    @@ -2192,7 +2192,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.

    @@ -3029,7 +3029,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.

    @@ -3071,8 +3071,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 @@ -3447,12 +3447,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.29/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.29/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2025-11-20 15:10:29.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2041-12-23 04:28:52.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.29/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.29/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2025-11-20 15:10:29.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2041-12-23 04:28:52.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.29/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.29/doc/html/common_test_app.html 2025-11-20 15:16:39.493967195 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test_app.html 2025-11-20 15:16:39.497967218 +0000 @@ -133,7 +133,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/config_file_chapter.html 2025-11-20 15:16:39.525967384 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/config_file_chapter.html 2025-11-20 15:16:39.529967409 +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.29/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.29/doc/html/cover_chapter.html	2025-11-20 15:16:39.553967550 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/cover_chapter.html	2025-11-20 15:16:39.557967575 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct.html 2025-11-20 15:16:39.609967884 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct.html 2025-11-20 15:16:39.609967884 +0000 @@ -1943,17 +1943,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 @@ -1991,7 +1991,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, [])
    @@ -2279,7 +2279,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.

    @@ -3116,7 +3116,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.

    @@ -3158,8 +3158,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 @@ -3534,12 +3534,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 ...",...]}
    @@ -3828,7 +3828,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_cover.html 2025-11-20 15:16:39.633968025 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_cover.html 2025-11-20 15:16:39.637968050 +0000 @@ -282,7 +282,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_ftp.html 2025-11-20 15:16:39.669968239 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ftp.html 2025-11-20 15:16:39.665968216 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_hooks.html 2025-11-20 15:16:39.701968430 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks.html 2025-11-20 15:16:39.705968454 +0000 @@ -1366,7 +1366,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_hooks_chapter.html 2025-11-20 15:16:39.733968621 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks_chapter.html 2025-11-20 15:16:39.737968643 +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 @@ -226,80 +226,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 @@ -374,7 +374,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_master.html 2025-11-20 15:16:39.769968834 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master.html 2025-11-20 15:16:39.773968857 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_master_chapter.html 2025-11-20 15:16:39.793968977 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master_chapter.html 2025-11-20 15:16:39.797969001 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_netconfc.html 2025-11-20 15:16:39.841969262 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_netconfc.html 2025-11-20 15:16:39.845969285 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_property_test.html 2025-11-20 15:16:39.881969499 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test.html 2025-11-20 15:16:39.889969546 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_property_test_chapter.html 2025-11-20 15:16:39.913969689 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test_chapter.html 2025-11-20 15:16:39.913969689 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_rpc.html 2025-11-20 15:16:39.933969808 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_rpc.html 2025-11-20 15:16:39.933969808 +0000 @@ -538,7 +538,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_run_cmd.html 2025-11-20 15:16:39.957969951 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_run_cmd.html 2025-11-20 15:16:39.961969974 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_slave.html 2025-11-20 15:16:39.993970164 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_slave.html 2025-11-20 15:16:39.993970164 +0000 @@ -532,7 +532,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_snmp.html 2025-11-20 15:16:40.025970355 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_snmp.html 2025-11-20 15:16:40.029970378 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_ssh.html 2025-11-20 15:16:40.081970687 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ssh.html 2025-11-20 15:16:40.089970735 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_suite.html 2025-11-20 15:16:40.121970926 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_suite.html 2025-11-20 15:16:40.125970949 +0000 @@ -1617,7 +1617,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_telnet.html 2025-11-20 15:16:40.157971139 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_telnet.html 2025-11-20 15:16:40.161971162 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/ct_testspec.html 2025-11-20 15:16:40.185971306 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_testspec.html 2025-11-20 15:16:40.185971306 +0000 @@ -204,7 +204,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/dependencies_chapter.html 2025-11-20 15:16:40.221971519 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/dependencies_chapter.html 2025-11-20 15:16:40.217971495 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/event_handler_chapter.html 2025-11-20 15:16:40.245971662 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/event_handler_chapter.html 2025-11-20 15:16:40.249971686 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/example_chapter.html 2025-11-20 15:16:40.281971876 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/example_chapter.html 2025-11-20 15:16:40.285971899 +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.29/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.29/doc/html/getting_started_chapter.html 2025-11-20 15:16:40.309972042 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/getting_started_chapter.html 2025-11-20 15:16:40.313972065 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/install_chapter.html 2025-11-20 15:16:40.333972185 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/install_chapter.html 2025-11-20 15:16:40.337972208 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/introduction.html 2025-11-20 15:16:40.357972327 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/introduction.html 2025-11-20 15:16:40.357972327 +0000 @@ -157,7 +157,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/notes.html 2025-11-20 15:16:40.405972613 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/notes.html 2025-11-20 15:16:40.413972660 +0000 @@ -1185,7 +1185,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/run_test_chapter.html 2025-11-20 15:16:40.457972922 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/run_test_chapter.html 2025-11-20 15:16:40.465972968 +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.29/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.29/doc/html/search.html	2025-11-20 15:16:40.489973111 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/search.html	2025-11-20 15:16:40.489973111 +0000
    @@ -108,7 +108,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/test_structure_chapter.html 2025-11-20 15:16:40.517973277 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/test_structure_chapter.html 2025-11-20 15:16:40.517973277 +0000 @@ -183,7 +183,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/unix_telnet.html 2025-11-20 15:16:40.541973420 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/unix_telnet.html 2025-11-20 15:16:40.545973444 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/why_test_chapter.html 2025-11-20 15:16:40.565973563 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/why_test_chapter.html 2025-11-20 15:16:40.565973563 +0000 @@ -163,7 +163,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.29/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.29/doc/html/write_test_chapter.html 2025-11-20 15:16:40.609973824 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/write_test_chapter.html 2025-11-20 15:16:40.609973824 +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.2/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.2/doc/html/404.html 2025-11-20 15:16:40.629973943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/404.html 2025-11-20 15:16:40.633973966 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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/compiler-9.0.2/doc/html/api-reference.html 2025-11-20 15:16:40.649974061 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/api-reference.html 2025-11-20 15:16:40.649974061 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/beam_ssa.html 2025-11-20 15:16:40.673974205 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/beam_ssa.html 2025-11-20 15:16:40.677974227 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/cerl.html 2025-11-20 15:16:40.765974750 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl.html 2025-11-20 15:16:40.769974775 +0000 @@ -11521,7 +11521,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/cerl_clauses.html 2025-11-20 15:16:40.809975012 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_clauses.html 2025-11-20 15:16:40.813975036 +0000 @@ -641,7 +641,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/cerl_trees.html 2025-11-20 15:16:40.841975203 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_trees.html 2025-11-20 15:16:40.849975250 +0000 @@ -698,7 +698,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/compile.html 2025-11-20 15:16:40.881975439 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compile.html 2025-11-20 15:16:40.885975464 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2025-11-20 15:10:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2041-12-23 04:28:46.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.2/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.2/doc/html/compiler.epub/OEBPS/compile.xhtml 2025-11-20 15:10:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/compile.xhtml 2041-12-23 04:28:46.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.2/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.2/doc/html/compiler.epub/OEBPS/content.opf 2025-11-20 15:10:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/content.opf 2041-12-23 04:28:46.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> compiler - 9.0.2 - urn:uuid:1204a1d3-5c0f-e9cd-c45e-8fbd1aa5ac81 + urn:uuid:eac58f47-d9c4-ca50-0de0-8afd9c06edb4 en - 2025-11-20T15:10:22Z + 2041-12-23T04:28:46Z /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/compiler.epub/OEBPS/notes.xhtml 2025-11-20 15:10:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/notes.xhtml 2041-12-23 04:28:46.000000000 +0000 @@ -17,44 +17,44 @@

    Compiler Release Notes

    -

    This document describes the changes made to the Compiler application.

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

      This document describes the changes made to the Compiler application.

      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.
       %     |     ^
      @@ -73,60 +73,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.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.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.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.2/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.2/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2025-11-20 15:10:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2041-12-23 04:28:46.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.2/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.2/doc/html/notes.html 2025-11-20 15:16:41.085976652 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/notes.html 2025-11-20 15:16:41.081976628 +0000 @@ -89,44 +89,44 @@ -

      This document describes the changes made to the Compiler application.

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

        This document describes the changes made to the Compiler application.

        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.
         %     |     ^
        @@ -145,60 +145,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.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.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.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 @@ -1123,7 +1123,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/search.html 2025-11-20 15:16:41.117976841 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/search.html 2025-11-20 15:16:41.121976866 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/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.2/doc/html/ssa_checks.html 2025-11-20 15:16:41.145977008 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/ssa_checks.html 2025-11-20 15:16:41.149977032 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/404.html 2025-11-20 15:16:41.169977151 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/404.html 2025-11-20 15:16:41.173977174 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/algorithm_details.html 2025-11-20 15:16:41.193977294 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/algorithm_details.html 2025-11-20 15:16:41.201977341 +0000 @@ -188,7 +188,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/api-reference.html 2025-11-20 15:16:41.221977460 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/api-reference.html 2025-11-20 15:16:41.221977460 +0000 @@ -118,7 +118,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/content.opf 2025-11-20 15:11:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/content.opf 2041-12-23 04:29:37.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> crypto - 5.7 - urn:uuid:059062bd-97dd-6d49-11b4-811fd3b98044 + urn:uuid:dea299f3-881e-5e7f-31a8-16b59962b207 en - 2025-11-20T15:11:21Z + 2041-12-23T04:29:37Z /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/crypto.epub/OEBPS/crypto.xhtml 2025-11-20 15:11:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/crypto.xhtml 2041-12-23 04:29:37.000000000 +0000 @@ -3651,7 +3651,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 @@ -6386,9 +6386,9 @@ BN_rand_range).

      Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_s/0.

      When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

      Example

      _ = crypto:rand_seed(),
      -_IntegerValue = rand:uniform(42), % [1; 42]
      -_FloatValue = rand:uniform().     % [0.0; 1.0[
      +to lack of secure "randomness".

      Example

      _ = crypto:rand_seed(),
      +_IntegerValue = rand:uniform(42), % [1; 42]
      +_FloatValue = rand:uniform().     % [0.0; 1.0[
      @@ -6454,9 +6454,9 @@ generate cryptographically strong random numbers.

      Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_alg_s/1.

      When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

      Example

      _ = crypto:rand_seed_alg(crypto_cache),
      -_IntegerValue = rand:uniform(42), % [1; 42]
      -_FloatValue = rand:uniform().     % [0.0; 1.0[
      +to lack of secure "randomness".

      Example

      _ = crypto:rand_seed_alg(crypto_cache),
      +_IntegerValue = rand:uniform(42), % [1; 42]
      +_FloatValue = rand:uniform().     % [0.0; 1.0[
      @@ -6488,12 +6488,12 @@

      Creates a state object for random number generation, in order to generate cryptographically unpredictable random numbers.

      Saves the state in the process dictionary before returning it as well. See also -rand_seed_alg_s/2.

      Example

      _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
      -IntegerValue = rand:uniform(42), % [1; 42]
      -FloatValue = rand:uniform(),     % [0.0; 1.0[
      -_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
      -IntegerValue = rand:uniform(42), % Same values
      -FloatValue = rand:uniform().     % again
      +rand_seed_alg_s/2.

      Example

      _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
      +IntegerValue = rand:uniform(42), % [1; 42]
      +FloatValue = rand:uniform(),     % [0.0; 1.0[
      +_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
      +IntegerValue = rand:uniform(42), % Same values
      +FloatValue = rand:uniform().     % again
      @@ -7136,14 +7136,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.

      @@ -7212,8 +7212,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.7/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.7/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2025-11-20 15:11:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2041-12-23 04:29:37.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.7/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.7/doc/html/crypto.epub/OEBPS/engine_load.xhtml 2025-11-20 15:11:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/engine_load.xhtml 2041-12-23 04:29:37.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.7/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.7/doc/html/crypto.epub/OEBPS/new_api.xhtml 2025-11-20 15:11:22.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/new_api.xhtml 2041-12-23 04:29:37.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.7/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.7/doc/html/crypto.html 2025-11-20 15:16:41.421978648 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.html 2025-11-20 15:16:41.421978648 +0000 @@ -3778,7 +3778,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 @@ -6563,9 +6563,9 @@ BN_rand_range).

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_s/0.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -6631,9 +6631,9 @@ generate cryptographically strong random numbers.

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_alg_s/1.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -6665,12 +6665,12 @@

    Creates a state object for random number generation, in order to generate cryptographically unpredictable random numbers.

    Saves the state in the process dictionary before returning it as well. See also -rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % [1; 42]
    -FloatValue = rand:uniform(),     % [0.0; 1.0[
    -_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % Same values
    -FloatValue = rand:uniform().     % again
    +rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % [1; 42]
    +FloatValue = rand:uniform(),     % [0.0; 1.0[
    +_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % Same values
    +FloatValue = rand:uniform().     % again
    @@ -7323,14 +7323,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.

    @@ -7399,8 +7399,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.

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

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/crypto_app.html 2025-11-20 15:16:41.449978815 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto_app.html 2025-11-20 15:16:41.453978838 +0000 @@ -157,7 +157,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/engine_keys.html 2025-11-20 15:16:41.473978956 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_keys.html 2025-11-20 15:16:41.477978981 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/engine_load.html 2025-11-20 15:16:41.497979099 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_load.html 2025-11-20 15:16:41.501979124 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/fips.html 2025-11-20 15:16:41.521979242 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/fips.html 2025-11-20 15:16:41.521979242 +0000 @@ -198,7 +198,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/new_api.html 2025-11-20 15:16:41.549979409 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/new_api.html 2025-11-20 15:16:41.553979431 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/notes.html 2025-11-20 15:16:41.597979693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/notes.html 2025-11-20 15:16:41.601979718 +0000 @@ -549,7 +549,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.7/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.7/doc/html/search.html 2025-11-20 15:16:41.621979836 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/search.html 2025-11-20 15:16:41.621979836 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 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 2025-11-20 15:16:41.645979979 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 2025-11-20 15:16:41.645979979 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 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 2025-11-20 15:16:41.669980122 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 2025-11-20 15:16:41.669980122 +0000 @@ -136,7 +136,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 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 2025-11-20 15:11:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/content.opf 2041-12-23 04:29:31.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> debugger - 6.0.3 - urn:uuid:8214e842-cc11-84c0-ea6b-c640b8ae5059 + urn:uuid:0d074f79-bfe6-41da-ea19-f2ea2880c63f en - 2025-11-20T15:11:14Z + 2041-12-23T04:29: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 2025-11-20 15:11:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml 2041-12-23 04:29: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 2025-11-20 15:11:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/int.xhtml 2041-12-23 04:29: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 2025-11-20 15:11:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/i.xhtml 2041-12-23 04:29: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 2025-11-20 15:11:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/notes.xhtml 2041-12-23 04:29: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 2025-11-20 15:16:41.841981143 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html 2025-11-20 15:16:41.845981166 +0000 @@ -312,7 +312,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 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 2025-11-20 15:16:41.869981309 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 2025-11-20 15:16:41.873981334 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 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 2025-11-20 15:16:41.909981547 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html 2025-11-20 15:16:41.913981570 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 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 2025-11-20 15:16:41.941981736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 2025-11-20 15:16:41.949981784 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 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 2025-11-20 15:16:41.965981879 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html 2025-11-20 15:16:41.969981904 +0000 @@ -145,7 +145,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 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 2025-11-20 15:16:42.001982093 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html 2025-11-20 15:16:42.005982118 +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-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:42.029982259 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html 2025-11-20 15:16:42.033982284 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:42.049982379 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html 2025-11-20 15:16:42.053982403 +0000 @@ -110,7 +110,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:42.077982545 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 2025-11-20 15:16:42.077982545 +0000 @@ -118,7 +118,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:11:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/content.opf 2041-12-23 04:30:02.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> dialyzer - 5.4 - urn:uuid:2f3540ff-d3c8-c86c-1226-d1a60088fc57 + urn:uuid:5cc12bbc-8062-7b2b-27f2-c681cd1f3c78 en - 2025-11-20T15:11:49Z + 2041-12-23T04:30:02Z /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 2025-11-20 15:11:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml 2041-12-23 04:30:02.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	2025-11-20 15:11:49.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml	2041-12-23 04:30:02.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 2025-11-20 15:11:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/notes.xhtml 2041-12-23 04:30:02.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 2025-11-20 15:16:42.201983282 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 2025-11-20 15:16:42.205983305 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 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 2025-11-20 15:16:42.237983496 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 2025-11-20 15:16:42.237983496 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 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 2025-11-20 15:16:42.277983732 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 2025-11-20 15:16:42.273983710 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 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 2025-11-20 15:16:42.297983852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html 2025-11-20 15:16:42.301983875 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 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 2025-11-20 15:16:42.321983994 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 2025-11-20 15:16:42.321983994 +0000 @@ -153,7 +153,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/404.html 2025-11-20 15:16:42.345984137 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/404.html 2025-11-20 15:16:42.345984137 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.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/diameter-2.5.2/doc/html/api-reference.html 2025-11-20 15:16:42.365984255 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/api-reference.html 2025-11-20 15:16:42.369984280 +0000 @@ -179,7 +179,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/content.opf 2025-11-20 15:11:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/content.opf 2041-12-23 04:29:51.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> diameter - 2.5.2 - urn:uuid:9bf73235-b1bc-0361-fb33-3e0fa2669bae + urn:uuid:ee9e66bd-7998-e258-b205-a22dac693170 en - 2025-11-20T15:11:37Z + 2041-12-23T04:29:51Z /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter.epub/OEBPS/diameter_app.xhtml 2025-11-20 15:11:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameter_app.xhtml 2041-12-23 04:29:51.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.5.2/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.5.2/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml 2025-11-20 15:11:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml 2041-12-23 04:29:51.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.5.2/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.5.2/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml 2025-11-20 15:11:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml 2041-12-23 04:29:51.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.5.2/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.5.2/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml 2025-11-20 15:11:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml 2041-12-23 04:29:51.000000000 +0000 @@ -177,14 +177,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()
          @@ -192,14 +192,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
          @@ -227,8 +227,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.5.2/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.5.2/doc/html/diameter.epub/OEBPS/diameter.xhtml 2025-11-20 15:11:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameter.xhtml 2041-12-23 04:29:51.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.5.2/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.5.2/doc/html/diameter.epub/OEBPS/notes.xhtml 2025-11-20 15:11:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/notes.xhtml 2041-12-23 04:29:51.000000000 +0000 @@ -17,9 +17,9 @@

    Release Notes

    -

    Releases are listed in reverse chronological order, most recent first.

    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

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

      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.5.2/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.5.2/doc/html/diameter.html 2025-11-20 15:16:42.597985635 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.html 2025-11-20 15:16:42.601985658 +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.5.2/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.5.2/doc/html/diameter_app.html 2025-11-20 15:16:42.633985848 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_app.html 2025-11-20 15:16:42.637985871 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_codec.html 2025-11-20 15:16:42.665986037 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_codec.html 2025-11-20 15:16:42.661986015 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_dict.html 2025-11-20 15:16:42.685986157 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_dict.html 2025-11-20 15:16:42.689986181 +0000 @@ -249,14 +249,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()
      @@ -264,14 +264,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
      @@ -284,8 +284,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

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

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_examples.html 2025-11-20 15:16:42.717986346 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_examples.html 2025-11-20 15:16:42.717986346 +0000 @@ -141,7 +141,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_intro.html 2025-11-20 15:16:42.741986490 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_intro.html 2025-11-20 15:16:42.741986490 +0000 @@ -169,7 +169,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_make.html 2025-11-20 15:16:42.765986633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_make.html 2025-11-20 15:16:42.773986679 +0000 @@ -490,7 +490,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_sctp.html 2025-11-20 15:16:42.797986822 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_sctp.html 2025-11-20 15:16:42.801986846 +0000 @@ -410,7 +410,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_service.html 2025-11-20 15:16:42.825986988 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_service.html 2025-11-20 15:16:42.825986988 +0000 @@ -185,7 +185,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_soc.html 2025-11-20 15:16:42.857987179 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_soc.html 2025-11-20 15:16:42.865987226 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_tcp.html 2025-11-20 15:16:42.889987369 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_tcp.html 2025-11-20 15:16:42.893987393 +0000 @@ -445,7 +445,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_transport.html 2025-11-20 15:16:42.917987535 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_transport.html 2025-11-20 15:16:42.921987558 +0000 @@ -270,7 +270,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameter_using.html 2025-11-20 15:16:42.945987702 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_using.html 2025-11-20 15:16:42.945987702 +0000 @@ -141,7 +141,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/diameterc_cmd.html 2025-11-20 15:16:42.969987844 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameterc_cmd.html 2025-11-20 15:16:42.969987844 +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 @@ -155,7 +155,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/notes.html 2025-11-20 15:16:43.005988058 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/notes.html 2025-11-20 15:16:43.009988081 +0000 @@ -89,9 +89,9 @@ -

      Releases are listed in reverse chronological order, most recent first.

      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

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

        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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/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.5.2/doc/html/search.html 2025-11-20 15:16:43.033988224 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/search.html 2025-11-20 15:16:43.033988224 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.057988367 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html 2025-11-20 15:16:43.057988367 +0000 @@ -106,7 +106,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.081988509 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html 2025-11-20 15:16:43.081988509 +0000 @@ -195,7 +195,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.117988723 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 2025-11-20 15:16:43.121988747 +0000 @@ -601,7 +601,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          Missing in old package: /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-701DC811.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-701DC811.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 2025-11-20 15:16:43.153988936 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 2025-11-20 15:16:43.153988936 +0000 @@ -177,7 +177,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.177989079 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 2025-11-20 15:16:43.181989104 +0000 @@ -1372,7 +1372,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.205989245 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 2025-11-20 15:16:43.205989245 +0000 @@ -134,7 +134,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.229989388 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html 2025-11-20 15:16:43.233989413 +0000 @@ -409,7 +409,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.253989531 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html 2025-11-20 15:16:43.253989531 +0000 @@ -183,7 +183,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.281989698 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 2025-11-20 15:16:43.281989698 +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-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.305989840 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 2025-11-20 15:16:43.313989888 +0000 @@ -618,7 +618,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.329989982 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html 2025-11-20 15:16:43.333990007 +0000 @@ -184,7 +184,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.357990149 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 2025-11-20 15:16:43.357990149 +0000 @@ -370,7 +370,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.385990316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 2025-11-20 15:16:43.389990339 +0000 @@ -713,7 +713,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.409990457 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 2025-11-20 15:16:43.413990482 +0000 @@ -414,7 +414,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.433990600 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 2025-11-20 15:16:43.433990600 +0000 @@ -323,7 +323,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 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 2025-11-20 15:16:43.461990766 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 2025-11-20 15:16:43.469990814 +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-2025 Ericsson AB

              +

              Copyright © 1996-2041 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 2025-11-20 15:16:43.489990932 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 2025-11-20 15:16:43.493990957 +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 2025-11-20 15:16:43.509991052 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 2025-11-20 15:16:43.509991052 +0000 @@ -110,7 +110,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 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 2025-11-20 15:16:43.533991194 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 2025-11-20 15:16:43.533991194 +0000 @@ -118,7 +118,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 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 2025-11-20 15:11:46.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/content.opf 2041-12-23 04:30:01.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> eldap - 1.2.16 - urn:uuid:b6cd2f47-130a-5a18-ddd4-e04aa48f903d + urn:uuid:59eafdc6-73d1-9b9e-2d35-b27b2b27198e en - 2025-11-20T15:11:46Z + 2041-12-23T04:30:01Z /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 2025-11-20 15:11:46.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/eldap.xhtml 2041-12-23 04:30:01.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 2025-11-20 15:16:43.637991812 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html 2025-11-20 15:16:43.645991859 +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-2025 Ericsson AB

              +

              Copyright © 1996-2041 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 2025-11-20 15:16:43.669992003 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 2025-11-20 15:16:43.673992026 +0000 @@ -147,7 +147,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 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 2025-11-20 15:16:43.697992169 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 2025-11-20 15:16:43.697992169 +0000 @@ -108,7 +108,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.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/erl_interface-5.6.1/doc/html/404.html 2025-11-20 15:16:43.721992312 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/404.html 2025-11-20 15:16:43.721992312 +0000 @@ -108,7 +108,7 @@ Erlang programming language

              -

              Copyright © 1996-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/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.1/doc/html/ei.html 2025-11-20 15:16:43.761992548 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei.html 2025-11-20 15:16:43.761992548 +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.

    • pp - Either NULL or *pp returns a pointer to the first byte of the +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.

      • pp - Either NULL or *pp returns a pointer to the first byte of the bit string. The returned bit string is readable as long as the buffer pointed to by buf is readable and not written to.

      • bitoffsp - Either NULL or *bitoffsp returns the number of unused bits in the first byte pointed to by *pp. The value of *bitoffsp is @@ -181,22 +181,22 @@ (*bitoffsp + *bitsp)%8 bits of the last byte are used. Unused bits in the last byte are the least significant bits.

        The values of unused bits in the first and last byte are undefined and cannot be relied on.

        Number of bits may be divisible by 8, which means a binary decodable by -ei_decode_binary is also decodable by ei_decode_bitstring.

        Available since OTP 22.0

        ei_decode_boolean()

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, -true decodes 1 and false decodes 0.

        ei_decode_char()

        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For +ei_decode_binary is also decodable by ei_decode_bitstring.

        Available since OTP 22.0

        ei_decode_boolean()

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, +true decodes 1 and false decodes 0.

        ei_decode_char()

        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For historical reasons the returned integer is of type char. Your C code is to consider the returned value to be of type unsigned char even if the C -compilers and system can define char to be signed.

        ei_decode_double()

        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary -format.

        ei_decode_ei_term()

        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in +compilers and system can define char to be signed.

        ei_decode_double()

        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary +format.

        ei_decode_ei_term()

        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in buf fits in the term union, it is decoded, and the appropriate field in term->value is set, and *index is incremented by the term size.

        The function returns 1 on successful decoding, -1 on error, and 0 if the term seems alright, but does not fit in the term structure. If 1 is returned, the index is incremented, and term contains the decoded term.

        The term structure contains the arity for a tuple or list, size for a binary, string, or atom. It contains a term if it is any of the following: integer, -float, atom, pid, port, or ref.

        ei_decode_fun()

        free_fun()

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to +float, atom, pid, port, or ref.

        ei_decode_fun()

        free_fun()

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to an erlang_fun structure. This is the only decode function that allocates memory. When the erlang_fun is no longer needed, it is to be freed with free_fun. (This has to do with the arbitrary size of the environment for a -fun.)

        ei_decode_iodata()

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). +fun.)

        ei_decode_iodata()

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). The iodata/0 term will be flattened an written into the buffer pointed to by the outbuf argument. The byte size of the iodata is written into the integer variable pointed to by the size argument. Both size and outbuf can be set @@ -211,96 +211,96 @@ to reset it before the second call doing the actual decoding.

        Returns 0 on success and -1 on failure. Failure might be either due to invalid encoding of the term or due to the term not being of the type iodata/0. On failure, the integer pointed to by the index argument will be -updated to refer to the sub term where the failure was detected.

        Available since OTP 23.0

        ei_decode_list_header()

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned +updated to refer to the sub term where the failure was detected.

        Available since OTP 23.0

        ei_decode_list_header()

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned in arity. The arity+1 elements follow (the last one is the tail of the list, normally an empty list). If arity is 0, it is an empty list.

        Notice that lists are encoded as strings if they consist entirely of integers in the range 0..255. This function do not decode such strings, use -ei_decode_string() instead.

        ei_decode_long()

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the -function ei_decode_long() is the same as ei_decode_longlong().

        ei_decode_longlong()

        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the -binary format.

        ei_decode_map_header()

        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is +ei_decode_string() instead.

        ei_decode_long()

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the +function ei_decode_long() is the same as ei_decode_longlong().

        ei_decode_longlong()

        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the +binary format.

        ei_decode_map_header()

        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is returned in *arity. Keys and values follow in this order: K1, V1, K2, V2, ..., Kn, Vn. This makes a total of arity*2 terms. If arity is zero, it is an empty map. A correctly encoded map does not have duplicate -keys.

        Available since OTP 17.0

        ei_decode_pid()

        int ei_decode_pid(const char *buf, int *index, erlang_pid *p);

        Decodes a process identifier (pid) from the binary format.

        ei_decode_port()

        int ei_decode_port(const char *buf, int *index, erlang_port *p);

        Decodes a port identifier from the binary format.

        ei_decode_ref()

        int ei_decode_ref(const char *buf, int *index, erlang_ref *p);

        Decodes a reference from the binary format.

        ei_decode_string()

        int ei_decode_string(const char *buf, int *index, char *p);

        Decodes a string from the binary format. A string in Erlang is a list of +keys.

        Available since OTP 17.0

        ei_decode_pid()

        int ei_decode_pid(const char *buf, int *index, erlang_pid *p);

        Decodes a process identifier (pid) from the binary format.

        ei_decode_port()

        int ei_decode_port(const char *buf, int *index, erlang_port *p);

        Decodes a port identifier from the binary format.

        ei_decode_ref()

        int ei_decode_ref(const char *buf, int *index, erlang_ref *p);

        Decodes a reference from the binary format.

        ei_decode_string()

        int ei_decode_string(const char *buf, int *index, char *p);

        Decodes a string from the binary format. A string in Erlang is a list of integers between 0 and 255. Notice that as the string is just a list, sometimes lists are encoded as strings by term_to_binary/1, even if it was not intended.

        The string is copied to p, and enough space must be allocated. The returned string is NULL-terminated, so you must add an extra byte to the memory -requirement.

        ei_decode_trace()

        int ei_decode_trace(const char *buf, int *index, erlang_trace *p);

        Decodes an Erlang trace token from the binary format.

        ei_decode_tuple_header()

        int ei_decode_tuple_header(const char *buf, int *index, int *arity);

        Decodes a tuple header, the number of elements is returned in arity. The tuple -elements follow in order in the buffer.

        ei_decode_ulong()

        int ei_decode_ulong(const char *buf, int *index, unsigned long *p);

        Decodes an unsigned long integer from the binary format. If the code is 64 bits, -the function ei_decode_ulong() is the same as ei_decode_ulonglong().

        ei_decode_ulonglong()

        int ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p);

        Decodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) -integer from the binary format.

        ei_decode_version()

        int ei_decode_version(const char *buf, int *index, int *version);

        Decodes the version magic number for the Erlang binary term format. It must be -the first token in a binary term.

        ei_encode_atom()

        ei_encode_atom_len()

        ei_x_encode_atom()

        ei_x_encode_atom_len()

        int ei_encode_atom(char *buf, int *index, const char *p);
        int ei_encode_atom_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_atom(ei_x_buff* x, const char *p);
        int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len);

        Encodes an atom in the binary format. Parameter p is the name of the atom in +requirement.

        ei_decode_trace()

        int ei_decode_trace(const char *buf, int *index, erlang_trace *p);

        Decodes an Erlang trace token from the binary format.

        ei_decode_tuple_header()

        int ei_decode_tuple_header(const char *buf, int *index, int *arity);

        Decodes a tuple header, the number of elements is returned in arity. The tuple +elements follow in order in the buffer.

        ei_decode_ulong()

        int ei_decode_ulong(const char *buf, int *index, unsigned long *p);

        Decodes an unsigned long integer from the binary format. If the code is 64 bits, +the function ei_decode_ulong() is the same as ei_decode_ulonglong().

        ei_decode_ulonglong()

        int ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p);

        Decodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) +integer from the binary format.

        ei_decode_version()

        int ei_decode_version(const char *buf, int *index, int *version);

        Decodes the version magic number for the Erlang binary term format. It must be +the first token in a binary term.

        ei_encode_atom()

        ei_encode_atom_len()

        ei_x_encode_atom()

        ei_x_encode_atom_len()

        int ei_encode_atom(char *buf, int *index, const char *p);
        int ei_encode_atom_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_atom(ei_x_buff* x, const char *p);
        int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len);

        Encodes an atom in the binary format. Parameter p is the name of the atom in Latin-1 encoding. Only up to MAXATOMLEN-1 bytes are encoded. The name is to be -NULL-terminated, except for the ei_x_encode_atom_len() function.

        ei_encode_atom_as()

        Available since OTP R16B

        ei_encode_atom_len_as()

        Available since OTP R16B

        ei_x_encode_atom_as()

        Available since OTP R16B

        ei_x_encode_atom_len_as()

        int ei_encode_atom_as(char *buf, int *index, const char *p,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_as(ei_x_buff* x, const char *p,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);

        Encodes an atom in the binary format. Parameter p is the name of the atom with +NULL-terminated, except for the ei_x_encode_atom_len() function.

        ei_encode_atom_as()

        Available since OTP R16B

        ei_encode_atom_len_as()

        Available since OTP R16B

        ei_x_encode_atom_as()

        Available since OTP R16B

        ei_x_encode_atom_len_as()

        int ei_encode_atom_as(char *buf, int *index, const char *p,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_as(ei_x_buff* x, const char *p,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);

        Encodes an atom in the binary format. Parameter p is the name of the atom with character encoding from_enc (ASCII, Latin-1, or UTF-8). The name must either be NULL-terminated or a function variant with a len parameter must be used.

        The encoding fails if p is not a valid string in encoding from_enc.

        Argument to_enc is ignored. As from Erlang/OTP 20 the encoding is always done -in UTF-8 which is readable by nodes as old as Erlang/OTP R16.

        Available since OTP R16B

        ei_encode_bignum()

        ei_x_encode_bignum()

        int ei_encode_bignum(char *buf, int *index, mpz_t obj);
        int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

        Encodes a GMP mpz_t integer to binary format. To use this function, the ei -library must be configured and compiled to use the GMP library.

        ei_encode_binary()

        ei_x_encode_binary()

        int ei_encode_binary(char *buf, int *index, const void *p, long len);
        int ei_x_encode_binary(ei_x_buff* x, const void *p, long len);

        Encodes a binary in the binary format. The data is at p, of len bytes -length.

        ei_encode_bitstring()

        Available since OTP 22.0

        ei_x_encode_bitstring()

        int ei_encode_bitstring(char *buf, int *index, const char *p, size_t bitoffs, size_t nbits);
        int ei_x_encode_bitstring(ei_x_buff* x, const char *p, size_t bitoffs, size_t nbits);

        Encodes a bit string in the binary format.

        The data is at p. The length of the bit string is nbits bits. The first +in UTF-8 which is readable by nodes as old as Erlang/OTP R16.

        Available since OTP R16B

        ei_encode_bignum()

        ei_x_encode_bignum()

        int ei_encode_bignum(char *buf, int *index, mpz_t obj);
        int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

        Encodes a GMP mpz_t integer to binary format. To use this function, the ei +library must be configured and compiled to use the GMP library.

        ei_encode_binary()

        ei_x_encode_binary()

        int ei_encode_binary(char *buf, int *index, const void *p, long len);
        int ei_x_encode_binary(ei_x_buff* x, const void *p, long len);

        Encodes a binary in the binary format. The data is at p, of len bytes +length.

        ei_encode_bitstring()

        Available since OTP 22.0

        ei_x_encode_bitstring()

        int ei_encode_bitstring(char *buf, int *index, const char *p, size_t bitoffs, size_t nbits);
        int ei_x_encode_bitstring(ei_x_buff* x, const char *p, size_t bitoffs, size_t nbits);

        Encodes a bit string in the binary format.

        The data is at p. The length of the bit string is nbits bits. The first bitoffs bits of the data at p are unused. The first byte which is part of the bit string is p[bitoffs/8]. The bitoffs%8 most significant bits of the first byte p[bitoffs/8] are unused.

        The number of bytes which is part of the bit string is (bitoffs + nbits + 7)/8. If (bitoffs + nbits)%8 > 0 then only (bitoffs + nbits)%8 bits of the last byte are used. Unused bits in the last -byte are the least significant bits.

        The values of unused bits are disregarded and does not need to be cleared.

        Available since OTP 22.0

        ei_encode_boolean()

        ei_x_encode_boolean()

        int ei_encode_boolean(char *buf, int *index, int p);
        int ei_x_encode_boolean(ei_x_buff* x, int p);

        Encodes a boolean value as the atom true if p is not zero, or false if p -is zero.

        ei_encode_char()

        ei_x_encode_char()

        int ei_encode_char(char *buf, int *index, char p);
        int ei_x_encode_char(ei_x_buff* x, char p);

        Encodes a char (8-bit) as an integer between 0-255 in the binary format. For +byte are the least significant bits.

        The values of unused bits are disregarded and does not need to be cleared.

        Available since OTP 22.0

        ei_encode_boolean()

        ei_x_encode_boolean()

        int ei_encode_boolean(char *buf, int *index, int p);
        int ei_x_encode_boolean(ei_x_buff* x, int p);

        Encodes a boolean value as the atom true if p is not zero, or false if p +is zero.

        ei_encode_char()

        ei_x_encode_char()

        int ei_encode_char(char *buf, int *index, char p);
        int ei_x_encode_char(ei_x_buff* x, char p);

        Encodes a char (8-bit) as an integer between 0-255 in the binary format. For historical reasons the integer argument is of type char. Your C code is to consider the specified argument to be of type unsigned char even if the C -compilers and system may define char to be signed.

        ei_encode_double()

        ei_x_encode_double()

        int ei_encode_double(char *buf, int *index, double p);
        int ei_x_encode_double(ei_x_buff* x, double p);

        Encodes a double-precision (64-bit) floating point number in the binary format.

        Returns -1 if the floating point number is not finite.

        ei_encode_empty_list()

        ei_x_encode_empty_list()

        int ei_encode_empty_list(char* buf, int* index);
        int ei_x_encode_empty_list(ei_x_buff* x);

        Encodes an empty list. It is often used at the tail of a list.

        ei_encode_fun()

        ei_x_encode_fun()

        int ei_encode_fun(char *buf, int *index, const erlang_fun *p);
        int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun);

        Encodes a fun in the binary format. Parameter p points to an erlang_fun +compilers and system may define char to be signed.

        ei_encode_double()

        ei_x_encode_double()

        int ei_encode_double(char *buf, int *index, double p);
        int ei_x_encode_double(ei_x_buff* x, double p);

        Encodes a double-precision (64-bit) floating point number in the binary format.

        Returns -1 if the floating point number is not finite.

        ei_encode_empty_list()

        ei_x_encode_empty_list()

        int ei_encode_empty_list(char* buf, int* index);
        int ei_x_encode_empty_list(ei_x_buff* x);

        Encodes an empty list. It is often used at the tail of a list.

        ei_encode_fun()

        ei_x_encode_fun()

        int ei_encode_fun(char *buf, int *index, const erlang_fun *p);
        int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun);

        Encodes a fun in the binary format. Parameter p points to an erlang_fun structure. The erlang_fun is not freed automatically, the free_fun is to be -called if the fun is not needed after encoding.

        ei_encode_list_header()

        ei_x_encode_list_header()

        int ei_encode_list_header(char *buf, int *index, int arity);
        int ei_x_encode_list_header(ei_x_buff* x, int arity);

        Encodes a list header, with a specified arity. The next arity+1 terms are the +called if the fun is not needed after encoding.

        ei_encode_list_header()

        ei_x_encode_list_header()

        int ei_encode_list_header(char *buf, int *index, int arity);
        int ei_x_encode_list_header(ei_x_buff* x, int arity);

        Encodes a list header, with a specified arity. The next arity+1 terms are the elements (actually its arity cons cells) and the tail of the list. Lists and tuples are encoded recursively, so that a list can contain another list or -tuple.

        For example, to encode the list [c, d, [e | f]]:

        ei_encode_list_header(buf, &i, 3);
        -ei_encode_atom(buf, &i, "c");
        -ei_encode_atom(buf, &i, "d");
        -ei_encode_list_header(buf, &i, 1);
        -ei_encode_atom(buf, &i, "e");
        -ei_encode_atom(buf, &i, "f");
        -ei_encode_empty_list(buf, &i);

        Note

        It may seem that there is no way to create a list without knowing the number +tuple.

        For example, to encode the list [c, d, [e | f]]:

        ei_encode_list_header(buf, &i, 3);
        +ei_encode_atom(buf, &i, "c");
        +ei_encode_atom(buf, &i, "d");
        +ei_encode_list_header(buf, &i, 1);
        +ei_encode_atom(buf, &i, "e");
        +ei_encode_atom(buf, &i, "f");
        +ei_encode_empty_list(buf, &i);

        Note

        It may seem that there is no way to create a list without knowing the number of elements in advance. But indeed there is a way. Notice that the list [a, b, c] can be written as [a | [b | [c]]]. Using this, a list can be -written as conses.

        To encode a list, without knowing the arity in advance:

        while (something()) {
        /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_connect.html differs (HTML document, UTF-8 Unicode text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_connect.html	2025-11-20 15:16:43.813992857 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_connect.html	2025-11-20 15:16:43.813992857 +0000
        @@ -191,43 +191,43 @@
         operation should be able to get the same file descriptor until it has been
         released by the close() callback.

        This callback is mandatory.

      Data Types

      • ei_cnode - Opaque data type representing a C-node. A ei_cnode structure is initialized by calling -ei_connect_init() or friends.

      • ei_socket_callbacks

        typedef struct {
        +ei_connect_init() or friends.

      • ei_socket_callbacks

        typedef struct {
             int flags;
        -    int (*socket)(void **ctx, void *setup_ctx);
        -    int   (*close)(void *ctx);
        -    int (*listen)(void *ctx, void *addr, int *len, int backlog);
        -    int (*accept)(void **ctx, void *addr, int *len, unsigned tmo);
        -    int (*connect)(void *ctx, void *addr, int len, unsigned tmo);
        -    int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo);
        -    int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo);
        -    int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo);
        -    int (*handshake_packet_header_size)(void *ctx, int *sz);
        -    int (*connect_handshake_complete)(void *ctx);
        -    int (*accept_handshake_complete)(void *ctx);
        -    int (*get_fd)(void *ctx, int *fd);
        -} ei_socket_callbacks;

        Callbacks functions for a + int (*socket)(void **ctx, void *setup_ctx); + int (*close)(void *ctx); + int (*listen)(void *ctx, void *addr, int *len, int backlog); + int (*accept)(void **ctx, void *addr, int *len, unsigned tmo); + int (*connect)(void *ctx, void *addr, int len, unsigned tmo); + int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo); + int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo); + int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo); + int (*handshake_packet_header_size)(void *ctx, int *sz); + int (*connect_handshake_complete)(void *ctx); + int (*accept_handshake_complete)(void *ctx); + int (*get_fd)(void *ctx, int *fd); +} ei_socket_callbacks;

    Callbacks functions for a User Supplied Socket Implementation. Documentation of each field can be -found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    -    char ipadr[4]; /* Ip v4 address in network byte order */
    -    char nodename[MAXNODELEN];
    -} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
    +found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    +    char ipadr[4]; /* Ip v4 address in network byte order */
    +    char nodename[MAXNODELEN];
    +} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
         unsigned s_addr; /* Ip v4 address in network byte order */
    -} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
    +} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
         long msgtype;
         erlang_pid from;
         erlang_pid to;
    -    char toname[MAXATOMLEN+1];
    -    char cookie[MAXATOMLEN+1];
    +    char toname[MAXATOMLEN+1];
    +    char cookie[MAXATOMLEN+1];
         erlang_trace token;
    -} erlang_msg;

    Information about a message received via -ei_receive_msg() or friends.

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

    • ec is the C-node structure.
    • listensock is an open socket descriptor on which listen() has previously +} erlang_msg;

    Information about a message received via +ei_receive_msg() or friends.

    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.

    • ec is the C-node structure.
    • listensock is an open socket descriptor on which listen() has previously been called.
    • conp is a pointer to an ErlConnect struct.

    On success, conp is filled in with the address and node name of the connecting client and a file descriptor is returned. On failure, ERL_ERROR is returned -and erl_errno is set to EIO.

    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 @@ -243,16 +243,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.1/doc/html/ei_global.html differs (HTML document, UTF-8 Unicode text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_global.html	2025-11-20 15:16:43.849993071 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_global.html	2025-11-20 15:16:43.849993071 +0000
    @@ -94,14 +94,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 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_users_guide.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_users_guide.html 2025-11-20 15:16:43.877993237 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_users_guide.html 2025-11-20 15:16:43.877993237 +0000 @@ -118,25 +118,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 @@ -146,18 +146,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 @@ -166,7 +166,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 @@ -177,13 +177,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;
    @@ -191,24 +191,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, @@ -220,19 +220,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 @@ -243,32 +243,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.1/doc/html/erl_call_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_call_cmd.html 2025-11-20 15:16:43.905993405 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_call_cmd.html 2025-11-20 15:16:43.901993380 +0000 @@ -207,8 +207,8 @@ {<madonna@chivas.du.etx.ericsson.se,38,0>, []}]

    To forward standard output without printing the result term (again, the input ends with EOF (Control-D)):

    erl_call -s -e -sname madonna -fetch_stdout -no_result_term
    -io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
    -io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
    +io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
    +io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
     ^D
     Number of schedulers: 8
     Number of logical cores: 8
    @@ -263,7 +263,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/content.opf 2025-11-20 15:10:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/content.opf 2041-12-23 04:29:14.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> erl_interface - 5.6.1 - urn:uuid:5d28a1a1-4968-7bf5-5261-5d9dcc92ffc4 + urn:uuid:92991278-c95a-b28d-efb8-d999b9999876 en - 2025-11-20T15:10:57Z + 2041-12-23T04:29:14Z /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei_connect.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei_connect.xhtml 2025-11-20 15:10:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei_connect.xhtml 2041-12-23 04:29:14.000000000 +0000 @@ -119,43 +119,43 @@ operation should be able to get the same file descriptor until it has been released by the close() callback.

    This callback is mandatory.

    Data Types

    • ei_cnode - Opaque data type representing a C-node. A ei_cnode structure is initialized by calling -ei_connect_init() or friends.

    • ei_socket_callbacks

      typedef struct {
      +ei_connect_init() or friends.

    • ei_socket_callbacks

      typedef struct {
           int flags;
      -    int (*socket)(void **ctx, void *setup_ctx);
      -    int   (*close)(void *ctx);
      -    int (*listen)(void *ctx, void *addr, int *len, int backlog);
      -    int (*accept)(void **ctx, void *addr, int *len, unsigned tmo);
      -    int (*connect)(void *ctx, void *addr, int len, unsigned tmo);
      -    int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo);
      -    int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo);
      -    int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo);
      -    int (*handshake_packet_header_size)(void *ctx, int *sz);
      -    int (*connect_handshake_complete)(void *ctx);
      -    int (*accept_handshake_complete)(void *ctx);
      -    int (*get_fd)(void *ctx, int *fd);
      -} ei_socket_callbacks;

      Callbacks functions for a + int (*socket)(void **ctx, void *setup_ctx); + int (*close)(void *ctx); + int (*listen)(void *ctx, void *addr, int *len, int backlog); + int (*accept)(void **ctx, void *addr, int *len, unsigned tmo); + int (*connect)(void *ctx, void *addr, int len, unsigned tmo); + int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo); + int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo); + int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo); + int (*handshake_packet_header_size)(void *ctx, int *sz); + int (*connect_handshake_complete)(void *ctx); + int (*accept_handshake_complete)(void *ctx); + int (*get_fd)(void *ctx, int *fd); +} ei_socket_callbacks;

      Callbacks functions for a User Supplied Socket Implementation. Documentation of each field can be -found in the User Supplied Socket Implementation section above.

    • ErlConnect

      typedef struct {
      -    char ipadr[4]; /* Ip v4 address in network byte order */
      -    char nodename[MAXNODELEN];
      -} ErlConnect;

      IP v4 address and nodename.

    • Erl_IpAddr

      typedef struct {
      +found in the User Supplied Socket Implementation section above.

    • ErlConnect

      typedef struct {
      +    char ipadr[4]; /* Ip v4 address in network byte order */
      +    char nodename[MAXNODELEN];
      +} ErlConnect;

      IP v4 address and nodename.

    • Erl_IpAddr

      typedef struct {
           unsigned s_addr; /* Ip v4 address in network byte order */
      -} Erl_IpAddr;

      IP v4 address.

    • erlang_msg

      typedef struct {
      +} Erl_IpAddr;

      IP v4 address.

    • erlang_msg

      typedef struct {
           long msgtype;
           erlang_pid from;
           erlang_pid to;
      -    char toname[MAXATOMLEN+1];
      -    char cookie[MAXATOMLEN+1];
      +    char toname[MAXATOMLEN+1];
      +    char cookie[MAXATOMLEN+1];
           erlang_trace token;
      -} erlang_msg;

      Information about a message received via -ei_receive_msg() or friends.

    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.

    • ec is the C-node structure.
    • listensock is an open socket descriptor on which listen() has previously +} erlang_msg;

      Information about a message received via +ei_receive_msg() or friends.

    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.

    • ec is the C-node structure.
    • listensock is an open socket descriptor on which listen() has previously been called.
    • conp is a pointer to an ErlConnect struct.

    On success, conp is filled in with the address and node name of the connecting client and a file descriptor is returned. On failure, ERL_ERROR is returned -and erl_errno is set to EIO.

    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.

    • ec is a structure containing information about the C-node. It is used in @@ -203,24 +203,24 @@ see the relevant system documentation.

      These functions return a negative value indicating that an error occurred.

      Example 1:

      unsigned n = 0;
       struct in_addr addr;
       ei_cnode ec;
      -addr.s_addr = inet_addr("150.236.14.75");
      -if (ei_connect_xinit(&ec,
      +addr.s_addr = inet_addr("150.236.14.75");
      +if (ei_connect_xinit(&ec,
                            "chivas",
                            "madonna",
                            "madonna@chivas.du.etx.ericsson.se",
                            &addr;
                            "cookie...",
      -                     n++) < 0) {
      -    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      -    exit(-1);
      -}

      Example 2:

      if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
      -    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      -    exit(-1);
      -}

      Available since OTP 21.3

      ei_connect_tmo()

      ei_xconnect_tmo()

      ei_connect_host_port_tmo()

      Available since OTP 23.0

      ei_xconnect_host_port_tmo()

      int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms);
      int ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms);
      int ei_connect_host_port_tmo(ei_cnode* ec, char *hostname, int port, unsigned ms);
      int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr, int port, unsigned ms);

      Equivalent to ei_connect, ei_xconnect, ei_connect_host_port and + n++) < 0) { + fprintf(stderr,"ERROR when initializing: %d",erl_errno); + exit(-1); +}

      Example 2:

      if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
      +    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      +    exit(-1);
      +}

      Available since OTP 21.3

      ei_connect_tmo()

      ei_xconnect_tmo()

      ei_connect_host_port_tmo()

      Available since OTP 23.0

      ei_xconnect_host_port_tmo()

      int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms);
      int ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms);
      int ei_connect_host_port_tmo(ei_cnode* ec, char *hostname, int port, unsigned ms);
      int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr, int port, unsigned ms);

      Equivalent to ei_connect, ei_xconnect, ei_connect_host_port and ei_xconnect_host_port with an optional time-out argument, see the description -at the beginning of this manual page.

      Available since OTP 23.0

      ei_get_tracelevel()

      Available since OTP R13B04

      ei_set_tracelevel()

      int ei_get_tracelevel(void);
      void ei_set_tracelevel(int level);

      Used to set tracing on the distribution. The levels are different verbosity +at the beginning of this manual page.

      Available since OTP 23.0

      ei_get_tracelevel()

      Available since OTP R13B04

      ei_set_tracelevel()

      int ei_get_tracelevel(void);
      void ei_set_tracelevel(int level);

      Used to set tracing on the distribution. The levels are different verbosity levels. A higher level means more information. See also section -Debug Information.

      These functions are not thread safe.

      Available since OTP R13B04

      ei_listen()

      Available since OTP 21.3

      ei_xlisten()

      int ei_listen(ei_cnode *ec, int *port, int backlog);
      int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog);

      Used by a server process to setup a listen socket which later can be used for +Debug Information.

      These functions are not thread safe.

      Available since OTP R13B04

      ei_listen()

      Available since OTP 21.3

      ei_xlisten()

      int ei_listen(ei_cnode *ec, int *port, int backlog);
      int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog);

      Used by a server process to setup a listen socket which later can be used for accepting connections from client processes.

      • ec is the C-node structure.
      • adr is local interface to bind to.
      • port is a pointer to an integer containing the port number to bind to. If *port equals 0 when calling ei_listen(), the socket will be bound to an ephemeral port. On success, ei_listen() will update the value of *port to @@ -229,35 +229,35 @@ mark the socket as a passive socket (that is, a socket that will be used for accepting incoming connections).

        On success, a file descriptor is returned which can be used in a call to ei_accept(). On failure, ERL_ERROR is returned and erl_errno is set to -EIO.

        Available since OTP 21.3

        ei_make_pid()

        int ei_make_pid(ei_cnode *ec, erlang_pid *pid);

        Creates a new process identifier in the argument pid. This process identifier +EIO.

        Available since OTP 21.3

        ei_make_pid()

        int ei_make_pid(ei_cnode *ec, erlang_pid *pid);

        Creates a new process identifier in the argument pid. This process identifier refers to a conseptual process residing on the C-node identified by the argument ec. On success 0 is returned. On failure ERL_ERROR is returned and erl_errno is set.

        The C-node identified by ec must have been initialized and must have received a name prior to the call to ei_make_pid(). Initialization of the C-node is done by a call to ei_connect_init() or friends. If the name is dynamically assigned from the peer node, the C-node also -has to be connected.

        Available since OTP 23.0

        ei_make_ref()

        int ei_make_ref(ei_cnode *ec, erlang_ref *ref);

        Creates a new reference in the argument ref. This reference originates from +has to be connected.

        Available since OTP 23.0

        ei_make_ref()

        int ei_make_ref(ei_cnode *ec, erlang_ref *ref);

        Creates a new reference in the argument ref. This reference originates from the C-node identified by the argument ec. On success 0 is returned. On failure ERL_ERROR is returned and erl_errno is set.

        The C-node identified by ec must have been initialized and must have received a name prior to the call to ei_make_ref(). Initialization of the C-node is done by a call to ei_connect_init() or friends. If the name is dynamically assigned from the peer node, the C-node also -has to be connected.

        Available since OTP 23.0

        ei_publish()

        int ei_publish(ei_cnode *ec, int port);

        Used by a server process to register with the local name server EPMD, thereby +has to be connected.

        Available since OTP 23.0

        ei_publish()

        int ei_publish(ei_cnode *ec, int port);

        Used by a server process to register with the local name server EPMD, thereby allowing other processes to send messages by using the registered name. Before calling either of these functions, the process should have called bind() and listen() on an open socket.

        • ec is the C-node structure.
        • port is the local name to register, and is to be the same as the port number that was previously bound to the socket.
        • addr is the 32-bit IP address of the local host.

        To unregister with EPMD, simply close the returned descriptor. Do not use ei_unpublish(), which is deprecated anyway.

        On success, the function returns a descriptor connecting the calling process to EPMD. On failure, -1 is returned and erl_errno is set to EIO.

        Also, errno values from socket(2) and connect(2) system calls may be -propagated into erl_errno.

        ei_publish_tmo()

        int ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms);

        Equivalent to ei_publish with an optional time-out argument, see the -description at the beginning of this manual page.

        ei_receive()

        int ei_receive(int fd, unsigned char* bufp, int bufsize);

        Receives a message consisting of a sequence of bytes in the Erlang external +propagated into erl_errno.

        ei_publish_tmo()

        int ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms);

        Equivalent to ei_publish with an optional time-out argument, see the +description at the beginning of this manual page.

        ei_receive()

        int ei_receive(int fd, unsigned char* bufp, int bufsize);

        Receives a message consisting of a sequence of bytes in the Erlang external format.

        • fd is an open descriptor to an Erlang connection. It is obtained from a previous ei_connect or ei_accept.
        • bufp is a buffer large enough to hold the expected message.
        • bufsize indicates the size of bufp.

        If a tick occurs, that is, the Erlang node on the other end of the connection has polled this node to see if it is still alive, the function returns ERL_TICK and no message is placed in the buffer. Also, erl_errno is set to EAGAIN.

        On success, the message is placed in the specified buffer and the function returns the number of bytes actually read. On failure, the function returns -ERL_ERROR and sets erl_errno to one of the following:

        • EAGAIN - Temporary error: Try again.

        • EMSGSIZE - Buffer is too small.

        • EIO - I/O error.

        ei_receive_encoded()

        int ei_receive_encoded(int fd, char **mbufp, int *bufsz,  erlang_msg *msg, int *msglen);

        This function is retained for compatibility with code generated by the interface +ERL_ERROR and sets erl_errno to one of the following:

        • EAGAIN - Temporary error: Try again.

        • EMSGSIZE - Buffer is too small.

        • EIO - I/O error.

        ei_receive_encoded()

        int ei_receive_encoded(int fd, char **mbufp, int *bufsz,  erlang_msg *msg, int *msglen);

        This function is retained for compatibility with code generated by the interface compiler and with code following examples in the same application.

        In essence, the function performs the same operation as ei_xreceive_msg, but instead of using an ei_x_buff, the function expects a pointer to a character pointer (mbufp), where the character pointer is to point to a memory area @@ -267,9 +267,9 @@ and update *mbufp.

        Returns either ERL_TICK or the msgtype field of the erlang_msg *msg. The length of the message is put in *msglen. On error a value < 0 is returned.

        It is recommended to use ei_xreceive_msg instead when possible, for the sake of readability. However, the function will be retained in the interface for -compatibility and will not be removed in future releases without prior notice.

        ei_receive_encoded_tmo()

        int ei_receive_encoded_tmo(int fd, char **mbufp, int *bufsz,  erlang_msg *msg,
        -  int *msglen, unsigned timeout_ms);

        Equivalent to ei_receive_encoded with an optional time-out argument, see the -description at the beginning of this manual page.

        ei_receive_msg()

        ei_xreceive_msg()

        int ei_receive_msg(int fd, erlang_msg* msg, ei_x_buff* x);
        int ei_xreceive_msg(int fd, erlang_msg* msg, ei_x_buff* x);

        Receives a message to the buffer in x. ei_xreceive_msg allows the buffer in +compatibility and will not be removed in future releases without prior notice.

        ei_receive_encoded_tmo()

        int ei_receive_encoded_tmo(int fd, char **mbufp, int *bufsz,  erlang_msg *msg,
        +  int *msglen, unsigned timeout_ms);

        Equivalent to ei_receive_encoded with an optional time-out argument, see the +description at the beginning of this manual page.

        ei_receive_msg()

        ei_xreceive_msg()

        int ei_receive_msg(int fd, erlang_msg* msg, ei_x_buff* x);
        int ei_xreceive_msg(int fd, erlang_msg* msg, ei_x_buff* x);

        Receives a message to the buffer in x. ei_xreceive_msg allows the buffer in x to grow, but ei_receive_msg fails if the message is larger than the pre-allocated buffer in x.

        • fd is an open descriptor to an Erlang connection.
        • msg is a pointer to an erlang_msg structure and contains information on the message received.
        • x is buffer obtained from ei_x_new.

        On success, the functions return ERL_MSG and the @@ -277,19 +277,19 @@ msg->to contains the pid of the recipient (the C-node).

      • ERL_REG_SEND - A registered send operation occurred. msg->from contains the pid of the sender.

      • ERL_LINK or ERL_UNLINK - msg->to and msg->from contain the pids of the sender and recipient of the link or unlink.

      • ERL_EXIT - Indicates a broken link. msg->to and msg->from contain -the pids of the linked processes.

      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.

      • fd is an open descriptor to an Erlang connection.
      • server_name is the registered name of the intended recipient.
      • buf is the buffer containing the term in binary format.
      • len is the length of the message in bytes.

      Returns 0 if successful, otherwise -1. In the latter case it sets +the pids of the linked processes.

    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.

    • fd is an open descriptor to an Erlang connection.
    • server_name is the registered name of the intended recipient.
    • buf is the buffer containing the term in binary format.
    • len is the length of the message in bytes.

    Returns 0 if successful, otherwise -1. In the latter case it sets erl_errno to EIO.

    Example:

    Send the atom "ok" to the process "worker":

    ei_x_buff x;
    -ei_x_new_with_version(&x);
    -ei_x_encode_atom(&x, "ok");
    /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/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.1/doc/html/erl_interface.epub/OEBPS/ei_global.xhtml	2025-11-20 15:10:57.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei_global.xhtml	2041-12-23 04:29:14.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.1/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.1/doc/html/erl_interface.epub/OEBPS/ei_users_guide.xhtml 2025-11-20 15:10:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei_users_guide.xhtml 2041-12-23 04:29:14.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.1/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.1/doc/html/erl_interface.epub/OEBPS/ei.xhtml 2025-11-20 15:10:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei.xhtml 2041-12-23 04:29:14.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_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 @@ -74,17 +74,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, @@ -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.

    • pp - Either NULL or *pp returns a pointer to the first byte of the +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.

      • pp - Either NULL or *pp returns a pointer to the first byte of the bit string. The returned bit string is readable as long as the buffer pointed to by buf is readable and not written to.

      • bitoffsp - Either NULL or *bitoffsp returns the number of unused bits in the first byte pointed to by *pp. The value of *bitoffsp is @@ -109,22 +109,22 @@ (*bitoffsp + *bitsp)%8 bits of the last byte are used. Unused bits in the last byte are the least significant bits.

        The values of unused bits in the first and last byte are undefined and cannot be relied on.

        Number of bits may be divisible by 8, which means a binary decodable by -ei_decode_binary is also decodable by ei_decode_bitstring.

        Available since OTP 22.0

        ei_decode_boolean()

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, -true decodes 1 and false decodes 0.

        ei_decode_char()

        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For +ei_decode_binary is also decodable by ei_decode_bitstring.

        Available since OTP 22.0

        ei_decode_boolean()

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, +true decodes 1 and false decodes 0.

        ei_decode_char()

        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For historical reasons the returned integer is of type char. Your C code is to consider the returned value to be of type unsigned char even if the C -compilers and system can define char to be signed.

        ei_decode_double()

        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary -format.

        ei_decode_ei_term()

        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in +compilers and system can define char to be signed.

        ei_decode_double()

        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary +format.

        ei_decode_ei_term()

        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in buf fits in the term union, it is decoded, and the appropriate field in term->value is set, and *index is incremented by the term size.

        The function returns 1 on successful decoding, -1 on error, and 0 if the term seems alright, but does not fit in the term structure. If 1 is returned, the index is incremented, and term contains the decoded term.

        The term structure contains the arity for a tuple or list, size for a binary, string, or atom. It contains a term if it is any of the following: integer, -float, atom, pid, port, or ref.

        ei_decode_fun()

        free_fun()

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to +float, atom, pid, port, or ref.

        ei_decode_fun()

        free_fun()

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to an erlang_fun structure. This is the only decode function that allocates memory. When the erlang_fun is no longer needed, it is to be freed with free_fun. (This has to do with the arbitrary size of the environment for a -fun.)

        ei_decode_iodata()

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). +fun.)

        ei_decode_iodata()

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). The iodata/0 term will be flattened an written into the buffer pointed to by the outbuf argument. The byte size of the iodata is written into the integer variable pointed to by the size argument. Both size and outbuf can be set @@ -139,96 +139,96 @@ to reset it before the second call doing the actual decoding.

        Returns 0 on success and -1 on failure. Failure might be either due to invalid encoding of the term or due to the term not being of the type iodata/0. On failure, the integer pointed to by the index argument will be -updated to refer to the sub term where the failure was detected.

        Available since OTP 23.0

        ei_decode_list_header()

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned +updated to refer to the sub term where the failure was detected.

        Available since OTP 23.0

        ei_decode_list_header()

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned in arity. The arity+1 elements follow (the last one is the tail of the list, normally an empty list). If arity is 0, it is an empty list.

        Notice that lists are encoded as strings if they consist entirely of integers in the range 0..255. This function do not decode such strings, use -ei_decode_string() instead.

        ei_decode_long()

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the -function ei_decode_long() is the same as ei_decode_longlong().

        ei_decode_longlong()

        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the -binary format.

        ei_decode_map_header()

        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is +ei_decode_string() instead.

        ei_decode_long()

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the +function ei_decode_long() is the same as ei_decode_longlong().

        ei_decode_longlong()

        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the +binary format.

        ei_decode_map_header()

        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is returned in *arity. Keys and values follow in this order: K1, V1, K2, V2, ..., Kn, Vn. This makes a total of arity*2 terms. If arity is zero, it is an empty map. A correctly encoded map does not have duplicate -keys.

        Available since OTP 17.0

        ei_decode_pid()

        int ei_decode_pid(const char *buf, int *index, erlang_pid *p);

        Decodes a process identifier (pid) from the binary format.

        ei_decode_port()

        int ei_decode_port(const char *buf, int *index, erlang_port *p);

        Decodes a port identifier from the binary format.

        ei_decode_ref()

        int ei_decode_ref(const char *buf, int *index, erlang_ref *p);

        Decodes a reference from the binary format.

        ei_decode_string()

        int ei_decode_string(const char *buf, int *index, char *p);

        Decodes a string from the binary format. A string in Erlang is a list of +keys.

        Available since OTP 17.0

        ei_decode_pid()

        int ei_decode_pid(const char *buf, int *index, erlang_pid *p);

        Decodes a process identifier (pid) from the binary format.

        ei_decode_port()

        int ei_decode_port(const char *buf, int *index, erlang_port *p);

        Decodes a port identifier from the binary format.

        ei_decode_ref()

        int ei_decode_ref(const char *buf, int *index, erlang_ref *p);

        Decodes a reference from the binary format.

        ei_decode_string()

        int ei_decode_string(const char *buf, int *index, char *p);

        Decodes a string from the binary format. A string in Erlang is a list of integers between 0 and 255. Notice that as the string is just a list, sometimes lists are encoded as strings by term_to_binary/1, even if it was not intended.

        The string is copied to p, and enough space must be allocated. The returned string is NULL-terminated, so you must add an extra byte to the memory -requirement.

        ei_decode_trace()

        int ei_decode_trace(const char *buf, int *index, erlang_trace *p);

        Decodes an Erlang trace token from the binary format.

        ei_decode_tuple_header()

        int ei_decode_tuple_header(const char *buf, int *index, int *arity);

        Decodes a tuple header, the number of elements is returned in arity. The tuple -elements follow in order in the buffer.

        ei_decode_ulong()

        int ei_decode_ulong(const char *buf, int *index, unsigned long *p);

        Decodes an unsigned long integer from the binary format. If the code is 64 bits, -the function ei_decode_ulong() is the same as ei_decode_ulonglong().

        ei_decode_ulonglong()

        int ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p);

        Decodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) -integer from the binary format.

        ei_decode_version()

        int ei_decode_version(const char *buf, int *index, int *version);

        Decodes the version magic number for the Erlang binary term format. It must be -the first token in a binary term.

        ei_encode_atom()

        ei_encode_atom_len()

        ei_x_encode_atom()

        ei_x_encode_atom_len()

        int ei_encode_atom(char *buf, int *index, const char *p);
        int ei_encode_atom_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_atom(ei_x_buff* x, const char *p);
        int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len);

        Encodes an atom in the binary format. Parameter p is the name of the atom in +requirement.

        ei_decode_trace()

        int ei_decode_trace(const char *buf, int *index, erlang_trace *p);

        Decodes an Erlang trace token from the binary format.

        ei_decode_tuple_header()

        int ei_decode_tuple_header(const char *buf, int *index, int *arity);

        Decodes a tuple header, the number of elements is returned in arity. The tuple +elements follow in order in the buffer.

        ei_decode_ulong()

        int ei_decode_ulong(const char *buf, int *index, unsigned long *p);

        Decodes an unsigned long integer from the binary format. If the code is 64 bits, +the function ei_decode_ulong() is the same as ei_decode_ulonglong().

        ei_decode_ulonglong()

        int ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p);

        Decodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) +integer from the binary format.

        ei_decode_version()

        int ei_decode_version(const char *buf, int *index, int *version);

        Decodes the version magic number for the Erlang binary term format. It must be +the first token in a binary term.

        ei_encode_atom()

        ei_encode_atom_len()

        ei_x_encode_atom()

        ei_x_encode_atom_len()

        int ei_encode_atom(char *buf, int *index, const char *p);
        int ei_encode_atom_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_atom(ei_x_buff* x, const char *p);
        int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len);

        Encodes an atom in the binary format. Parameter p is the name of the atom in Latin-1 encoding. Only up to MAXATOMLEN-1 bytes are encoded. The name is to be -NULL-terminated, except for the ei_x_encode_atom_len() function.

        ei_encode_atom_as()

        Available since OTP R16B

        ei_encode_atom_len_as()

        Available since OTP R16B

        ei_x_encode_atom_as()

        Available since OTP R16B

        ei_x_encode_atom_len_as()

        int ei_encode_atom_as(char *buf, int *index, const char *p,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_as(ei_x_buff* x, const char *p,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);

        Encodes an atom in the binary format. Parameter p is the name of the atom with +NULL-terminated, except for the ei_x_encode_atom_len() function.

        ei_encode_atom_as()

        Available since OTP R16B

        ei_encode_atom_len_as()

        Available since OTP R16B

        ei_x_encode_atom_as()

        Available since OTP R16B

        ei_x_encode_atom_len_as()

        int ei_encode_atom_as(char *buf, int *index, const char *p,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_as(ei_x_buff* x, const char *p,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);

        Encodes an atom in the binary format. Parameter p is the name of the atom with character encoding from_enc (ASCII, Latin-1, or UTF-8). The name must either be NULL-terminated or a function variant with a len parameter must be used.

        The encoding fails if p is not a valid string in encoding from_enc.

        Argument to_enc is ignored. As from Erlang/OTP 20 the encoding is always done -in UTF-8 which is readable by nodes as old as Erlang/OTP R16.

        Available since OTP R16B

        ei_encode_bignum()

        ei_x_encode_bignum()

        int ei_encode_bignum(char *buf, int *index, mpz_t obj);
        int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

        Encodes a GMP mpz_t integer to binary format. To use this function, the ei -library must be configured and compiled to use the GMP library.

        ei_encode_binary()

        ei_x_encode_binary()

        int ei_encode_binary(char *buf, int *index, const void *p, long len);
        int ei_x_encode_binary(ei_x_buff* x, const void *p, long len);

        Encodes a binary in the binary format. The data is at p, of len bytes -length.

        ei_encode_bitstring()

        Available since OTP 22.0

        ei_x_encode_bitstring()

        int ei_encode_bitstring(char *buf, int *index, const char *p, size_t bitoffs, size_t nbits);
        int ei_x_encode_bitstring(ei_x_buff* x, const char *p, size_t bitoffs, size_t nbits);

        Encodes a bit string in the binary format.

        The data is at p. The length of the bit string is nbits bits. The first +in UTF-8 which is readable by nodes as old as Erlang/OTP R16.

        Available since OTP R16B

        ei_encode_bignum()

        ei_x_encode_bignum()

        int ei_encode_bignum(char *buf, int *index, mpz_t obj);
        int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

        Encodes a GMP mpz_t integer to binary format. To use this function, the ei +library must be configured and compiled to use the GMP library.

        ei_encode_binary()

        ei_x_encode_binary()

        int ei_encode_binary(char *buf, int *index, const void *p, long len);
        int ei_x_encode_binary(ei_x_buff* x, const void *p, long len);

        Encodes a binary in the binary format. The data is at p, of len bytes +length.

        ei_encode_bitstring()

        Available since OTP 22.0

        ei_x_encode_bitstring()

        int ei_encode_bitstring(char *buf, int *index, const char *p, size_t bitoffs, size_t nbits);
        int ei_x_encode_bitstring(ei_x_buff* x, const char *p, size_t bitoffs, size_t nbits);

        Encodes a bit string in the binary format.

        The data is at p. The length of the bit string is nbits bits. The first bitoffs bits of the data at p are unused. The first byte which is part of the bit string is p[bitoffs/8]. The bitoffs%8 most significant bits of the first byte p[bitoffs/8] are unused.

        The number of bytes which is part of the bit string is (bitoffs + nbits + 7)/8. If (bitoffs + nbits)%8 > 0 then only (bitoffs + nbits)%8 bits of the last byte are used. Unused bits in the last -byte are the least significant bits.

        The values of unused bits are disregarded and does not need to be cleared.

        Available since OTP 22.0

        ei_encode_boolean()

        ei_x_encode_boolean()

        int ei_encode_boolean(char *buf, int *index, int p);
        int ei_x_encode_boolean(ei_x_buff* x, int p);

        Encodes a boolean value as the atom true if p is not zero, or false if p -is zero.

        ei_encode_char()

        ei_x_encode_char()

        int ei_encode_char(char *buf, int *index, char p);
        int ei_x_encode_char(ei_x_buff* x, char p);

        Encodes a char (8-bit) as an integer between 0-255 in the binary format. For +byte are the least significant bits.

        The values of unused bits are disregarded and does not need to be cleared.

        Available since OTP 22.0

        ei_encode_boolean()

        ei_x_encode_boolean()

        int ei_encode_boolean(char *buf, int *index, int p);
        int ei_x_encode_boolean(ei_x_buff* x, int p);

        Encodes a boolean value as the atom true if p is not zero, or false if p +is zero.

        ei_encode_char()

        ei_x_encode_char()

        int ei_encode_char(char *buf, int *index, char p);
        int ei_x_encode_char(ei_x_buff* x, char p);

        Encodes a char (8-bit) as an integer between 0-255 in the binary format. For historical reasons the integer argument is of type char. Your C code is to consider the specified argument to be of type unsigned char even if the C -compilers and system may define char to be signed.

        ei_encode_double()

        ei_x_encode_double()

        int ei_encode_double(char *buf, int *index, double p);
        int ei_x_encode_double(ei_x_buff* x, double p);

        Encodes a double-precision (64-bit) floating point number in the binary format.

        Returns -1 if the floating point number is not finite.

        ei_encode_empty_list()

        ei_x_encode_empty_list()

        int ei_encode_empty_list(char* buf, int* index);
        int ei_x_encode_empty_list(ei_x_buff* x);

        Encodes an empty list. It is often used at the tail of a list.

        ei_encode_fun()

        ei_x_encode_fun()

        int ei_encode_fun(char *buf, int *index, const erlang_fun *p);
        int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun);

        Encodes a fun in the binary format. Parameter p points to an erlang_fun +compilers and system may define char to be signed.

        ei_encode_double()

        ei_x_encode_double()

        int ei_encode_double(char *buf, int *index, double p);
        int ei_x_encode_double(ei_x_buff* x, double p);

        Encodes a double-precision (64-bit) floating point number in the binary format.

        Returns -1 if the floating point number is not finite.

        ei_encode_empty_list()

        ei_x_encode_empty_list()

        int ei_encode_empty_list(char* buf, int* index);
        int ei_x_encode_empty_list(ei_x_buff* x);

        Encodes an empty list. It is often used at the tail of a list.

        ei_encode_fun()

        ei_x_encode_fun()

        int ei_encode_fun(char *buf, int *index, const erlang_fun *p);
        int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun);

        Encodes a fun in the binary format. Parameter p points to an erlang_fun structure. The erlang_fun is not freed automatically, the free_fun is to be -called if the fun is not needed after encoding.

        ei_encode_list_header()

        ei_x_encode_list_header()

        int ei_encode_list_header(char *buf, int *index, int arity);
        int ei_x_encode_list_header(ei_x_buff* x, int arity);

        Encodes a list header, with a specified arity. The next arity+1 terms are the +called if the fun is not needed after encoding.

        ei_encode_list_header()

        ei_x_encode_list_header()

        int ei_encode_list_header(char *buf, int *index, int arity);
        int ei_x_encode_list_header(ei_x_buff* x, int arity);

        Encodes a list header, with a specified arity. The next arity+1 terms are the elements (actually its arity cons cells) and the tail of the list. Lists and tuples are encoded recursively, so that a list can contain another list or -tuple.

        For example, to encode the list [c, d, [e | f]]:

        ei_encode_list_header(buf, &i, 3);
        -ei_encode_atom(buf, &i, "c");
        -ei_encode_atom(buf, &i, "d");
        -ei_encode_list_header(buf, &i, 1);
        -ei_encode_atom(buf, &i, "e");
        -ei_encode_atom(buf, &i, "f");
        -ei_encode_empty_list(buf, &i);

        Note

        It may seem that there is no way to create a list without knowing the number +tuple.

        For example, to encode the list [c, d, [e | f]]:

        ei_encode_list_header(buf, &i, 3);
        +ei_encode_atom(buf, &i, "c");
        +ei_encode_atom(buf, &i, "d");
        +ei_encode_list_header(buf, &i, 1);
        +ei_encode_atom(buf, &i, "e");
        +ei_encode_atom(buf, &i, "f");
        +ei_encode_empty_list(buf, &i);

        Note

        It may seem that there is no way to create a list without knowing the number of elements in advance. But indeed there is a way. Notice that the list [a, b, c] can be written as [a | [b | [c]]]. Using this, a list can be -written as conses.

        To encode a list, without knowing the arity in advance:

        while (something()) {
        /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/erl_call_cmd.xhtml differs (HTML document, ASCII text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/erl_call_cmd.xhtml	2025-11-20 15:10:57.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/erl_call_cmd.xhtml	2041-12-23 04:29:14.000000000 +0000
        @@ -135,8 +135,8 @@
          {<madonna@chivas.du.etx.ericsson.se,38,0>,
                           []}]

        To forward standard output without printing the result term (again, the input ends with EOF (Control-D)):

        erl_call -s -e -sname madonna -fetch_stdout -no_result_term
        -io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
        -io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
        +io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
        +io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
         ^D
         Number of schedulers: 8
         Number of logical cores: 8
        /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.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/erl_interface-5.6.1/doc/html/notes.html 2025-11-20 15:16:44.077994426 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/notes.html 2025-11-20 15:16:44.077994426 +0000 @@ -432,7 +432,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.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/erl_interface-5.6.1/doc/html/search.html 2025-11-20 15:16:44.101994569 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/search.html 2025-11-20 15:16:44.101994569 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/404.html 2025-11-20 15:16:44.125994711 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/404.html 2025-11-20 15:16:44.125994711 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.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/et-1.7.2/doc/html/api-reference.html 2025-11-20 15:16:44.149994853 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/api-reference.html 2025-11-20 15:16:44.149994853 +0000 @@ -145,7 +145,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/content.opf 2025-11-20 15:11:39.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/content.opf 2041-12-23 04:29:52.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> et - 1.7.2 - urn:uuid:26bffa8f-c613-d869-3d3b-f4c0a98f5fe2 + urn:uuid:45f3614d-1948-6947-c799-6cbc4b8900c5 en - 2025-11-20T15:11:39Z + 2041-12-23T04:29:52Z /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_desc.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_desc.xhtml 2025-11-20 15:11:39.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_desc.xhtml 2041-12-23 04:29:52.000000000 +0000 @@ -24,33 +24,33 @@ enable other types of Viewers. However in the following text we will focus on usage of the et_viewer.

        The main start function is et_viewer:start/1. By default it will start both an et_collector and an et_viewer:

        % erl -pa et/examples
        -Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
        +Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
         
        -Eshell V5.7.4  (abort with ^G)
        -1> {ok, Viewer} = et_viewer:start([]).
        -{ok,<0.40.0>}

        A Viewer gets trace Events from its Collector by polling it regularly for +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>}

        A Viewer gets trace Events from its Collector by polling it regularly for more Events to display. Events are for example reported to the Collector -with et_collector:report_event/6:

        2> Collector = et_viewer:get_collector_pid(Viewer).
        +with et_collector:report_event/6:

        2> Collector = et_viewer:get_collector_pid(Viewer).
         <0.39.0>
        -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
        -3>                           "Start outer transaction"),
        -3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
        -3>                           "New transaction id is 4711"),
        -3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
        -3>                           "Acquire write lock for {my_tab, key}"),
        -3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
        -3>                           "You got the write lock for {my_tab, key}"),
        -3> et_collector:report_event(Collector, 60, my_shell, do_commit,
        -3>                           "Perform  transaction commit"),
        -3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
        -3>                           "Release all locks for transaction 4711"),
        -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
        -3>                           "End of outer transaction"),
        -3> et_collector:report_event(Collector, 20, my_shell, end_outer,
        -3>                           "Transaction returned {atomic, ok}").
        -{ok,{table_handle,<0.39.0>,16402,trace_ts,
        -     #Fun<et_collector.0.62831470>}}

        This actually is a simulation of the process Events caused by a Mnesia -transaction that writes a record in a local table:

        mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

        At this stage when we have a couple of Events, it is time to show how it looks +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer, +3> "Start outer transaction"), +3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid, +3> "New transaction id is 4711"), +3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock, +3> "Acquire write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted, +3> "You got the write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 60, my_shell, do_commit, +3> "Perform transaction commit"), +3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid, +3> "Release all locks for transaction 4711"), +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction, +3> "End of outer transaction"), +3> et_collector:report_event(Collector, 20, my_shell, end_outer, +3> "Transaction returned {atomic, ok}"). +{ok,{table_handle,<0.39.0>,16402,trace_ts, + #Fun<et_collector.0.62831470>}}

        This actually is a simulation of the process Events caused by a Mnesia +transaction that writes a record in a local table:

        mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

        At this stage when we have a couple of Events, it is time to show how it looks like in the graphical interface of et_viewer:

        A simulated Mnesia transaction which writes one record

        In the sequence chart, the actors (which symbolically has performed the Event) are shown as named vertical bars. The order of the actors may be altered by dragging (hold mouse button 1 pressed during the operation) the name tag of an @@ -61,11 +61,11 @@ the arrow. When doing that a Contents Viewer window pops up. It may look like this:

        Details of a write lock message

        Filters and dictionary

        The Event Tracer (ET) uses named filters in various contexts. An Event Trace filter is an Erlang fun that takes some trace data as input and returns a -possibly modified version of it:

        filter(TraceData) -> false | true | {true, NewEvent}
        +possibly modified version of it:

        filter(TraceData) -> false | true | {true, NewEvent}
         
        -TraceData = Event | erlang_trace_data()
        -Event = #event{}
        -NewEvent = #event{}

        The interface of the filter function is the same as the the filter functions for +TraceData = Event | erlang_trace_data() +Event = #event{} +NewEvent = #event{}

        The interface of the filter function is the same as the the filter functions for the good old lists:filtermap/2. If the filter returns false it means that the trace data should silently be dropped. true means that the trace data data already is an Event Record and that it should be kept as it is. true means @@ -92,21 +92,21 @@ in the viewer. The following filter in et/examples/et_demo.erl replaces the actor names mnesia_tm and mnesia_locker and leaves everything else in the record as it was:

        
        -mgr_actors(E) when is_record(E, event) ->
        -    Actor = fun(A) ->
        +mgr_actors(E) when is_record(E, event) ->
        +    Actor = fun(A) ->
                        case A of
                            mnesia_tm     -> trans_mgr;
                            mnesia_locker -> lock_mgr;
                            _             -> A
                        end
                     end,
        -    {true, E#event{from = Actor(E#event.from),
        -                   to = Actor(E#event.to),
        -                   contents = [{orig_from, E#event.from},
        -                               {orig_to,   E#event.to},
        -                               {orig_contents, E#event.contents}]}}.

        If we now add the filter to the running Collector:

        4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
        +    {true, E#event{from = Actor(E#event.from),
        +                   to = Actor(E#event.to),
        +                   contents = [{orig_from, E#event.from},
        +                               {orig_to,   E#event.to},
        +                               {orig_contents, E#event.contents}]}}.

        If we now add the filter to the running Collector:

        4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
         #Fun<erl_eval.6.13229925>
        -5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
        +5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
         ok

        you will see that the Filter menu in all viewers have got a new entry called mgr_actors. Select it, and a new Viewer window will pop up:

        The same trace data in a different view

        In order to see the nitty gritty details of an Event you may click on the Event in order to start a Contents Viewer for that Event. In the /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_examples.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_examples.xhtml 2025-11-20 15:11:39.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_examples.xhtml 2041-12-23 04:29:52.000000000 +0000 @@ -19,71 +19,71 @@

        Advanced examples

        A simulated Mnesia transaction

        The Erlang code for running the simulated Mnesia transaction example in the previous chapter is included in the et/examples/et_demo.erl file:

        
        -sim_trans() ->
        -    sim_trans([]).
        +sim_trans() ->
        +    sim_trans([]).
         
        -sim_trans(ExtraOptions) ->
        -    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
        -    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
        -    Collector = et_viewer:get_collector_pid(Viewer),
        -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
        -                              "Start outer transaction"),
        -    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
        -                              "New transaction id is 4711"),
        -    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
        -                              "Acquire write lock for {my_tab, key}"),
        -    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
        -                              "You got the write lock for {my_tab, key}"),
        -    et_collector:report_event(Collector, 60, my_shell, do_commit,
        -                              "Perform  transaction commit"),
        -    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
        -                              "Release all locks for transaction 4711"),
        -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
        -                              "End of outer transaction"),
        -    et_collector:report_event(Collector, 20, my_shell, end_outer,
        -                              "Transaction returned {atomic, ok}"),
        -    {collector, Collector}.
        
        -mgr_actors(E) when is_record(E, event) ->
        -    Actor = fun(A) ->
        +sim_trans(ExtraOptions) ->
        +    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
        +    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
        +    Collector = et_viewer:get_collector_pid(Viewer),
        +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
        +                              "Start outer transaction"),
        +    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
        +                              "New transaction id is 4711"),
        +    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
        +                              "Acquire write lock for {my_tab, key}"),
        +    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
        +                              "You got the write lock for {my_tab, key}"),
        +    et_collector:report_event(Collector, 60, my_shell, do_commit,
        +                              "Perform  transaction commit"),
        +    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
        +                              "Release all locks for transaction 4711"),
        +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
        +                              "End of outer transaction"),
        +    et_collector:report_event(Collector, 20, my_shell, end_outer,
        +                              "Transaction returned {atomic, ok}"),
        +    {collector, Collector}.
        
        +mgr_actors(E) when is_record(E, event) ->
        +    Actor = fun(A) ->
                        case A of
                            mnesia_tm     -> trans_mgr;
                            mnesia_locker -> lock_mgr;
                            _             -> A
                        end
                     end,
        -    {true, E#event{from = Actor(E#event.from),
        -                   to = Actor(E#event.to),
        -                   contents = [{orig_from, E#event.from},
        -                               {orig_to,   E#event.to},
        -                               {orig_contents, E#event.contents}]}}.

        If you invoke the et_demo:sim_trans() function, a Viewer window will pop up + {true, E#event{from = Actor(E#event.from), + to = Actor(E#event.to), + contents = [{orig_from, E#event.from}, + {orig_to, E#event.to}, + {orig_contents, E#event.contents}]}}.

        If you invoke the et_demo:sim_trans() function, a Viewer window will pop up and the sequence trace will be almost the same as if the following Mnesia -transaction would have been run:

        mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

        And the viewer window will look like:

        Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
        +transaction would have been run:

        mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

        And the viewer window will look like:

        Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
         
        -Eshell V5.7.4  (abort with ^G)
        -1> {ok, Viewer} = et_viewer:start([]).
        -{ok,<0.40.0>;}
        -2> et_demo:sim_trans().
        -{ok,{table_handle,<0.45.0>,24596,trace_ts,
        -     #Fun<et_collector.0.62831470>}}

        A simulated Mnesia transaction which writes one record

        Some convenient functions used in the Mnesia transaction example

        The module_as_actor filter converts the Event Records so the module names +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>;} +2> et_demo:sim_trans(). +{ok,{table_handle,<0.45.0>,24596,trace_ts, + #Fun<et_collector.0.62831470>}}

        A simulated Mnesia transaction which writes one record

        Some convenient functions used in the Mnesia transaction example

        The module_as_actor filter converts the Event Records so the module names becomes actors and the invoked functions becomes labels. If the information about who the caller was it will be displayed as an arrow directed from the caller to the callee. The [{message, {caller}}, {return_trace}] options to dbg:tpl/2 function will imply the necessary information in the Erlang traces. Here follows the module_as_actor filter:

        
        -module_as_actor(E) when is_record(E, event) ->
        -    case lists:keysearch(mfa, 1, E#event.contents) of
        -        {value, {mfa, {M, F, _A}}} ->
        -            case lists:keysearch(pam_result, 1, E#event.contents) of
        -                {value, {pam_result, {M2, _F2, _A2}}} ->
        -                    {true, E#event{label = F, from = M2, to = M}};
        +module_as_actor(E) when is_record(E, event) ->
        +    case lists:keysearch(mfa, 1, E#event.contents) of
        +        {value, {mfa, {M, F, _A}}} ->
        +            case lists:keysearch(pam_result, 1, E#event.contents) of
        +                {value, {pam_result, {M2, _F2, _A2}}} ->
        +                    {true, E#event{label = F, from = M2, to = M}};
                         _ ->
        -                    {true, E#event{label = F, from = M, to = M}}
        +                    {true, E#event{label = F, from = M, to = M}}
                     end;
                 _ ->
                     false
             end.

        The plain_process_info filter does not alter the Event Records. It merely ensures that the event not related to processes are skipped:

        
        -plain_process_info(E) when is_record(E, event) ->
        +plain_process_info(E) when is_record(E, event) ->
             case E#event.label of
                 send                          -> true;
                 send_to_non_existing_process  -> true;
        @@ -93,50 +93,50 @@
                 link                          -> true;
                 unlink                        -> true;
                 getting_linked                -> true;
        -        {seq_send, _Label}            -> true;
        -        {seq_receive, _Label}         -> true;
        -        {seq_print, _Label}           -> true;
        -        {drop, _N}                    -> true;
        +        {seq_send, _Label}            -> true;
        +        {seq_receive, _Label}         -> true;
        +        {seq_print, _Label}           -> true;
        +        {drop, _N}                    -> true;
                 _                             -> false
             end.

        The plain_process_info_nolink filter does not alter the Event Records. It do makes use of the plain_process_info , but do also ensure that the process info related to linking and unlinking is skipped:

        
        -plain_process_info_nolink(E) when is_record(E, event) ->
        -    (E#event.label /= link) and
        -    (E#event.label /= unlink) and
        -    (E#event.label /= getting_linked) and
        -    plain_process_info(E).

        In order to simplify the startup of an et_viewer process with the filters +plain_process_info_nolink(E) when is_record(E, event) -> + (E#event.label /= link) and + (E#event.label /= unlink) and + (E#event.label /= getting_linked) and + plain_process_info(E).

        In order to simplify the startup of an et_viewer process with the filters mentioned above, plus some others (that also are found in et/examples/et_demo.erl src/et_collector.erl the et_demo:start/0,1 functions can be used:

        
        -start() ->
        -    start([]).
        +start() ->
        +    start([]).
         
        -start(ExtraOptions) ->
        -    Options = [{trace_global, true},
        -               {parent_pid, undefined},
        -               {max_actors, infinity},
        -               {max_events, 1000},
        -               {active_filter, module_as_actor}],
        -    et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

        A simple one-liner starts the tool:

                  erl -pa ../examples -s et_demo

        The filters are included by the following parameters:

        
        -filters() ->
        -    [{dict_insert, {filter, module_as_actor},
        -                   fun module_as_actor/1},
        -     {dict_insert, {filter, plain_process_info},
        -                   fun plain_process_info/1},
        -     {dict_insert, {filter, plain_process_info_nolink},
        -                   fun plain_process_info_nolink/1},
        -     {dict_insert, {filter, named_process_info},
        -                   fun named_process_info/1},
        -     {dict_insert, {filter, named_process_info_nolink},
        -                   fun named_process_info_nolink/1},
        -     {dict_insert, {filter, node_process_info},
        -                   fun node_process_info/1},
        -     {dict_insert, {filter, node_process_info_nolink},
        -                   fun node_process_info_nolink/1},
        -     {dict_insert, {filter, application_as_actor},
        -                   fun application_as_actor/1}
        -    ].

        Erlang trace of a real Mnesia transaction

        The following piece of code et_demo:trace_mnesia/0 activates call tracing of +start(ExtraOptions) -> + Options = [{trace_global, true}, + {parent_pid, undefined}, + {max_actors, infinity}, + {max_events, 1000}, + {active_filter, module_as_actor}], + et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

        A simple one-liner starts the tool:

                  erl -pa ../examples -s et_demo

        The filters are included by the following parameters:

        
        +filters() ->
        +    [{dict_insert, {filter, module_as_actor},
        +                   fun module_as_actor/1},
        +     {dict_insert, {filter, plain_process_info},
        +                   fun plain_process_info/1},
        +     {dict_insert, {filter, plain_process_info_nolink},
        +                   fun plain_process_info_nolink/1},
        +     {dict_insert, {filter, named_process_info},
        +                   fun named_process_info/1},
        +     {dict_insert, {filter, named_process_info_nolink},
        +                   fun named_process_info_nolink/1},
        +     {dict_insert, {filter, node_process_info},
        +                   fun node_process_info/1},
        +     {dict_insert, {filter, node_process_info_nolink},
        +                   fun node_process_info_nolink/1},
        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_tutorial.xhtml differs (HTML document, ASCII text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_tutorial.xhtml	2025-11-20 15:11:39.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_tutorial.xhtml	2041-12-23 04:29:52.000000000 +0000
        @@ -19,8 +19,8 @@
             

        Tutorial

        Visualizing Message Sequence Charts

        The easiest way of using ET, is to just use it as a graphical tool for displaying message sequence charts. In order to do that you need to first start -a Viewer (which by default starts a Collector):

              {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
        -      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

        Then you send events to the Collector with the function +a Viewer (which by default starts a Collector):

              {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
        +      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

        Then you send events to the Collector with the function et_collector:report_event/6 like this:

              et_collector:report_event(CollectorPid,85,from,to,message,extra_stuff).

        The Viewer will automatically pull events from the Collector and display them on the screen.

        The number (in this case 85) is an integer from 1 to 100 that specifies the "detail level" of the message. The higher the number, the more important it is. @@ -30,30 +30,30 @@ displayed next to the lifeline as an "action". The extra_stuffvalue is simply data that you can attach that will be displayed when someone actually clicks on the action or message in the Viewer window.

        The module et/examples/et_display_demo.erl illustrates how it can be used:

        
        --module(et_display_demo).
        +-module(et_display_demo).
         
        --export([test/0]).
        +-export([test/0]).
         
        -test() ->
        -    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
        -    Drink = {drink,iced_chai_latte},
        -    Size = {size,grande},
        -    Milk = {milk,whole},
        -    Flavor = {flavor,vanilla},
        -    C = et_viewer:get_collector_pid(Viewer),
        -    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
        -    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
        -    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
        -    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
        -    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
        -    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
        -    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
        -    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
        -    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
        -    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
        -    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
        -    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
        -    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
        +test() ->
        +    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
        +    Drink = {drink,iced_chai_latte},
        +    Size = {size,grande},
        +    Milk = {milk,whole},
        +    Flavor = {flavor,vanilla},
        +    C = et_viewer:get_collector_pid(Viewer),
        +    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
        +    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
        +    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
        +    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
        +    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
        +    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
        +    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
        +    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
        +    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
        +    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
        +    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
        +    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
        +    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
             ok.

        When you run the et_display_demo:test(). function in the example above, the Viewer window will look like this:

        Screenshot of the Viewer window

        Four Modules

        The event tracer framework is made up of four modules:

        • et
        • et_collector
        • et_viewer
        • et_selector

        In addition, you'll probably want to familiarize yourself with the dbg module and possibly seq_trace module as well.

        The Event Tracer Interface

        The et module is not like other modules. It contains a function called @@ -73,7 +73,7 @@ calls. The idea is that you should instrument your code with calls to et:trace_me/5 in strategic places where you have interesting information available in your program. Then you just start the Collector with global -tracing enabled:

              et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

        This will start a Collector, a Viewer and also start the tracing of +tracing enabled:

              et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

        This will start a Collector, a Viewer and also start the tracing of et:trace_me/5 function calls. The Raw Trace Data is collected by the Collector and a view of it is displayed on the screen by the Viewer. You can define your own "views" of the data by implementing your own Filter functions @@ -111,36 +111,36 @@ all you have to do is enable them.

        For those people who want to do general tracing, consult the dbg module on how to trace whatever you're interested in and let it work its magic. If you just want et:trace_me/5 to work, do the following:

        1. Create a Collector
        2. Create a Viewer (this can do step #1 for you)
        3. Turn on and pare down debugging

        The module et/examples/et_trace_demo.erl achieves this.

        
        --module(et_trace_demo).
        +-module(et_trace_demo).
         
        --export([test/0]).
        +-export([test/0]).
         
        -test() ->
        -    et_viewer:start([
        -        {title,"Coffee Order"},
        -        {trace_global,true},
        -        {trace_pattern,{et,max}},
        -        {max_actors,10}
        -      ]),
        +test() ->
        +    et_viewer:start([
        +        {title,"Coffee Order"},
        +        {trace_global,true},
        +        {trace_pattern,{et,max}},
        +        {max_actors,10}
        +      ]),
               %% dbg:p(all,call),
               %% dbg:tpl(et, trace_me, 5, []),
        -      Drink = {drink,iced_chai_latte},
        -      Size = {size,grande},
        -      Milk = {milk,whole},
        -      Flavor = {flavor,vanilla},
        -      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
        -      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
        -      et:trace_me(80,register,barrista1,give_total,"$5"),
        -      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
        -      et:trace_me(80,barrista1,barrista2,give_cup,[]),
        -      et:trace_me(90,barrista1,customer,request_money,"$5"),
        -      et:trace_me(90,customer,barrista1,pay_money,"$5"),
        -      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
        -      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
        -      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
        -      et:trace_me(80,barrista2,barrista2,add_ice,[]),
        -      et:trace_me(80,barrista2,barrista2,swirl,[]),
        -      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
        +      Drink = {drink,iced_chai_latte},
        +      Size = {size,grande},
        +      Milk = {milk,whole},
        +      Flavor = {flavor,vanilla},
        +      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
        +      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
        +      et:trace_me(80,register,barrista1,give_total,"$5"),
        +      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
        +      et:trace_me(80,barrista1,barrista2,give_cup,[]),
        +      et:trace_me(90,barrista1,customer,request_money,"$5"),
        +      et:trace_me(90,customer,barrista1,pay_money,"$5"),
        +      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
        +      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
        +      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
        +      et:trace_me(80,barrista2,barrista2,add_ice,[]),
        +      et:trace_me(80,barrista2,barrista2,swirl,[]),
        +      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
               ok.

        Running through the above, the most important points are:

        • Turn on global tracing
        • Set a Trace Pattern
        • Tell dbg to trace function Calls
        • Tell it specifically to trace the et:trace_me/5 function

        When you run the et_trace_demo:test() function above, the Viewer window will look like this screenshot:

        Screenshot of the Viewer window

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.html 2025-11-20 15:16:44.317995851 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.html 2025-11-20 15:16:44.321995876 +0000 @@ -521,7 +521,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_collector.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_collector.html 2025-11-20 15:16:44.349996042 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_collector.html 2025-11-20 15:16:44.353996065 +0000 @@ -1506,7 +1506,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_desc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_desc.html 2025-11-20 15:16:44.381996231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_desc.html 2025-11-20 15:16:44.381996231 +0000 @@ -96,33 +96,33 @@ enable other types of Viewers. However in the following text we will focus on usage of the et_viewer.

        The main start function is et_viewer:start/1. By default it will start both an et_collector and an et_viewer:

        % erl -pa et/examples
        -Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
        +Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
         
        -Eshell V5.7.4  (abort with ^G)
        -1> {ok, Viewer} = et_viewer:start([]).
        -{ok,<0.40.0>}

        A Viewer gets trace Events from its Collector by polling it regularly for +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>}

        A Viewer gets trace Events from its Collector by polling it regularly for more Events to display. Events are for example reported to the Collector -with et_collector:report_event/6:

        2> Collector = et_viewer:get_collector_pid(Viewer).
        +with et_collector:report_event/6:

        2> Collector = et_viewer:get_collector_pid(Viewer).
         <0.39.0>
        -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
        -3>                           "Start outer transaction"),
        -3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
        -3>                           "New transaction id is 4711"),
        -3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
        -3>                           "Acquire write lock for {my_tab, key}"),
        -3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
        -3>                           "You got the write lock for {my_tab, key}"),
        -3> et_collector:report_event(Collector, 60, my_shell, do_commit,
        -3>                           "Perform  transaction commit"),
        -3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
        -3>                           "Release all locks for transaction 4711"),
        -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
        -3>                           "End of outer transaction"),
        -3> et_collector:report_event(Collector, 20, my_shell, end_outer,
        -3>                           "Transaction returned {atomic, ok}").
        -{ok,{table_handle,<0.39.0>,16402,trace_ts,
        -     #Fun<et_collector.0.62831470>}}

        This actually is a simulation of the process Events caused by a Mnesia -transaction that writes a record in a local table:

        mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

        At this stage when we have a couple of Events, it is time to show how it looks +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer, +3> "Start outer transaction"), +3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid, +3> "New transaction id is 4711"), +3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock, +3> "Acquire write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted, +3> "You got the write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 60, my_shell, do_commit, +3> "Perform transaction commit"), +3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid, +3> "Release all locks for transaction 4711"), +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction, +3> "End of outer transaction"), +3> et_collector:report_event(Collector, 20, my_shell, end_outer, +3> "Transaction returned {atomic, ok}"). +{ok,{table_handle,<0.39.0>,16402,trace_ts, + #Fun<et_collector.0.62831470>}}

        This actually is a simulation of the process Events caused by a Mnesia +transaction that writes a record in a local table:

        mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

        At this stage when we have a couple of Events, it is time to show how it looks like in the graphical interface of et_viewer:

        A simulated Mnesia transaction which writes one record

        In the sequence chart, the actors (which symbolically has performed the Event) are shown as named vertical bars. The order of the actors may be altered by dragging (hold mouse button 1 pressed during the operation) the name tag of an @@ -133,11 +133,11 @@ the arrow. When doing that a Contents Viewer window pops up. It may look like this:

        Details of a write lock message

        Filters and dictionary

        The Event Tracer (ET) uses named filters in various contexts. An Event Trace filter is an Erlang fun that takes some trace data as input and returns a -possibly modified version of it:

        filter(TraceData) -> false | true | {true, NewEvent}
        +possibly modified version of it:

        filter(TraceData) -> false | true | {true, NewEvent}
         
        -TraceData = Event | erlang_trace_data()
        -Event = #event{}
        -NewEvent = #event{}

        The interface of the filter function is the same as the the filter functions for +TraceData = Event | erlang_trace_data() +Event = #event{} +NewEvent = #event{}

        The interface of the filter function is the same as the the filter functions for the good old lists:filtermap/2. If the filter returns false it means that the trace data should silently be dropped. true means that the trace data data already is an Event Record and that it should be kept as it is. true means @@ -164,21 +164,21 @@ in the viewer. The following filter in et/examples/et_demo.erl replaces the actor names mnesia_tm and mnesia_locker and leaves everything else in the record as it was:

        
        -mgr_actors(E) when is_record(E, event) ->
        -    Actor = fun(A) ->
        +mgr_actors(E) when is_record(E, event) ->
        +    Actor = fun(A) ->
                        case A of
                            mnesia_tm     -> trans_mgr;
                            mnesia_locker -> lock_mgr;
                            _             -> A
                        end
                     end,
        -    {true, E#event{from = Actor(E#event.from),
        -                   to = Actor(E#event.to),
        -                   contents = [{orig_from, E#event.from},
        -                               {orig_to,   E#event.to},
        -                               {orig_contents, E#event.contents}]}}.

        If we now add the filter to the running Collector:

        4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
        +    {true, E#event{from = Actor(E#event.from),
        +                   to = Actor(E#event.to),
        +                   contents = [{orig_from, E#event.from},
        +                               {orig_to,   E#event.to},
        +                               {orig_contents, E#event.contents}]}}.

        If we now add the filter to the running Collector:

        4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
         #Fun<erl_eval.6.13229925>
        -5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
        +5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
         ok

        you will see that the Filter menu in all viewers have got a new entry called mgr_actors. Select it, and a new Viewer window will pop up:

        The same trace data in a different view

        In order to see the nitty gritty details of an Event you may click on the Event in order to start a Contents Viewer for that Event. In the @@ -346,7 +346,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_examples.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_examples.html 2025-11-20 15:16:44.425996493 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_examples.html 2025-11-20 15:16:44.417996447 +0000 @@ -91,71 +91,71 @@

        A simulated Mnesia transaction

        The Erlang code for running the simulated Mnesia transaction example in the previous chapter is included in the et/examples/et_demo.erl file:

        
        -sim_trans() ->
        -    sim_trans([]).
        +sim_trans() ->
        +    sim_trans([]).
         
        -sim_trans(ExtraOptions) ->
        -    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
        -    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
        -    Collector = et_viewer:get_collector_pid(Viewer),
        -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
        -                              "Start outer transaction"),
        -    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
        -                              "New transaction id is 4711"),
        -    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
        -                              "Acquire write lock for {my_tab, key}"),
        -    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
        -                              "You got the write lock for {my_tab, key}"),
        -    et_collector:report_event(Collector, 60, my_shell, do_commit,
        -                              "Perform  transaction commit"),
        -    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
        -                              "Release all locks for transaction 4711"),
        -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
        -                              "End of outer transaction"),
        -    et_collector:report_event(Collector, 20, my_shell, end_outer,
        -                              "Transaction returned {atomic, ok}"),
        -    {collector, Collector}.
        
        -mgr_actors(E) when is_record(E, event) ->
        -    Actor = fun(A) ->
        +sim_trans(ExtraOptions) ->
        +    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
        +    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
        +    Collector = et_viewer:get_collector_pid(Viewer),
        +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
        +                              "Start outer transaction"),
        +    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
        +                              "New transaction id is 4711"),
        +    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
        +                              "Acquire write lock for {my_tab, key}"),
        +    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
        +                              "You got the write lock for {my_tab, key}"),
        +    et_collector:report_event(Collector, 60, my_shell, do_commit,
        +                              "Perform  transaction commit"),
        +    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
        +                              "Release all locks for transaction 4711"),
        +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
        +                              "End of outer transaction"),
        +    et_collector:report_event(Collector, 20, my_shell, end_outer,
        +                              "Transaction returned {atomic, ok}"),
        +    {collector, Collector}.
        
        +mgr_actors(E) when is_record(E, event) ->
        +    Actor = fun(A) ->
                        case A of
                            mnesia_tm     -> trans_mgr;
                            mnesia_locker -> lock_mgr;
                            _             -> A
                        end
                     end,
        -    {true, E#event{from = Actor(E#event.from),
        -                   to = Actor(E#event.to),
        -                   contents = [{orig_from, E#event.from},
        -                               {orig_to,   E#event.to},
        -                               {orig_contents, E#event.contents}]}}.

        If you invoke the et_demo:sim_trans() function, a Viewer window will pop up + {true, E#event{from = Actor(E#event.from), + to = Actor(E#event.to), + contents = [{orig_from, E#event.from}, + {orig_to, E#event.to}, + {orig_contents, E#event.contents}]}}.

        If you invoke the et_demo:sim_trans() function, a Viewer window will pop up and the sequence trace will be almost the same as if the following Mnesia -transaction would have been run:

        mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

        And the viewer window will look like:

        Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
        +transaction would have been run:

        mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

        And the viewer window will look like:

        Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
         
        -Eshell V5.7.4  (abort with ^G)
        -1> {ok, Viewer} = et_viewer:start([]).
        -{ok,<0.40.0>;}
        -2> et_demo:sim_trans().
        -{ok,{table_handle,<0.45.0>,24596,trace_ts,
        -     #Fun<et_collector.0.62831470>}}

        A simulated Mnesia transaction which writes one record

        Some convenient functions used in the Mnesia transaction example

        The module_as_actor filter converts the Event Records so the module names +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>;} +2> et_demo:sim_trans(). +{ok,{table_handle,<0.45.0>,24596,trace_ts, + #Fun<et_collector.0.62831470>}}

        A simulated Mnesia transaction which writes one record

        Some convenient functions used in the Mnesia transaction example

        The module_as_actor filter converts the Event Records so the module names becomes actors and the invoked functions becomes labels. If the information about who the caller was it will be displayed as an arrow directed from the caller to the callee. The [{message, {caller}}, {return_trace}] options to dbg:tpl/2 function will imply the necessary information in the Erlang traces. Here follows the module_as_actor filter:

        
        -module_as_actor(E) when is_record(E, event) ->
        -    case lists:keysearch(mfa, 1, E#event.contents) of
        -        {value, {mfa, {M, F, _A}}} ->
        -            case lists:keysearch(pam_result, 1, E#event.contents) of
        -                {value, {pam_result, {M2, _F2, _A2}}} ->
        -                    {true, E#event{label = F, from = M2, to = M}};
        +module_as_actor(E) when is_record(E, event) ->
        +    case lists:keysearch(mfa, 1, E#event.contents) of
        +        {value, {mfa, {M, F, _A}}} ->
        +            case lists:keysearch(pam_result, 1, E#event.contents) of
        +                {value, {pam_result, {M2, _F2, _A2}}} ->
        +                    {true, E#event{label = F, from = M2, to = M}};
                         _ ->
        -                    {true, E#event{label = F, from = M, to = M}}
        +                    {true, E#event{label = F, from = M, to = M}}
                     end;
                 _ ->
                     false
             end.

        The plain_process_info filter does not alter the Event Records. It merely ensures that the event not related to processes are skipped:

        
        -plain_process_info(E) when is_record(E, event) ->
        +plain_process_info(E) when is_record(E, event) ->
             case E#event.label of
                 send                          -> true;
                 send_to_non_existing_process  -> true;
        @@ -165,50 +165,50 @@
                 link                          -> true;
                 unlink                        -> true;
                 getting_linked                -> true;
        -        {seq_send, _Label}            -> true;
        -        {seq_receive, _Label}         -> true;
        -        {seq_print, _Label}           -> true;
        -        {drop, _N}                    -> true;
        +        {seq_send, _Label}            -> true;
        +        {seq_receive, _Label}         -> true;
        +        {seq_print, _Label}           -> true;
        +        {drop, _N}                    -> true;
                 _                             -> false
             end.

        The plain_process_info_nolink filter does not alter the Event Records. It do makes use of the plain_process_info , but do also ensure that the process info related to linking and unlinking is skipped:

        
        -plain_process_info_nolink(E) when is_record(E, event) ->
        -    (E#event.label /= link) and
        -    (E#event.label /= unlink) and
        -    (E#event.label /= getting_linked) and
        -    plain_process_info(E).

        In order to simplify the startup of an et_viewer process with the filters +plain_process_info_nolink(E) when is_record(E, event) -> + (E#event.label /= link) and + (E#event.label /= unlink) and + (E#event.label /= getting_linked) and + plain_process_info(E).

        In order to simplify the startup of an et_viewer process with the filters mentioned above, plus some others (that also are found in et/examples/et_demo.erl src/et_collector.erl the et_demo:start/0,1 functions can be used:

        
        -start() ->
        -    start([]).
        +start() ->
        +    start([]).
         
        -start(ExtraOptions) ->
        -    Options = [{trace_global, true},
        -               {parent_pid, undefined},
        -               {max_actors, infinity},
        -               {max_events, 1000},
        -               {active_filter, module_as_actor}],
        -    et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

        A simple one-liner starts the tool:

                  erl -pa ../examples -s et_demo

        The filters are included by the following parameters:

        
        -filters() ->
        -    [{dict_insert, {filter, module_as_actor},
        -                   fun module_as_actor/1},
        -     {dict_insert, {filter, plain_process_info},
        -                   fun plain_process_info/1},
        -     {dict_insert, {filter, plain_process_info_nolink},
        -                   fun plain_process_info_nolink/1},
        -     {dict_insert, {filter, named_process_info},
        -                   fun named_process_info/1},
        -     {dict_insert, {filter, named_process_info_nolink},
        -                   fun named_process_info_nolink/1},
        -     {dict_insert, {filter, node_process_info},
        -                   fun node_process_info/1},
        -     {dict_insert, {filter, node_process_info_nolink},
        -                   fun node_process_info_nolink/1},
        -     {dict_insert, {filter, application_as_actor},
        -                   fun application_as_actor/1}
        -    ].

        Erlang trace of a real Mnesia transaction

        The following piece of code et_demo:trace_mnesia/0 activates call tracing of +start(ExtraOptions) -> + Options = [{trace_global, true}, + {parent_pid, undefined}, + {max_actors, infinity}, + {max_events, 1000}, + {active_filter, module_as_actor}], + et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

        A simple one-liner starts the tool:

                  erl -pa ../examples -s et_demo

        The filters are included by the following parameters:

        
        +filters() ->
        +    [{dict_insert, {filter, module_as_actor},
        +                   fun module_as_actor/1},
        +     {dict_insert, {filter, plain_process_info},
        +                   fun plain_process_info/1},
        +     {dict_insert, {filter, plain_process_info_nolink},
        +                   fun plain_process_info_nolink/1},
        +     {dict_insert, {filter, named_process_info},
        +                   fun named_process_info/1},
        +     {dict_insert, {filter, named_process_info_nolink},
        +                   fun named_process_info_nolink/1},
        +     {dict_insert, {filter, node_process_info},
        +                   fun node_process_info/1},
        +     {dict_insert, {filter, node_process_info_nolink},
        +                   fun node_process_info_nolink/1},
        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_intro.html differs (HTML document, UTF-8 Unicode text, with very long lines)
        --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_intro.html	2025-11-20 15:16:44.453996660 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_intro.html	2025-11-20 15:16:44.457996684 +0000
        @@ -156,7 +156,7 @@
                   Erlang programming language
         
               

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_selector.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_selector.html 2025-11-20 15:16:44.477996802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_selector.html 2025-11-20 15:16:44.481996827 +0000 @@ -394,7 +394,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_tutorial.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_tutorial.html 2025-11-20 15:16:44.509996993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_tutorial.html 2025-11-20 15:16:44.513997016 +0000 @@ -91,8 +91,8 @@

        Visualizing Message Sequence Charts

        The easiest way of using ET, is to just use it as a graphical tool for displaying message sequence charts. In order to do that you need to first start -a Viewer (which by default starts a Collector):

              {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
        -      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

        Then you send events to the Collector with the function +a Viewer (which by default starts a Collector):

              {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
        +      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

        Then you send events to the Collector with the function et_collector:report_event/6 like this:

              et_collector:report_event(CollectorPid,85,from,to,message,extra_stuff).

        The Viewer will automatically pull events from the Collector and display them on the screen.

        The number (in this case 85) is an integer from 1 to 100 that specifies the "detail level" of the message. The higher the number, the more important it is. @@ -102,30 +102,30 @@ displayed next to the lifeline as an "action". The extra_stuffvalue is simply data that you can attach that will be displayed when someone actually clicks on the action or message in the Viewer window.

        The module et/examples/et_display_demo.erl illustrates how it can be used:

        
        --module(et_display_demo).
        +-module(et_display_demo).
         
        --export([test/0]).
        +-export([test/0]).
         
        -test() ->
        -    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
        -    Drink = {drink,iced_chai_latte},
        -    Size = {size,grande},
        -    Milk = {milk,whole},
        -    Flavor = {flavor,vanilla},
        -    C = et_viewer:get_collector_pid(Viewer),
        -    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
        -    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
        -    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
        -    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
        -    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
        -    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
        -    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
        -    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
        -    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
        -    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
        -    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
        -    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
        -    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
        +test() ->
        +    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
        +    Drink = {drink,iced_chai_latte},
        +    Size = {size,grande},
        +    Milk = {milk,whole},
        +    Flavor = {flavor,vanilla},
        +    C = et_viewer:get_collector_pid(Viewer),
        +    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
        +    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
        +    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
        +    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
        +    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
        +    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
        +    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
        +    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
        +    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
        +    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
        +    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
        +    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
        +    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
             ok.

        When you run the et_display_demo:test(). function in the example above, the Viewer window will look like this:

        Screenshot of the Viewer window

        Four Modules

        The event tracer framework is made up of four modules:

        • et
        • et_collector
        • et_viewer
        • et_selector

        In addition, you'll probably want to familiarize yourself with the dbg module and possibly seq_trace module as well.

        The Event Tracer Interface

        The et module is not like other modules. It contains a function called @@ -145,7 +145,7 @@ calls. The idea is that you should instrument your code with calls to et:trace_me/5 in strategic places where you have interesting information available in your program. Then you just start the Collector with global -tracing enabled:

              et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

        This will start a Collector, a Viewer and also start the tracing of +tracing enabled:

              et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

        This will start a Collector, a Viewer and also start the tracing of et:trace_me/5 function calls. The Raw Trace Data is collected by the Collector and a view of it is displayed on the screen by the Viewer. You can define your own "views" of the data by implementing your own Filter functions @@ -183,36 +183,36 @@ all you have to do is enable them.

        For those people who want to do general tracing, consult the dbg module on how to trace whatever you're interested in and let it work its magic. If you just want et:trace_me/5 to work, do the following:

        1. Create a Collector
        2. Create a Viewer (this can do step #1 for you)
        3. Turn on and pare down debugging

        The module et/examples/et_trace_demo.erl achieves this.

        
        --module(et_trace_demo).
        +-module(et_trace_demo).
         
        --export([test/0]).
        +-export([test/0]).
         
        -test() ->
        -    et_viewer:start([
        -        {title,"Coffee Order"},
        -        {trace_global,true},
        -        {trace_pattern,{et,max}},
        -        {max_actors,10}
        -      ]),
        +test() ->
        +    et_viewer:start([
        +        {title,"Coffee Order"},
        +        {trace_global,true},
        +        {trace_pattern,{et,max}},
        +        {max_actors,10}
        +      ]),
               %% dbg:p(all,call),
               %% dbg:tpl(et, trace_me, 5, []),
        -      Drink = {drink,iced_chai_latte},
        -      Size = {size,grande},
        -      Milk = {milk,whole},
        -      Flavor = {flavor,vanilla},
        -      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
        -      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
        -      et:trace_me(80,register,barrista1,give_total,"$5"),
        -      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
        -      et:trace_me(80,barrista1,barrista2,give_cup,[]),
        -      et:trace_me(90,barrista1,customer,request_money,"$5"),
        -      et:trace_me(90,customer,barrista1,pay_money,"$5"),
        -      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
        -      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
        -      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
        -      et:trace_me(80,barrista2,barrista2,add_ice,[]),
        -      et:trace_me(80,barrista2,barrista2,swirl,[]),
        -      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
        +      Drink = {drink,iced_chai_latte},
        +      Size = {size,grande},
        +      Milk = {milk,whole},
        +      Flavor = {flavor,vanilla},
        +      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
        +      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
        +      et:trace_me(80,register,barrista1,give_total,"$5"),
        +      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
        +      et:trace_me(80,barrista1,barrista2,give_cup,[]),
        +      et:trace_me(90,barrista1,customer,request_money,"$5"),
        +      et:trace_me(90,customer,barrista1,pay_money,"$5"),
        +      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
        +      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
        +      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
        +      et:trace_me(80,barrista2,barrista2,add_ice,[]),
        +      et:trace_me(80,barrista2,barrista2,swirl,[]),
        +      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
               ok.

        Running through the above, the most important points are:

        • Turn on global tracing
        • Set a Trace Pattern
        • Tell dbg to trace function Calls
        • Tell it specifically to trace the et:trace_me/5 function

        When you run the et_trace_demo:test() function above, the Viewer window will look like this screenshot:

        Screenshot of the Viewer window

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

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_viewer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_viewer.html 2025-11-20 15:16:44.545997207 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_viewer.html 2025-11-20 15:16:44.545997207 +0000 @@ -536,7 +536,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/notes.html 2025-11-20 15:16:44.577997397 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/notes.html 2025-11-20 15:16:44.581997420 +0000 @@ -164,7 +164,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/search.html 2025-11-20 15:16:44.601997538 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/search.html 2025-11-20 15:16:44.601997538 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/404.html 2025-11-20 15:16:44.621997658 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/404.html 2025-11-20 15:16:44.625997681 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/api-reference.html 2025-11-20 15:16:44.645997800 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/api-reference.html 2025-11-20 15:16:44.649997825 +0000 @@ -128,7 +128,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/chapter.html 2025-11-20 15:16:44.681998014 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/chapter.html 2025-11-20 15:16:44.685998038 +0000 @@ -591,7 +591,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub/OEBPS/content.opf 2025-11-20 15:11:42.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub/OEBPS/content.opf 2041-12-23 04:29:56.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> eunit - 2.10 - urn:uuid:3bfa14a2-d81c-015e-0f51-a48ab8ac5f8f + urn:uuid:052d8a18-27e9-cdc8-bc88-062b210c0d8b en - 2025-11-20T15:11:42Z + 2041-12-23T04:29:56Z /usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub/OEBPS/notes.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub/OEBPS/notes.xhtml 2025-11-20 15:11:42.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub/OEBPS/notes.xhtml 2041-12-23 04:29:56.000000000 +0000 @@ -17,9 +17,9 @@

        EUnit Release Notes

        -

        This document describes the changes made to the EUnit application.

        Eunit 2.10

        Fixed Bugs and Malfunctions

        • Fix so that when running tests in parallel and one test is cancelled due to a failing setup, it is report as cancelled. Before this fix the cancellation was ignored.

          Own Id: OTP-19630 Aux Id: PR-9794

        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

        Eunit 2.9.1

        Improvements and New Features

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

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

        Eunit 2.9

        Improvements and New Features

        • With this change, EUnit timetraps can be scaled with the use of scale_timeouts +

          This document describes the changes made to the EUnit application.

          Eunit 2.10

          Fixed Bugs and Malfunctions

          • Fix so that when running tests in parallel and one test is cancelled due to a failing setup, it is report as cancelled. Before this fix the cancellation was ignored.

            Own Id: OTP-19630 Aux Id: PR-9794

          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

          Eunit 2.9.1

          Improvements and New Features

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

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

          Eunit 2.9

          Improvements and New Features

          • With this change, EUnit timetraps can be scaled with the use of scale_timeouts option.

            Own Id: OTP-18771 Aux Id: PR-7635

          Eunit 2.8.2

          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/eunit-2.10/doc/html/eunit.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.html 2025-11-20 15:16:44.793998679 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.html 2025-11-20 15:16:44.797998704 +0000 @@ -315,7 +315,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit_surefire.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit_surefire.html 2025-11-20 15:16:44.821998846 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit_surefire.html 2025-11-20 15:16:44.821998846 +0000 @@ -123,7 +123,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/notes.html 2025-11-20 15:16:44.845998989 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/notes.html 2025-11-20 15:16:44.849999012 +0000 @@ -89,9 +89,9 @@ -

            This document describes the changes made to the EUnit application.

            Eunit 2.10

            Fixed Bugs and Malfunctions

            • Fix so that when running tests in parallel and one test is cancelled due to a failing setup, it is report as cancelled. Before this fix the cancellation was ignored.

              Own Id: OTP-19630 Aux Id: PR-9794

            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

            Eunit 2.9.1

            Improvements and New Features

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

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

            Eunit 2.9

            Improvements and New Features

            • With this change, EUnit timetraps can be scaled with the use of scale_timeouts +

              This document describes the changes made to the EUnit application.

              Eunit 2.10

              Fixed Bugs and Malfunctions

              • Fix so that when running tests in parallel and one test is cancelled due to a failing setup, it is report as cancelled. Before this fix the cancellation was ignored.

                Own Id: OTP-19630 Aux Id: PR-9794

              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

              Eunit 2.9.1

              Improvements and New Features

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

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

              Eunit 2.9

              Improvements and New Features

              • With this change, EUnit timetraps can be scaled with the use of scale_timeouts option.

                Own Id: OTP-18771 Aux Id: PR-7635

              Eunit 2.8.2

              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, @@ -203,7 +203,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/search.html 2025-11-20 15:16:44.869999132 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/search.html 2025-11-20 15:16:44.873999155 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/ftp-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/ftp-1.2.4/doc/html/404.html 2025-11-20 15:16:44.897999298 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/404.html 2025-11-20 15:16:44.897999298 +0000 @@ -110,7 +110,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/ftp-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/ftp-1.2.4/doc/html/api-reference.html 2025-11-20 15:16:44.917999416 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/api-reference.html 2025-11-20 15:16:44.921999441 +0000 @@ -118,7 +118,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub/OEBPS/content.opf 2025-11-20 15:11:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub/OEBPS/content.opf 2041-12-23 04:30:03.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> ftp - 1.2.4 - urn:uuid:d6f4c63c-d320-f944-0957-c141b4844349 + urn:uuid:f2fb572a-2cb5-6976-18b7-84a47d58e526 en - 2025-11-20T15:11:50Z + 2041-12-23T04:30:03Z /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub/OEBPS/ftp_client.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub/OEBPS/ftp_client.xhtml 2025-11-20 15:11:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub/OEBPS/ftp_client.xhtml 2041-12-23 04:30:03.000000000 +0000 @@ -18,25 +18,25 @@

                Examples

                The following is a simple example of an FTP session, where the user guest with -password password logs on to the remote host erlang.org:

                      1> ftp:start().
                +password password logs on to the remote host erlang.org:

                      1> ftp:start().
                       ok
                -      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
                -      {ok,<0.22.0>}
                -      3> ftp:user(Pid, "guest", "password").
                +      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
                +      {ok,<0.22.0>}
                +      3> ftp:user(Pid, "guest", "password").
                       ok
                -      4> ftp:pwd(Pid).
                -      {ok, "/home/guest"}
                -      5> ftp:cd(Pid, "appl/examples").
                +      4> ftp:pwd(Pid).
                +      {ok, "/home/guest"}
                +      5> ftp:cd(Pid, "appl/examples").
                       ok
                -      6> ftp:lpwd(Pid).
                -      {ok, "/home/fred"}.
                -      7> ftp:lcd(Pid, "/home/eproj/examples").
                +      6> ftp:lpwd(Pid).
                +      {ok, "/home/fred"}.
                +      7> ftp:lcd(Pid, "/home/eproj/examples").
                       ok
                -      8> ftp:recv(Pid, "appl.erl").
                +      8> ftp:recv(Pid, "appl.erl").
                       ok
                -      9> ftp:close(Pid).
                +      9> ftp:close(Pid).
                       ok
                -      10> ftp:stop().
                +      10> ftp:stop().
                       ok

                The file appl.erl is transferred from the remote to the local host. When the session is opened, the current directory at the remote host is /home/guest, and /home/fred at the local host. Before transferring the file, the current /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html 2025-11-20 15:16:45.026000057 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html 2025-11-20 15:16:45.034000105 +0000 @@ -1880,7 +1880,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html 2025-11-20 15:16:45.054000225 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html 2025-11-20 15:16:45.058000248 +0000 @@ -90,25 +90,25 @@

                The following is a simple example of an FTP session, where the user guest with -password password logs on to the remote host erlang.org:

                      1> ftp:start().
                +password password logs on to the remote host erlang.org:

                      1> ftp:start().
                       ok
                -      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
                -      {ok,<0.22.0>}
                -      3> ftp:user(Pid, "guest", "password").
                +      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
                +      {ok,<0.22.0>}
                +      3> ftp:user(Pid, "guest", "password").
                       ok
                -      4> ftp:pwd(Pid).
                -      {ok, "/home/guest"}
                -      5> ftp:cd(Pid, "appl/examples").
                +      4> ftp:pwd(Pid).
                +      {ok, "/home/guest"}
                +      5> ftp:cd(Pid, "appl/examples").
                       ok
                -      6> ftp:lpwd(Pid).
                -      {ok, "/home/fred"}.
                -      7> ftp:lcd(Pid, "/home/eproj/examples").
                +      6> ftp:lpwd(Pid).
                +      {ok, "/home/fred"}.
                +      7> ftp:lcd(Pid, "/home/eproj/examples").
                       ok
                -      8> ftp:recv(Pid, "appl.erl").
                +      8> ftp:recv(Pid, "appl.erl").
                       ok
                -      9> ftp:close(Pid).
                +      9> ftp:close(Pid).
                       ok
                -      10> ftp:stop().
                +      10> ftp:stop().
                       ok

                The file appl.erl is transferred from the remote to the local host. When the session is opened, the current directory at the remote host is /home/guest, and /home/fred at the local host. Before transferring the file, the current @@ -156,7 +156,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/ftp-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/ftp-1.2.4/doc/html/introduction.html 2025-11-20 15:16:45.078000366 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/introduction.html 2025-11-20 15:16:45.082000391 +0000 @@ -146,7 +146,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/ftp-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/ftp-1.2.4/doc/html/notes.html 2025-11-20 15:16:45.106000533 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/notes.html 2025-11-20 15:16:45.110000557 +0000 @@ -160,7 +160,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/ftp-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/ftp-1.2.4/doc/html/search.html 2025-11-20 15:16:45.130000675 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/search.html 2025-11-20 15:16:45.130000675 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/404.html 2025-11-20 15:16:45.158000842 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/404.html 2025-11-20 15:16:45.158000842 +0000 @@ -110,7 +110,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/inets-9.4.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/inets-9.4.2/doc/html/api-reference.html 2025-11-20 15:16:45.178000961 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/api-reference.html 2025-11-20 15:16:45.182000985 +0000 @@ -210,7 +210,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_client.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_client.html 2025-11-20 15:16:45.206001128 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_client.html 2025-11-20 15:16:45.210001151 +0000 @@ -96,26 +96,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
                @@ -168,7 +168,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_server.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_server.html 2025-11-20 15:16:48.706021919 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_server.html 2025-11-20 15:16:48.702021896 +0000 @@ -99,40 +99,40 @@ server API, which is described in the Erlang Web Server API. This API can be used to enhance the core server functionality, for example with custom logging and authentication.

                The following is to be put in the Erlang node application configuration file to -start an HTTP server at application startup:

                [{inets, [{services, [{httpd, [{proplist_file,
                -           "/var/tmp/server_root/conf/8888_props.conf"}]},
                -          {httpd, [{proplist_file,
                -           "/var/tmp/server_root/conf/8080_props.conf"}]}]}]}].

                The server is configured using an Erlang property list. For the available -properties, see httpd.

                The available configuration properties are as follows:

                httpd_service() -> {httpd, httpd()}
                -httpd()         -> [httpd_config()]
                -httpd_config()  -> {proplist_file, file()}
                -                   {debug, debug()} |
                -                   {accept_timeout, integer()}
                -debug()         -> disable | [debug_options()]
                -debug_options() -> {all_functions, modules()} |
                -                   {exported_functions, modules()} |
                -                   {disable, modules()}
                -modules()       -> [atom()]

                Here:

                • {proplist_file, file()} - File containing an Erlang property list, +start an HTTP server at application startup:

                  [{inets, [{services, [{httpd, [{proplist_file,
                  +           "/var/tmp/server_root/conf/8888_props.conf"}]},
                  +          {httpd, [{proplist_file,
                  +           "/var/tmp/server_root/conf/8080_props.conf"}]}]}]}].

                  The server is configured using an Erlang property list. For the available +properties, see httpd.

                  The available configuration properties are as follows:

                  httpd_service() -> {httpd, httpd()}
                  +httpd()         -> [httpd_config()]
                  +httpd_config()  -> {proplist_file, file()}
                  +                   {debug, debug()} |
                  +                   {accept_timeout, integer()}
                  +debug()         -> disable | [debug_options()]
                  +debug_options() -> {all_functions, modules()} |
                  +                   {exported_functions, modules()} |
                  +                   {disable, modules()}
                  +modules()       -> [atom()]

                  Here:

                  • {proplist_file, file()} - File containing an Erlang property list, followed by a full stop, describing the HTTP server configuration.

                  • {debug, debug()} - Can enable trace on all functions or only exported functions on chosen modules.

                  • {accept_timeout, integer()} - Sets the wanted time-out value for the -server to set up a request connection.

                  Getting Started

                  Start Inets:

                  1> inets:start().
                  +server to set up a request connection.

                Getting Started

                Start Inets:

                1> inets:start().
                 ok

                Start an HTTP server with minimal required configuration. If you specify port 0, an arbitrary available port is used, and you can use function info to -find which port number that was picked:

                2> {ok, Pid} = inets:start(httpd, [{port, 0}, {server_root,"/tmp"},
                -.. {document_root,"/tmp/htdocs"}, {bind_address, "localhost"}]).
                -{ok, 0.79.0}

                Call info:

                3> httpd:info(Pid).
                -[{mime_types,[{"html","text/html"},{"htm","text/html"}]},
                - {server_name,"machine.local"},
                - {bind_address, {127,0,0,1}},
                - {server_root,"/tmp"},
                - {port,59408},
                - {document_root,"/tmp/htdocs"},
                - {ipfamily,inet}]

                Reload the configuration without restarting the server:

                4> httpd:reload_config([{port, 59408},
                -.. {server_root,"/tmp/www_test"}, {document_root,"/tmp/www_test/htdocs"},
                -.. {bind_address, "localhost"}], non_disturbing).
                +find which port number that was picked:

                2> {ok, Pid} = inets:start(httpd, [{port, 0}, {server_root,"/tmp"},
                +.. {document_root,"/tmp/htdocs"}, {bind_address, "localhost"}]).
                +{ok, 0.79.0}

                Call info:

                3> httpd:info(Pid).
                +[{mime_types,[{"html","text/html"},{"htm","text/html"}]},
                + {server_name,"machine.local"},
                + {bind_address, {127,0,0,1}},
                + {server_root,"/tmp"},
                + {port,59408},
                + {document_root,"/tmp/htdocs"},
                + {ipfamily,inet}]

                Reload the configuration without restarting the server:

                4> httpd:reload_config([{port, 59408},
                +.. {server_root,"/tmp/www_test"}, {document_root,"/tmp/www_test/htdocs"},
                +.. {bind_address, "localhost"}], non_disturbing).
                 ok.

                Note

                port and bind_address cannot be changed. Clients trying to access the -server during the reload get a service temporary unavailable answer.

                5> httpd:info(Pid, [server_root, document_root]).
                -[{server_root,"/tmp/www_test"},{document_root,"/tmp/www_test/htdocs"}]
                6> ok = inets:stop(httpd, Pid).

                Alternative:

                6> ok = inets:stop(httpd, {{127,0,0,1}, 59408}).

                Notice that bind_address must be the IP address reported by function info +server during the reload get a service temporary unavailable answer.

        5> httpd:info(Pid, [server_root, document_root]).
        +[{server_root,"/tmp/www_test"},{document_root,"/tmp/www_test/htdocs"}]
        6> ok = inets:stop(httpd, Pid).

        Alternative:

        6> ok = inets:stop(httpd, {{127,0,0,1}, 59408}).

        Notice that bind_address must be the IP address reported by function info and cannot be the hostname that is allowed when putting in bind_address.

        Dynamic Web Pages

        Inets HTTP server provides two ways of creating dynamic web pages, each with its own advantages and disadvantages:

        • CGI scripts - Common Gateway Interface (CGI) scripts can be written in any programming language. CGI scripts are standardized and supported by most @@ -197,28 +197,28 @@ first_start/0 is to be used the first time. It creates the schema and the tables. start/0 is to be used in consecutive startups. start/0 starts Mnesia and waits for the tables to be initiated. This function must only be used when -the schema and the tables are already created.

          -module(mnesia_test).
          --export([start/0,load_data/0]).
          --include_lib("mod_auth.hrl").
          -
          -first_start() ->
          -    mnesia:create_schema([node()]),
          -    mnesia:start(),
          -    mnesia:create_table(httpd_user,
          -                        [{type, bag},
          -                         {disc_copies, [node()]},
          -                         {attributes, record_info(fields,
          -                                                  httpd_user)}]),
          -    mnesia:create_table(httpd_group,
          -                        [{type, bag},
          -                         {disc_copies, [node()]},
          -                         {attributes, record_info(fields,
          -                                                  httpd_group)}]),
          -    mnesia:wait_for_tables([httpd_user, httpd_group], 60000).
          -
          -start() ->
          -    mnesia:start(),
          -    mnesia:wait_for_tables([httpd_user, httpd_group], 60000).

          To create the Mnesia tables, we use two records defined in mod_auth.hrl, so +the schema and the tables are already created.

          -module(mnesia_test).
          +-export([start/0,load_data/0]).
          +-include_lib("mod_auth.hrl").
          +
          +first_start() ->
          +    mnesia:create_schema([node()]),
          +    mnesia:start(),
          +    mnesia:create_table(httpd_user,
          +                        [{type, bag},
          +                         {disc_copies, [node()]},
          +                         {attributes, record_info(fields,
          +                                                  httpd_user)}]),
          +    mnesia:create_table(httpd_group,
          +                        [{type, bag},
          +                         {disc_copies, [node()]},
          +                         {attributes, record_info(fields,
          +                                                  httpd_group)}]),
          +    mnesia:wait_for_tables([httpd_user, httpd_group], 60000).
          +
          +start() ->
          +    mnesia:start(),
          +    mnesia:wait_for_tables([httpd_user, httpd_group], 60000).

          To create the Mnesia tables, we use two records defined in mod_auth.hrl, so that file must be included. first_start/0 creates a schema that specifies on which nodes the database is to reside. Then it starts Mnesia and creates the tables. The first argument is the name of the tables, the second argument is a @@ -306,7 +306,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_uri.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_uri.html 2025-11-20 15:16:48.730022062 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_uri.html 2025-11-20 15:16:48.734022087 +0000 @@ -244,7 +244,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpc.html 2025-11-20 15:16:48.774022323 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpc.html 2025-11-20 15:16:48.766022276 +0000 @@ -1020,13 +1020,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.

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

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/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.4.2/doc/html/httpd.html 2025-11-20 15:16:48.818022585 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd.html 2025-11-20 15:16:48.822022610 +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 @@ -1239,7 +1239,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/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.4.2/doc/html/httpd_custom_api.html 2025-11-20 15:16:48.850022776 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_custom_api.html 2025-11-20 15:16:48.846022751 +0000 @@ -284,7 +284,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/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.4.2/doc/html/httpd_socket.html 2025-11-20 15:16:48.878022942 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_socket.html 2025-11-20 15:16:48.882022965 +0000 @@ -280,7 +280,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/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.4.2/doc/html/httpd_util.html 2025-11-20 15:16:48.918023179 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_util.html 2025-11-20 15:16:48.918023179 +0000 @@ -948,7 +948,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/content.opf 2025-11-20 15:10:35.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/content.opf 2041-12-23 04:28:55.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> inets - 9.4.2 - urn:uuid:cf10bc61-dac4-dace-6d78-87893807ec5d + urn:uuid:969f23a7-9431-d66d-97b3-2bc9e764c734 en - 2025-11-20T15:10:35Z + 2041-12-23T04:28:55Z /usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/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.4.2/doc/html/inets.epub/OEBPS/http_client.xhtml 2025-11-20 15:10:35.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/http_client.xhtml 2041-12-23 04:28:55.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.4.2/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.4.2/doc/html/inets.epub/OEBPS/httpc.xhtml 2025-11-20 15:10:35.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/httpc.xhtml 2041-12-23 04:28:55.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.4.2/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.4.2/doc/html/inets.epub/OEBPS/httpd.xhtml 2025-11-20 15:10:35.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/httpd.xhtml 2041-12-23 04:28:55.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.4.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.4.1/doc/html/gen_tcp.html	2025-11-20 15:16:52.290043211 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_tcp.html	2025-11-20 15:16:52.294043236 +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 @@ -1230,7 +1230,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/gen_udp.html 2025-11-20 15:16:52.326043425 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_udp.html 2025-11-20 15:16:52.330043450 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/global.html 2025-11-20 15:16:52.358043616 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global.html 2025-11-20 15:16:52.362043639 +0000 @@ -1257,7 +1257,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/global_group.html 2025-11-20 15:16:52.390043805 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global_group.html 2025-11-20 15:16:52.394043830 +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.4.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.4.1/doc/html/kernel.epub/OEBPS/socket.xhtml	2025-11-20 15:10:18.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/socket.xhtml	2041-12-23 04:28:43.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).
    @@ -4760,7 +4760,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),
           :
    @@ -4924,7 +4924,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),
    @@ -4955,7 +4955,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),
    @@ -5052,7 +5052,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.4.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.4.1/doc/html/kernel.epub/OEBPS/trace.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/trace.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel_app.html 2025-11-20 15:16:53.178048488 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel_app.html 2025-11-20 15:16:53.182048511 +0000 @@ -363,7 +363,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/logger.html 2025-11-20 15:16:53.234048820 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger.html 2025-11-20 15:16:53.238048844 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/logger_chapter.html 2025-11-20 15:16:53.282049106 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_chapter.html 2025-11-20 15:16:53.286049128 +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.4.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.4.1/doc/html/logger_cookbook.html	2025-11-20 15:16:53.318049319 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_cookbook.html	2025-11-20 15:16:53.322049342 +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.4.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.4.1/doc/html/logger_disk_log_h.html	2025-11-20 15:16:53.346049486 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_disk_log_h.html	2025-11-20 15:16:53.350049509 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/logger_filters.html 2025-11-20 15:16:53.374049651 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_filters.html 2025-11-20 15:16:53.378049676 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/logger_formatter.html 2025-11-20 15:16:53.402049818 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_formatter.html 2025-11-20 15:16:53.410049865 +0000 @@ -584,7 +584,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/logger_handler.html 2025-11-20 15:16:53.438050031 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_handler.html 2025-11-20 15:16:53.434050008 +0000 @@ -559,7 +559,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/logger_std_h.html 2025-11-20 15:16:53.466050199 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_std_h.html 2025-11-20 15:16:53.466050199 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/net.html 2025-11-20 15:16:53.494050365 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net.html 2025-11-20 15:16:53.498050388 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/net_adm.html 2025-11-20 15:16:53.526050554 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_adm.html 2025-11-20 15:16:53.534050602 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/net_kernel.html 2025-11-20 15:16:53.566050793 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_kernel.html 2025-11-20 15:16:53.570050816 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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/kernel-10.4.1/doc/html/notes.html 2025-11-20 15:16:53.638051220 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/notes.html 2025-11-20 15:16:53.634051197 +0000 @@ -90,9 +90,9 @@

    This document describes the changes made to the Kernel application.

    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.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.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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/os.html 2025-11-20 15:16:53.686051506 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/os.html 2025-11-20 15:16:53.678051458 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/pg.html 2025-11-20 15:16:53.710051647 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/pg.html 2025-11-20 15:16:53.714051672 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/rpc.html 2025-11-20 15:16:53.754051909 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/rpc.html 2025-11-20 15:16:53.746051861 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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/kernel-10.4.1/doc/html/search.html 2025-11-20 15:16:53.770052004 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/search.html 2025-11-20 15:16:53.770052004 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/seq_trace.html 2025-11-20 15:16:53.798052170 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/seq_trace.html 2025-11-20 15:16:53.802052195 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/socket.html 2025-11-20 15:16:53.890052718 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket.html 2025-11-20 15:16:53.890052718 +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).
    @@ -4847,7 +4847,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),
           :
    @@ -5011,7 +5011,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),
    @@ -5042,7 +5042,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),
    @@ -5139,7 +5139,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.

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

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/socket_usage.html 2025-11-20 15:16:53.938053002 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket_usage.html 2025-11-20 15:16:53.938053002 +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.4.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.4.1/doc/html/trace.html	2025-11-20 15:16:53.990053311 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/trace.html	2025-11-20 15:16:53.986053288 +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="5409273455-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="6721102421-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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.4.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.4.1/doc/html/wrap_log_reader.html 2025-11-20 15:16:54.018053477 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/wrap_log_reader.html 2025-11-20 15:16:54.018053477 +0000 @@ -509,7 +509,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/404.html 2025-11-20 15:16:54.042053620 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/404.html 2025-11-20 15:16:54.042053620 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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/megaco-4.8.1/doc/html/api-reference.html 2025-11-20 15:16:54.062053739 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/api-reference.html 2025-11-20 15:16:54.066053763 +0000 @@ -235,7 +235,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco.epub/OEBPS/content.opf 2025-11-20 15:11:41.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/content.opf 2041-12-23 04:29:54.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> megaco - 4.8.1 - urn:uuid:1ab08946-c361-92e6-0957-dc4a9b5fd944 + urn:uuid:8c010f36-7f27-0b1d-b826-c46ae235b9b4 en - 2025-11-20T15:11:41Z + 2041-12-23T04:29:54Z /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2025-11-20 15:11:41.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2041-12-23 04:29:54.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.1/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.1/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2025-11-20 15:11:41.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2041-12-23 04:29:54.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.1/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.1/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2025-11-20 15:11:41.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2041-12-23 04:29:54.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.1/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.1/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2025-11-20 15:11:41.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2041-12-23 04:29:54.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.1/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.1/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2025-11-20 15:11:41.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2041-12-23 04:29:54.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.1/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.1/doc/html/megaco.epub/OEBPS/megaco.xhtml 2025-11-20 15:11:41.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco.xhtml 2041-12-23 04:29:54.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.1/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.1/doc/html/megaco.html 2025-11-20 15:16:54.302055165 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.html 2025-11-20 15:16:54.306055188 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_architecture.html 2025-11-20 15:16:54.330055332 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_architecture.html 2025-11-20 15:16:54.330055332 +0000 @@ -326,7 +326,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_codec_meas.html 2025-11-20 15:16:54.354055474 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_meas.html 2025-11-20 15:16:54.358055498 +0000 @@ -225,7 +225,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_codec_mstone1.html 2025-11-20 15:16:54.382055641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone1.html 2025-11-20 15:16:54.386055664 +0000 @@ -608,7 +608,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_codec_mstone2.html 2025-11-20 15:16:54.402055759 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone2.html 2025-11-20 15:16:54.406055782 +0000 @@ -226,7 +226,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_codec_transform.html 2025-11-20 15:16:54.430055925 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_transform.html 2025-11-20 15:16:54.434055950 +0000 @@ -226,7 +226,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_debug.html 2025-11-20 15:16:54.458056091 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_debug.html 2025-11-20 15:16:54.462056116 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_digit_map.html 2025-11-20 15:16:54.482056234 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_digit_map.html 2025-11-20 15:16:54.486056259 +0000 @@ -467,7 +467,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_edist_compress.html 2025-11-20 15:16:54.510056400 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_edist_compress.html 2025-11-20 15:16:54.514056425 +0000 @@ -246,7 +246,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_encode.html 2025-11-20 15:16:54.534056544 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encode.html 2025-11-20 15:16:54.538056566 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_encoder.html 2025-11-20 15:16:54.566056734 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encoder.html 2025-11-20 15:16:54.566056734 +0000 @@ -1363,7 +1363,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_examples.html 2025-11-20 15:16:54.590056875 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_examples.html 2025-11-20 15:16:54.590056875 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_flex_scanner.html 2025-11-20 15:16:54.614057018 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_flex_scanner.html 2025-11-20 15:16:54.614057018 +0000 @@ -416,7 +416,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_intro.html 2025-11-20 15:16:54.634057137 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_intro.html 2025-11-20 15:16:54.638057162 +0000 @@ -155,7 +155,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_mib.html 2025-11-20 15:16:54.658057280 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_mib.html 2025-11-20 15:16:54.654057257 +0000 @@ -153,7 +153,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_performance.html 2025-11-20 15:16:54.678057398 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_performance.html 2025-11-20 15:16:54.678057398 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_run.html 2025-11-20 15:16:54.702057541 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_run.html 2025-11-20 15:16:54.702057541 +0000 @@ -322,7 +322,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_sdp.html 2025-11-20 15:16:54.738057755 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_sdp.html 2025-11-20 15:16:54.738057755 +0000 @@ -1199,7 +1199,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_tcp.html 2025-11-20 15:16:54.766057921 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_tcp.html 2025-11-20 15:16:54.770057946 +0000 @@ -826,7 +826,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_transport.html 2025-11-20 15:16:54.786058041 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport.html 2025-11-20 15:16:54.790058064 +0000 @@ -299,7 +299,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_transport_mechanisms.html 2025-11-20 15:16:54.814058207 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport_mechanisms.html 2025-11-20 15:16:54.814058207 +0000 @@ -144,7 +144,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_udp.html 2025-11-20 15:16:54.838058350 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_udp.html 2025-11-20 15:16:54.842058373 +0000 @@ -862,7 +862,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/megaco_user.html 2025-11-20 15:16:54.874058564 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_user.html 2025-11-20 15:16:54.878058587 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/notes.html 2025-11-20 15:16:54.906058753 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/notes.html 2025-11-20 15:16:54.914058800 +0000 @@ -214,7 +214,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/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.1/doc/html/search.html 2025-11-20 15:16:54.930058896 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/search.html 2025-11-20 15:16:54.930058896 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/404.html 2025-11-20 15:16:54.950059014 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/404.html 2025-11-20 15:16:54.954059039 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.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/mnesia-4.24.1/doc/html/api-reference.html 2025-11-20 15:16:54.974059158 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/api-reference.html 2025-11-20 15:16:54.978059180 +0000 @@ -136,7 +136,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/content.opf 2025-11-20 15:11:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/content.opf 2041-12-23 04:29:34.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> mnesia - 4.24.1 - urn:uuid:c5c1f065-e4a0-9e94-cd00-767c8f987436 + urn:uuid:e262dc36-b3b2-57e1-9029-3e675d831ae0 en - 2025-11-20T15:11:19Z + 2041-12-23T04:29:34Z /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2025-11-20 15:11:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2025-11-20 15:11:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2025-11-20 15:11:19.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2025-11-20 15:11:19.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml	2025-11-20 15:11:19.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml	2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2025-11-20 15:11:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2025-11-20 15:11:19.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2025-11-20 15:11:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2025-11-20 15:11:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2025-11-20 15:11:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2041-12-23 04:29:34.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.24.1/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.24.1/doc/html/mnesia.epub/OEBPS/notes.xhtml 2025-11-20 15:11:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/notes.xhtml 2041-12-23 04:29:34.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.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

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

        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.24.1/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.24.1/doc/html/mnesia.html 2025-11-20 15:16:55.290061035 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.html 2025-11-20 15:16:55.294061058 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/mnesia_app_a.html 2025-11-20 15:16:55.326061249 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_a.html 2025-11-20 15:16:55.330061272 +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.24.1/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.24.1/doc/html/mnesia_app_b.html 2025-11-20 15:16:55.354061414 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_b.html 2025-11-20 15:16:55.354061414 +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.24.1/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.24.1/doc/html/mnesia_app_c.html	2025-11-20 15:16:55.378061558 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_c.html	2025-11-20 15:16:55.382061581 +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.24.1/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.24.1/doc/html/mnesia_chap1.html	2025-11-20 15:16:55.398061676 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap1.html	2025-11-20 15:16:55.402061701 +0000
      @@ -166,7 +166,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/mnesia_chap2.html 2025-11-20 15:16:55.430061867 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap2.html 2025-11-20 15:16:55.434061890 +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.24.1/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.24.1/doc/html/mnesia_chap3.html	2025-11-20 15:16:55.458062033 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap3.html	2025-11-20 15:16:55.462062056 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/mnesia_chap4.html 2025-11-20 15:16:55.494062246 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap4.html 2025-11-20 15:16:55.494062246 +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.24.1/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.24.1/doc/html/mnesia_chap5.html	2025-11-20 15:16:55.534062485 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap5.html	2025-11-20 15:16:55.538062508 +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.24.1/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.24.1/doc/html/mnesia_chap7.html 2025-11-20 15:16:55.574062721 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap7.html 2025-11-20 15:16:55.570062699 +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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/mnesia_chap8.html 2025-11-20 15:16:55.602062888 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap8.html 2025-11-20 15:16:55.602062888 +0000 @@ -150,7 +150,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/mnesia_frag_hash.html 2025-11-20 15:16:55.626063030 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_frag_hash.html 2025-11-20 15:16:55.626063030 +0000 @@ -378,7 +378,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/mnesia_overview.html 2025-11-20 15:16:55.646063149 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_overview.html 2025-11-20 15:16:55.646063149 +0000 @@ -184,7 +184,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/mnesia_registry.html 2025-11-20 15:16:55.666063269 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_registry.html 2025-11-20 15:16:55.670063292 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/notes.html 2025-11-20 15:16:55.706063506 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/notes.html 2025-11-20 15:16:55.706063506 +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.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

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

          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-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/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.24.1/doc/html/search.html 2025-11-20 15:16:55.730063649 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/search.html 2025-11-20 15:16:55.734063672 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/404.html 2025-11-20 15:16:55.758063815 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/404.html 2025-11-20 15:16:55.758063815 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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/observer-2.18.1/doc/html/api-reference.html 2025-11-20 15:16:55.778063933 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/api-reference.html 2025-11-20 15:16:55.782063958 +0000 @@ -146,7 +146,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/cdv_cmd.html 2025-11-20 15:16:55.802064076 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/cdv_cmd.html 2025-11-20 15:16:55.802064076 +0000 @@ -135,7 +135,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/crashdump_ug.html 2025-11-20 15:16:55.826064219 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_ug.html 2025-11-20 15:16:55.826064219 +0000 @@ -240,7 +240,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/crashdump_viewer.html 2025-11-20 15:16:55.854064386 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_viewer.html 2025-11-20 15:16:55.858064408 +0000 @@ -268,7 +268,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/etop.html 2025-11-20 15:16:55.882064551 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop.html 2025-11-20 15:16:55.886064576 +0000 @@ -400,7 +400,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/etop_ug.html 2025-11-20 15:16:55.910064717 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop_ug.html 2025-11-20 15:16:55.914064742 +0000 @@ -202,7 +202,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/introduction_ug.html 2025-11-20 15:16:55.938064885 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/introduction_ug.html 2025-11-20 15:16:55.938064885 +0000 @@ -142,7 +142,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/notes.html 2025-11-20 15:16:55.966065051 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/notes.html 2025-11-20 15:16:55.970065074 +0000 @@ -323,7 +323,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/observer.epub/OEBPS/content.opf 2025-11-20 15:11:34.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub/OEBPS/content.opf 2041-12-23 04:29:47.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> observer - 2.18.1 - urn:uuid:b2a03bf9-de23-824c-6276-721f7d698eac + urn:uuid:51a8f011-a742-ec1d-cc20-55e947897a57 en - 2025-11-20T15:11:34Z + 2041-12-23T04:29:47Z /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/observer.epub/OEBPS/ttb_ug.xhtml 2025-11-20 15:11:34.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub/OEBPS/ttb_ug.xhtml 2041-12-23 04:29:47.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.1/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.1/doc/html/observer.epub/OEBPS/ttb.xhtml 2025-11-20 15:11:34.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub/OEBPS/ttb.xhtml 2041-12-23 04:29:47.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.1/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.1/doc/html/observer.html 2025-11-20 15:16:56.114065931 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.html 2025-11-20 15:16:56.114065931 +0000 @@ -356,7 +356,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/observer_app.html 2025-11-20 15:16:56.134066049 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_app.html 2025-11-20 15:16:56.138066072 +0000 @@ -133,7 +133,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/observer_ug.html 2025-11-20 15:16:56.170066263 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_ug.html 2025-11-20 15:16:56.170066263 +0000 @@ -234,7 +234,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/search.html 2025-11-20 15:16:56.190066381 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/search.html 2025-11-20 15:16:56.190066381 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/ttb.html 2025-11-20 15:16:56.222066572 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb.html 2025-11-20 15:16:56.230066620 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/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.1/doc/html/ttb_ug.html 2025-11-20 15:16:56.274066881 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb_ug.html 2025-11-20 15:16:56.278066904 +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/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/doc/html/404.html 2025-11-20 15:16:56.298067024 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/404.html 2025-11-20 15:16:56.298067024 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-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/odbc-2.16/doc/html/api-reference.html 2025-11-20 15:16:56.318067142 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/api-reference.html 2025-11-20 15:16:56.322067165 +0000 @@ -118,7 +118,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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/doc/html/databases.html 2025-11-20 15:16:56.342067285 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/databases.html 2025-11-20 15:16:56.342067285 +0000 @@ -195,7 +195,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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/doc/html/error_handling.html 2025-11-20 15:16:56.362067404 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/error_handling.html 2025-11-20 15:16:56.366067427 +0000 @@ -200,7 +200,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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/doc/html/getting_started.html 2025-11-20 15:16:56.390067570 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/getting_started.html 2025-11-20 15:16:56.390067570 +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="4110894374-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="3842688919-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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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/doc/html/introduction.html 2025-11-20 15:16:56.410067688 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/introduction.html 2025-11-20 15:16:56.410067688 +0000 @@ -154,7 +154,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-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/odbc-2.16/doc/html/notes.html 2025-11-20 15:16:56.450067927 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/notes.html 2025-11-20 15:16:56.442067879 +0000 @@ -256,7 +256,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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/doc/html/odbc.epub/OEBPS/content.opf 2025-11-20 15:11:35.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.epub/OEBPS/content.opf 2041-12-23 04:29:48.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> odbc - 2.16 - urn:uuid:fe0ee78b-ae66-2238-cdb2-732334cd7986 + urn:uuid:ea9a22c6-9c98-ba4e-46fa-bcdbced56589 en - 2025-11-20T15:11:35Z + 2041-12-23T04:29:48Z /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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/doc/html/odbc.epub/OEBPS/getting_started.xhtml 2025-11-20 15:11:35.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.epub/OEBPS/getting_started.xhtml 2041-12-23 04:29:48.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/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/doc/html/odbc.html	2025-11-20 15:16:56.566068616 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.html	2025-11-20 15:16:56.574068663 +0000
      @@ -1800,7 +1800,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-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/odbc-2.16/doc/html/search.html 2025-11-20 15:16:56.598068806 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/search.html 2025-11-20 15:16:56.598068806 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/404.html 2025-11-20 15:16:56.618068925 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/404.html 2025-11-20 15:16:56.618068925 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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/os_mon-2.11.1/doc/html/api-reference.html 2025-11-20 15:16:56.642069067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/api-reference.html 2025-11-20 15:16:56.642069067 +0000 @@ -154,7 +154,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/cpu_sup.html 2025-11-20 15:16:56.666069209 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/cpu_sup.html 2025-11-20 15:16:56.666069209 +0000 @@ -604,7 +604,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/disksup.html 2025-11-20 15:16:56.690069352 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/disksup.html 2025-11-20 15:16:56.694069376 +0000 @@ -528,7 +528,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/memsup.html 2025-11-20 15:16:56.718069518 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/memsup.html 2025-11-20 15:16:56.722069543 +0000 @@ -652,7 +652,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/notes.html 2025-11-20 15:16:56.754069732 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/notes.html 2025-11-20 15:16:56.758069756 +0000 @@ -248,7 +248,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/nteventlog.html 2025-11-20 15:16:56.778069874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/nteventlog.html 2025-11-20 15:16:56.782069899 +0000 @@ -300,7 +300,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/os_mon.epub/OEBPS/content.opf 2025-11-20 15:11:24.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon.epub/OEBPS/content.opf 2041-12-23 04:29:38.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> os_mon - 2.11.1 - urn:uuid:7c38abe5-8542-6ae3-305e-ab553f2842a9 + urn:uuid:2d95ec44-4e57-d48c-3f67-5dddb302c17c en - 2025-11-20T15:11:24Z + 2041-12-23T04:29:38Z /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/os_mon_app.html 2025-11-20 15:16:56.874070445 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon_app.html 2025-11-20 15:16:56.874070445 +0000 @@ -145,7 +145,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/os_sup.html 2025-11-20 15:16:56.894070563 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_sup.html 2025-11-20 15:16:56.894070563 +0000 @@ -363,7 +363,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/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.1/doc/html/search.html 2025-11-20 15:16:56.918070706 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/search.html 2025-11-20 15:16:56.918070706 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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/doc/html/404.html 2025-11-20 15:16:56.942070850 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/404.html 2025-11-20 15:16:56.942070850 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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/doc/html/api-reference.html 2025-11-20 15:16:56.958070945 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/api-reference.html 2025-11-20 15:16:56.958070945 +0000 @@ -127,7 +127,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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/doc/html/leex.html 2025-11-20 15:16:56.982071086 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/leex.html 2025-11-20 15:16:56.982071086 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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/doc/html/notes.html 2025-11-20 15:16:57.006071229 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/notes.html 2025-11-20 15:16:57.014071277 +0000 @@ -89,9 +89,9 @@ -

      This document describes the changes made to the Parsetools application.

      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

        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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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/doc/html/parsetools.epub/OEBPS/content.opf 2025-11-20 15:10:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub/OEBPS/content.opf 2041-12-23 04:28:56.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> parsetools - 2.7 - urn:uuid:4efebbce-e2a4-d419-252e-f126d1a548f8 + urn:uuid:dbc5fb5f-4768-0dcc-006d-577a2a368a12 en - 2025-11-20T15:10:37Z + 2041-12-23T04:28:56Z /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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/doc/html/parsetools.epub/OEBPS/leex.xhtml 2025-11-20 15:10:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub/OEBPS/leex.xhtml 2041-12-23 04:28:56.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/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/doc/html/parsetools.epub/OEBPS/notes.xhtml 2025-11-20 15:10:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub/OEBPS/notes.xhtml 2041-12-23 04:28:56.000000000 +0000 @@ -17,9 +17,9 @@

          Parsetools Release Notes

          -

          This document describes the changes made to the Parsetools application.

          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

            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/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/doc/html/parsetools.epub/OEBPS/yecc.xhtml 2025-11-20 15:10:37.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub/OEBPS/yecc.xhtml 2041-12-23 04:28:56.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/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/doc/html/search.html 2025-11-20 15:16:57.130071966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/search.html 2025-11-20 15:16:57.130071966 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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/doc/html/yecc.html 2025-11-20 15:16:57.162072157 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/yecc.html 2025-11-20 15:16:57.166072179 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/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.18.3/doc/html/404.html 2025-11-20 15:16:57.190072323 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/404.html 2025-11-20 15:16:57.190072323 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.18.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/public_key-1.18.3/doc/html/api-reference.html 2025-11-20 15:16:57.210072441 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/api-reference.html 2025-11-20 15:16:57.210072441 +0000 @@ -118,7 +118,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/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.18.3/doc/html/notes.html 2025-11-20 15:16:57.242072632 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/notes.html 2025-11-20 15:16:57.250072679 +0000 @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/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.18.3/doc/html/public_key.epub/OEBPS/content.opf 2025-11-20 15:11:28.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub/OEBPS/content.opf 2041-12-23 04:29:42.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> public_key - 1.18.3 - urn:uuid:e3b36445-966b-6e02-2ce9-dd0d136834ff + urn:uuid:079b978c-5845-55f1-b1de-58ae83ffc880 en - 2025-11-20T15:11:28Z + 2041-12-23T04:29:42Z /usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/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.18.3/doc/html/public_key.epub/OEBPS/public_key_records.xhtml 2025-11-20 15:11:28.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub/OEBPS/public_key_records.xhtml 2041-12-23 04:29:42.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.18.3/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.18.3/doc/html/public_key.epub/OEBPS/public_key.xhtml	2025-11-20 15:11:28.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub/OEBPS/public_key.xhtml	2041-12-23 04:29:42.000000000 +0000
    @@ -2686,22 +2686,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 @@ -2873,9 +2873,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 @@ -3070,14 +3070,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.

    @@ -4257,18 +4257,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.18.3/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.18.3/doc/html/public_key.epub/OEBPS/using_public_key.xhtml 2025-11-20 15:11:28.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub/OEBPS/using_public_key.xhtml 2041-12-23 04:29:42.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.18.3/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.18.3/doc/html/public_key.html	2025-11-20 15:16:57.414073653 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.html	2025-11-20 15:16:57.410073630 +0000
    @@ -2808,22 +2808,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 @@ -2995,9 +2995,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 @@ -3197,14 +3197,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.

            @@ -4409,18 +4409,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.

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

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/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.18.3/doc/html/public_key_app.html 2025-11-20 15:16:57.434073773 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_app.html 2025-11-20 15:16:57.438073795 +0000 @@ -156,7 +156,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/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.18.3/doc/html/public_key_records.html 2025-11-20 15:16:57.462073939 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_records.html 2025-11-20 15:16:57.466073962 +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.18.3/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.18.3/doc/html/search.html	2025-11-20 15:16:57.482074057 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/search.html	2025-11-20 15:16:57.482074057 +0000
          @@ -108,7 +108,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/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.18.3/doc/html/using_public_key.html 2025-11-20 15:16:57.514074248 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/using_public_key.html 2025-11-20 15:16:57.514074248 +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.2/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.2/doc/html/404.html	2025-11-20 15:16:57.534074366 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/404.html	2025-11-20 15:16:57.534074366 +0000
          @@ -110,7 +110,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.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/reltool-1.0.2/doc/html/api-reference.html 2025-11-20 15:16:57.558074509 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/api-reference.html 2025-11-20 15:16:57.558074509 +0000 @@ -118,7 +118,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/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.2/doc/html/notes.html 2025-11-20 15:16:57.578074627 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/notes.html 2025-11-20 15:16:57.578074627 +0000 @@ -282,7 +282,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/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.2/doc/html/reltool.epub/OEBPS/content.opf 2025-11-20 15:11:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.epub/OEBPS/content.opf 2041-12-23 04:29:32.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> reltool - 1.0.2 - urn:uuid:f077ae42-1e33-0da9-d975-a87859869d1e + urn:uuid:4f7dddc7-3874-633c-fae8-0a96ff944205 en - 2025-11-20T15:11:16Z + 2041-12-23T04:29:32Z /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/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.2/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml 2025-11-20 15:11:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml 2041-12-23 04:29:32.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.2/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.2/doc/html/reltool.html	2025-11-20 15:16:57.710075411 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.html	2025-11-20 15:16:57.706075389 +0000
          @@ -2846,7 +2846,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/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.2/doc/html/reltool_examples.html 2025-11-20 15:16:57.754075673 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_examples.html 2025-11-20 15:16:57.758075698 +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.2/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.2/doc/html/reltool_intro.html	2025-11-20 15:16:57.790075887 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_intro.html	2025-11-20 15:16:57.790075887 +0000
          @@ -153,7 +153,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/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.2/doc/html/reltool_usage.html 2025-11-20 15:16:57.814076030 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_usage.html 2025-11-20 15:16:57.814076030 +0000 @@ -251,7 +251,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/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.2/doc/html/search.html 2025-11-20 15:16:57.838076173 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/search.html 2025-11-20 15:16:57.838076173 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/404.html 2025-11-20 15:16:57.854076268 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/404.html 2025-11-20 15:16:57.858076291 +0000 @@ -110,7 +110,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.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/runtime_tools-2.3/doc/html/api-reference.html 2025-11-20 15:16:57.882076434 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/api-reference.html 2025-11-20 15:16:57.882076434 +0000 @@ -163,7 +163,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/dbg.html 2025-11-20 15:16:57.934076743 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg.html 2025-11-20 15:16:57.930076718 +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/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/doc/html/dbg_guide.html 2025-11-20 15:16:57.982077027 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg_guide.html 2025-11-20 15:16:57.986077052 +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/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/doc/html/dtrace.html 2025-11-20 15:16:58.014077218 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dtrace.html 2025-11-20 15:16:58.014077218 +0000 @@ -156,7 +156,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/dyntrace.html 2025-11-20 15:16:58.042077385 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dyntrace.html 2025-11-20 15:16:58.046077408 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/instrument.html 2025-11-20 15:16:58.082077621 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/instrument.html 2025-11-20 15:16:58.078077598 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/lttng.html 2025-11-20 15:16:58.110077789 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/lttng.html 2025-11-20 15:16:58.118077836 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/msacc.html 2025-11-20 15:16:58.158078073 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/msacc.html 2025-11-20 15:16:58.158078073 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/notes.html 2025-11-20 15:16:58.190078264 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/notes.html 2025-11-20 15:16:58.198078312 +0000 @@ -89,9 +89,9 @@ -

      This document describes the changes made to the Runtime_Tools application.

      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

        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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/runtime_tools.epub/OEBPS/content.opf 2025-11-20 15:10:31.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/content.opf 2041-12-23 04:28:53.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> runtime_tools - 2.3 - urn:uuid:3b5073bb-7439-b30a-b56f-2b3297681b60 + urn:uuid:81bab532-2757-87fc-defa-34abc5d5569c en - 2025-11-20T15:10:31Z + 2041-12-23T04:28:53Z /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/runtime_tools.epub/OEBPS/dbg_guide.xhtml 2025-11-20 15:10:31.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/dbg_guide.xhtml 2041-12-23 04:28:53.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/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/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml 2025-11-20 15:10:31.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml 2041-12-23 04:28:53.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/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/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml 2025-11-20 15:10:31.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml 2041-12-23 04:28:53.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/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/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml 2025-11-20 15:10:31.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml 2041-12-23 04:28:53.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/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/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml 2025-11-20 15:10:31.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml 2041-12-23 04:28:53.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/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/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml	2025-11-20 15:10:31.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml	2041-12-23 04:28:53.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/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/doc/html/runtime_tools.epub/OEBPS/notes.xhtml 2025-11-20 15:10:31.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/notes.xhtml 2041-12-23 04:28:53.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

      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

        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/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/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml	2025-11-20 15:10:31.000000000 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml	2041-12-23 04:28:53.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/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/doc/html/runtime_tools_app.html 2025-11-20 15:16:58.406079546 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools_app.html 2025-11-20 15:16:58.406079546 +0000 @@ -133,7 +133,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/scheduler.html 2025-11-20 15:16:58.434079714 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/scheduler.html 2025-11-20 15:16:58.438079737 +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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/search.html 2025-11-20 15:16:58.462079880 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/search.html 2025-11-20 15:16:58.462079880 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/system_information.html 2025-11-20 15:16:58.482079999 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/system_information.html 2025-11-20 15:16:58.486080022 +0000 @@ -263,7 +263,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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/doc/html/systemtap.html 2025-11-20 15:16:58.510080164 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/systemtap.html 2025-11-20 15:16:58.514080189 +0000 @@ -157,7 +157,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-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/sasl-4.3/doc/html/404.html 2025-11-20 15:16:58.538080331 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/404.html 2025-11-20 15:16:58.538080331 +0000 @@ -110,7 +110,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/alarm_handler.html 2025-11-20 15:16:58.562080473 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/alarm_handler.html 2025-11-20 15:16:58.562080473 +0000 @@ -377,7 +377,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-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/sasl-4.3/doc/html/api-reference.html 2025-11-20 15:16:58.578080569 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/api-reference.html 2025-11-20 15:16:58.582080592 +0000 @@ -145,7 +145,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/appup.html 2025-11-20 15:16:58.614080782 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/appup.html 2025-11-20 15:16:58.614080782 +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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/error_logging.html 2025-11-20 15:16:58.642080948 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/error_logging.html 2025-11-20 15:16:58.638080926 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-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/sasl-4.3/doc/html/notes.html 2025-11-20 15:16:58.670081115 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/notes.html 2025-11-20 15:16:58.678081162 +0000 @@ -396,7 +396,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/rb.html 2025-11-20 15:16:58.710081353 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rb.html 2025-11-20 15:16:58.714081376 +0000 @@ -1078,7 +1078,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/rel.html 2025-11-20 15:16:58.734081496 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rel.html 2025-11-20 15:16:58.738081519 +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-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/release_handler.html 2025-11-20 15:16:58.778081757 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/release_handler.html 2025-11-20 15:16:58.770081710 +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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/relup.html 2025-11-20 15:16:58.802081899 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/relup.html 2025-11-20 15:16:58.806081924 +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-2025 Ericsson AB

              +

              Copyright © 1996-2041 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/sasl.epub/OEBPS/appup.xhtml 2025-11-20 15:10:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/appup.xhtml 2041-12-23 04:28:36.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/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/doc/html/sasl.epub/OEBPS/content.opf 2025-11-20 15:10:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/content.opf 2041-12-23 04:28:36.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> sasl - 4.3 - urn:uuid:d639a59e-1269-481e-453b-58c9503aa141 + urn:uuid:ca50a73f-f775-57bc-af52-d1b2095675f9 en - 2025-11-20T15:10:07Z + 2041-12-23T04:28:36Z /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/sasl.epub/OEBPS/error_logging.xhtml 2025-11-20 15:10:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/error_logging.xhtml 2041-12-23 04:28:36.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/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/doc/html/sasl.epub/OEBPS/release_handler.xhtml	2025-11-20 15:10:07.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/release_handler.xhtml	2041-12-23 04:28:36.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/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/doc/html/sasl.epub/OEBPS/relup.xhtml 2025-11-20 15:10:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/relup.xhtml 2041-12-23 04:28:36.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/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/doc/html/sasl.epub/OEBPS/rel.xhtml 2025-11-20 15:10:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/rel.xhtml 2041-12-23 04:28:36.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/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/doc/html/sasl.epub/OEBPS/script.xhtml 2025-11-20 15:10:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/script.xhtml 2041-12-23 04:28:36.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/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/doc/html/sasl_app.html 2025-11-20 15:16:58.982082969 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_app.html 2025-11-20 15:16:58.986082992 +0000 @@ -197,7 +197,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/sasl_intro.html 2025-11-20 15:16:59.010083135 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_intro.html 2025-11-20 15:16:59.014083160 +0000 @@ -145,7 +145,7 @@ Erlang programming language

                -

                Copyright © 1996-2025 Ericsson AB

                +

                Copyright © 1996-2041 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/script.html 2025-11-20 15:16:59.038083301 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/script.html 2025-11-20 15:16:59.042083326 +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-2025 Ericsson AB

                  +

                  Copyright © 1996-2041 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/sasl-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/sasl-4.3/doc/html/search.html 2025-11-20 15:16:59.066083469 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/search.html 2025-11-20 15:16:59.066083469 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2025 Ericsson AB

                  +

                  Copyright © 1996-2041 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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/doc/html/systools.html 2025-11-20 15:16:59.094083635 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/systools.html 2025-11-20 15:16:59.094083635 +0000 @@ -631,7 +631,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2025 Ericsson AB

                  +

                  Copyright © 1996-2041 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/404.html 2025-11-20 15:16:59.122083801 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/404.html 2025-11-20 15:16:59.118083776 +0000 @@ -110,7 +110,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2025 Ericsson AB

                  +

                  Copyright © 1996-2041 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/api-reference.html 2025-11-20 15:16:59.142083919 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/api-reference.html 2025-11-20 15:16:59.142083919 +0000 @@ -415,7 +415,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2025 Ericsson AB

                  +

                  Copyright © 1996-2041 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/notes.html 2025-11-20 15:16:59.174084110 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/notes.html 2025-11-20 15:16:59.182084158 +0000 @@ -89,9 +89,9 @@ -

                  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.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-2025 Ericsson AB

                      +

                      Copyright © 1996-2041 Ericsson AB

                      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/search.html 2025-11-20 15:16:59.206084299 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/search.html 2025-11-20 15:16:59.206084299 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                      -

                      Copyright © 1996-2025 Ericsson AB

                      +

                      Copyright © 1996-2041 Ericsson AB

                      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp.epub/OEBPS/content.opf 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/content.opf 2041-12-23 04:29:13.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> snmp - 5.19.1 - urn:uuid:5843a0c3-23cd-c0fd-e05c-ef2bb397e7f0 + urn:uuid:634360f9-c861-b01b-4f08-3bc190b6a26e en - 2025-11-20T15:10:55Z + 2041-12-23T04:29:13Z /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp.epub/OEBPS/notes.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/notes.xhtml 2041-12-23 04:29:13.000000000 +0000 @@ -17,9 +17,9 @@

                      SNMP Release Notes

                      -

                      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.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2025-11-20 15:10:55.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.epub/OEBPS/snmp.xhtml 2025-11-20 15:10:55.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp.xhtml 2041-12-23 04:29:13.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.19.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.19.1/doc/html/snmp.html 2025-11-20 15:16:59.698087222 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.html 2025-11-20 15:16:59.698087222 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_advanced_agent.html 2025-11-20 15:16:59.726087390 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_advanced_agent.html 2025-11-20 15:16:59.726087390 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_agent_config_files.html 2025-11-20 15:16:59.758087579 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_config_files.html 2025-11-20 15:16:59.754087556 +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.19.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.19.1/doc/html/snmp_agent_funct_descr.html 2025-11-20 15:16:59.786087745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_funct_descr.html 2025-11-20 15:16:59.790087770 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_agent_netif.html 2025-11-20 15:16:59.814087912 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_netif.html 2025-11-20 15:16:59.818087935 +0000 @@ -202,7 +202,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_app.html 2025-11-20 15:16:59.842088079 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app.html 2025-11-20 15:16:59.846088102 +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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_app_a.html 2025-11-20 15:16:59.874088269 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_a.html 2025-11-20 15:16:59.874088269 +0000 @@ -142,7 +142,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_app_b.html 2025-11-20 15:16:59.894088388 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_b.html 2025-11-20 15:16:59.898088411 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_app_c.html 2025-11-20 15:16:59.926088577 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_c.html 2025-11-20 15:16:59.926088577 +0000 @@ -143,7 +143,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_audit_trail_log.html 2025-11-20 15:16:59.946088697 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_audit_trail_log.html 2025-11-20 15:16:59.946088697 +0000 @@ -155,7 +155,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_community_mib.html 2025-11-20 15:16:59.978088886 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_community_mib.html 2025-11-20 15:16:59.974088863 +0000 @@ -584,7 +584,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_config.html 2025-11-20 15:17:00.014089100 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_config.html 2025-11-20 15:17:00.022089147 +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-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_def_instr_functions.html 2025-11-20 15:17:00.050089315 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_def_instr_functions.html 2025-11-20 15:17:00.054089338 +0000 @@ -243,7 +243,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_framework_mib.html 2025-11-20 15:17:00.078089481 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_framework_mib.html 2025-11-20 15:17:00.082089504 +0000 @@ -576,7 +576,7 @@ Erlang programming language

          -

          Copyright © 1996-2025 Ericsson AB

          +

          Copyright © 1996-2041 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_generic.html 2025-11-20 15:17:00.114089695 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_generic.html 2025-11-20 15:17:00.114089695 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_impl_example_agent.html 2025-11-20 15:17:00.146089884 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_agent.html 2025-11-20 15:17:00.146089884 +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.19.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.19.1/doc/html/snmp_impl_example_manager.html	2025-11-20 15:17:00.170090027 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_manager.html	2025-11-20 15:17:00.174090051 +0000
        @@ -146,7 +146,7 @@
                   Erlang programming language
         
               

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_index.html 2025-11-20 15:17:00.198090193 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_index.html 2025-11-20 15:17:00.202090217 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_instr_functions.html 2025-11-20 15:17:00.222090336 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_instr_functions.html 2025-11-20 15:17:00.230090383 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_intro.html 2025-11-20 15:17:00.258090549 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_intro.html 2025-11-20 15:17:00.258090549 +0000 @@ -192,7 +192,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_manager_config_files.html 2025-11-20 15:17:00.282090693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_config_files.html 2025-11-20 15:17:00.286090716 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_manager_funct_descr.html 2025-11-20 15:17:00.314090883 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_funct_descr.html 2025-11-20 15:17:00.314090883 +0000 @@ -160,7 +160,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_manager_netif.html 2025-11-20 15:17:00.342091049 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_netif.html 2025-11-20 15:17:00.342091049 +0000 @@ -190,7 +190,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_mib_compiler.html 2025-11-20 15:17:00.366091192 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_mib_compiler.html 2025-11-20 15:17:00.366091192 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_notification_mib.html 2025-11-20 15:17:00.394091358 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_notification_mib.html 2025-11-20 15:17:00.398091381 +0000 @@ -451,7 +451,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_pdus.html 2025-11-20 15:17:00.426091547 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_pdus.html 2025-11-20 15:17:00.430091572 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_standard_mib.html 2025-11-20 15:17:00.454091715 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_standard_mib.html 2025-11-20 15:17:00.454091715 +0000 @@ -391,7 +391,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_target_mib.html 2025-11-20 15:17:00.478091856 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_target_mib.html 2025-11-20 15:17:00.478091856 +0000 @@ -770,7 +770,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_user_based_sm_mib.html 2025-11-20 15:17:00.506092023 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_user_based_sm_mib.html 2025-11-20 15:17:00.502092000 +0000 @@ -727,7 +727,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmp_view_based_acm_mib.html 2025-11-20 15:17:00.538092213 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_view_based_acm_mib.html 2025-11-20 15:17:00.546092261 +0000 @@ -1053,7 +1053,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa.html 2025-11-20 15:17:00.610092641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa.html 2025-11-20 15:17:00.614092665 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_conf.html 2025-11-20 15:17:00.666092974 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_conf.html 2025-11-20 15:17:00.670092997 +0000 @@ -3772,7 +3772,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_discovery_handler.html 2025-11-20 15:17:00.694093140 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_discovery_handler.html 2025-11-20 15:17:00.698093163 +0000 @@ -209,7 +209,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_error.html 2025-11-20 15:17:00.722093306 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error.html 2025-11-20 15:17:00.722093306 +0000 @@ -234,7 +234,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_error_io.html 2025-11-20 15:17:00.746093449 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_io.html 2025-11-20 15:17:00.750093472 +0000 @@ -234,7 +234,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_error_logger.html 2025-11-20 15:17:00.778093639 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_logger.html 2025-11-20 15:17:00.778093639 +0000 @@ -235,7 +235,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_error_report.html 2025-11-20 15:17:00.794093734 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_report.html 2025-11-20 15:17:00.798093758 +0000 @@ -230,7 +230,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_local_db.html 2025-11-20 15:17:00.830093948 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_local_db.html 2025-11-20 15:17:00.830093948 +0000 @@ -692,7 +692,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_mib_data.html 2025-11-20 15:17:00.866094163 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_data.html 2025-11-20 15:17:00.866094163 +0000 @@ -1089,7 +1089,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_mib_storage.html 2025-11-20 15:17:00.894094329 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_storage.html 2025-11-20 15:17:00.898094352 +0000 @@ -812,7 +812,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_mpd.html 2025-11-20 15:17:00.926094518 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mpd.html 2025-11-20 15:17:00.934094566 +0000 @@ -976,7 +976,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_network_interface.html 2025-11-20 15:17:00.958094709 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface.html 2025-11-20 15:17:00.962094732 +0000 @@ -457,7 +457,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_network_interface_filter.html 2025-11-20 15:17:00.978094827 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface_filter.html 2025-11-20 15:17:00.978094827 +0000 @@ -469,7 +469,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_notification_delivery_info_receiver.html 2025-11-20 15:17:01.006094993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_delivery_info_receiver.html 2025-11-20 15:17:01.002094970 +0000 @@ -389,7 +389,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_notification_filter.html 2025-11-20 15:17:01.034095161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_filter.html 2025-11-20 15:17:01.034095161 +0000 @@ -294,7 +294,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpa_supervisor.html 2025-11-20 15:17:01.062095327 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_supervisor.html 2025-11-20 15:17:01.062095327 +0000 @@ -337,7 +337,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpc.html 2025-11-20 15:17:01.086095470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc.html 2025-11-20 15:17:01.090095493 +0000 @@ -379,7 +379,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpc_cmd.html 2025-11-20 15:17:01.114095636 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc_cmd.html 2025-11-20 15:17:01.118095659 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpm.html 2025-11-20 15:17:01.174095992 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm.html 2025-11-20 15:17:01.178096015 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpm_conf.html 2025-11-20 15:17:01.214096229 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_conf.html 2025-11-20 15:17:01.218096254 +0000 @@ -1333,7 +1333,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpm_mpd.html 2025-11-20 15:17:01.242096395 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_mpd.html 2025-11-20 15:17:01.242096395 +0000 @@ -612,7 +612,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpm_network_interface.html 2025-11-20 15:17:01.266096538 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface.html 2025-11-20 15:17:01.270096563 +0000 @@ -539,7 +539,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpm_network_interface_filter.html 2025-11-20 15:17:01.294096704 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface_filter.html 2025-11-20 15:17:01.298096729 +0000 @@ -461,7 +461,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.19.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.19.1/doc/html/snmpm_user.html 2025-11-20 15:17:01.322096871 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_user.html 2025-11-20 15:17:01.326096895 +0000 @@ -684,7 +684,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/404.html 2025-11-20 15:17:01.350097038 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/404.html 2025-11-20 15:17:01.350097038 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.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/ssh-5.3.3/doc/html/api-reference.html 2025-11-20 15:17:01.378097204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/api-reference.html 2025-11-20 15:17:01.378097204 +0000 @@ -210,7 +210,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/configurations.html 2025-11-20 15:17:01.410097393 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configurations.html 2025-11-20 15:17:01.406097371 +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',zlib]}, {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]
    +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',zlib]},
    +               {server2client,[none,'zlib@openssh.com',zlib]}]}]
     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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/configure_algos.html 2025-11-20 15:17:01.438097561 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configure_algos.html 2025-11-20 15:17:01.442097584 +0000 @@ -116,29 +116,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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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 @@ -149,98 +149,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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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.3.3/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.3.3/doc/html/hardening.html	2025-11-20 15:17:01.470097750 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/hardening.html	2025-11-20 15:17:01.474097775 +0000
    @@ -142,16 +142,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 @@ -184,7 +184,7 @@ 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 @@ -233,7 +233,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/introduction.html 2025-11-20 15:17:01.498097917 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/introduction.html 2025-11-20 15:17:01.498097917 +0000 @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/notes.html 2025-11-20 15:17:01.546098202 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/notes.html 2025-11-20 15:17:01.550098225 +0000 @@ -738,7 +738,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/search.html 2025-11-20 15:17:01.578098393 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/search.html 2025-11-20 15:17:01.578098393 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh.epub/OEBPS/configurations.xhtml 2025-11-20 15:11:45.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/configurations.xhtml 2041-12-23 04:29:59.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',zlib]}, {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]
    +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',zlib]},
    +               {server2client,[none,'zlib@openssh.com',zlib]}]}]
     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.3.3/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.3.3/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2025-11-20 15:11:45.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2041-12-23 04:29:59.000000000 +0000 @@ -44,29 +44,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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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 @@ -77,98 +77,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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]},
    -               {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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',zlib]}, + {server2client,[none,'zlib@openssh.com',zlib]}]}]

    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.3.3/doc/html/ssh.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text)
    --- old//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/content.opf	2025-11-20 15:11:45.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/content.opf	2041-12-23 04:29:59.000000000 +0000
    @@ -4,10 +4,10 @@
              version="3.0">
       
         ssh - 5.3.3
    -    urn:uuid:815b3807-a00d-eeaf-c4f0-fa04f887c27c
    +    urn:uuid:89d18e2b-95a3-0114-6f29-ff24d3afedd8
         en
     
    -    2025-11-20T15:11:45Z
    +    2041-12-23T04:29:59Z
     
       
       
    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh.epub/OEBPS/hardening.xhtml	2025-11-20 15:11:45.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/hardening.xhtml	2041-12-23 04:29:59.000000000 +0000
    @@ -70,16 +70,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 @@ -112,7 +112,7 @@ 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 /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2025-11-20 15:11:45.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2041-12-23 04:29:59.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.3.3/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.3.3/doc/html/ssh.epub/OEBPS/ssh.xhtml 2025-11-20 15:11:45.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/ssh.xhtml 2041-12-23 04:29:59.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.3.3/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.3.3/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2025-11-20 15:11:45.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2041-12-23 04:29:59.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.3.3/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.3.3/doc/html/ssh.html	2025-11-20 15:17:01.834099913 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.html	2025-11-20 15:17:01.838099936 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_agent.html 2025-11-20 15:17:01.866100103 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_agent.html 2025-11-20 15:17:01.870100127 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_app.html 2025-11-20 15:17:01.894100270 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_app.html 2025-11-20 15:17:01.898100293 +0000 @@ -229,7 +229,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_client_channel.html 2025-11-20 15:17:01.922100436 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_channel.html 2025-11-20 15:17:01.930100484 +0000 @@ -951,7 +951,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_client_key_api.html 2025-11-20 15:17:01.958100650 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_key_api.html 2025-11-20 15:17:01.962100673 +0000 @@ -506,7 +506,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_connection.html 2025-11-20 15:17:01.994100863 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_connection.html 2025-11-20 15:17:02.006100934 +0000 @@ -1982,7 +1982,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_file.html 2025-11-20 15:17:02.034101102 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_file.html 2025-11-20 15:17:02.038101125 +0000 @@ -981,7 +981,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_server_channel.html 2025-11-20 15:17:02.066101291 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_channel.html 2025-11-20 15:17:02.066101291 +0000 @@ -352,7 +352,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_server_key_api.html 2025-11-20 15:17:02.086101411 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_key_api.html 2025-11-20 15:17:02.090101434 +0000 @@ -296,7 +296,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_sftp.html 2025-11-20 15:17:02.130101672 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftp.html 2025-11-20 15:17:02.138101719 +0000 @@ -2889,7 +2889,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/ssh_sftpd.html 2025-11-20 15:17:02.162101861 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftpd.html 2025-11-20 15:17:02.162101861 +0000 @@ -217,7 +217,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/terminology.html 2025-11-20 15:17:02.182101980 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/terminology.html 2025-11-20 15:17:02.182101980 +0000 @@ -188,7 +188,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/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.3.3/doc/html/using_ssh.html 2025-11-20 15:17:02.218102195 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/using_ssh.html 2025-11-20 15:17:02.222102219 +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.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/ssl-11.4.1/doc/html/404.html	2025-11-20 15:17:02.246102361 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/404.html	2025-11-20 15:17:02.246102361 +0000
    @@ -110,7 +110,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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/ssl-11.4.1/doc/html/api-reference.html 2025-11-20 15:17:02.266102479 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/api-reference.html 2025-11-20 15:17:02.270102504 +0000 @@ -146,7 +146,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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/ssl-11.4.1/doc/html/notes.html 2025-11-20 15:17:02.322102812 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/notes.html 2025-11-20 15:17:02.330102859 +0000 @@ -936,7 +936,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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/ssl-11.4.1/doc/html/search.html 2025-11-20 15:17:02.354103002 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/search.html 2025-11-20 15:17:02.354103002 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/content.opf 2025-11-20 15:11:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/content.opf 2041-12-23 04:29:45.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> ssl - 11.4.1 - urn:uuid:a0142fa6-9f99-0521-34f7-c406159ba753 + urn:uuid:bca1ae4f-67df-8181-5cd2-dccb508b0acb en - 2025-11-20T15:11:32Z + 2041-12-23T04:29:45Z /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2025-11-20 15:11:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2041-12-23 04:29:45.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.4.1/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.4.1/doc/html/ssl.epub/OEBPS/ssl.xhtml 2025-11-20 15:11:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/ssl.xhtml 2041-12-23 04:29:45.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.

    @@ -1836,26 +1836,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
    @@ -2132,8 +2132,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.

    @@ -2383,7 +2383,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 @@ -2527,7 +2527,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, {SNI, TicketData}}

      where SNI is the ServerNameIndication and TicketData is the extended ticket +information to user process in a 3-tuple:

      {ssl, session_ticket, {SNI, TicketData}}

      where SNI is the ServerNameIndication and TicketData is the extended ticket data that can be used in subsequent session resumptions.

      If it is set to auto, the client automatically handles received tickets and tries to use them when making new TLS connections (session resumption with pre-shared keys).

      Ticket lifetime, the number of tickets sent by the server, and the @@ -2537,7 +2537,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 @@ -2692,20 +2692,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 @@ -2722,25 +2722,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 @@ -2890,11 +2890,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 @@ -4140,8 +4140,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).
      @@ -4812,7 +4812,7 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2025-11-20 15:11:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2041-12-23 04:29:45.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.4.1/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.4.1/doc/html/ssl.html	2025-11-20 15:17:02.554104191 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.html	2025-11-20 15:17:02.554104191 +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.

      @@ -1918,26 +1918,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
      @@ -2224,8 +2224,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.

      @@ -2480,7 +2480,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 @@ -2624,7 +2624,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, {SNI, TicketData}}

        where SNI is the ServerNameIndication and TicketData is the extended ticket +information to user process in a 3-tuple:

        {ssl, session_ticket, {SNI, TicketData}}

        where SNI is the ServerNameIndication and TicketData is the extended ticket data that can be used in subsequent session resumptions.

        If it is set to auto, the client automatically handles received tickets and tries to use them when making new TLS connections (session resumption with pre-shared keys).

        Ticket lifetime, the number of tickets sent by the server, and the @@ -2634,7 +2634,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 @@ -2794,20 +2794,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 @@ -2824,25 +2824,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 @@ -2992,11 +2992,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 @@ -4272,8 +4272,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).
        @@ -4964,7 +4964,7 @@ /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/ssl_app.html 2025-11-20 15:17:02.582104357 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_app.html 2025-11-20 15:17:02.586104381 +0000 @@ -203,7 +203,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/ssl_crl_cache.html 2025-11-20 15:17:02.606104500 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache.html 2025-11-20 15:17:02.606104500 +0000 @@ -334,7 +334,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/ssl_crl_cache_api.html 2025-11-20 15:17:02.634104666 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache_api.html 2025-11-20 15:17:02.638104689 +0000 @@ -485,7 +485,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/ssl_distribution.html 2025-11-20 15:17:02.666104857 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_distribution.html 2025-11-20 15:17:02.666104857 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/ssl_protocol.html 2025-11-20 15:17:02.694105023 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_protocol.html 2025-11-20 15:17:02.690104998 +0000 @@ -202,7 +202,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/ssl_session_cache_api.html 2025-11-20 15:17:02.718105166 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_session_cache_api.html 2025-11-20 15:17:02.722105189 +0000 @@ -688,7 +688,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/standards_compliance.html 2025-11-20 15:17:02.746105332 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/standards_compliance.html 2025-11-20 15:17:02.754105379 +0000 @@ -153,7 +153,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/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.4.1/doc/html/using_ssl.html 2025-11-20 15:17:02.790105593 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/using_ssl.html 2025-11-20 15:17:02.794105616 +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.1/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.1/doc/html/404.html	2025-11-20 15:17:02.822105782 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/404.html	2025-11-20 15:17:02.822105782 +0000
    @@ -110,7 +110,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-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/stdlib-7.1/doc/html/api-reference.html 2025-11-20 15:17:02.854105973 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/api-reference.html 2025-11-20 15:17:02.858105997 +0000 @@ -766,7 +766,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/argparse.html 2025-11-20 15:17:02.886106164 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/argparse.html 2025-11-20 15:17:02.890106187 +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.1/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.1/doc/html/array.html 2025-11-20 15:17:02.938106473 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/array.html 2025-11-20 15:17:02.934106448 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/assert_hrl.html 2025-11-20 15:17:02.962106614 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/assert_hrl.html 2025-11-20 15:17:02.966106639 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/base64.html 2025-11-20 15:17:02.994106804 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/base64.html 2025-11-20 15:17:02.998106829 +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 strips 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 strips 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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/beam_lib.html 2025-11-20 15:17:03.034107043 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/beam_lib.html 2025-11-20 15:17:03.038107066 +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 @@ -123,13 +123,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.

    @@ -1536,11 +1536,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 @@ -1907,14 +1907,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]}}
    @@ -1943,7 +1943,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/binary.html 2025-11-20 15:17:03.078107304 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/binary.html 2025-11-20 15:17:03.082107327 +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.1/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.1/doc/html/c.html	2025-11-20 15:17:03.122107566 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/c.html	2025-11-20 15:17:03.126107589 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/calendar.html 2025-11-20 15:17:03.162107802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/calendar.html 2025-11-20 15:17:03.170107850 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/custom_shell.html 2025-11-20 15:17:03.198108016 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/custom_shell.html 2025-11-20 15:17:03.202108041 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/dets.html 2025-11-20 15:17:03.250108325 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dets.html 2025-11-20 15:17:03.250108325 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/dict.html 2025-11-20 15:17:03.286108538 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dict.html 2025-11-20 15:17:03.290108563 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/digraph.html 2025-11-20 15:17:03.322108752 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph.html 2025-11-20 15:17:03.326108777 +0000 @@ -1801,7 +1801,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/digraph_utils.html 2025-11-20 15:17:03.350108920 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph_utils.html 2025-11-20 15:17:03.354108943 +0000 @@ -1003,7 +1003,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/edlin.html 2025-11-20 15:17:03.382109109 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin.html 2025-11-20 15:17:03.382109109 +0000 @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/edlin_expand.html 2025-11-20 15:17:03.406109252 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin_expand.html 2025-11-20 15:17:03.410109275 +0000 @@ -301,7 +301,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/epp.html 2025-11-20 15:17:03.434109418 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/epp.html 2025-11-20 15:17:03.438109443 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_anno.html 2025-11-20 15:17:03.466109609 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_anno.html 2025-11-20 15:17:03.470109632 +0000 @@ -1268,7 +1268,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_error.html 2025-11-20 15:17:03.494109774 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_error.html 2025-11-20 15:17:03.498109799 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_eval.html 2025-11-20 15:17:03.534110013 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_eval.html 2025-11-20 15:17:03.542110061 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_expand_records.html 2025-11-20 15:17:03.562110179 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_expand_records.html 2025-11-20 15:17:03.566110202 +0000 @@ -195,7 +195,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_features.html 2025-11-20 15:17:03.586110322 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_features.html 2025-11-20 15:17:03.590110345 +0000 @@ -557,7 +557,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_id_trans.html 2025-11-20 15:17:03.618110511 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_id_trans.html 2025-11-20 15:17:03.618110511 +0000 @@ -244,7 +244,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_internal.html 2025-11-20 15:17:03.646110677 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_internal.html 2025-11-20 15:17:03.650110702 +0000 @@ -545,7 +545,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_lint.html 2025-11-20 15:17:03.678110868 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_lint.html 2025-11-20 15:17:03.682110892 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_parse.html 2025-11-20 15:17:03.734111200 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_parse.html 2025-11-20 15:17:03.738111225 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_pp.html 2025-11-20 15:17:03.766111390 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_pp.html 2025-11-20 15:17:03.770111415 +0000 @@ -958,7 +958,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_scan.html 2025-11-20 15:17:03.806111629 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_scan.html 2025-11-20 15:17:03.806111629 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/erl_tar.html 2025-11-20 15:17:03.842111843 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_tar.html 2025-11-20 15:17:03.846111866 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/escript.html 2025-11-20 15:17:03.878112057 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/escript.html 2025-11-20 15:17:03.882112079 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/ets.html 2025-11-20 15:17:03.938112413 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ets.html 2025-11-20 15:17:03.946112461 +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="2416856208-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="2349361716-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.1/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.1/doc/html/file_sorter.html	2025-11-20 15:17:04.014112864 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/file_sorter.html	2025-11-20 15:17:04.014112864 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/filelib.html 2025-11-20 15:17:04.038113006 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filelib.html 2025-11-20 15:17:04.038113006 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/filename.html 2025-11-20 15:17:04.070113197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filename.html 2025-11-20 15:17:04.074113220 +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.1/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.1/doc/html/gb_sets.html	2025-11-20 15:17:04.118113482 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_sets.html	2025-11-20 15:17:04.126113529 +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.1/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.1/doc/html/gb_trees.html	2025-11-20 15:17:04.158113720 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_trees.html	2025-11-20 15:17:04.162113743 +0000
    @@ -1562,7 +1562,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/gen_event.html 2025-11-20 15:17:04.214114052 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_event.html 2025-11-20 15:17:04.214114052 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/gen_fsm.html 2025-11-20 15:17:04.262114338 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_fsm.html 2025-11-20 15:17:04.266114361 +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.1/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.1/doc/html/gen_server.html	2025-11-20 15:17:04.310114622 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_server.html	2025-11-20 15:17:04.314114647 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/gen_statem.html 2025-11-20 15:17:04.374115002 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_statem.html 2025-11-20 15:17:04.382115050 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/introduction.html 2025-11-20 15:17:04.418115264 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/introduction.html 2025-11-20 15:17:04.418115264 +0000 @@ -142,7 +142,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/io.html 2025-11-20 15:17:04.466115550 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io.html 2025-11-20 15:17:04.470115573 +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.1/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.1/doc/html/io_lib.html	2025-11-20 15:17:04.510115811 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_lib.html	2025-11-20 15:17:04.510115811 +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],[]}
    @@ -1772,11 +1772,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|...],...}"
    @@ -2045,7 +2045,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/io_protocol.html 2025-11-20 15:17:04.546116025 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_protocol.html 2025-11-20 15:17:04.546116025 +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.1/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.1/doc/html/json.html	2025-11-20 15:17:04.590116286 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/json.html	2025-11-20 15:17:04.594116311 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/lists.html 2025-11-20 15:17:04.654116666 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/lists.html 2025-11-20 15:17:04.658116691 +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.1/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.1/doc/html/log_mf_h.html 2025-11-20 15:17:04.690116881 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/log_mf_h.html 2025-11-20 15:17:04.686116856 +0000 @@ -418,7 +418,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/maps.html 2025-11-20 15:17:04.734117142 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/maps.html 2025-11-20 15:17:04.738117166 +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.1/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.1/doc/html/math.html	2025-11-20 15:17:04.774117379 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/math.html	2025-11-20 15:17:04.778117404 +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.1/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.1/doc/html/ms_transform.html 2025-11-20 15:17:04.818117641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ms_transform.html 2025-11-20 15:17:04.818117641 +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.1/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.1/doc/html/notes.html	2025-11-20 15:17:04.898118116 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/notes.html	2025-11-20 15:17:04.902118140 +0000
    @@ -89,45 +89,45 @@
       
     
     
    -

    This document describes the changes made to the STDLIB application.

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

      This document describes the changes made to the STDLIB application.

      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="2682689274-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="0531097900-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.
     %     |     ^
    @@ -146,37 +146,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.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: @@ -184,8 +184,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.
      @@ -208,22 +208,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.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 @@ -2359,7 +2359,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/orddict.html 2025-11-20 15:17:04.962118497 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/orddict.html 2025-11-20 15:17:04.962118497 +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.1/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.1/doc/html/ordsets.html 2025-11-20 15:17:04.994118686 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ordsets.html 2025-11-20 15:17:04.998118711 +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.1/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.1/doc/html/peer.html	2025-11-20 15:17:05.034118925 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/peer.html	2025-11-20 15:17:05.038118948 +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.1/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.1/doc/html/pool.html 2025-11-20 15:17:05.070119138 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/pool.html 2025-11-20 15:17:05.066119114 +0000 @@ -474,7 +474,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/proc_lib.html 2025-11-20 15:17:05.110119375 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proc_lib.html 2025-11-20 15:17:05.114119400 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/proplists.html 2025-11-20 15:17:05.146119590 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proplists.html 2025-11-20 15:17:05.154119637 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/qlc.html 2025-11-20 15:17:05.202119923 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/qlc.html 2025-11-20 15:17:05.210119970 +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="0805556821-44">}]).
    +    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    +                   {lookup_fun, LookupFun},{key_equality,&#href_anchor"p" data-group-id="2600408389-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.1/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.1/doc/html/queue.html	2025-11-20 15:17:05.250120207 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/queue.html	2025-11-20 15:17:05.250120207 +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.1/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.1/doc/html/rand.html	2025-11-20 15:17:05.294120468 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/rand.html	2025-11-20 15:17:05.298120493 +0000
    @@ -160,13 +160,13 @@
     a reasonably unpredictable seed.

    The functions with explicit state don't use the process dictionary.

    Examples

    Simple use; create and seed the default algorithm with a non-fixed seed, if not already done, and generate two uniformly distibuted -floating point numbers.

    R0 = rand:uniform(),
    -R1 = rand:uniform(),

    Use a specified algorithm:

    _ = rand:seed(exro928ss),
    -R2 = rand:uniform(),

    Use a specified algorithm with a fixed seed:

    _ = rand:seed(exro928ss, {123, 123534, 345345}),
    -R3 = rand:uniform(),

    Use the functional API with a non-fixed seed:

    S0 = rand:seed_s(exsss),
    -{R4, S1} = rand:uniform_s(S0),

    Generate a textbook basic form Box-Muller standard normal distribution number:

    R5 = rand:uniform_real(),
    -R6 = rand:uniform(),
    -SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

    Generate a standard normal distribution number:

    {SND1, S2} = rand:normal_s(S1),

    Generate a normal distribution number with with mean -3 and variance 0.5:

    {ND0, S3} = rand:normal_s(-3, 0.5, S2),

    Quality of the Generated Numbers

    Note

    The builtin random number generator algorithms are not cryptographically +floating point numbers.

    R0 = rand:uniform(),
    +R1 = rand:uniform(),

    Use a specified algorithm:

    _ = rand:seed(exro928ss),
    +R2 = rand:uniform(),

    Use a specified algorithm with a fixed seed:

    _ = rand:seed(exro928ss, {123, 123534, 345345}),
    +R3 = rand:uniform(),

    Use the functional API with a non-fixed seed:

    S0 = rand:seed_s(exsss),
    +{R4, S1} = rand:uniform_s(S0),

    Generate a textbook basic form Box-Muller standard normal distribution number:

    R5 = rand:uniform_real(),
    +R6 = rand:uniform(),
    +SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

    Generate a standard normal distribution number:

    {SND1, S2} = rand:normal_s(S1),

    Generate a normal distribution number with with mean -3 and variance 0.5:

    {ND0, S3} = rand:normal_s(-3, 0.5, S2),

    Quality of the Generated Numbers

    Note

    The builtin random number generator algorithms are not cryptographically strong. If a cryptographically strong random number generator is needed, use something like crypto:rand_seed/0.

    For all these generators except exro928ss and exsss the lowest bit(s) have got a slightly less random behaviour than all other bits. @@ -177,7 +177,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 don't use the plug-in framework, mainly for performance reasons.

    Since these algorithms lack the plug-in framework support, generating numbers @@ -1383,7 +1383,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 @@ -2269,10 +2269,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.
    @@ -2334,7 +2334,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/random.html 2025-11-20 15:17:05.330120683 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/random.html 2025-11-20 15:17:05.330120683 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/re.html 2025-11-20 15:17:05.390121039 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re.html 2025-11-20 15:17:05.390121039 +0000 @@ -2468,32 +2468,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">>,<<>>}]
    @@ -2582,16 +2582,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", @@ -2712,7 +2712,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 @@ -2724,7 +2724,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 @@ -2795,12 +2795,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 @@ -2813,9 +2813,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 @@ -2840,12 +2840,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 @@ -2880,12 +2880,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.

    @@ -2972,7 +2972,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 @@ -2980,21 +2980,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 @@ -3074,7 +3074,7 @@ Erlang programming language /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/re_incompat.html 2025-11-20 15:17:05.422121230 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re_incompat.html 2025-11-20 15:17:05.422121230 +0000 @@ -182,7 +182,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-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/stdlib-7.1/doc/html/search.html 2025-11-20 15:17:05.442121348 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/search.html 2025-11-20 15:17:05.442121348 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/sets.html 2025-11-20 15:17:05.478121562 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sets.html 2025-11-20 15:17:05.482121586 +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.1/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.1/doc/html/shell.html	2025-11-20 15:17:05.690122822 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell.html	2025-11-20 15:17:05.690122822 +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.1/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.1/doc/html/shell_default.html	2025-11-20 15:17:05.714122964 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_default.html	2025-11-20 15:17:05.718122988 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/shell_docs.html 2025-11-20 15:17:05.750123178 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_docs.html 2025-11-20 15:17:05.754123202 +0000 @@ -1261,7 +1261,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/slave.html 2025-11-20 15:17:05.782123368 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/slave.html 2025-11-20 15:17:05.786123393 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/sofs.html 2025-11-20 15:17:05.870123891 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sofs.html 2025-11-20 15:17:05.874123915 +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.1/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.1/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/array.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/array.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/base64.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/base64.xhtml 2041-12-23 04:28:34.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 strips 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 strips 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.1/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.1/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2041-12-23 04:28:34.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 @@ -52,13 +52,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.

    @@ -1449,11 +1449,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 @@ -1820,14 +1820,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.1/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.1/doc/html/stdlib.epub/OEBPS/binary.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/binary.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/calendar.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/calendar.xhtml	2041-12-23 04:28:34.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.1/doc/html/stdlib.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/content.opf 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/content.opf 2041-12-23 04:28:34.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> stdlib - 7.1 - urn:uuid:f84adca9-5295-3a7b-95e4-a41978f9da9e + urn:uuid:3f37ba76-1c18-0fda-bd27-5e3646cc1162 en - 2025-11-20T15:10:05Z + 2041-12-23T04:28:34Z /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/stdlib.epub/OEBPS/custom_shell.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/custom_shell.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/c.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/c.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/dets.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/dets.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/dict.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/dict.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/epp.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/epp.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/escript.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/escript.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/ets.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/ets.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/filelib.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/filelib.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/filename.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/filename.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/gb_sets.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gb_sets.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/io_lib.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/io_lib.xhtml 2041-12-23 04:28:34.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],[]}
    @@ -1685,11 +1685,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.1/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.1/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/io.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/io.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/json.xhtml	2025-11-20 15:10:05.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/json.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/lists.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/lists.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/maps.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/maps.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/math.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/math.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/notes.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/notes.xhtml	2041-12-23 04:28:34.000000000 +0000
    @@ -17,45 +17,45 @@
       
     
         

    STDLIB Release Notes

    -

    This document describes the changes made to the STDLIB application.

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

      This document describes the changes made to the STDLIB application.

      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.
     %     |     ^
    @@ -74,37 +74,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.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: @@ -112,8 +112,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.
      @@ -136,22 +136,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.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.1/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.1/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/ordsets.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/ordsets.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/peer.xhtml	2025-11-20 15:10:05.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/peer.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/queue.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/queue.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/random.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/random.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/rand.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/rand.xhtml 2041-12-23 04:28:34.000000000 +0000 @@ -89,13 +89,13 @@ a reasonably unpredictable seed.

    The functions with explicit state don't use the process dictionary.

    Examples

    Simple use; create and seed the default algorithm with a non-fixed seed, if not already done, and generate two uniformly distibuted -floating point numbers.

    R0 = rand:uniform(),
    -R1 = rand:uniform(),

    Use a specified algorithm:

    _ = rand:seed(exro928ss),
    -R2 = rand:uniform(),

    Use a specified algorithm with a fixed seed:

    _ = rand:seed(exro928ss, {123, 123534, 345345}),
    -R3 = rand:uniform(),

    Use the functional API with a non-fixed seed:

    S0 = rand:seed_s(exsss),
    -{R4, S1} = rand:uniform_s(S0),

    Generate a textbook basic form Box-Muller standard normal distribution number:

    R5 = rand:uniform_real(),
    -R6 = rand:uniform(),
    -SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

    Generate a standard normal distribution number:

    {SND1, S2} = rand:normal_s(S1),

    Generate a normal distribution number with with mean -3 and variance 0.5:

    {ND0, S3} = rand:normal_s(-3, 0.5, S2),

    Quality of the Generated Numbers

    Note

    The builtin random number generator algorithms are not cryptographically +floating point numbers.

    R0 = rand:uniform(),
    +R1 = rand:uniform(),

    Use a specified algorithm:

    _ = rand:seed(exro928ss),
    +R2 = rand:uniform(),

    Use a specified algorithm with a fixed seed:

    _ = rand:seed(exro928ss, {123, 123534, 345345}),
    +R3 = rand:uniform(),

    Use the functional API with a non-fixed seed:

    S0 = rand:seed_s(exsss),
    +{R4, S1} = rand:uniform_s(S0),

    Generate a textbook basic form Box-Muller standard normal distribution number:

    R5 = rand:uniform_real(),
    +R6 = rand:uniform(),
    +SND0 = math:sqrt(-2 * math:log(R5)) * math:cos(math:pi() * R6)

    Generate a standard normal distribution number:

    {SND1, S2} = rand:normal_s(S1),

    Generate a normal distribution number with with mean -3 and variance 0.5:

    {ND0, S3} = rand:normal_s(-3, 0.5, S2),

    Quality of the Generated Numbers

    Note

    The builtin random number generator algorithms are not cryptographically strong. If a cryptographically strong random number generator is needed, use something like crypto:rand_seed/0.

    For all these generators except exro928ss and exsss the lowest bit(s) have got a slightly less random behaviour than all other bits. @@ -106,7 +106,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 don't use the plug-in framework, mainly for performance reasons.

    Since these algorithms lack the plug-in framework support, generating numbers @@ -1296,7 +1296,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 @@ -2177,10 +2177,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.1/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.1/doc/html/stdlib.epub/OEBPS/re.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/re.xhtml 2041-12-23 04:28:34.000000000 +0000 @@ -2383,32 +2383,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">>,<<>>}]
    @@ -2497,16 +2497,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", @@ -2627,7 +2627,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 @@ -2639,7 +2639,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 @@ -2710,12 +2710,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 @@ -2728,9 +2728,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 @@ -2755,12 +2755,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 @@ -2795,12 +2795,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.

    @@ -2887,7 +2887,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 @@ -2895,21 +2895,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.1/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.1/doc/html/stdlib.epub/OEBPS/sets.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/sets.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/shell.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/shell.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/slave.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/slave.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/string.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/string.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/supervisor.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/supervisor.xhtml	2041-12-23 04:28:34.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 occations 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.1/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.1/doc/html/stdlib.epub/OEBPS/terminal_interface.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/terminal_interface.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/timer.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/timer.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/unicode.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/unicode.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/uri_string.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/uri_string.xhtml 2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/zip.xhtml	2025-11-20 15:10:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/zip.xhtml	2041-12-23 04:28:34.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.1/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.1/doc/html/stdlib.epub/OEBPS/zstd.xhtml 2025-11-20 15:10:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/zstd.xhtml 2041-12-23 04:28:34.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.
    @@ -625,8 +625,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 }).
    @@ -749,9 +749,9 @@ -

    Decompress Data using the given compress_parameters/0 or the context/0.

    Example:

    1> Compressed = zstd:compress("abc").
    -2> zstd:decompress(Compressed).
    -[~"abc"]
    +

    Decompress Data using the given compress_parameters/0 or the context/0.

    Example:

    1> Compressed = zstd:compress("abc").
    +2> zstd:decompress(Compressed).
    +[~"abc"]
    @@ -820,12 +820,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.

    @@ -859,11 +859,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">>
    @@ -893,10 +893,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
    @@ -938,11 +938,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}}
    @@ -976,13 +976,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
    @@ -1015,14 +1015,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"]
    @@ -1053,14 +1053,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">>}, _}}
    @@ -1095,13 +1095,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.1/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.1/doc/html/stdlib_app.html	2025-11-20 15:17:07.042130855 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib_app.html	2025-11-20 15:17:07.046130878 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/string.html 2025-11-20 15:17:07.094131164 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/string.html 2025-11-20 15:17:07.098131187 +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.1/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.1/doc/html/supervisor.html	2025-11-20 15:17:07.138131425 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor.html	2025-11-20 15:17:07.146131473 +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 occations 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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/supervisor_bridge.html 2025-11-20 15:17:07.166131591 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor_bridge.html 2025-11-20 15:17:07.170131615 +0000 @@ -378,7 +378,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/sys.html 2025-11-20 15:17:07.210131852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sys.html 2025-11-20 15:17:07.214131877 +0000 @@ -2276,7 +2276,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/terminal_interface.html 2025-11-20 15:17:07.246132066 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/terminal_interface.html 2025-11-20 15:17:07.250132091 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/timer.html 2025-11-20 15:17:07.282132280 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/timer.html 2025-11-20 15:17:07.282132280 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/unicode.html 2025-11-20 15:17:07.314132470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode.html 2025-11-20 15:17:07.322132518 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/unicode_usage.html 2025-11-20 15:17:07.358132731 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode_usage.html 2025-11-20 15:17:07.362132756 +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.1/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.1/doc/html/uri_string.html	2025-11-20 15:17:07.398132970 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string.html	2025-11-20 15:17:07.406133018 +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.1/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.1/doc/html/uri_string_usage.html	2025-11-20 15:17:07.434133184 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string_usage.html	2025-11-20 15:17:07.434133184 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/win32reg.html 2025-11-20 15:17:07.462133350 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/win32reg.html 2025-11-20 15:17:07.470133398 +0000 @@ -877,7 +877,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/zip.html 2025-11-20 15:17:07.498133563 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zip.html 2025-11-20 15:17:07.502133588 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/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.1/doc/html/zstd.html 2025-11-20 15:17:07.534133777 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zstd.html 2025-11-20 15:17:07.538133802 +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.
    @@ -712,8 +712,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 }).
    @@ -836,9 +836,9 @@ -

    Decompress Data using the given compress_parameters/0 or the context/0.

    Example:

    1> Compressed = zstd:compress("abc").
    -2> zstd:decompress(Compressed).
    -[~"abc"]
    +

    Decompress Data using the given compress_parameters/0 or the context/0.

    Example:

    1> Compressed = zstd:compress("abc").
    +2> zstd:decompress(Compressed).
    +[~"abc"]
    @@ -907,12 +907,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.

    @@ -946,11 +946,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">>
    @@ -980,10 +980,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
    @@ -1025,11 +1025,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}}
    @@ -1063,13 +1063,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
    @@ -1102,14 +1102,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"]
    @@ -1140,14 +1140,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">>}, _}}
    @@ -1182,13 +1182,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.1/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.1/doc/html/404.html	2025-11-20 15:17:07.562133943 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/404.html	2025-11-20 15:17:07.562133943 +0000
    @@ -106,7 +106,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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/syntax_tools-4.0.1/doc/html/api-reference.html 2025-11-20 15:17:07.582134063 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/api-reference.html 2025-11-20 15:17:07.586134086 +0000 @@ -186,7 +186,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/chapter.html 2025-11-20 15:17:07.610134229 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/chapter.html 2025-11-20 15:17:07.610134229 +0000 @@ -140,7 +140,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/epp_dodger.html 2025-11-20 15:17:07.634134372 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/epp_dodger.html 2025-11-20 15:17:07.638134395 +0000 @@ -856,7 +856,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/erl_comment_scan.html 2025-11-20 15:17:07.662134538 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_comment_scan.html 2025-11-20 15:17:07.662134538 +0000 @@ -414,7 +414,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/erl_prettypr.html 2025-11-20 15:17:07.694134728 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_prettypr.html 2025-11-20 15:17:07.698134752 +0000 @@ -978,7 +978,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/erl_recomment.html 2025-11-20 15:17:07.718134870 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_recomment.html 2025-11-20 15:17:07.722134895 +0000 @@ -356,7 +356,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/erl_syntax.html 2025-11-20 15:17:07.826135513 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax.html 2025-11-20 15:17:07.830135536 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/erl_syntax_lib.html 2025-11-20 15:17:07.878135821 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax_lib.html 2025-11-20 15:17:07.878135821 +0000 @@ -2467,7 +2467,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/merl.html 2025-11-20 15:17:07.918136059 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl.html 2025-11-20 15:17:07.918136059 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/merl_transform.html 2025-11-20 15:17:07.942136202 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl_transform.html 2025-11-20 15:17:07.942136202 +0000 @@ -121,7 +121,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/notes.html 2025-11-20 15:17:07.966136345 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/notes.html 2025-11-20 15:17:07.970136368 +0000 @@ -89,13 +89,13 @@ -

    This document describes the changes made to the Syntax_Tools application.

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

      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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/prettypr.html 2025-11-20 15:17:07.998136534 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/prettypr.html 2025-11-20 15:17:08.002136559 +0000 @@ -1135,7 +1135,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/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.1/doc/html/search.html 2025-11-20 15:17:08.026136700 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/search.html 2025-11-20 15:17:08.030136725 +0000 @@ -104,7 +104,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/404.html 2025-11-20 15:17:08.050136843 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/404.html 2025-11-20 15:17:08.054136868 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.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/tftp-1.2.3/doc/html/api-reference.html 2025-11-20 15:17:08.078137009 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/api-reference.html 2025-11-20 15:17:08.078137009 +0000 @@ -127,7 +127,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/getting_started.html 2025-11-20 15:17:08.106137177 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/getting_started.html 2025-11-20 15:17:08.106137177 +0000 @@ -92,9 +92,9 @@

        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" > file.txt

        Step 2. Start the TFTP server:

              1> {ok, Pid} = tftp:start([{port, 19999}]).
        -      {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" > file.txt

        Step 2. Start the TFTP server:

              1> {ok, Pid} = tftp:start([{port, 19999}]).
        +      {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">>}
        @@ -137,7 +137,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/introduction.html 2025-11-20 15:17:08.134137343 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/introduction.html 2025-11-20 15:17:08.134137343 +0000 @@ -154,7 +154,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/notes.html 2025-11-20 15:17:08.154137461 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/notes.html 2025-11-20 15:17:08.158137484 +0000 @@ -148,7 +148,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/search.html 2025-11-20 15:17:08.178137604 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/search.html 2025-11-20 15:17:08.182137627 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/tftp.epub/OEBPS/content.opf 2025-11-20 15:11:51.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub/OEBPS/content.opf 2041-12-23 04:30:04.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> tftp - 1.2.3 - urn:uuid:2df77e9d-788b-4d22-602b-1aa0064611ec + urn:uuid:e2ea64e5-8308-2f65-8a0d-96a804d1d6cc en - 2025-11-20T15:11:51Z + 2041-12-23T04:30:04Z /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/tftp.epub/OEBPS/getting_started.xhtml 2025-11-20 15:11:51.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub/OEBPS/getting_started.xhtml 2041-12-23 04:30:04.000000000 +0000 @@ -20,9 +20,9 @@

        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" > file.txt

        Step 2. Start the TFTP server:

              1> {ok, Pid} = tftp:start([{port, 19999}]).
        -      {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" > file.txt

        Step 2. Start the TFTP server:

              1> {ok, Pid} = tftp:start([{port, 19999}]).
        +      {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.3/doc/html/tftp.epub/OEBPS/tftp.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub/OEBPS/tftp.xhtml 2025-11-20 15:11:51.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub/OEBPS/tftp.xhtml 2041-12-23 04:30:04.000000000 +0000 @@ -22,7 +22,7 @@
        -

        Trivial FTP.

        Interface module for the tftp application.

        Overwiew

        This is a complete implementation of the following IETF standards:

        RFC 1350, The TFTP Protocol (revision 2).
        +

        Trivial FTP.

        Interface module for the tftp application.

        Overwiew

        This is a complete implementation of the following IETF standards:

        RFC 1350, The TFTP Protocol (revision 2).
         RFC 2347, TFTP Option Extension.
         RFC 2348, TFTP Blocksize Option.
         RFC 2349, TFTP Timeout Interval and Transfer Size Options.

        The only feature that not is implemented in this release is /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/tftp.html 2025-11-20 15:17:08.298138316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.html 2025-11-20 15:17:08.302138341 +0000 @@ -93,7 +93,7 @@

        -

        Trivial FTP.

        Interface module for the tftp application.

        Overwiew

        This is a complete implementation of the following IETF standards:

        RFC 1350, The TFTP Protocol (revision 2).
        +

        Trivial FTP.

        Interface module for the tftp application.

        Overwiew

        This is a complete implementation of the following IETF standards:

        RFC 1350, The TFTP Protocol (revision 2).
         RFC 2347, TFTP Option Extension.
         RFC 2348, TFTP Blocksize Option.
         RFC 2349, TFTP Timeout Interval and Transfer Size Options.

        The only feature that not is implemented in this release is @@ -935,7 +935,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/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.3/doc/html/tftp_logger.html 2025-11-20 15:17:08.322138459 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp_logger.html 2025-11-20 15:17:08.326138484 +0000 @@ -276,7 +276,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/404.html 2025-11-20 15:17:08.350138625 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/404.html 2025-11-20 15:17:08.350138625 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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/tools-4.1.3/doc/html/api-reference.html 2025-11-20 15:17:08.370138745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/api-reference.html 2025-11-20 15:17:08.374138768 +0000 @@ -193,7 +193,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/cover.html 2025-11-20 15:17:08.410138982 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover.html 2025-11-20 15:17:08.418139029 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/cover_chapter.html 2025-11-20 15:17:08.454139243 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover_chapter.html 2025-11-20 15:17:08.454139243 +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.3/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.3/doc/html/cprof.html	2025-11-20 15:17:08.482139409 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof.html	2025-11-20 15:17:08.490139457 +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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/cprof_chapter.html 2025-11-20 15:17:08.514139600 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof_chapter.html 2025-11-20 15:17:08.522139647 +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.3/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.3/doc/html/eprof.html 2025-11-20 15:17:08.550139813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/eprof.html 2025-11-20 15:17:08.554139838 +0000 @@ -976,7 +976,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/erlang-el.html 2025-11-20 15:17:08.578139980 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang-el.html 2025-11-20 15:17:08.578139980 +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-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/erlang_mode_chapter.html 2025-11-20 15:17:08.602140122 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang_mode_chapter.html 2025-11-20 15:17:08.606140147 +0000 @@ -224,7 +224,7 @@ Erlang programming language

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/fprof.html 2025-11-20 15:17:08.642140361 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof.html 2025-11-20 15:17:08.646140384 +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.3/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.3/doc/html/fprof_chapter.html	2025-11-20 15:17:08.674140550 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof_chapter.html	2025-11-20 15:17:08.678140575 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/lcnt.html 2025-11-20 15:17:08.710140765 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt.html 2025-11-20 15:17:08.718140811 +0000 @@ -1816,7 +1816,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/lcnt_chapter.html 2025-11-20 15:17:08.742140954 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt_chapter.html 2025-11-20 15:17:08.746140979 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/make.html 2025-11-20 15:17:08.774141145 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/make.html 2025-11-20 15:17:08.774141145 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/notes.html 2025-11-20 15:17:08.814141382 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/notes.html 2025-11-20 15:17:08.814141382 +0000 @@ -89,37 +89,37 @@ -

    This document describes the changes made to the Tools application.

    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.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-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/search.html 2025-11-20 15:17:08.834141502 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/search.html 2025-11-20 15:17:08.834141502 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/tags.html 2025-11-20 15:17:08.858141643 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tags.html 2025-11-20 15:17:08.866141691 +0000 @@ -751,7 +751,7 @@ Erlang programming language

        -

        Copyright © 1996-2025 Ericsson AB

        +

        Copyright © 1996-2041 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/tools.epub/OEBPS/content.opf 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/content.opf 2041-12-23 04:28:48.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> tools - 4.1.3 - urn:uuid:7fcf65a4-d451-70ab-bdb1-34e86ddc5451 + urn:uuid:4df759ba-d6bc-683c-288e-4770305c8034 en - 2025-11-20T15:10:25Z + 2041-12-23T04:28:48Z /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/tools.epub/OEBPS/cover_chapter.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/cover_chapter.xhtml 2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/cover.xhtml	2025-11-20 15:10:25.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/cover.xhtml	2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml 2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/cprof.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/cprof.xhtml 2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/erlang-el.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/erlang-el.xhtml 2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml 2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/fprof.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/fprof.xhtml 2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml	2025-11-20 15:10:25.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml	2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/make.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/make.xhtml 2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/notes.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/notes.xhtml 2041-12-23 04:28:48.000000000 +0000 @@ -17,37 +17,37 @@

    Tools Release Notes

    -

    This document describes the changes made to the Tools application.

    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.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.3/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.3/doc/html/tools.epub/OEBPS/tprof.xhtml 2025-11-20 15:10:25.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/tprof.xhtml 2041-12-23 04:28:48.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.3/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.3/doc/html/tools.epub/OEBPS/xref_chapter.xhtml	2025-11-20 15:10:25.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/xref_chapter.xhtml	2041-12-23 04:28:48.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.3/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.3/doc/html/tprof.html 2025-11-20 15:17:09.166143474 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tprof.html 2025-11-20 15:17:09.170143497 +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.3/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.3/doc/html/xref.html	2025-11-20 15:17:09.230143854 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref.html	2025-11-20 15:17:09.238143902 +0000
      @@ -3681,7 +3681,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2025 Ericsson AB

      +

      Copyright © 1996-2041 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/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.3/doc/html/xref_chapter.html 2025-11-20 15:17:09.262144045 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref_chapter.html 2025-11-20 15:17:09.266144068 +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-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/404.html 2025-11-20 15:17:09.282144163 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/404.html 2025-11-20 15:17:09.282144163 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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/wx-2.5.2/doc/html/api-reference.html 2025-11-20 15:17:09.450145161 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/api-reference.html 2025-11-20 15:17:09.454145186 +0000 @@ -2351,7 +2351,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/chapter.html 2025-11-20 15:17:09.478145327 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/chapter.html 2025-11-20 15:17:09.482145352 +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-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/gl.html 2025-11-20 15:17:09.774147086 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/gl.html 2025-11-20 15:17:09.774147086 +0000 @@ -41014,7 +41014,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/glu.html 2025-11-20 15:17:09.830147420 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/glu.html 2025-11-20 15:17:09.834147443 +0000 @@ -1786,7 +1786,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/notes.html 2025-11-20 15:17:09.870147656 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/notes.html 2025-11-20 15:17:09.874147681 +0000 @@ -204,7 +204,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/search.html 2025-11-20 15:17:09.894147800 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/search.html 2025-11-20 15:17:09.898147822 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wx.epub/OEBPS/chapter.xhtml 2025-11-20 15:11:13.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub/OEBPS/chapter.xhtml 2041-12-23 04:29:29.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.2/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.2/doc/html/wx.epub/OEBPS/content.opf 2025-11-20 15:11:13.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub/OEBPS/content.opf 2041-12-23 04:29:29.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> wx - 2.5.2 - urn:uuid:4fb83b1e-7b07-54c5-cfd0-bdebcac70daf + urn:uuid:2e99bbb3-4ca0-6ea4-e78a-9eb117648a7c en - 2025-11-20T15:11:12Z + 2041-12-23T04:29:29Z /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wx.epub/OEBPS/wx_object.xhtml 2025-11-20 15:11:13.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub/OEBPS/wx_object.xhtml 2041-12-23 04:29:29.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.2/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.2/doc/html/wx.html 2025-11-20 15:17:10.466151197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.html 2025-11-20 15:17:10.474151245 +0000 @@ -1428,7 +1428,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAcceleratorEntry.html 2025-11-20 15:17:10.506151436 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorEntry.html 2025-11-20 15:17:10.506151436 +0000 @@ -525,7 +525,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAcceleratorTable.html 2025-11-20 15:17:10.526151554 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorTable.html 2025-11-20 15:17:10.530151578 +0000 @@ -398,7 +398,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxActivateEvent.html 2025-11-20 15:17:10.554151720 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxActivateEvent.html 2025-11-20 15:17:10.558151745 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxArtProvider.html 2025-11-20 15:17:10.582151887 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxArtProvider.html 2025-11-20 15:17:10.582151887 +0000 @@ -385,7 +385,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAuiDockArt.html 2025-11-20 15:17:10.610152054 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiDockArt.html 2025-11-20 15:17:10.614152077 +0000 @@ -438,7 +438,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAuiManager.html 2025-11-20 15:17:10.650152290 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManager.html 2025-11-20 15:17:10.650152290 +0000 @@ -1426,7 +1426,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAuiManagerEvent.html 2025-11-20 15:17:10.674152433 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManagerEvent.html 2025-11-20 15:17:10.682152481 +0000 @@ -779,7 +779,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAuiNotebook.html 2025-11-20 15:17:10.710152647 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebook.html 2025-11-20 15:17:10.714152672 +0000 @@ -1382,7 +1382,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAuiNotebookEvent.html 2025-11-20 15:17:10.746152861 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebookEvent.html 2025-11-20 15:17:10.742152838 +0000 @@ -518,7 +518,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAuiPaneInfo.html 2025-11-20 15:17:10.798153170 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiPaneInfo.html 2025-11-20 15:17:10.806153217 +0000 @@ -4062,7 +4062,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAuiSimpleTabArt.html 2025-11-20 15:17:10.826153336 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiSimpleTabArt.html 2025-11-20 15:17:10.830153361 +0000 @@ -281,7 +281,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxAuiTabArt.html 2025-11-20 15:17:10.850153479 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiTabArt.html 2025-11-20 15:17:10.854153503 +0000 @@ -434,7 +434,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBitmap.html 2025-11-20 15:17:10.882153670 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmap.html 2025-11-20 15:17:10.886153693 +0000 @@ -1344,7 +1344,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBitmapButton.html 2025-11-20 15:17:10.906153812 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapButton.html 2025-11-20 15:17:10.910153836 +0000 @@ -504,7 +504,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBitmapDataObject.html 2025-11-20 15:17:10.938154002 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapDataObject.html 2025-11-20 15:17:10.938154002 +0000 @@ -399,7 +399,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBookCtrlBase.html 2025-11-20 15:17:10.970154193 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlBase.html 2025-11-20 15:17:10.974154215 +0000 @@ -923,7 +923,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBookCtrlEvent.html 2025-11-20 15:17:11.006154406 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlEvent.html 2025-11-20 15:17:11.002154383 +0000 @@ -442,7 +442,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBoxSizer.html 2025-11-20 15:17:11.034154572 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBoxSizer.html 2025-11-20 15:17:11.034154572 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBrush.html 2025-11-20 15:17:11.054154692 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBrush.html 2025-11-20 15:17:11.058154715 +0000 @@ -713,7 +713,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBufferedDC.html 2025-11-20 15:17:11.082154858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedDC.html 2025-11-20 15:17:11.090154906 +0000 @@ -536,7 +536,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxBufferedPaintDC.html 2025-11-20 15:17:11.110155024 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedPaintDC.html 2025-11-20 15:17:11.114155047 +0000 @@ -373,7 +373,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxButton.html 2025-11-20 15:17:11.142155215 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxButton.html 2025-11-20 15:17:11.142155215 +0000 @@ -882,7 +882,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCalendarCtrl.html 2025-11-20 15:17:11.182155451 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarCtrl.html 2025-11-20 15:17:11.178155428 +0000 @@ -1355,7 +1355,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCalendarDateAttr.html 2025-11-20 15:17:11.218155665 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarDateAttr.html 2025-11-20 15:17:11.218155665 +0000 @@ -1011,7 +1011,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCalendarEvent.html 2025-11-20 15:17:11.242155809 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarEvent.html 2025-11-20 15:17:11.242155809 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCaret.html 2025-11-20 15:17:11.278156022 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCaret.html 2025-11-20 15:17:11.274155999 +0000 @@ -951,7 +951,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCheckBox.html 2025-11-20 15:17:11.306156188 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckBox.html 2025-11-20 15:17:11.310156213 +0000 @@ -730,7 +730,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCheckListBox.html 2025-11-20 15:17:11.342156402 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckListBox.html 2025-11-20 15:17:11.338156379 +0000 @@ -481,7 +481,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxChildFocusEvent.html 2025-11-20 15:17:11.362156522 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChildFocusEvent.html 2025-11-20 15:17:11.362156522 +0000 @@ -318,7 +318,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxChoice.html 2025-11-20 15:17:11.386156663 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoice.html 2025-11-20 15:17:11.386156663 +0000 @@ -615,7 +615,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxChoicebook.html 2025-11-20 15:17:11.414156831 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoicebook.html 2025-11-20 15:17:11.414156831 +0000 @@ -1323,7 +1323,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxClientDC.html 2025-11-20 15:17:11.438156972 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClientDC.html 2025-11-20 15:17:11.442156997 +0000 @@ -288,7 +288,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxClipboard.html 2025-11-20 15:17:11.478157211 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboard.html 2025-11-20 15:17:11.478157211 +0000 @@ -766,7 +766,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxClipboardTextEvent.html 2025-11-20 15:17:11.498157329 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboardTextEvent.html 2025-11-20 15:17:11.502157353 +0000 @@ -265,7 +265,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCloseEvent.html 2025-11-20 15:17:11.526157496 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCloseEvent.html 2025-11-20 15:17:11.530157520 +0000 @@ -521,7 +521,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxColourData.html 2025-11-20 15:17:11.550157638 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourData.html 2025-11-20 15:17:11.554157662 +0000 @@ -513,7 +513,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxColourDialog.html 2025-11-20 15:17:11.578157804 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourDialog.html 2025-11-20 15:17:11.578157804 +0000 @@ -482,7 +482,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxColourPickerCtrl.html 2025-11-20 15:17:11.606157971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerCtrl.html 2025-11-20 15:17:11.606157971 +0000 @@ -536,7 +536,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxColourPickerEvent.html 2025-11-20 15:17:11.630158113 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerEvent.html 2025-11-20 15:17:11.634158138 +0000 @@ -315,7 +315,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxComboBox.html 2025-11-20 15:17:11.658158280 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxComboBox.html 2025-11-20 15:17:11.666158328 +0000 @@ -1255,7 +1255,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCommandEvent.html 2025-11-20 15:17:11.698158517 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCommandEvent.html 2025-11-20 15:17:11.698158517 +0000 @@ -651,7 +651,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxContextMenuEvent.html 2025-11-20 15:17:11.726158683 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxContextMenuEvent.html 2025-11-20 15:17:11.726158683 +0000 @@ -364,7 +364,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxControl.html 2025-11-20 15:17:11.758158874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControl.html 2025-11-20 15:17:11.758158874 +0000 @@ -287,7 +287,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxControlWithItems.html 2025-11-20 15:17:11.790159065 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControlWithItems.html 2025-11-20 15:17:11.794159088 +0000 @@ -1138,7 +1138,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxCursor.html 2025-11-20 15:17:11.822159254 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCursor.html 2025-11-20 15:17:11.826159278 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDC.html 2025-11-20 15:17:11.874159563 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDC.html 2025-11-20 15:17:11.874159563 +0000 @@ -4021,7 +4021,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDCOverlay.html 2025-11-20 15:17:11.906159754 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDCOverlay.html 2025-11-20 15:17:11.906159754 +0000 @@ -364,7 +364,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDataObject.html 2025-11-20 15:17:11.934159919 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDataObject.html 2025-11-20 15:17:11.934159919 +0000 @@ -223,7 +223,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDateEvent.html 2025-11-20 15:17:11.950160015 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDateEvent.html 2025-11-20 15:17:11.954160038 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDatePickerCtrl.html 2025-11-20 15:17:11.986160228 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDatePickerCtrl.html 2025-11-20 15:17:11.986160228 +0000 @@ -545,7 +545,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDialog.html 2025-11-20 15:17:12.010160372 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDialog.html 2025-11-20 15:17:12.018160419 +0000 @@ -914,7 +914,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDirDialog.html 2025-11-20 15:17:12.038160537 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirDialog.html 2025-11-20 15:17:12.042160562 +0000 @@ -494,7 +494,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDirPickerCtrl.html 2025-11-20 15:17:12.074160752 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirPickerCtrl.html 2025-11-20 15:17:12.074160752 +0000 @@ -544,7 +544,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDisplay.html 2025-11-20 15:17:12.106160941 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplay.html 2025-11-20 15:17:12.102160917 +0000 @@ -670,7 +670,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDisplayChangedEvent.html 2025-11-20 15:17:12.126161059 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplayChangedEvent.html 2025-11-20 15:17:12.130161084 +0000 @@ -258,7 +258,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxDropFilesEvent.html 2025-11-20 15:17:12.162161273 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDropFilesEvent.html 2025-11-20 15:17:12.162161273 +0000 @@ -395,7 +395,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxEraseEvent.html 2025-11-20 15:17:12.186161417 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEraseEvent.html 2025-11-20 15:17:12.186161417 +0000 @@ -317,7 +317,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxEvent.html 2025-11-20 15:17:12.214161582 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvent.html 2025-11-20 15:17:12.218161607 +0000 @@ -564,7 +564,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxEvtHandler.html 2025-11-20 15:17:12.242161748 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvtHandler.html 2025-11-20 15:17:12.242161748 +0000 @@ -631,7 +631,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFileDataObject.html 2025-11-20 15:17:12.270161916 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDataObject.html 2025-11-20 15:17:12.270161916 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFileDialog.html 2025-11-20 15:17:12.298162082 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDialog.html 2025-11-20 15:17:12.306162130 +0000 @@ -901,7 +901,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFileDirPickerEvent.html 2025-11-20 15:17:12.330162271 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDirPickerEvent.html 2025-11-20 15:17:12.334162296 +0000 @@ -315,7 +315,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFilePickerCtrl.html 2025-11-20 15:17:12.366162486 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFilePickerCtrl.html 2025-11-20 15:17:12.366162486 +0000 @@ -547,7 +547,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFindReplaceData.html 2025-11-20 15:17:12.394162653 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceData.html 2025-11-20 15:17:12.398162675 +0000 @@ -549,7 +549,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFindReplaceDialog.html 2025-11-20 15:17:12.422162819 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceDialog.html 2025-11-20 15:17:12.422162819 +0000 @@ -493,7 +493,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFlexGridSizer.html 2025-11-20 15:17:12.446162962 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFlexGridSizer.html 2025-11-20 15:17:12.450162984 +0000 @@ -816,7 +816,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFocusEvent.html 2025-11-20 15:17:12.478163151 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFocusEvent.html 2025-11-20 15:17:12.478163151 +0000 @@ -323,7 +323,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFont.html 2025-11-20 15:17:12.506163318 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFont.html 2025-11-20 15:17:12.514163366 +0000 @@ -1176,7 +1176,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFontData.html 2025-11-20 15:17:12.538163507 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontData.html 2025-11-20 15:17:12.538163507 +0000 @@ -814,7 +814,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFontDialog.html 2025-11-20 15:17:12.570163698 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontDialog.html 2025-11-20 15:17:12.570163698 +0000 @@ -401,7 +401,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFontPickerCtrl.html 2025-11-20 15:17:12.594163841 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerCtrl.html 2025-11-20 15:17:12.594163841 +0000 @@ -616,7 +616,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFontPickerEvent.html 2025-11-20 15:17:12.622164007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerEvent.html 2025-11-20 15:17:12.622164007 +0000 @@ -314,7 +314,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxFrame.html 2025-11-20 15:17:12.654164198 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFrame.html 2025-11-20 15:17:12.654164198 +0000 @@ -1237,7 +1237,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGBSizerItem.html 2025-11-20 15:17:12.674164316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGBSizerItem.html 2025-11-20 15:17:12.674164316 +0000 @@ -189,7 +189,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGCDC.html 2025-11-20 15:17:12.702164482 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGCDC.html 2025-11-20 15:17:12.706164507 +0000 @@ -409,7 +409,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGLCanvas.html 2025-11-20 15:17:12.730164648 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLCanvas.html 2025-11-20 15:17:12.730164648 +0000 @@ -509,7 +509,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGLContext.html 2025-11-20 15:17:12.754164791 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLContext.html 2025-11-20 15:17:12.754164791 +0000 @@ -422,7 +422,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGauge.html 2025-11-20 15:17:12.778164934 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGauge.html 2025-11-20 15:17:12.782164957 +0000 @@ -697,7 +697,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGenericDirCtrl.html 2025-11-20 15:17:12.810165123 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGenericDirCtrl.html 2025-11-20 15:17:12.814165148 +0000 @@ -1065,7 +1065,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsBrush.html 2025-11-20 15:17:12.834165266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsBrush.html 2025-11-20 15:17:12.834165266 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsContext.html 2025-11-20 15:17:12.870165480 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsContext.html 2025-11-20 15:17:12.878165527 +0000 @@ -2184,7 +2184,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsFont.html 2025-11-20 15:17:12.898165646 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsFont.html 2025-11-20 15:17:12.902165671 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsGradientStops.html 2025-11-20 15:17:12.926165814 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsGradientStops.html 2025-11-20 15:17:12.930165836 +0000 @@ -589,7 +589,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsMatrix.html 2025-11-20 15:17:12.954165980 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsMatrix.html 2025-11-20 15:17:12.958166003 +0000 @@ -681,7 +681,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsObject.html 2025-11-20 15:17:12.986166170 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsObject.html 2025-11-20 15:17:12.990166194 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsPath.html 2025-11-20 15:17:13.018166359 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPath.html 2025-11-20 15:17:13.022166384 +0000 @@ -1139,7 +1139,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsPen.html 2025-11-20 15:17:13.046166525 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPen.html 2025-11-20 15:17:13.046166525 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGraphicsRenderer.html 2025-11-20 15:17:13.082166740 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsRenderer.html 2025-11-20 15:17:13.082166740 +0000 @@ -674,7 +674,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGrid.html 2025-11-20 15:17:13.158167191 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGrid.html 2025-11-20 15:17:13.166167239 +0000 @@ -8414,7 +8414,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridBagSizer.html 2025-11-20 15:17:13.198167430 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridBagSizer.html 2025-11-20 15:17:13.206167477 +0000 @@ -1129,7 +1129,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellAttr.html 2025-11-20 15:17:13.230167620 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellAttr.html 2025-11-20 15:17:13.234167644 +0000 @@ -1060,7 +1060,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellBoolEditor.html 2025-11-20 15:17:13.262167809 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolEditor.html 2025-11-20 15:17:13.262167809 +0000 @@ -401,7 +401,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellBoolRenderer.html 2025-11-20 15:17:13.286167953 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolRenderer.html 2025-11-20 15:17:13.290167976 +0000 @@ -279,7 +279,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellChoiceEditor.html 2025-11-20 15:17:13.318168143 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellChoiceEditor.html 2025-11-20 15:17:13.318168143 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellEditor.html 2025-11-20 15:17:13.342168285 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellEditor.html 2025-11-20 15:17:13.346168309 +0000 @@ -568,7 +568,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellFloatEditor.html 2025-11-20 15:17:13.366168427 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatEditor.html 2025-11-20 15:17:13.374168476 +0000 @@ -359,7 +359,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellFloatRenderer.html 2025-11-20 15:17:13.398168618 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatRenderer.html 2025-11-20 15:17:13.402168641 +0000 @@ -511,7 +511,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellNumberEditor.html 2025-11-20 15:17:13.426168785 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberEditor.html 2025-11-20 15:17:13.430168808 +0000 @@ -395,7 +395,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellNumberRenderer.html 2025-11-20 15:17:13.458168975 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberRenderer.html 2025-11-20 15:17:13.462168998 +0000 @@ -279,7 +279,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellRenderer.html 2025-11-20 15:17:13.482169116 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellRenderer.html 2025-11-20 15:17:13.486169141 +0000 @@ -304,7 +304,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellStringRenderer.html 2025-11-20 15:17:13.510169284 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellStringRenderer.html 2025-11-20 15:17:13.514169307 +0000 @@ -280,7 +280,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridCellTextEditor.html 2025-11-20 15:17:13.534169425 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellTextEditor.html 2025-11-20 15:17:13.538169450 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridEvent.html 2025-11-20 15:17:13.570169639 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridEvent.html 2025-11-20 15:17:13.570169639 +0000 @@ -602,7 +602,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxGridSizer.html 2025-11-20 15:17:13.590169759 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridSizer.html 2025-11-20 15:17:13.598169807 +0000 @@ -708,7 +708,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxHelpEvent.html 2025-11-20 15:17:13.618169925 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHelpEvent.html 2025-11-20 15:17:13.622169948 +0000 @@ -436,7 +436,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxHtmlEasyPrinting.html 2025-11-20 15:17:13.650170116 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlEasyPrinting.html 2025-11-20 15:17:13.654170139 +0000 @@ -925,7 +925,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxHtmlLinkEvent.html 2025-11-20 15:17:13.674170257 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlLinkEvent.html 2025-11-20 15:17:13.678170282 +0000 @@ -316,7 +316,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxHtmlWindow.html 2025-11-20 15:17:13.710170471 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlWindow.html 2025-11-20 15:17:13.714170496 +0000 @@ -1314,7 +1314,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxIcon.html 2025-11-20 15:17:13.738170639 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIcon.html 2025-11-20 15:17:13.742170661 +0000 @@ -411,7 +411,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxIconBundle.html 2025-11-20 15:17:13.770170828 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconBundle.html 2025-11-20 15:17:13.774170852 +0000 @@ -565,7 +565,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxIconizeEvent.html 2025-11-20 15:17:13.794170970 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconizeEvent.html 2025-11-20 15:17:13.798170995 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxIdleEvent.html 2025-11-20 15:17:13.822171137 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIdleEvent.html 2025-11-20 15:17:13.826171161 +0000 @@ -500,7 +500,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxImage.html 2025-11-20 15:17:13.878171470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImage.html 2025-11-20 15:17:13.882171493 +0000 @@ -3824,7 +3824,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxImageList.html 2025-11-20 15:17:13.918171707 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImageList.html 2025-11-20 15:17:13.926171755 +0000 @@ -938,7 +938,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxInitDialogEvent.html 2025-11-20 15:17:13.950171898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxInitDialogEvent.html 2025-11-20 15:17:13.950171898 +0000 @@ -257,7 +257,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxJoystickEvent.html 2025-11-20 15:17:13.978172064 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxJoystickEvent.html 2025-11-20 15:17:13.982172088 +0000 @@ -820,7 +820,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxKeyEvent.html 2025-11-20 15:17:14.014172277 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxKeyEvent.html 2025-11-20 15:17:14.014172277 +0000 @@ -894,7 +894,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxLayoutAlgorithm.html 2025-11-20 15:17:14.042172444 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLayoutAlgorithm.html 2025-11-20 15:17:14.046172468 +0000 @@ -564,7 +564,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxListBox.html 2025-11-20 15:17:14.074172634 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListBox.html 2025-11-20 15:17:14.078172659 +0000 @@ -780,7 +780,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxListCtrl.html 2025-11-20 15:17:14.126172943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListCtrl.html 2025-11-20 15:17:14.126172943 +0000 @@ -3215,7 +3215,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxListEvent.html 2025-11-20 15:17:14.162173157 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListEvent.html 2025-11-20 15:17:14.158173134 +0000 @@ -796,7 +796,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxListItem.html 2025-11-20 15:17:14.190173323 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItem.html 2025-11-20 15:17:14.190173323 +0000 @@ -1237,7 +1237,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxListItemAttr.html 2025-11-20 15:17:14.218173491 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItemAttr.html 2025-11-20 15:17:14.222173513 +0000 @@ -660,7 +660,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxListView.html 2025-11-20 15:17:14.250173680 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListView.html 2025-11-20 15:17:14.254173704 +0000 @@ -554,7 +554,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxListbook.html 2025-11-20 15:17:14.286173893 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListbook.html 2025-11-20 15:17:14.282173871 +0000 @@ -1322,7 +1322,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxLocale.html 2025-11-20 15:17:14.318174084 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLocale.html 2025-11-20 15:17:14.322174109 +0000 @@ -1336,7 +1336,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxLogNull.html 2025-11-20 15:17:14.346174250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLogNull.html 2025-11-20 15:17:14.346174250 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMDIChildFrame.html 2025-11-20 15:17:14.366174370 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIChildFrame.html 2025-11-20 15:17:14.370174393 +0000 @@ -619,7 +619,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMDIClientWindow.html 2025-11-20 15:17:14.394174536 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIClientWindow.html 2025-11-20 15:17:14.398174559 +0000 @@ -370,7 +370,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMDIParentFrame.html 2025-11-20 15:17:14.430174750 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIParentFrame.html 2025-11-20 15:17:14.434174773 +0000 @@ -787,7 +787,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMask.html 2025-11-20 15:17:14.466174964 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMask.html 2025-11-20 15:17:14.462174940 +0000 @@ -439,7 +439,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMaximizeEvent.html 2025-11-20 15:17:14.490175107 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMaximizeEvent.html 2025-11-20 15:17:14.490175107 +0000 @@ -260,7 +260,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMemoryDC.html 2025-11-20 15:17:14.518175273 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMemoryDC.html 2025-11-20 15:17:14.526175320 +0000 @@ -412,7 +412,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMenu.html 2025-11-20 15:17:14.558175511 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenu.html 2025-11-20 15:17:14.570175582 +0000 @@ -2209,7 +2209,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMenuBar.html 2025-11-20 15:17:14.602175772 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuBar.html 2025-11-20 15:17:14.602175772 +0000 @@ -1423,7 +1423,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMenuEvent.html 2025-11-20 15:17:14.630175938 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuEvent.html 2025-11-20 15:17:14.634175961 +0000 @@ -403,7 +403,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMenuItem.html 2025-11-20 15:17:14.666176152 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuItem.html 2025-11-20 15:17:14.674176200 +0000 @@ -1390,7 +1390,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMessageDialog.html 2025-11-20 15:17:14.702176365 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMessageDialog.html 2025-11-20 15:17:14.702176365 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMiniFrame.html 2025-11-20 15:17:14.730176532 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMiniFrame.html 2025-11-20 15:17:14.730176532 +0000 @@ -457,7 +457,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMirrorDC.html 2025-11-20 15:17:14.750176651 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMirrorDC.html 2025-11-20 15:17:14.754176675 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMouseCaptureChangedEvent.html 2025-11-20 15:17:14.782176841 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureChangedEvent.html 2025-11-20 15:17:14.782176841 +0000 @@ -316,7 +316,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMouseCaptureLostEvent.html 2025-11-20 15:17:14.806176984 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureLostEvent.html 2025-11-20 15:17:14.806176984 +0000 @@ -262,7 +262,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMouseEvent.html 2025-11-20 15:17:14.838177174 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseEvent.html 2025-11-20 15:17:14.838177174 +0000 @@ -2041,7 +2041,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMoveEvent.html 2025-11-20 15:17:14.862177316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMoveEvent.html 2025-11-20 15:17:14.862177316 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxMultiChoiceDialog.html 2025-11-20 15:17:14.886177459 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMultiChoiceDialog.html 2025-11-20 15:17:14.886177459 +0000 @@ -406,7 +406,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxNavigationKeyEvent.html 2025-11-20 15:17:14.918177650 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNavigationKeyEvent.html 2025-11-20 15:17:14.918177650 +0000 @@ -589,7 +589,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxNotebook.html 2025-11-20 15:17:14.946177816 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotebook.html 2025-11-20 15:17:14.946177816 +0000 @@ -808,7 +808,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxNotificationMessage.html 2025-11-20 15:17:14.978178006 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotificationMessage.html 2025-11-20 15:17:14.982178029 +0000 @@ -896,7 +896,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxNotifyEvent.html 2025-11-20 15:17:15.002178148 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotifyEvent.html 2025-11-20 15:17:15.006178172 +0000 @@ -325,7 +325,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxOverlay.html 2025-11-20 15:17:15.030178315 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxOverlay.html 2025-11-20 15:17:15.034178338 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPageSetupDialog.html 2025-11-20 15:17:15.058178481 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialog.html 2025-11-20 15:17:15.062178504 +0000 @@ -404,7 +404,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPageSetupDialogData.html 2025-11-20 15:17:15.094178695 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialogData.html 2025-11-20 15:17:15.098178718 +0000 @@ -1444,7 +1444,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPaintDC.html 2025-11-20 15:17:15.126178885 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintDC.html 2025-11-20 15:17:15.130178908 +0000 @@ -285,7 +285,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPaintEvent.html 2025-11-20 15:17:15.154179052 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintEvent.html 2025-11-20 15:17:15.154179052 +0000 @@ -266,7 +266,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPalette.html 2025-11-20 15:17:15.182179218 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPalette.html 2025-11-20 15:17:15.186179241 +0000 @@ -596,7 +596,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPaletteChangedEvent.html 2025-11-20 15:17:15.210179384 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaletteChangedEvent.html 2025-11-20 15:17:15.210179384 +0000 @@ -351,7 +351,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPanel.html 2025-11-20 15:17:15.230179503 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPanel.html 2025-11-20 15:17:15.234179527 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPasswordEntryDialog.html 2025-11-20 15:17:15.262179693 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPasswordEntryDialog.html 2025-11-20 15:17:15.262179693 +0000 @@ -326,7 +326,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPen.html 2025-11-20 15:17:15.286179836 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPen.html 2025-11-20 15:17:15.290179859 +0000 @@ -827,7 +827,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPickerBase.html 2025-11-20 15:17:15.306179954 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPickerBase.html 2025-11-20 15:17:15.310179979 +0000 @@ -747,7 +747,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPopupTransientWindow.html 2025-11-20 15:17:15.334180120 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupTransientWindow.html 2025-11-20 15:17:15.338180145 +0000 @@ -474,7 +474,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPopupWindow.html 2025-11-20 15:17:15.362180288 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupWindow.html 2025-11-20 15:17:15.362180288 +0000 @@ -483,7 +483,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPostScriptDC.html 2025-11-20 15:17:15.386180429 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPostScriptDC.html 2025-11-20 15:17:15.390180454 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPreviewCanvas.html 2025-11-20 15:17:15.414180597 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewCanvas.html 2025-11-20 15:17:15.418180620 +0000 @@ -186,7 +186,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPreviewControlBar.html 2025-11-20 15:17:15.434180715 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewControlBar.html 2025-11-20 15:17:15.438180738 +0000 @@ -484,7 +484,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPreviewFrame.html 2025-11-20 15:17:15.462180881 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewFrame.html 2025-11-20 15:17:15.462180881 +0000 @@ -485,7 +485,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPrintData.html 2025-11-20 15:17:15.494181072 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintData.html 2025-11-20 15:17:15.490181047 +0000 @@ -1050,7 +1050,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPrintDialog.html 2025-11-20 15:17:15.514181190 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialog.html 2025-11-20 15:17:15.514181190 +0000 @@ -398,7 +398,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPrintDialogData.html 2025-11-20 15:17:15.546181381 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialogData.html 2025-11-20 15:17:15.550181404 +0000 @@ -1235,7 +1235,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPrintPreview.html 2025-11-20 15:17:15.586181618 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintPreview.html 2025-11-20 15:17:15.582181595 +0000 @@ -998,7 +998,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPrinter.html 2025-11-20 15:17:15.614181785 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrinter.html 2025-11-20 15:17:15.618181808 +0000 @@ -685,7 +685,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxPrintout.html 2025-11-20 15:17:15.646181974 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintout.html 2025-11-20 15:17:15.646181974 +0000 @@ -1198,7 +1198,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxProgressDialog.html 2025-11-20 15:17:15.670182117 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxProgressDialog.html 2025-11-20 15:17:15.678182165 +0000 @@ -458,7 +458,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxQueryNewPaletteEvent.html 2025-11-20 15:17:15.706182331 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxQueryNewPaletteEvent.html 2025-11-20 15:17:15.706182331 +0000 @@ -353,7 +353,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxRadioBox.html 2025-11-20 15:17:15.738182522 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioBox.html 2025-11-20 15:17:15.734182497 +0000 @@ -1086,7 +1086,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxRadioButton.html 2025-11-20 15:17:15.762182663 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioButton.html 2025-11-20 15:17:15.770182711 +0000 @@ -543,7 +543,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxRegion.html 2025-11-20 15:17:15.798182878 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRegion.html 2025-11-20 15:17:15.802182901 +0000 @@ -1170,7 +1170,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSashEvent.html 2025-11-20 15:17:15.830183067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashEvent.html 2025-11-20 15:17:15.830183067 +0000 @@ -406,7 +406,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSashLayoutWindow.html 2025-11-20 15:17:15.862183258 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashLayoutWindow.html 2025-11-20 15:17:15.862183258 +0000 @@ -653,7 +653,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSashWindow.html 2025-11-20 15:17:15.890183424 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashWindow.html 2025-11-20 15:17:15.890183424 +0000 @@ -746,7 +746,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxScreenDC.html 2025-11-20 15:17:15.910183543 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScreenDC.html 2025-11-20 15:17:15.914183567 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxScrollBar.html 2025-11-20 15:17:15.946183758 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollBar.html 2025-11-20 15:17:15.946183758 +0000 @@ -758,7 +758,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxScrollEvent.html 2025-11-20 15:17:15.970183899 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollEvent.html 2025-11-20 15:17:15.966183876 +0000 @@ -367,7 +367,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxScrollWinEvent.html 2025-11-20 15:17:15.998184067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollWinEvent.html 2025-11-20 15:17:15.994184042 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxScrolledWindow.html 2025-11-20 15:17:16.026184233 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrolledWindow.html 2025-11-20 15:17:16.030184256 +0000 @@ -1032,7 +1032,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSetCursorEvent.html 2025-11-20 15:17:16.054184399 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSetCursorEvent.html 2025-11-20 15:17:16.054184399 +0000 @@ -473,7 +473,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxShowEvent.html 2025-11-20 15:17:16.082184565 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxShowEvent.html 2025-11-20 15:17:16.086184589 +0000 @@ -354,7 +354,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSingleChoiceDialog.html 2025-11-20 15:17:16.114184756 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSingleChoiceDialog.html 2025-11-20 15:17:16.110184731 +0000 @@ -445,7 +445,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSizeEvent.html 2025-11-20 15:17:16.138184898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizeEvent.html 2025-11-20 15:17:16.138184898 +0000 @@ -363,7 +363,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSizer.html 2025-11-20 15:17:16.186185183 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizer.html 2025-11-20 15:17:16.186185183 +0000 @@ -2311,7 +2311,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSizerFlags.html 2025-11-20 15:17:16.218185374 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerFlags.html 2025-11-20 15:17:16.218185374 +0000 @@ -710,7 +710,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSizerItem.html 2025-11-20 15:17:16.250185563 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerItem.html 2025-11-20 15:17:16.258185610 +0000 @@ -1656,7 +1656,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSlider.html 2025-11-20 15:17:16.290185801 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSlider.html 2025-11-20 15:17:16.294185824 +0000 @@ -903,7 +903,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSpinButton.html 2025-11-20 15:17:16.322185992 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinButton.html 2025-11-20 15:17:16.326186014 +0000 @@ -646,7 +646,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSpinCtrl.html 2025-11-20 15:17:16.354186181 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinCtrl.html 2025-11-20 15:17:16.354186181 +0000 @@ -698,7 +698,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSpinEvent.html 2025-11-20 15:17:16.378186323 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinEvent.html 2025-11-20 15:17:16.378186323 +0000 @@ -351,7 +351,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSplashScreen.html 2025-11-20 15:17:16.406186490 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplashScreen.html 2025-11-20 15:17:16.406186490 +0000 @@ -412,7 +412,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSplitterEvent.html 2025-11-20 15:17:16.430186633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterEvent.html 2025-11-20 15:17:16.434186656 +0000 @@ -475,7 +475,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSplitterWindow.html 2025-11-20 15:17:16.462186823 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterWindow.html 2025-11-20 15:17:16.466186846 +0000 @@ -1308,7 +1308,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStaticBitmap.html 2025-11-20 15:17:16.490186990 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBitmap.html 2025-11-20 15:17:16.498187037 +0000 @@ -537,7 +537,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStaticBox.html 2025-11-20 15:17:16.526187203 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBox.html 2025-11-20 15:17:16.526187203 +0000 @@ -460,7 +460,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStaticBoxSizer.html 2025-11-20 15:17:16.550187346 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBoxSizer.html 2025-11-20 15:17:16.550187346 +0000 @@ -365,7 +365,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStaticLine.html 2025-11-20 15:17:16.574187489 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticLine.html 2025-11-20 15:17:16.574187489 +0000 @@ -527,7 +527,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStaticText.html 2025-11-20 15:17:16.602187655 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticText.html 2025-11-20 15:17:16.602187655 +0000 @@ -590,7 +590,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStatusBar.html 2025-11-20 15:17:16.630187821 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStatusBar.html 2025-11-20 15:17:16.630187821 +0000 @@ -1056,7 +1056,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStdDialogButtonSizer.html 2025-11-20 15:17:16.654187964 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStdDialogButtonSizer.html 2025-11-20 15:17:16.658187987 +0000 @@ -482,7 +482,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStyledTextCtrl.html 2025-11-20 15:17:16.786188748 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextCtrl.html 2025-11-20 15:17:16.782188724 +0000 @@ -17621,7 +17621,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxStyledTextEvent.html 2025-11-20 15:17:16.822188962 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextEvent.html 2025-11-20 15:17:16.822188962 +0000 @@ -1187,7 +1187,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSysColourChangedEvent.html 2025-11-20 15:17:16.846189105 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSysColourChangedEvent.html 2025-11-20 15:17:16.850189128 +0000 @@ -262,7 +262,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSystemOptions.html 2025-11-20 15:17:16.870189246 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemOptions.html 2025-11-20 15:17:16.870189246 +0000 @@ -444,7 +444,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxSystemSettings.html 2025-11-20 15:17:16.898189414 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemSettings.html 2025-11-20 15:17:16.894189389 +0000 @@ -403,7 +403,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTaskBarIcon.html 2025-11-20 15:17:16.918189533 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIcon.html 2025-11-20 15:17:16.922189555 +0000 @@ -480,7 +480,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTaskBarIconEvent.html 2025-11-20 15:17:16.946189698 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIconEvent.html 2025-11-20 15:17:16.950189723 +0000 @@ -260,7 +260,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTextAttr.html 2025-11-20 15:17:16.986189937 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextAttr.html 2025-11-20 15:17:16.982189912 +0000 @@ -1817,7 +1817,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTextCtrl.html 2025-11-20 15:17:17.030190198 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextCtrl.html 2025-11-20 15:17:17.026190173 +0000 @@ -2479,7 +2479,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTextDataObject.html 2025-11-20 15:17:17.058190364 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextDataObject.html 2025-11-20 15:17:17.054190341 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTextEntryDialog.html 2025-11-20 15:17:17.082190507 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextEntryDialog.html 2025-11-20 15:17:17.082190507 +0000 @@ -442,7 +442,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxToggleButton.html 2025-11-20 15:17:17.106190650 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToggleButton.html 2025-11-20 15:17:17.110190673 +0000 @@ -532,7 +532,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxToolBar.html 2025-11-20 15:17:17.150190911 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolBar.html 2025-11-20 15:17:17.150190911 +0000 @@ -2027,7 +2027,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxToolTip.html 2025-11-20 15:17:17.170191030 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolTip.html 2025-11-20 15:17:17.170191030 +0000 @@ -470,7 +470,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxToolbook.html 2025-11-20 15:17:17.202191220 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolbook.html 2025-11-20 15:17:17.206191244 +0000 @@ -1324,7 +1324,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTopLevelWindow.html 2025-11-20 15:17:17.234191409 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTopLevelWindow.html 2025-11-20 15:17:17.238191434 +0000 @@ -1106,7 +1106,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTreeCtrl.html 2025-11-20 15:17:17.294191766 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeCtrl.html 2025-11-20 15:17:17.290191743 +0000 @@ -3620,7 +3620,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTreeEvent.html 2025-11-20 15:17:17.322191932 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeEvent.html 2025-11-20 15:17:17.322191932 +0000 @@ -595,7 +595,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxTreebook.html 2025-11-20 15:17:17.354192123 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreebook.html 2025-11-20 15:17:17.362192171 +0000 @@ -1522,7 +1522,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxUpdateUIEvent.html 2025-11-20 15:17:17.390192336 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxUpdateUIEvent.html 2025-11-20 15:17:17.398192385 +0000 @@ -991,7 +991,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxWebView.html 2025-11-20 15:17:17.430192575 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebView.html 2025-11-20 15:17:17.438192622 +0000 @@ -2300,7 +2300,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxWebViewEvent.html 2025-11-20 15:17:17.466192789 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebViewEvent.html 2025-11-20 15:17:17.466192789 +0000 @@ -443,7 +443,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxWindow.html 2025-11-20 15:17:17.546193264 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindow.html 2025-11-20 15:17:17.550193287 +0000 @@ -8178,7 +8178,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxWindowCreateEvent.html 2025-11-20 15:17:17.578193454 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowCreateEvent.html 2025-11-20 15:17:17.578193454 +0000 @@ -258,7 +258,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxWindowDC.html 2025-11-20 15:17:17.602193596 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDC.html 2025-11-20 15:17:17.602193596 +0000 @@ -283,7 +283,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxWindowDestroyEvent.html 2025-11-20 15:17:17.630193763 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDestroyEvent.html 2025-11-20 15:17:17.630193763 +0000 @@ -265,7 +265,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wxXmlResource.html 2025-11-20 15:17:17.662193952 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxXmlResource.html 2025-11-20 15:17:17.662193952 +0000 @@ -1450,7 +1450,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wx_misc.html 2025-11-20 15:17:17.698194166 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_misc.html 2025-11-20 15:17:17.694194143 +0000 @@ -1331,7 +1331,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/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.2/doc/html/wx_object.html 2025-11-20 15:17:17.730194357 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_object.html 2025-11-20 15:17:17.734194381 +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-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/404.html 2025-11-20 15:17:17.750194475 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/404.html 2025-11-20 15:17:17.750194475 +0000 @@ -106,7 +106,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/api-reference.html 2025-11-20 15:17:17.770194595 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/api-reference.html 2025-11-20 15:17:17.770194595 +0000 @@ -168,7 +168,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/notes.html 2025-11-20 15:17:17.806194809 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/notes.html 2025-11-20 15:17:17.806194809 +0000 @@ -339,7 +339,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/search.html 2025-11-20 15:17:17.830194952 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/search.html 2025-11-20 15:17:17.830194952 +0000 @@ -104,7 +104,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl.html 2025-11-20 15:17:17.858195118 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl.html 2025-11-20 15:17:17.858195118 +0000 @@ -1109,7 +1109,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl_eventp.html 2025-11-20 15:17:17.882195259 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_eventp.html 2025-11-20 15:17:17.886195284 +0000 @@ -519,7 +519,7 @@ Erlang programming language

            -

            Copyright © 1996-2025 Ericsson AB

            +

            Copyright © 1996-2041 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl_examples.html 2025-11-20 15:17:17.910195427 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_examples.html 2025-11-20 15:17:17.914195450 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl_sax_parser.html 2025-11-20 15:17:17.946195641 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_sax_parser.html 2025-11-20 15:17:17.946195641 +0000 @@ -764,7 +764,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl_scan.html 2025-11-20 15:17:17.978195831 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_scan.html 2025-11-20 15:17:17.978195831 +0000 @@ -1112,7 +1112,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl_ug.html 2025-11-20 15:17:18.010196020 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_ug.html 2025-11-20 15:17:18.010196020 +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.7/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.7/doc/html/xmerl_xpath.html	2025-11-20 15:17:18.042196211 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xpath.html	2025-11-20 15:17:18.042196211 +0000
    @@ -473,7 +473,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl_xs.html 2025-11-20 15:17:18.066196354 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs.html 2025-11-20 15:17:18.066196354 +0000 @@ -344,7 +344,7 @@ Erlang programming language

    -

    Copyright © 1996-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl_xs_examples.html 2025-11-20 15:17:18.094196520 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs_examples.html 2025-11-20 15:17:18.094196520 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/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.7/doc/html/xmerl_xsd.html 2025-11-20 15:17:18.122196686 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xsd.html 2025-11-20 15:17:18.126196709 +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-2025 Ericsson AB

    +

    Copyright © 1996-2041 Ericsson AB

    RPMS.2/erlang-jinterface-28.1.1-1.1.x86_64.rpm RPMS/erlang-jinterface-28.1.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-jinterface-28.1.1-1.1.x86_64.rpm to erlang-jinterface-28.1.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 d1629a97a24f9013ca1dfbeeebf0566ac994662edb1bc6ee800d71bba5e242a4 0 +/usr/lib64/erlang/lib/jinterface-1.15/priv/OtpErlang.jar df4d7c475d9aebba9d10effe5ccca459b6dfa12052fab25a46b5cee246e99eda 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.1.1-1.1.x86_64.rpm RPMS/erlang-src-28.1.1-1.1.x86_64.rpm differ: byte 225, line 1 Comparing erlang-src-28.1.1-1.1.x86_64.rpm to erlang-src-28.1.1-1.1.x86_64.rpm comparing the rpm tags of erlang-src --- old-rpm-tags +++ new-rpm-tags @@ -1943 +1943 @@ -/usr/lib64/erlang/lib/public_key-1.18.3/src/CryptographicMessageSyntax-2009.erl c2f16c010b2cceee46fa558fae7ed9589969c44d8d2fa6f088f2f7f40797f9de 0 +/usr/lib64/erlang/lib/public_key-1.18.3/src/CryptographicMessageSyntax-2009.erl 25254c78ca0da084c084f04f550f7a0603cc1de670ac578ffad1e172cc7560b4 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.18.3/src/CryptographicMessageSyntax-2009.erl differs (ASCII text) --- old//usr/lib64/erlang/lib/public_key-1.18.3/src/CryptographicMessageSyntax-2009.erl 2025-11-05 07:53:15.000000000 +0000 +++ new//usr/lib64/erlang/lib/public_key-1.18.3/src/CryptographicMessageSyntax-2009.erl 2025-11-05 07:53:15.000000000 +0000 @@ -193,25 +193,25 @@ getenc_SupportedOtherRevokInfo/1, getenc_SupportedCertFormats/1, getenc_SupportedKeyAttributes/1, -getenc_internal_object_set_argument_57/1, -getenc_internal_object_set_argument_56/1, -getenc_internal_object_set_argument_54/1, -getenc_internal_object_set_argument_53/1, -getenc_internal_object_set_argument_52/1, getenc_internal_object_set_argument_51/1, getenc_internal_object_set_argument_50/1, getenc_internal_object_set_argument_2/1, getenc_internal_object_set_argument_38/1, -getenc_internal_object_set_argument_37/1, getenc_internal_object_set_argument_36/1, -getenc_internal_object_set_argument_35/1, +getenc_internal_object_set_argument_34/1, +getenc_internal_object_set_argument_32/1, +getenc_internal_object_set_argument_31/1, +getenc_internal_object_set_argument_30/1, getenc_internal_object_set_argument_48/1, +getenc_internal_object_set_argument_47/1, getenc_internal_object_set_argument_46/1, +getenc_internal_object_set_argument_45/1, getenc_internal_object_set_argument_44/1, getenc_internal_object_set_argument_42/1, getenc_internal_object_set_argument_40/1, getenc_internal_object_set_argument_13/1, -getenc_internal_object_set_argument_11/1 +getenc_internal_object_set_argument_11/1, +getenc_internal_object_set_argument_29/1 ]). -export([ @@ -233,25 +233,25 @@ getdec_SupportedOtherRevokInfo/1, getdec_SupportedCertFormats/1, getdec_SupportedKeyAttributes/1, -getdec_internal_object_set_argument_57/1, -getdec_internal_object_set_argument_56/1, -getdec_internal_object_set_argument_54/1, -getdec_internal_object_set_argument_53/1, -getdec_internal_object_set_argument_52/1, getdec_internal_object_set_argument_51/1, getdec_internal_object_set_argument_50/1, getdec_internal_object_set_argument_2/1, getdec_internal_object_set_argument_38/1, -getdec_internal_object_set_argument_37/1, getdec_internal_object_set_argument_36/1, -getdec_internal_object_set_argument_35/1, +getdec_internal_object_set_argument_34/1, +getdec_internal_object_set_argument_32/1, +getdec_internal_object_set_argument_31/1, +getdec_internal_object_set_argument_30/1, getdec_internal_object_set_argument_48/1, +getdec_internal_object_set_argument_47/1, getdec_internal_object_set_argument_46/1, +getdec_internal_object_set_argument_45/1, getdec_internal_object_set_argument_44/1, getdec_internal_object_set_argument_42/1, getdec_internal_object_set_argument_40/1, getdec_internal_object_set_argument_13/1, -getdec_internal_object_set_argument_11/1 +getdec_internal_object_set_argument_11/1, +getdec_internal_object_set_argument_29/1 ]). -export([ @@ -848,7 +848,7 @@ enc_SignerInfo_unsignedAttrs_Attribute(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, ObjattrType = - 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_38'( Cindex1), + 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_32'( Cindex1), %%------------------------------------------------- %% attribute attrType(1) with type OBJECT IDENTIFIER @@ -971,7 +971,7 @@ %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), -ObjFun = 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_38'(Term1), +ObjFun = 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_32'(Term1), %%------------------------------------------------- %% attribute attrValues(2) with type SET OF @@ -1030,7 +1030,7 @@ enc_SignedAttributes_Attribute(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, ObjattrType = - 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_36'( Cindex1), + 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_30'( Cindex1), %%------------------------------------------------- %% attribute attrType(1) with type OBJECT IDENTIFIER @@ -1088,7 +1088,7 @@ %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), -ObjFun = 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_36'(Term1), +ObjFun = 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_30'(Term1), %%------------------------------------------------- %% attribute attrValues(2) with type SET OF @@ -1253,7 +1253,7 @@ enc_EnvelopedData_unprotectedAttrs_Attribute(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, ObjattrType = - 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_52'( Cindex1), + 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_46'( Cindex1), %%------------------------------------------------- %% attribute attrType(1) with type OBJECT IDENTIFIER @@ -1362,7 +1362,7 @@ %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), -ObjFun = 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_52'(Term1), +ObjFun = 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_46'(Term1), %%------------------------------------------------- %% attribute attrValues(2) with type SET OF @@ -1689,7 +1689,7 @@ enc_KeyTransRecipientInfo_keyEncryptionAlgorithm(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, Objalgorithm = - 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_40'( Cindex1), + 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_34'( Cindex1), %%------------------------------------------------- %% attribute algorithm(1) with type OBJECT IDENTIFIER @@ -1776,7 +1776,7 @@ end, DecObjalgorithmTerm1 = - 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_40'(Term1), + 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_34'(Term1), Term2 = case Tmpterm1 of asn1_NOVALUE ->asn1_NOVALUE; @@ -1889,7 +1889,7 @@ enc_KeyAgreeRecipientInfo_keyEncryptionAlgorithm(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, Objalgorithm = - 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_44'( Cindex1), + 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_38'( Cindex1), %%------------------------------------------------- %% attribute algorithm(1) with type OBJECT IDENTIFIER @@ -1986,7 +1986,7 @@ end, DecObjalgorithmTerm1 = - 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_44'(Term1), + 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_38'(Term1), Term2 = case Tmpterm1 of asn1_NOVALUE ->asn1_NOVALUE; @@ -2087,7 +2087,7 @@ enc_OriginatorPublicKey_algorithm(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, Objalgorithm = - 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_42'( Cindex1), + 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_36'( Cindex1), %%------------------------------------------------- %% attribute algorithm(1) with type OBJECT IDENTIFIER @@ -2158,7 +2158,7 @@ end, DecObjalgorithmTerm1 = - 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_42'(Term1), + 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_36'(Term1), Term2 = case Tmpterm1 of asn1_NOVALUE ->asn1_NOVALUE; @@ -2869,7 +2869,7 @@ enc_EncryptedData_unprotectedAttrs_Attribute(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, ObjattrType = - 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_54'( Cindex1), + 'CryptographicMessageSyntax-2009':'getenc_internal_object_set_argument_48'( Cindex1), %%------------------------------------------------- %% attribute attrType(1) with type OBJECT IDENTIFIER @@ -2962,7 +2962,7 @@ %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), -ObjFun = 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_54'(Term1), +ObjFun = 'CryptographicMessageSyntax-2009':'getdec_internal_object_set_argument_48'(Term1), %%------------------------------------------------- %% attribute attrValues(2) with type SET OF @@ -3186,7 +3186,7 @@ enc_AuthAttributes_Attribute(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, ObjattrType = overalldiffered=5 (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.4.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.4.1/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2025-11-20 15:10:18.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/global_group.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/global_group.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/inet.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/inet.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2025-11-20 15:10:18.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2025-11-20 15:10:18.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/logger.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/net.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/net.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/notes.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/notes.xhtml 2041-12-23 04:28:43.000000000 +0000 @@ -18,9 +18,9 @@

    Kernel Release Notes

    This document describes the changes made to the Kernel application.

    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.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.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.4.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.4.1/doc/html/kernel.epub/OEBPS/os.xhtml	2025-11-20 15:10:18.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/os.xhtml	2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/pg.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/pg.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/rpc.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/rpc.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2041-12-23 04:28:43.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.4.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.4.1/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2025-11-20 15:10:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2041-12-23 04:28:43.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).