~/f/erlang/RPMS.2 ~/f/erlang ~/f/erlang 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-7C9EBC10.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-96375997.js 2 (none) 100644 root root 0 4294967295 @@ -2000 +2000 @@ -/usr/share/doc/packages/erlang-doc/doc/404.html 5fc6f09ccffbc926f2c6abe94c4f9cf85b4036b46dcf5c93f400b5e5f169d1af 2 +/usr/share/doc/packages/erlang-doc/doc/404.html 8196489dfccc6d5cddc6d29409ed0aac6e0f85364e7f1c58e99b608ade165732 2 @@ -2008 +2008 @@ -/usr/share/doc/packages/erlang-doc/doc/deprecations.html 93c6c1c951f99038f640563312c7b666991d75f72cc481b3c494c495abbf9070 2 +/usr/share/doc/packages/erlang-doc/doc/deprecations.html 35b322fb322f5e370817bea68ce659543b6475031dbfed27c85d6f438d50b9ee 2 @@ -2037 +2037 @@ -/usr/share/doc/packages/erlang-doc/doc/man_index.html ce863f26f2be75a5d0bb6b1465f0646d4f59d20d87494e2707f34ffd8a091488 2 +/usr/share/doc/packages/erlang-doc/doc/man_index.html 894c62a2e27e29252d67181313a6bfca66762dc7be2d79b7b2a5e03a9e5b50a5 2 @@ -2046 +2046 @@ -/usr/share/doc/packages/erlang-doc/doc/readme.html 1ef241ccf5e009ccda3c05299431aaa432769f4768037849e4914c0f4daca07f 2 +/usr/share/doc/packages/erlang-doc/doc/readme.html 1e24578d885226273cf81ca583656f1ba935422d98352065deb9a85f732d35e3 2 @@ -2049 +2049 @@ -/usr/share/doc/packages/erlang-doc/doc/removed.html f408ee84f694b7f95d11f36e271192276afe8d6b6b400a8b7d6be8ceb2276daa 2 +/usr/share/doc/packages/erlang-doc/doc/removed.html 17e7470dec220ac519f8bd7cf1936361a6ba4cc842d38248023c37d058ede003 2 @@ -2052,2 +2052,2 @@ -/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html ed7faa4890944d461d7d3a63f95cf115dbc6bbf68cf6839f6ebed80e9fde6269 2 -/usr/share/doc/packages/erlang-doc/doc/search.html 6e8d61907e975612d8fd41fa222215d12de8f690bdfdeeba88484b19aa101be2 2 +/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 3831bde381d17b3e87a4f5e0b77f8b45697acc3021f38c7bd6b9dcf1b8b0ab65 2 +/usr/share/doc/packages/erlang-doc/doc/search.html 75de09109edcf5a471c5df9f430a1ba8f4ea66b12762d22a0119f65c06403a7b 2 @@ -2060,4 +2060,4 @@ -/usr/share/doc/packages/erlang-doc/doc/system/404.html 03686152f361e73aeff963497726d32622a63ba97f6d90e4bc61f7f31bab8efc 2 -/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub 28228ee53caa8f514f072df5c75b6eb57f9b36141fd0646357b8ca47a78e9c71 2 -/usr/share/doc/packages/erlang-doc/doc/system/applications.html d9053020b9a0268b1815cbcc6777d02b56b786d738e829a6c5625f6651cbeb70 2 -/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 0a29c26ce7eeb0e7e9b3e684bc7b3b89e1953bc90bf9ac0e9eff87bed84b3db8 2 +/usr/share/doc/packages/erlang-doc/doc/system/404.html dfa5f1ae52623c36e7b2d8e70345e919fa37065fce2a12dae42f07d86de1b635 2 +/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub bf1bec4e676af2c944987ac749bc87155427b388f9f0e7fdf064a7f84821fd8a 2 +/usr/share/doc/packages/erlang-doc/doc/system/applications.html 54f5fed74bc6c548b4d2e190aaf94a340d99426e7d91eb6ade95b42606f31391 2 +/usr/share/doc/packages/erlang-doc/doc/system/appup_cookbook.html 0a974169ef6dd31e66d8fe64ece0b854bb9459588c5e857c3851c9e5e89fc527 2 @@ -2074,14 +2074,14 @@ -/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html e7cdc9345c61621d3ddf4b0f80081bbbb78ce0ac32e19fd762a8995803a1862d 2 -/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html 022f651b0df3bb5e9bcef2ca14284dc75ab5a6431efe7ef749182879bd7b88ea 2 -/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 92bec91f0a69d7a3fcbf604cfe60ccec6df8864505cb3b5b209ffc0e4846a5fa 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_port.html ff8f379f3882f13034162d01bdc7da41080e96138e5ee51d2dec9bdf5cf56ed8 2 -/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html cf69f8be3db0c33f061d395f344c033f955675c3fabb5f79e12a4bc5b8b3f63c 2 -/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 3d5bd78f55331675c48118ece02b8017508dfccc4d7d658c0a4d420afcfa62c2 2 -/usr/share/doc/packages/erlang-doc/doc/system/cnode.html 725cbf48efa869b6f2a2439c791d18d707e3fda76c659bf4f2c905f32ba222f6 2 -/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html ace074264aae4963600668208159ab97add0d8a971f08f6ee56621887fdb3fb5 2 -/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html 2c50233baecabd39a602b2c60ffd9931a9120e181d1819da180eb2b0fa7b24a3 2 -/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html 641ed2564cd828785ddde008572b105f0d5b9eab5dee5f10bbcace2fb0b946dc 2 -/usr/share/doc/packages/erlang-doc/doc/system/create_target.html 644ede6f812a8169090d68c07088ea256865c1851b2dbaf56109a5adb578c32d 2 -/usr/share/doc/packages/erlang-doc/doc/system/data_types.html 2944ebef61aa8d6f3fd42ae38e1294db829b1edf1f48d19ab91efa46a1b5f6d2 2 -/usr/share/doc/packages/erlang-doc/doc/system/debugging.html d05397296c36ac5774ed571f19b661a2deb18e783d91a3616d31325c93020ae5 2 -/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html a812ef7a4df20d1a47eaa8f5243766c287baaf07c3bf78897d7e284d5d6b9404 2 +/usr/share/doc/packages/erlang-doc/doc/system/benchmarking.html c7079ac2864e995e7a431bda0e8e3e6c98206d8fa71d584f40540a5b4324b638 2 +/usr/share/doc/packages/erlang-doc/doc/system/binaryhandling.html db488e8f921956f7883045fd8d13d55cb5c7ef2d58c9fd44600ec3cdfd3f3a6f 2 +/usr/share/doc/packages/erlang-doc/doc/system/bit_syntax.html 252637bc2fc9fe570626612ed1b55a5b5f1a07c9684a2684cdd608c41756bf27 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_port.html 9870f56826bd43fe37a377ece05925c201ee96ea3fcd38ee7d995cb5ad844396 2 +/usr/share/doc/packages/erlang-doc/doc/system/c_portdriver.html 17b1f5ec47d5dd3a66a365897d3fce961307369544ff7bb44e7655971499eda2 2 +/usr/share/doc/packages/erlang-doc/doc/system/character_set.html 89070b334acee96468ed6b6bbb20bb05e6a134a1b1877f6317225f886f5a4e65 2 +/usr/share/doc/packages/erlang-doc/doc/system/cnode.html c5b1f98277fb6919cfcbbfa9e9fca3ef28655266cc3f4d131c08f6df0adacc6f 2 +/usr/share/doc/packages/erlang-doc/doc/system/code_loading.html 667b9920cb80e65abb5aa88200ff1199e61011c5446eeadaafc25cb86cfc2c85 2 +/usr/share/doc/packages/erlang-doc/doc/system/commoncaveats.html f7a3c7c2eb559ac59f47b0a26492f537fbc457522853eea808cb12a5131adc20 2 +/usr/share/doc/packages/erlang-doc/doc/system/conc_prog.html 4164ce0bfb80fda208dade614b276d0f6bbb2c11597b35dfdffc3eb414f4d0f6 2 +/usr/share/doc/packages/erlang-doc/doc/system/create_target.html 2a09a84b3bc61259627d40971fb49fd92ae9d41f98fc87c012994bee0c3a0b47 2 +/usr/share/doc/packages/erlang-doc/doc/system/data_types.html dee267d3c2fc392dce319f602baa1a1014cca4ae46037a45f509ff62f7b502df 2 +/usr/share/doc/packages/erlang-doc/doc/system/debugging.html a482bdf5caf945bfd4aa33fe172b6046485e329d00777f1d12cd61dbdbd2cdbf 2 +/usr/share/doc/packages/erlang-doc/doc/system/design_principles.html f95b3131a97ffe81381d2313c5f5400772b8f7b15bfbda7fdcc09e2eb6adc558 2 @@ -2098,20 +2098,20 @@ -/usr/share/doc/packages/erlang-doc/doc/system/distributed.html b06ada5e0c17267de750a37a107edfc5403788e90dbfe31f2d6ebfbfb66ab0f9 2 -/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html da7e4c4a835900d0a5af2b39bacd088f84cea547a65c61f13cbe4ed5ae3089e7 2 -/usr/share/doc/packages/erlang-doc/doc/system/documentation.html 15f740a30ec4c3760c1d5a3d856744d76037485a99c62e0dcc2a427bb7328aff 2 -/usr/share/doc/packages/erlang-doc/doc/system/drivers.html 8d2ff9c4d621eb572f8249281594a40333f167575a4399f8c22feea58cdd8b58 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html e0ab29e18c744a8969498cb73cf8141ae72e750fe783346df47168aedc90b0db 2 -/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html c443b8b7ec0fd6e9537d7ee8a9bffa39965d330d4a81f1a1b6b22be8ddb7daec 2 -/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html cf1ecb76a4165e3af71d23c891b8d87d8a7c8e48968d8b247caf4ec930126f40 2 -/usr/share/doc/packages/erlang-doc/doc/system/embedded.html c4a8f4b24c773edb3aabe5421cd628fce5626294eac7ebee6c82da2bda7653a8 2 -/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html e1b0d221a248e87618e3bf1077df26af584b9ce676d2a0505b61faa8cb613670 2 -/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html 3a4edc8eaeff41a935706877ed86766aea1ffc14ff63093655ff1f1874a38c6d 2 -/usr/share/doc/packages/erlang-doc/doc/system/errors.html 688e1b5aa1c5e99298caca5c93041256f673109f3fce48a0e824ba8cacb38c59 2 -/usr/share/doc/packages/erlang-doc/doc/system/events.html c118143242aab6077349d5d4aa137cc406a38420d5a7b90948b9bf3155bbf7cc 2 -/usr/share/doc/packages/erlang-doc/doc/system/example.html 9bad4cd48ba7cab5cc1e02ac13e98f002c7526591f6950a0104dae2fbb188551 2 -/usr/share/doc/packages/erlang-doc/doc/system/expressions.html 07c909f35c2ed20a4a0729e4d1d88cb516d74127bed5714a4865d04908daa559 2 -/usr/share/doc/packages/erlang-doc/doc/system/features.html d9a17f8757ec74b5ff75e77dc399278739cd278823478964dbe36582e9092d5d 2 -/usr/share/doc/packages/erlang-doc/doc/system/funs.html 66a52dc06d8e7a96180461e0a7bd9869a3e183d6885a74fe059b08edc4d77422 2 -/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html c76eda905c89147e9afc8f7216422bd8f7e5afa175ecd26cb9c880fd1e5cf255 2 -/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 4639bc405c6fb599128a6875ac400f5f860e727e658c0e1c7cb1eac15f6f9598 2 -/usr/share/doc/packages/erlang-doc/doc/system/howto_debug.html 12f3c9909409c39cf7e2864a9d4f89d31e565a035a829806080ff58ee1baefd1 2 -/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 8fd98aa5139e951d7fa41d04dd7c3a2001bb0c53a612e0af94d4271ce057e67f 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed.html e07a53a5d7a305c50e86a48146d5fe79b79fbf33af85f64aa79674f890617031 2 +/usr/share/doc/packages/erlang-doc/doc/system/distributed_applications.html d36fb4d7b3ef74f0c1b2aca81d61392417ccdb1c495f2cb43674eddaeed8f9d2 2 +/usr/share/doc/packages/erlang-doc/doc/system/documentation.html ce54b5a94348bf4ec143a9411d5f9f8e9ab0db5b85aca94a9b618f7cc8e8d331 2 +/usr/share/doc/packages/erlang-doc/doc/system/drivers.html b88e72d1c8e5b96b009d6ab76944b0b339736b29c78ff063dd0481d5ab6fbf7d 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_functions.html 51cb71c6bc0e6a47a2c9485ee8d72148adf716eb1757ff7e75089fe40bd93151 2 +/usr/share/doc/packages/erlang-doc/doc/system/eff_guide_processes.html f831322389823588c66b685c729c176e05831db1a404bc78586b5e961904d484 2 +/usr/share/doc/packages/erlang-doc/doc/system/efficiency_guide.html 4dc866af58d2a379cf2e2c8f835e73e4abe772710703aac9c5b1c747c330d468 2 +/usr/share/doc/packages/erlang-doc/doc/system/embedded.html d07ef19007ef59e7f17f502f403faceadb1cc57c671b454aff35d5459b5271aa 2 +/usr/share/doc/packages/erlang-doc/doc/system/erl_interface.html f2392299d145f87c6434b8eda63b920043ae6ac71d09e13a052375055db2697f 2 +/usr/share/doc/packages/erlang-doc/doc/system/error_logging.html 6c0d31ba66456ef9193d6e588a87193c943160923fc1be72606935ddd480fd54 2 +/usr/share/doc/packages/erlang-doc/doc/system/errors.html d400b219aa836013bf10c0c3f2f188ef9915a97cebd3f929573832b5128e33ca 2 +/usr/share/doc/packages/erlang-doc/doc/system/events.html 84ba4d9fe61580370865298a76a8b94319b3bffb8865be99f777aaee9643a135 2 +/usr/share/doc/packages/erlang-doc/doc/system/example.html 1fd7ea3ddf87d3327363331759bdd2d2a5891633db05eb82d6e7ccbf418d1946 2 +/usr/share/doc/packages/erlang-doc/doc/system/expressions.html 89ae33ff3abf797a10c35afb89fe70424d5161121283957443efeba73af88780 2 +/usr/share/doc/packages/erlang-doc/doc/system/features.html 9d6316711f6677e61bc1522412fc94c0bf64962bb05cffcdd3a117e61ec022a3 2 +/usr/share/doc/packages/erlang-doc/doc/system/funs.html 89f55863d94d6f6392564a6d197cbc370620625b72d09876d775740d71bb6e27 2 +/usr/share/doc/packages/erlang-doc/doc/system/gen_server_concepts.html a8057c09e256a0fe2a15262f25af5dfcbfd4df32e1bd1a123a7bd1977f306590 2 +/usr/share/doc/packages/erlang-doc/doc/system/getting_started.html 75cd3e1bd6fa8d04cb93fa210d1868ef7f7126715bf172c2dfcce9750d102063 2 +/usr/share/doc/packages/erlang-doc/doc/system/howto_debug.html bd18c6d323fe86d85a5c906f944d59278e17c915224a1a6417a9ddbb66cc1672 2 +/usr/share/doc/packages/erlang-doc/doc/system/included_applications.html 1934f5e1949b7755944518bb6498e213df5e71e522acf38d643fbb5cabb88663 2 @@ -2119,42 +2119,42 @@ -/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 8acc290a9604447baace47fe2feba0c30d88e9d73f94b7689963fab39755fd90 2 -/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 507bf96cedd83a82e69dfd217f24f803c5e615e38ce031028c01368cb1b11f8e 2 -/usr/share/doc/packages/erlang-doc/doc/system/install.html 9a4432fd233c5831ffc0b19ac72f7b55dbf0ad8b7f72b407b81e4a35b65decf6 2 -/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html 9c0f3aad93d572d674bc7f22724c5630b510b8178cdd37139561e85628fa6b66 2 -/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html abca2813d68ae6461ee5478ef2e7e7a63cfbeb700bc248fdfb3a5cade66b8ca3 2 -/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html 072c640b4bc6bbb7413f6404a8a3293179d0db02ff27cb545cc578b334a4d995 2 -/usr/share/doc/packages/erlang-doc/doc/system/macros.html 82cd0e7e42383395c3789a0493c0c6e0afd98b3e564747c296841a02965de476 2 -/usr/share/doc/packages/erlang-doc/doc/system/maps.html b96fb07cbf1aa306d794b4857dcfe4d8da3ea32bc58b1145c175ea70a2057da0 2 -/usr/share/doc/packages/erlang-doc/doc/system/memory.html 75668736fb62704669d7c7a0b608e4a925e5d41f9df64f416274f43078d71416 2 -/usr/share/doc/packages/erlang-doc/doc/system/misc.html a6ecffa3838def0e41ad8e3275ff5cdad6e9ef7e9710353844e398b0f18205d9 2 -/usr/share/doc/packages/erlang-doc/doc/system/modules.html 4518e895733a2d97d1ab2b95fa6c05a0d953873cb5d016a1722e800a32b2267b 2 -/usr/share/doc/packages/erlang-doc/doc/system/nif.html b176b1e2a1639a2be69ef0b1e879539af3f5ebd4030a90c147181bb5ebc224c4 2 -/usr/share/doc/packages/erlang-doc/doc/system/nominals.html 4394ae840138fa02f0a601621874d7a00943b6ba4fba27f982dadc3ae79f18f3 2 -/usr/share/doc/packages/erlang-doc/doc/system/opaques.html af3fcfa9fa75a52d9c5493678babcf07f3dd0cb814994d5574ba5817903394d6 2 -/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html ec0848c76344c720ba37baf6af378b0f9cc76234d7db49cddbb58496774cdff0 2 -/usr/share/doc/packages/erlang-doc/doc/system/overview.html 246630cb7bd557d38e4a8ec3c136669fd5d9924ece2d5bde3db108e587bdbbaa 2 -/usr/share/doc/packages/erlang-doc/doc/system/patterns.html 01dee09617808d6d76fcfc1c3ff466f34b62aa031e39693f16d91ca5a8a26bd3 2 -/usr/share/doc/packages/erlang-doc/doc/system/ports.html 123b970bc80b4702405f649dbf8fd9a7e6025683d2ce07434ca3c0a626711f95 2 -/usr/share/doc/packages/erlang-doc/doc/system/profiling.html a9341d6db3a5d04f43f233262f7b213da6590f8c6560e5bfb8f1d6a468a456aa 2 -/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html ba1dff460f25a4bc388ca95470c479dba923b0833ad8811e3094e0780b8440aa 2 -/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html f168ee9cae511013fc0c3be22f52bceb4475c6e1c8637884eba4b6b6191fc909 2 -/usr/share/doc/packages/erlang-doc/doc/system/readme.html f574606a05273852677e0610b99ae57133f4b58293cbb0b40e250735e8eb7dc6 2 -/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html a93a7d1013ea4cf966f037f775b660b4daaf6ef64015eb3358c8883d9366c312 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html 95b34629be204f39d9b94b591cd4a94a6dd06a2ba1001427baaeda23f73b99c6 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 53df3abb19c7e20b8c0079e1e41b9f961a43d6f1363b57d203b20a89ed89b3fb 2 -/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html 47b14e4121c6498f79b4f19edab66be80515b25d844ff5f800b6d4c88756e21d 2 -/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html e32db96e9061beecd5172e954174bb676336cd559ed19c8dcd46e1899f27572f 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html fc3576aae78c0b0ae5b89e8a50905e8c8ef3a9f089bfcd6d3fd321c863a8db2a 2 -/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html 8dc4b544c6aaeb8655895767831ca809da36820bcb53505a1e259f5032c29b55 2 -/usr/share/doc/packages/erlang-doc/doc/system/robustness.html fb1cb9b183f610d8d237a10254f79eb6aee3828ec8ee1d302136aa5d1d42e212 2 -/usr/share/doc/packages/erlang-doc/doc/system/search.html abfc57e08098b361c45f5ceb8e4add008769d91df0b92673547708e3a257e41e 2 -/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html 81653f6eab8b128dca74e73b8a970eaf83cbfa40aea4e6c9c9d886f144212999 2 -/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 9d465b6ee7df6fbe4439c09933f525588e1d0e56ef8d960167e48cbccbd83fae 2 -/usr/share/doc/packages/erlang-doc/doc/system/statem.html c2bd339f4c24b360481b392b7db8dcc2fedff5aa431366175209d2ec47737a6c 2 -/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 740f4dd5f56126f1306c29102335faa93001ef32ebbfbf6ca5bfaff170ebe2f4 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html c39f745cfed217aefba23deada063015805c1293f3e743cd956dde9a532e93f0 2 -/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html 152ee1a6047bc5c35b5691baf9b5c07555839a6ae7abd4ebeb4293bfdd2ba08b 2 -/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html da856c77c901aeb6170d95506a193c941a6789d5467aacb88271cdc05c1793d0 2 -/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html e434fbab2802c60ec284050847b4b037b4db75260d9c58d156666ad414dfee7b 2 -/usr/share/doc/packages/erlang-doc/doc/system/typespec.html ce0498b44a5c03b48ac8b2b67418f0d233c4046f4863968f7267da27e6fb71e0 2 -/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 6adcd1e842cb2a2efa38dd727ea47f10bcf35cb3316b0b4830edde7524ace3c3 2 -/usr/share/doc/packages/erlang-doc/doc/system/versions.html 55853ed1160139c4cc925b44fb4870bc557bd50a61de84c82ebc5446e550e400 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-cross.html 422e2e8dd588d711b614ddb118948f1c497f2c93f0f4bcb72dcc21b95626e631 2 +/usr/share/doc/packages/erlang-doc/doc/system/install-win32.html 768084925dddecb6b87c56975506e10b7cca6318a736fb9f04c3881a92ecb3f3 2 +/usr/share/doc/packages/erlang-doc/doc/system/install.html 5cae49260d73ef650d1df9268d616efb61777d96890e7b551cec45f7873b075f 2 +/usr/share/doc/packages/erlang-doc/doc/system/installation_guide.html de3d7cd0185405894fb21f8e2ec5a4371051ab921b65d90d7ee9f90dfeb7b8c4 2 +/usr/share/doc/packages/erlang-doc/doc/system/list_comprehensions.html 2dc1c188bd0760f3f59041b296e625dfc8e4b8b2fb4533ff385a7bbb018eb241 2 +/usr/share/doc/packages/erlang-doc/doc/system/listhandling.html e27493d74d2b2a52519293c07a969da940b4ab1b4f3e4c9471ce702fdd4aa9da 2 +/usr/share/doc/packages/erlang-doc/doc/system/macros.html 3fbb8a4bc930af17f11833f550c89973ed56a62ad973a49a6f34cb4d4a71e4b6 2 +/usr/share/doc/packages/erlang-doc/doc/system/maps.html 3b68a91facffe54c78b1f0e0d396eb04007b01159ac1123da92dc1aff52df6eb 2 +/usr/share/doc/packages/erlang-doc/doc/system/memory.html 22b73559167f958d5c1df2444ef87ef71c318fc6bd20eef3f82c70531e903c6e 2 +/usr/share/doc/packages/erlang-doc/doc/system/misc.html 2c4a03b4f1df1e0e306630a8a1b89f3008c6619a697d0314162573dabf588d1c 2 +/usr/share/doc/packages/erlang-doc/doc/system/modules.html 9f87b678c00c2c38c8e4a3a30faa299bbbe869d884fd1a5b53cc6d5a81d6d569 2 +/usr/share/doc/packages/erlang-doc/doc/system/nif.html 796badda465cab1fcf639139206cfc9102ce4d5d037232e1f6d8adc213f8068d 2 +/usr/share/doc/packages/erlang-doc/doc/system/nominals.html 8cf0d51dcb72641bc467fc7e4b57d0deebc0a6d282e29e56c3e3c13ed6cca95b 2 +/usr/share/doc/packages/erlang-doc/doc/system/opaques.html 03d21671e4bf6420f08b8a446bf6935700ef9946041fd9d2d0576c4dfa500ddd 2 +/usr/share/doc/packages/erlang-doc/doc/system/otp-patch-apply.html 98ab9747b50a685677e96bb4799c6eeafc56d63db8d69eea509911bbf65a55f1 2 +/usr/share/doc/packages/erlang-doc/doc/system/overview.html 6338fcfbbec5f9a2f7b019b6fc1de88cc65cf619185ca25e46c587e233131ca3 2 +/usr/share/doc/packages/erlang-doc/doc/system/patterns.html 5b5aa40b8e4c962980f0d9f852d00ac0a06303f61c21d7c2f38087e5ea2eca99 2 +/usr/share/doc/packages/erlang-doc/doc/system/ports.html 8bec8d2d715025058a2dc5c58d19d2823376d324510a6a11defceb13c3c17293 2 +/usr/share/doc/packages/erlang-doc/doc/system/profiling.html 159afd894428cb08c3ecf03560cadb6a797c8e57041bdb33adf1e0a9b36f21c1 2 +/usr/share/doc/packages/erlang-doc/doc/system/prog_ex_records.html 1b9e202c60986a491e9c7701144bb0bf9c863ad6a7526abb350620b37d055c09 2 +/usr/share/doc/packages/erlang-doc/doc/system/programming_examples.html 75e78fd4f847974b08a78f8e1886ee9c10eac43d70c9cbbe9fa81b61c60e5538 2 +/usr/share/doc/packages/erlang-doc/doc/system/readme.html 4856fbeaeb0d2785489b261f3decd891187649b5c3fb92b4ef153cd524e65b0e 2 +/usr/share/doc/packages/erlang-doc/doc/system/records_macros.html 080a6cd1fc730853a7b9956da621206a01dead4a81057b39ea60162ae40aa089 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_functions.html 107e9a7322efc9f97efbaa014598301eb1984c01ff9f743cd43a0ad94e8e469d 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_processes.html 26dda0b1316e63b0e42c0016bf540996d1ba35964e142cfe08a816b58ba562fb 2 +/usr/share/doc/packages/erlang-doc/doc/system/ref_man_records.html 5ed7502b3ba9cd483413c5aa4a4d3d5ec5d358aa6569fd76584a43dd8d7b6d9a 2 +/usr/share/doc/packages/erlang-doc/doc/system/reference_manual.html c85ec64b821cbfe3e525b343c50a97edb27a5e8b3c3e6d214f2eb44417e9b202 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_handling.html 785fbdfffefac4f5ded63349d5c5a53a8118e5aad4574b7e81a458d7e34878a8 2 +/usr/share/doc/packages/erlang-doc/doc/system/release_structure.html b4908e266791315f712de7e596fb47f8646afc2122a6fca3d77eb7afc3f661d9 2 +/usr/share/doc/packages/erlang-doc/doc/system/robustness.html cb6c03c9c62c5eceda8990a3bec2cc61239b43129dd07ef134fc7757a182d354 2 +/usr/share/doc/packages/erlang-doc/doc/system/search.html bf8f7891571546cbc2b93acd4c241fa4dc61fdd6d13b65a0c225e0b373143b55 2 +/usr/share/doc/packages/erlang-doc/doc/system/seq_prog.html c240002803d8d4add41a7b774889dc55a890579ca3f25ec29b6d0526aaa4f831 2 +/usr/share/doc/packages/erlang-doc/doc/system/spec_proc.html 879dbbf23f17bc739f6525862f4bf74f54088c48fb9b9c4ab30297feba9d574e 2 +/usr/share/doc/packages/erlang-doc/doc/system/statem.html 10492fe506058c1ceb841a5daa415e9b68c7a96767fb775413bad331f457593e 2 +/usr/share/doc/packages/erlang-doc/doc/system/sup_princ.html 289013f4cbd364a68b201de9cecc8b53ab1e77ec8ba0eba4a9fd234ef617e364 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_limits.html 20e4d9bb61ce2d92e0f92f5fb63bf6ca52c2c4e6510383c9b91ab6c6e3a9d1d5 2 +/usr/share/doc/packages/erlang-doc/doc/system/system_principles.html c46b9bf6658345c428f2d4b1c5e28363ce64e17db63188a667f8aeb4780759fd 2 +/usr/share/doc/packages/erlang-doc/doc/system/tablesdatabases.html fcadb3ffe55ba0d0c59b981f6e65d852cde49ad31fc4e7934007d6c85be121aa 2 +/usr/share/doc/packages/erlang-doc/doc/system/tutorial.html 1909d7623a2ed9176604c23d8ea90e06cd5f59db3d8e557119c955ae41465940 2 +/usr/share/doc/packages/erlang-doc/doc/system/typespec.html c18a7fb25627854147ecfa3d1d45bf4782637d1414ec09636faa2920795f82ab 2 +/usr/share/doc/packages/erlang-doc/doc/system/upgrade.html 5350cc12e73c8421425d05a01c8c5497224dd0d1b73300b4a75e10bd6761576d 2 +/usr/share/doc/packages/erlang-doc/doc/system/versions.html e4ad0de60dbb9e66007ea9fa0965006b85da68b663bca533d581106a1761b41c 2 @@ -2165 +2165 @@ -/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html b3def996716a7bd13418610f09fed4132e4eef1aafd262e84fc34960c90fc41e 2 +/usr/share/doc/packages/erlang-doc/doc/upcoming_incompatibilities.html a5fcd0167ff664c0353a3e2cf71f88b3643cc5611b2ed6209f417fbcc5831b64 2 @@ -2171,5 +2171,5 @@ -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/404.html 838bc177ca4192e3d495bd340f9f5f11569452c197bb36638c8b4131e945e96f 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/absform.html 53fcbb80f01f9dcd46c4260587379dd840f5a4edb1f86c41a13df0830156a21c 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/alt_disco.html c8aa698f1a63aa07ab9bea05ebc3ef90e494fd78d6b51a26ca00a21f00698a15 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/alt_dist.html f2da313dd7529126e939f0591b4b145af990ac48e88d4f2b909684c807a4e90a 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/api-reference.html d224d274ed2fa5f791b3abdd0271497242acccc09721a38a5cf246589d3b19ee 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/404.html af2b59943eeeeefedc987d778bb4d06ea2ed60080ca2506044869dd3a39cf336 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/absform.html 5b963436e92c451c64084d123ed8a0cc724a2b6820e2add4f1e5930d6a8f32b7 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/alt_disco.html 10d574158c99f243dc0e29c4ff713309511ef1ee1ebceaf4323eec53f434bdfe 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/alt_dist.html 9ca1163ca2d9884886a7b5ea5db322ca6a13893cc17ac41594230f8b88367055 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/api-reference.html cc544221ac8e7a28813fed55911a52c64e9492e9325fa64da37ef09ad6e80348 2 @@ -2191,12 +2191,12 @@ -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/atomics.html 319cb5c648bbd09eb909e93b68c563534b8ec08c04337f2db4e32ab699c5ca27 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/automaticyieldingofccode.html 6a04a50869651ec66bae8a83263aa4a110dcbd56890e3a5c5a6fe4434af33219 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/beam_makeops.html 610154a95c2b104969d4e2b875b8bd7508cefb1e2654ac234b3e9d7cb2d717e9 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/beamasm.html 22cf0d7102d68b334ae261e86898548b62890e51c0337d743d6954fb9a5e42d0 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/carriermigration.html d608c67a6bb1ed6b96771df865e435cf0f81f52a26d32dd36334ddd27c76bc62 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/checkio.html 05490be77069f5bcf34b4d22f63f06c292456b0ba9180c0962b3300b0d628cc8 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/codeloading.html 7041fc7a5d82ece5d05c1e0c86441282f2a84b8e85c471314e1e0eb3547d1e25 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/communication.html aae8837e0a35ae4402c14dc85bb2eb8e793e91b2a6d29c8b26418e0d002b4ad1 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/counters.html 937929134281f7cf75689f978554bc8eca1ae020f35697c293323d677a661048 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/countinginstructions.html c2c8e1d4202a6c7f781e9f83fc9e82ecc358499216294f108d50bd3807fc344b 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/crash_dump.html 311a9eede454316771d6e6b0ba60f2d2cb75d773fd3ee6c08cf83fc50330aeb7 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/delayeddealloc.html 8f93b9e53a392a07b7493fda73f5548cfa6053f85731038793401bff43c40809 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/atomics.html e8ec5f167d6b3eb1417b93661b9523d1c442796a6db554db89d43fdc3237d0c1 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/automaticyieldingofccode.html 7b3c8417e0e56f6c732225458ee5171a1dc9f2b6746919aece0808822aab1c30 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/beam_makeops.html 8ac24fb6e1970bfd223158a78a367c99e8a404df7898dc7b36ac2dfc92695c36 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/beamasm.html 68b848082d362b6d98897093cc4f275b2f84fd1567ac7c48ebcb113821e8b689 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/carriermigration.html 3c06caac5cb1d6cf2bd03fe0c7d00030887204005b567d25c7c82f3caaa835e7 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/checkio.html 50ffbddbfde88d77442805d080095d79978088229a5fbe106ce57775e8ab06c8 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/codeloading.html fe8a672e5816f3c7c7b3b10a7654e2f6cad5e3bf676a99dfcd72f9b2ff0137fd 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/communication.html a22d7bd15446d06ec43061c14e6382fc3257098b19d5680ff130ed55a6aa0cbc 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/counters.html 8c60f76f150b26efaef8acf99e3da80e61cb255ffabddf51568a4bb66fe81da8 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/countinginstructions.html d7a5585d215caecd52aa279264fc83b47c56ce20b9b9911094c0c0aa4e441866 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/crash_dump.html d774e8c8912c4383892a32a17553dc63575f4a65234f8f5e9626615170676392 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/delayeddealloc.html 8c492c61e52d1cacdcd2525aaf6caddfa4f87c4c4942dc9da48d9601313020b1 2 @@ -2213,16 +2213,16 @@ -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/driver.html cbd462e535e59fbe4df4bd1927a94dacb2c14d69019568add5432fdaf27bea02 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/driver_entry.html ed4a174b675bf3df47d03f9218f06cc9eb2bbc8f67b7e4ab2d32353b6ed5afc2 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/epmd_cmd.html 7d8fbf20424f156c3a6adc297301ccc0b46c3001d78b2b62d7939b3464e62a60 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_cmd.html f93b428c7d5690fd23ed6aa8d3fb0d7f62a5865db4840b3148b5f20fcac7d90c 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_dist_protocol.html 6572ae85e8400e149e7c455ba0f142703b6c7b4993e9dc6690656ac96de6196e 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_driver.html fc323bd05d8f4f6317a6010de4af6ceda7085d92c4e4e90b3609a3b956e037f3 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_ext_dist.html b9687130384b6a8b899c2bb447b12b72a62b27cd31fbf8e865cfe042a222b932 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_nif.html c5a5c35e772e3626051f7e6c8f34c8c74159980b51468937917f7516fcca6ce6 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_prim_loader.html fa72ca1247638a6bcc8ab1dae360f2db00e1b5185dfea26db9a9a6ff58f1c442 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_tracer.html 2b7b23354e15192f6a3f0434cfb4f9ada3f68251dec6023e95e58400cf61b070 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlang.html 4bd6b14d261f834ac5d3b925a8cd5afde25a98afdf60e28b2be37d3405290498 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlc_cmd.html 80c4006202c1d7121be2fb0abec8f6974eea8ae5f8ec3d06b9689e8e84a566fd 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlsrv_cmd.html 085fe8ba3425dbde0ff62080c19eccb5c87536352282182420be402f2c353514 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erts_alloc.html ce0c82ac62462e65234718e6e9f70b219bde91135c8cc07b915f0978d3e5b78b 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/escript_cmd.html 09eb4479149deb7a4bf692343186ac21a86a3b826c8f7958c0dc05bc31d4ba0a 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/garbagecollection.html 5d8ec7f91674b7418d7b474eced9ec01a3a27d66587329a5ede0947ff4c9f842 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/driver.html 927ba79ba45a1b7952a8eb99939413d4e305d48b709dfe29e1c779786c5a6fe2 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/driver_entry.html 6bd62ab7de5fc86442c05242439c1c91ed7a56dfef6a80b1a32feb83d8473c03 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/epmd_cmd.html d2f4f756bfb486b4e161b5f4972a89a0260eaa02c5e3d069d4ebcc31749bf05b 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_cmd.html 6656b5b2ad0f9a153abecb8af8bad50cb6c6b8fe06045d8fad4e8175bbe427c4 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_dist_protocol.html ab9d715708c5b1c301303c4f7daa2ca4a87aaa8125d5ba008c47b5daef1eb5ff 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_driver.html 425c7953b0bfcd72ce48b854e08e932212dc75bcbf92af4cafa4c8abc1c559b6 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_ext_dist.html 61c431365b31f52a0fe145e55d8e25f33747cbc61ddbf9e22030aeafa51c4105 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_nif.html 7b895b52f1198d950162296a63a8973780c7b2664540bd1e106dfd59046da5cc 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_prim_loader.html 03802c4d64ddd6bc77d8589995a39f33de7b6b76435fdf8aefcd39feda617112 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erl_tracer.html 70a79f570cb9b81a99b387d0a7f26f4a60a736d0a10eca12c169eac59e6509a8 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlang.html a36a973c5c1a4f0d5f6cee32a6d6a9acf483b29df183180ad35f38583416344c 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlc_cmd.html cfd1b5bd2ae9ee7f00fd817f67b43222fa9d5a595f3fb1e957dce1c951ed5e54 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlsrv_cmd.html c161501749a837971bd3c146183dc07f26e939fb5c02d4fa155b9a3535c41476 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erts_alloc.html c0aba5c2b21cbc93c8e821aff449e38401274720e02a22cc0ac2786773642afa 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/escript_cmd.html 21cbe7fdf40726f26318d2d6b07a6d39d27b0cd1b1bee8b8193e8694edf56a5e 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/garbagecollection.html 922adcfdff4ae3d1138a7c6ad851709459ed1a4db160da349ac9dddad99756a1 2 @@ -2230,20 +2230,20 @@ -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/inet_cfg.html 92c69153a23c6602fcd8db4a9b7c6419fa1d8e873db20bf5c3d7f900d1656b7e 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/init.html 7f80734cf560c4563b652eeec665c79146603fbe315005ce6117f1e3c50cd33b 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/introduction.html 4dc50f676c1df600855f8a725885729cdffb617b05116c8bd54b31d8f2f603e8 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/match_spec.html ba83d59c58720ed3ba034381200ed7f3d2eedc01a73e06eefcc82308a4010647 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/notes.html b7d458bf9b9bc10ef64cbffe44a5cc378aa41144a23c77ae89391d235ac77cc3 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/persistent_term.html 6524a45bb962d00024de8479e8ad35aa8ea8a0be68c0c5d18078267acfef62f1 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/portsignals.html 43988f32267c6c8f67e3abfdbed5d9a18d5a94cc61e05cf74d80acdbf9570b94 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/processmanagementoptimizations.html 913cf33c0f6f15b182fa680997c480f98128a77b1634b4711e84e9f45aba136a 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/ptables.html e343e50084a403075e2f51754b243ba81b7d9f88a49b826df703989e81245172 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/run_erl_cmd.html 18bfc0bf3845ee0e686eb8b5296e302ba2bf849e16568f5952c74429094637bc 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/search.html 01da566441b07b5c12f78c25fe3f08cd20c52d7c5e1a54073a9d1185f71ae4e0 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_cmd.html 4ba0a6cf910d87d5b2e40765f7738731a69ee5a923bc6eb9a8d0caa4fd5276b7 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_erl_cmd.html 731272be5d0c3d39d88401eab346e2c25ca32f2a81d35b01a454c46c30116187 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/supercarrier.html 867367839e7b703599ff5bac216b9fc246efe285a50c123edf0fa249ace2a1c4 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/threadprogress.html a7901b22eb1bee8299355916f3cb3613d6a1466d96decde850cb5a759fd58e8d 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/time_correction.html a46ce917679bb4dc64baa8285842a9b2d1e1b7524729172c38b8442a4e18a904 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tracing.html 11647d2aae07fabe83c6a59f8f7ccbef53ff3a3ed714f5e2ae6ad187017ed336 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tty.html f057610e558f37af64412c9c88f16f87622680040606079c4f8d7760e78af9b4 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/werl_cmd.html 3dc6bab1564e9ebccf4199a5e50011a7887a647418eafdc1b09df08437f6b7bb 2 -/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/zlib.html 77002335b25cd2bb3db79f502b3ac31798e7613ba581e455aa997240eff82372 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/inet_cfg.html 183a831c8dc82238b3f01a81d2a80ee84122ff4685c58db95a553e50d132f69f 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/init.html 780ca63dac316d0e218482c49e756b1a8435c96badf170d75a947d61fd01d7bb 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/introduction.html 41a6d5574314c80784a8f2458a9024ad0159602159fa4aaef62fc2f6e593ac9e 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/match_spec.html 752e2e68ef3c5e787a7726e208134348ef0f674bb04fa4ab2de2aecae12e25db 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/notes.html 65643bb3a5fcb16c1ce2d08535c44786562a0e3f416168f2914968ac96a2459e 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/persistent_term.html 5fa3102c7997af34f0b87a64fbb171fc29ccf3ca30f57721efd6afbca16324c9 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/portsignals.html 6a4042514022e3db7ee9222f7aa6f3e694e73fcb5f52689b47e26189303e20db 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/processmanagementoptimizations.html c52d241f175ffb1ef5aada7ca7c62aa00e77d60ae1e649f1f9548f69e493f78b 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/ptables.html 26578acf5ab429411ff868614deeb730f057558d5016fed467ea76131d56e455 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/run_erl_cmd.html ee949e62ef0880ab7d98d3a84000de8d34f52d125254bc937aa4f61285607c70 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/search.html d31c3e5718cca1c5b52b83f37119ec14646f81b2fb7a65245bcf90107f57ab7c 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_cmd.html bf72a0f1163f58be8de377481f3a64f5f353e4f414d16daab60fb1b9066bdc50 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_erl_cmd.html 629ea855ea8fd267313012f95ff3fadd031450660159980ec111a28def1a4536 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/supercarrier.html dd03afd96827eb879b97606d56de4f04177c49d2743494b6bca937c84c3f10eb 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/threadprogress.html e931994f246a383db943155aec5e30fe0debf3bcab1d15b29ef36d276e2eb349 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/time_correction.html 354eeafa1fa9c39f0032528302eba8964d58381a3898684e5f34e00bcdcd5918 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tracing.html bae513b18e28df499d1a7df9d3320e5937e1347dba2327bd683bbe09a68493bf 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tty.html a57dcb9f36ff17e81b28b9c1bdee3eda7b8ef1ae056ab78d578f4670a20f0d71 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/werl_cmd.html fd0023f4584394e28b4b8a3244f7f6fc7bbeadce029314c950923874c9d90414 2 +/usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/zlib.html e2928c1ef98b53783e618e0c3fb941e50bcecefb2078353e238c449471562b38 2 @@ -2254,8 +2254,8 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/404.html 1a58b2ece1123929b743d8071340227c08bef9d9a3a72e14fae4614376066414 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/api-reference.html 6a2f7199b2cadfc2f9d3c825a120e6fb11f527669f93e2e217bd12d737206800 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub 4f5a722346446056a2a3a8e251e6de17caff92c2a654767c4eb836722854c47b 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_getting_started.html b042ecc9a2522962e9cc5c35fd282f0696b085d441c3005b80a443497a573970 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_introduction.html 0106a65b95738ff7f21d25d78bea27988b30a60711ee74ddd3b8d1ed07bd586f 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_overview.html 1332fc135204d2167aaae3b119bcd1a7060b7aa4fd57ef0b893c824aa4b03dbe 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_spec.html 99aa51d2c37d17031768285a6de35e8d0b18f7db55f3b2f3cfb7ea3a47716852 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1ct.html 7f7f21ad1a503a1840ada79a194eccfb5aaa64d0c5568fc9ed9e4ca1acb55eab 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/404.html 04bfd47022855615376cabb7ea6ee6bfb3d84c863f4856d08f8f312cafa1aa7d 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/api-reference.html dfdc129eabfaef3783dbcfc4ab7f6ee515b086e884494a7a2553d8bec0e096a2 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub ef393e27613a8bbfd174741045e520fc578d1ce0bd367539a1a5cee211dd9f9d 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_getting_started.html 9430a1e0f770969a8cff384c05bcef5dfac7b9cebe185f1b11e7b6249ead6198 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_introduction.html dc6a983d0021f26f4176bbd286b119bc8731896790aff93985393ffd41c68b10 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_overview.html 21d438eef16c39f81669c7a79da1cc3ba90fe6262efef85b89139eec1d5b8445 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_spec.html 2f259a7c7f6c99d09f3bee345c5a51a4201af0b9ee5dedb1fb174d40be4fa619 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1ct.html 1aa3a59fab97459d68d302616650f99e468cd65a56705d1bb55f5d5c45e91024 2 @@ -2278,2 +2278,2 @@ -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/notes.html 57a02cf292e35e080630d74348faa1f0ca21daa3eb1334a423bf7efed78f2ca1 2 -/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/search.html 97885f8fbfee747df2414c8d0ce0dd5083f2ee29c9113a89796fd9fc3a54b53a 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/notes.html 4d0d02919875c9ddbcf07671dbb7ff0e57d77000a6b7967a0b941bcef385cca5 2 +/usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/search.html 7f73dc9d01c9ac41c40daaeef475cdae3381383b7d0d9abcd247a8a3b5793084 2 @@ -2283,2 +2283,2 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/404.html 9ca63e698d3692d4251fe90b578be15091857223372802a7b448ff47b9e1ac29 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/api-reference.html b9f60bb57785dd618e5f88d8ffe0867cb89d2ff79a499ad9f2439eebcb1fee14 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/404.html dfacfbb18cb36585ce08d209e19bd7846b8e759e038f13d481911b5aeb97075b 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/api-reference.html 25405ef1b35c6c0f328ca0e9be843d2b354cecaa499cfc585b11b3fdf513d816 2 @@ -2290,24 +2290,24 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/basics_chapter.html fea3a7b524b5310648105ed64ef302262b12abb638db29f8d4892ab7209f46fd 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub 95c0e8541268e4284b758815d18c629aa13512bd1b2d241f1e9c93569c05a958 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test_app.html 86f95fca66428f4c6ba71ba592a62d3fa0b875f9326d3dda9ff8377dfb9cebf6 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/config_file_chapter.html 6c2a5c6a87b92a5088b623944e7df87ff4f691b91f591ea30740649a74a12961 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/cover_chapter.html 1080258c70940c27b5f74c8c4177451c8ba80a875df2b2087754b5e8ddec1407 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct.html a2d23cbb578f394f4bf9e835b936ace4ca02fbb92541e583340adf0b33b4beed 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_cover.html fd46ab239c6bebae6a14d188f6f4610b109481015178d64a351e29c8cfcd2446 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ftp.html f76c914af28995d40edf786712c19e4f99f3958234e004153c0267749e21cc03 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks.html b4273ae7e559feb67f5309288b3d863402a957ca4975f1210a3df869b00b92d2 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks_chapter.html 50c7ebb0ab93ba712e19db913a02cfe5615633a546b2e7140e76d08825f9910c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master.html 9e23ea371d611eaefe7551511f4ab804ffed14f79bb0847e78465f3c045a7b34 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master_chapter.html 83be1501ba11adb29f3cd8dbb623bee0272682f27e3b7e3f3f80201508fee66c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_netconfc.html 60b4e04755460dd27bea71e0956bc15e79a939840ab9a38175d1f0f2029b45b2 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test.html c0dba15ff84d46151676987270695647be7e0bb140f63005711858a7f926850c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test_chapter.html 2a165958b8486f9635a1b92ea0dfa9ced6c9f91279f7ddb41a01d25fad53f437 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_rpc.html c76b14c2e50b7efa25a0997d1fc10687cf906f42f297191ca9b4fab9a912311c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_run_cmd.html 7882c236c7496294734fab76998905a0e128b1a0e2b5dde9481b78681bc55532 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_slave.html 54cd9da2c09edb9a9d3e2c92e2e83ee13acf255f5fb8e6a396a07b550aa3b94c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_snmp.html 8c864239e606d05f7fa575f6322c4bba980115b92a88ecc3eb4accd6921ac307 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ssh.html e7eda27c637d8f06db9948834e90c2cf05c4851a48f0f7842970f215513cbcfe 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_suite.html f3796b36ece465465e5b1e5b8f049c6f4e0bfb6fe8e6689f7bfb6ef6a7a1c424 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_telnet.html 3f0bb51f9db984fcc7280c279c4298910d1c4401804a51fcb2fd8d5e3b6dc0fb 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_testspec.html 8186448a75c60d275a39d6d26ca062355c01bb62cb2ded3241dac1248d224c8f 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/dependencies_chapter.html d8c31dcb4116b88119290de6ffdad8665bc238f5bf54a58bef33fef307e2163b 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/basics_chapter.html a0a148302af6d77891ac830b1f1f19eff92c3b2d4043116f32e2a8433e69075d 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub d2260a6a93374d519f20323a51c19bfb7836505acb03db8aa4736426d0949d34 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test_app.html 793fcdcc97bf948f3a3511c8c2fda6d4c415ac932e55e6ba861001db581cc6e3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/config_file_chapter.html 67e38e7333e11e4110ca6857e35e7dccc411c6c7de8b0f8abd891d73f9c511a8 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/cover_chapter.html 88cc30ed3788e10a01d273843be717944dec6f116e2f4304e5c621427a5cd390 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct.html 4906791040cf654772ff367aeaaa30250d4ffe9a1b6b188aaf40ef1f55453dff 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_cover.html 8b22607a1a9b20c48b2b401bdcc8f0358a459de497ac8a2536784bb56e4faccf 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ftp.html 2179e902fd1db51aed5a0e9b6ef560a204792ff530b8f8655c3006b03c2da0d5 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks.html c9e9ef51919e624d033aafc3501ee6d83db3f8e91ba077ef34e88631b147c9d3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks_chapter.html a6c764f5f71251c37b4789bf56ea7ab3ff93e1e84c2943997d56d11974c8665c 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master.html ec0dab0eb2725b5b1192670a4f776a6ef096e9e4c26a17089bbdb03cfb8c3ddb 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master_chapter.html caa2baf19e46ef55ec6aae2ed03800ccf6be9601200f4522f598be051af732b7 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_netconfc.html 7165bfb78cce876c6224f7ee98a6cf9d341b751653caf22cb2f587d73c67b626 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test.html a0ad7ad85a9d51e3cadbf3be0246e66bee760f5b611209b47123283fe0638239 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test_chapter.html ca06d0c5b2c98eebb7110f9ca7714c352829288b0bc4a9b81c360395ed122f34 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_rpc.html 5c0bb32789249de5101d6a4c93e8df85c108cf5866864780a431bb513e73b606 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_run_cmd.html 9f28f69a40c9978522427240bb878daa2d5bd587abc79e524487713ae61ac3c9 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_slave.html 6742a1b29fa8fb220fab2c1e766304abbc1858a43f89b1cb25931de8203422b1 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_snmp.html dc12be45207aa38e4b82cc0ee7afe057ce4685d57d123896ffd5a93f4b2f9e47 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ssh.html aa601aab21386bf7cd021ec6c7ed8628083ea7f2c8197b5ed383277e970822ab 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_suite.html 867995630a381c7b5f0b3d6e310c5a83bb26531978945b8b73c8ecb03993f1ee 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_telnet.html ec12c7b088e934ee8f0bac01a711011356411ee715044ab8b8abe6f4e5f97467 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_testspec.html 4a19dcb09462efe445a21008dd6809de73c0df4a44cd4cf0cdc9211ffed604b3 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/dependencies_chapter.html 5ad3dc6c6d802be343a8bd6325887ac09593647811e13e02a155838311ab2c10 2 @@ -2324,3 +2324,3 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/event_handler_chapter.html d9991c0dfae24475234dc7e0807b1b2ae05b78381f0adb9a2c09b1861068e18c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/example_chapter.html 3ce72a832a2ff10b75dbcd2fec3bb96d01a876f9c5ba909f101831cb58118de4 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/getting_started_chapter.html ed144c8d1c2dde0bc1ab68c2033e1090a8bdbf1253984c256026148085cbd624 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/event_handler_chapter.html 0bcfd873bc1b158520be405f48a48ca974ef89246d76c8f47067c2c1fb86f898 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/example_chapter.html 4e315e651e54bc928c07bc039a5e559b04f1c972e339fb2a3005ba31a4a33be9 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/getting_started_chapter.html 77faef16125d7a031cb8af172518adfdcfb2cffa247430f9fe856be61bc9e329 2 @@ -2328,9 +2328,9 @@ -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/install_chapter.html 2ec7bef551fb8213cac79aadb25d008f4d0bb5a81e3e6aadac2c5d1b2c72f387 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/introduction.html 2f5fd7a58f7b08b7332cd1e92305138c2771bd2efedf7862532a557f857adf6e 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/notes.html 4b241e5e53c3094e3f10abcb5b52e05e303ddcd08c602a38ed2a001bff1eaf37 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/run_test_chapter.html 78a2e8a8a806d93c7910353df17d8da6c37aaab91bac1bf985f0006bd95f2c78 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/search.html 57b76478f2eb7bb7fdeaef39cc3db79d4b9e2fd1d5864619d3252677f081e492 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/test_structure_chapter.html 207cbb0cf2da4c06a822563c280b73627b70446cda4c6589597e36cb84b090ea 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/unix_telnet.html cce333950e9748a30bdeea858cc0049532e5f86f63a5b0fd6ccace21c163997c 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/why_test_chapter.html 79bc84e3ebc871af73bc0b86350b8176026a0b653c0b568b642eeb8f73fe62f6 2 -/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/write_test_chapter.html 8fb8e15183e904224671dfccc4553757439c15b42eabe378c525d28f647d862d 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/install_chapter.html 2e6b65bc44cfc518d24db4840a8250cdffb7c9852bae4cf5f8fefd5662fc5fd7 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/introduction.html 795ca2de921042b661391ead0177f88e0d329c2df2e28223daa5ffa133198a76 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/notes.html d9ded179f9ece7d26a29b9dc0552cf6e46b76b56cdeaeaf9109d9570df3b520d 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/run_test_chapter.html 89dfc9334f6e40b5ed9f7800e742bfa4274bd6f866596438ab3a19b6209ec099 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/search.html 980736ccd27bc10debed49f3922f7214750f6f6e2f5c015325c04085d00df35b 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/test_structure_chapter.html cfb8fd7bbad0a875065f34aa2386a979d9c158aa27f22c240279483851134d58 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/unix_telnet.html ca343aae1e42055d75128971d5ddb4f9bc426c3308628168d0fc2496e74405c8 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/why_test_chapter.html 92df8167f56bab49aecda44bb34193015f8f69943f39bb3fc1c49e3368412650 2 +/usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/write_test_chapter.html 56c40e088742e9fad542c3fdb7487503901d1e018cc6d563ba36bb00a4e4c3b1 2 @@ -2340,2 +2340,2 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/404.html 033e6ef12c12cf0b9c29c68575b8662abae075c977ae478dadda4e0fc80f9f80 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/api-reference.html 049c28b1cde07ee7fb2d07bc8fa69264f58717cc9e3595fed60d9ad665ad9f1e 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/404.html 03cbab9be91e6f9108757a4ce4a13b857f1e3e43c8a528182cab35bb762299bf 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/api-reference.html 7b4ecd36af0eccd7bb026a90ce275bc226d8957157e0074292467dff8583e847 2 @@ -2344,6 +2344,6 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/beam_ssa.html e717a96fed70b6e39a5f4430a3dd8c3d98f156051b658d785147ce52b3ff2501 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl.html 902d7258abe822cb496f5c54b957797ee18998043795aa2cb85cf079cd4afb09 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_clauses.html 9bd9bc583bc08c9280fa30e53078d54128a2a3ee4f87642cb44bffd1a04db05c 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_trees.html 36c9b6debdad8420de2e20d05101e80560755caaf43f0cc5de566c78d1901a8f 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compile.html ae4405e6c2ceecf025b379f429d00ca7dcfff407011caaf46212ab68d2e0c76e 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub 5691844af585fea26da4e5b3a2f75a9d1666c691a92a1b1bf26664afb72604c0 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/beam_ssa.html 071d6576ef3c3519c74424c664a11910df3341309ac485e15e27f60de40f6961 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl.html f012627ebe48e3e9c9c8d98e00d2c1c473ccb64e67dddfad21c90c051fffe021 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_clauses.html 2f23731adbaf83532e170ad0e6436017928e16632ef431d4f6149ac02dd94a6a 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_trees.html 3d8aa7f5d76ef283aa24e2ee50bb606a441421c67de6d326f8693269c24ec720 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compile.html dcae2d73ad294ce1a9b5bb239b4ded294d1cd2a980084f03806a8b7f561d7190 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub 0f7e0147290ee52e128e854030df91206a96e733136a7572dc6e9365b62e2c33 2 @@ -2361,3 +2361,3 @@ -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/notes.html f15d5d94a361e51fc4d4fe810e0f546308a4c7262903e3107c3850f3a52bf3f1 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/search.html 2bf7494b9b828eada09ce6e349715a505ec670a0e0db4df7ede9abf740a56c3e 2 -/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/ssa_checks.html a93e31eaa747bb277b83db459414dd9740705c5ab3ecde5de46d15d7c2449acf 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/notes.html 0f617b2ba7cdcc2a034775401b0b44d445858fcdbb9480c14bba313440b3d75e 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/search.html 21d8b844c8019fcc62bfb69ba4abbc5d72e0d818cee15e0efec2e538089a60d7 2 +/usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/ssa_checks.html 52982926e340a96612d22b18e152dc72b15ec54e655a45ba40d13c6fe7bedff8 2 @@ -2367,3 +2367,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/404.html 6f3ebc6e7d6b3ce892e79d9ab1e817e08604b29a4754eb5ebaf341997e2a217b 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/algorithm_details.html 09b0e98a081bfd0a295ae767c6480700f16d358320ff95de6950a0c4d4f44f4b 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/api-reference.html 06301132adce721b745875830b526ba27490d390491987258a1529990c31bbf8 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/404.html 50bb0da87745b7c619fe91c20e01b0729f4a585c201676809c1daa5c1b172da9 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/algorithm_details.html be3c8508d3051165a570bef1b070bf570cd3b4039658a46fa06313537a88997b 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/api-reference.html 610804f18faa086faa2f94878ec8be0d1122e39664408967bdb40b02ec99489a 2 @@ -2372,3 +2372,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub 489aa3e7a1a5031d7dcd68edcac58fc9c194d4789eb6a0827c33f94d7e412994 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.html b515805a26e82910b2aa1c591e7890206ca23efe567e77d1d7ea030eb0bc7dad 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto_app.html 5e39ed0749307b31c21c35e7c6bb61496848d542bbcd926b4ac2a683ae816b99 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub e6ed1a163c1deee44a548fe6fe9b8662b97bbd6e17d42736606da5c1117348d3 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.html f2aecab24152edf213f23807d6af09ea1201818d640dcf4ef383035e084d6717 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto_app.html f5e4ca22258fa2e3579f50bba875baa10ac6d6782ae4bdb8de45e8b6365ec403 2 @@ -2385,3 +2385,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_keys.html ffc8b96ab22910c88cbab36b3e161d331ce8d355a08ec28d5716d9a522a4c6ed 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_load.html a8a675c4fb78449e03c517b7fe8ede549be7096698cb5c0ec864947848ac835c 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/fips.html 2991c66a5611d8dd25bd8900d9988ec06164bfb27a01bb98c3b0157a2cf36a8d 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_keys.html e5b0c81a899f4945ab477b79c413b43ea86376ac0c4f70c3268d19eb753116e5 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_load.html 03853a463324754013fb5d4a4e000ad6d40f300eabd549bd83349d29f07481f7 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/fips.html db25ac4dc51905eae474cfabdd53c8a0b7b20cf1299972f7ef275490b8f066ef 2 @@ -2389,3 +2389,3 @@ -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/new_api.html 76249621962cfc33e17e85e7c020e7b81a9be88640d19f327f8dc4dab4b7b3cc 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/notes.html 6c12bdef1b98d09b2bc9ee76a5dd1600d9bbc65139f02dd2536433982d3d621b 2 -/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/search.html 6f1be9a7054593fc5b61f085b621005cfe09ea3039306986a0e46df7ee5d9a23 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/new_api.html 211718c386008f0427bbd3151d62acd8ad91fc9324e5edbc8394c3915506e41c 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/notes.html 9ea32e44f6fe765a1db50d5eca3e46ad4cb3fb9c8ad5044d3d7955ebee3d8331 2 +/usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/search.html 2492f618606f56f10e1867b28833cd0f154169588d6df794fab0aae5eac32d56 2 @@ -2395,2 +2395,2 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 4bd8cf1152141ab55358d654c4b29a4f1a7cd6e1f41094b12c6fe7cc30ee534b 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html ab7259894f23e57fe2ff4dc124891988d8eebfd9acf6f70e470c9aaac7045cbf 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 5c1930a2d804b5cd4a4ceed8a6b87fec3802f0e55295800f331d1f4cbef67370 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 10c33b454d0d3077c5bba35d72ab119ad55e7ee897b87375ea2c2f8d31262220 2 @@ -2406,3 +2406,3 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub 230cc3acd45f8dad2571d0e22036751e03875d7216f017149b4bbb97ae1dfe45 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html f7f87dd315251ee29271fa9c3fba43d205d50a262c203f51cb724d22beaac29a 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html fac5bfc78a36e60d6afbf92ac465475fb790469f11370245e43888fe0f89dfec 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub d941255f593fc01af8d390b4d69f4da933bce510993e4bedc9299db39aa6919f 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html c833c83a4b840c06449d108ffda98ed3d86f8a85bcde222e2298b6300372aed9 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 6431decb6346930c85c7c3487a367df42b5eff4e6290132d8b3bd8f2f60710dd 2 @@ -2419 +2419 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html ddb95ca6f43b36d19b55dbebc8ee5a9ce3f28e00b3da8d9790b3b6a0c858f619 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html b114403d645c0209f4144e39b9ac61614f1cc37aa85e3ebd198a64a60798b883 2 @@ -2421,4 +2421,4 @@ -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 370dc90857f00e9f93c751ef9f9677ec349f681384493a0bfb559cdea722893e 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html a5bfa2a5fc4505c2f8f479b82d14ea3e3ccb5cecb2570847273dc793bfc0e3a6 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html f4296ecaf00244e9b290fa627651571f4deac95f1cacbf768112289ad355ea2e 2 -/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html 14e1471cb52523f675c55cff07d3fc93c3ea7441d2e4b3dc8cd114a1c7b22fc6 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 2cf73988f6ae5eb67db7b7789b0d8ce9ea4fadc32c7a1a23a1e7ea75bde1377d 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html 076aa27afda00493e196a526e2fbefcbdde170f03b279bc90f77ed3cc1c3ee9d 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html e2282d7b486296565041907e6b3711ca1ba98a6a8abdc4b1a85e9d31a9164220 2 +/usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html a6ad7225588a05af2a651af7b70b8e6979c3dbd99e6883fd23349c153fece44e 2 @@ -2428,2 +2428,2 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html ab9ff89b6d9673222cd0ec1808cb1cb0467c33e743c0bae3c105314a0a5786c1 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 2359eeb6382517c5620abbfd5d21cc4a26c5d584ef6cb892126f54acad757329 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html fd550f34ee9e40681341b98e1615b7bb69dd8b640e53bc7b7f43fed3f60df512 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html ca5c5d66dab1ad3bf1d17879c8f7a292c25b0a9e48e17f6ec51fd9814c98c752 2 @@ -2432,3 +2432,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub 63015917df848a1b37bd7e9d4ccffa5953b6eeb6cd6da4e6bab4134c0b4369be 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html ba270296a0ba623a500fd49adc531d8dc0c3d6e620670cc222fc5425cccbe7d7 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 6b7271d033086fa3793627e6d23d388175750e74c9ecc9b5e23a110dcb310953 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub 6eab687ef1243f54cbc08180e91a23d0316c3fb356d73a977c1300332a4dfb93 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html fe00bacb844bc990ddd2ccea63313eef51df05183cfa68e02b3f5a3d3a360e3a 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 50f404188f229a7adb06810b0924d5ccc599a4edda93429688522909d6e0f07e 2 @@ -2446,3 +2446,3 @@ -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 6a2b066a797f1c8865e565e1f0da9adf5c7a179ec43d0f3c069b5fa5f37a26cc 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html a37e38db01586c43651f0e07793cfccf428ac41aeb42793b5a20f98a3f272ada 2 -/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 2447c8d90cf00e5a0ba49fcacf9359b44330606d6304a14cbb9ce4b656876eb6 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 9eed54d951799d024d444925ad42e59340b8bf8d038ca7a93fa5d8d569192360 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html 85c913eaed62f835902b6dc287bac6c1a6d2936869adfdfc7c3dbfea79560d00 2 +/usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 630d7e0e5d49dcc20f2615b06c21a4004e81558b3dba93ecd32d7c915f9bbebd 2 @@ -2452,2 +2452,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/404.html a1a8089419676e050f191023aa730f68511fdb0b9165fde0c36868465e815d22 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/api-reference.html 7210ed68bfce8dae4dccfe45ae971c342f1d8d1dd4e3bb79d6bdbcd099760958 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/404.html f493d99b9a71336464421ff8473d5ef958355f939a901d1e22e766f92ca23874 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/api-reference.html 2d7e4393ff4065512482e5ae83ee0ee0b1cd152a781897a4cc41fbd46effa935 2 @@ -2456,15 +2456,15 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub 470916daefe0d114a43ba082918f9ba7087f56448acbdb28c2f4b3afe37d8a11 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.html df4831d14553a8e7356aa26d58170129973c5af72fb051e66a13c84386752b38 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_app.html 0697726a31e13d36b3b44224dc948771f28d1137aa4a1d8e01d014b0bb4dddd8 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_codec.html 8da35a0821fc36edb54b272b941622f5dc2f836a643ac34cdee2d2b6823a4283 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_dict.html d966938231753c14c6fc69106a4ae1a01a2594695466441db0b97ab822745d67 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_examples.html c0797fc120d52cbffde80a0604cdee1bc4c6af69001b279116757e34a699c26c 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_intro.html c97efdb14c23ceb2ce06bc259c5da1957635725012ee33ed920edfaa72e58e5b 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_make.html 12aa7babf2701b3d90f9f72b746fbcc5c09c9a26577717255bc73d4d57cb4798 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_sctp.html e8989a1c10a428d6426baac255d82ca5e7ebb46679d43d6382906400eb3a7a5e 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_service.html 90ecc7f6b11f555c3a1d67777d1aad559193256106c2c191e556aae90c135b6e 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_soc.html 865081b63c59982680d0b2b663191610bee52349f0fcb62db0e7c8f4523917a7 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_tcp.html dbcc9e7aa22e2238c3078045e008384634c09d4d2c09197d6f06e9f40a98a5d1 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_transport.html 390158a1b079fa54962bdbf457bbee7a4fdafc6860694e4c1ebc2b1aa06b37bf 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_using.html 6706a013c35ac52f0ec22f500066b988138d9a2fc7a585052cd6334cfdf18b93 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameterc_cmd.html b4e2f615fbc8998c55ef6a12fef437032f77e29e75cbf3a6e23d8533c3d9093e 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub 02c963b828ca8042cb45c89ab079a4c4a3d85377da46ea9b162ff25e05083372 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.html fbe68466f4467f84ae5b030109fb54aeb790f05a5924bd11386947f144d64178 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_app.html a01a89f0a668f42eec57eeba8c299df2bf0e66ecde626d214bc6f4fc1d96debb 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_codec.html 036e90b39c51b6dd4ecfd91bae86c5ee0c3a0e8672e64e8df4a7680c7f2da328 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_dict.html c8d143c83999f05542b617f39dc2b4b1239ad8713c0216ae55a53a3f456d4143 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_examples.html 7179f254698f95e30de7c53c379cc1690c2ee0e59b5141e08504f59c3d7d3c80 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_intro.html 4a0e21e73d0f66826c0e9da03f65530f997ded94e811d7ed24e0e7fb5c46e6ec 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_make.html 15a505e4083904eddad033531e0feb4d3a5da8d30050f030d522f56d4ba15b1b 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_sctp.html ba154186eeb02959cfdf698d942a4355dfd249700b8db0fce4bcab8141833895 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_service.html d0549d3afbe3004cf28d2ae6e3d1e7b75ddb472c1b5487e39ea0e50190f221b8 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_soc.html 903f7d1a45e1a80e9298397ecd9194f3b31da460b1682b39ad8b5c707080906f 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_tcp.html b02ba988de3f5996fdc0f1348249e71421251e9a0783dda2ca761873e73dd2c9 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_transport.html a35af564cb02db96e2fc9a9e20ef413741accffdf7e3b27a11ffc4c8fa17cf95 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_using.html 2f9a6afe2eaba5e05fb9ad34a4807945ada68c2d6b0f7d36625f6b95cfd475ff 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameterc_cmd.html 8a9dd52c5ce40b8e33dd6d8cbdb1945b32bd42ef64cc9a6831440c1acf6bb480 2 @@ -2482,2 +2482,2 @@ -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/notes.html 54ed9ace610f42e3aab46c8199a425b3ba8e0f9dee0c93e15278fef07fa688d1 2 -/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/search.html 91890d2f6339d9357afe4753d122178aef84b0cb1032eecee428de2ddee1e817 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/notes.html df0a4ad5cb985319e2081c6c7c0c9e1fd6f5ffdd6608d6ec0c18cd9ab3b780f2 2 +/usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/search.html 512ab6456e65d83537fbcb3e5beb9ff149189e4d1df22ccfee1dc62393664b8f 2 @@ -2491,2 +2491,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html 62a39b13d2c8e3ba7d870d44832a997f86918969ed43d81468788cd4e45edcc9 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html bc5657f0048606ee29a66002de60932dad42f7a8b8be6c8b8890d96ff2191a49 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html ca7c04c58505fa69d8ce17d992fb6ca03bc222c62122f7a5f1d1338faac9b700 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html 7661c804f56c8ed6bc601f624ddfec4ed376f1a52ca3536450f73d468075af27 2 @@ -2497 +2497 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html d6211e852160e5f8aae487406ce9e8b9905dbc6f63010a6ceb6d73c89eb82dd9 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html b5753ae031c724b13e8871258f9e5943cfb3240472b8e7b4a7db046e630bd46f 2 @@ -2506 +2506 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-7C9EBC10.js a486d61bc72a32de688cbbe889390fb28291162d0490d8291ccb03539c95bc20 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-96375997.js 856b488859e93cd3b043a2555fcbe498488d3c76c5339d84d3dcda0e02d234e2 2 @@ -2508,12 +2508,12 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 10072cd42bfdc5358fa7606cc56540c4d5c54e68e794a81eba77f0b29b545a3c 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html e46f1e87e53902dd96b85b3f0a22ab5a8bfe99740719ed2bd0998fa76bca6ade 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 9af324566901cfd7c4653809bccd079b15006123d3d6c88b601271e0a42f5c61 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html 3e50ddd3b366c4cd27ae769d0d7ba5f4eaa6992ef8b5eca812c8dbcd71e53624 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html c02d6c091e45f470ec9bca9f5e392e7e2334ab52c77a88b7e60c3d938b1f771d 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 6a710adb446ebe73d88cc1068ad363089fce62dcb80fb136645e66e1777c0b14 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 549df537a89b1fdf5575f94a3d15c4e4d1fbbcc645d9c255b776e6116d00cc23 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html a5364e1f485d007210943dcabf0d693821c8a20115b803d6aa97abd7311dcbc2 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 8666ec4af558f39bfc4e01e7eb51b146135f171c6388adf66e82c897e0778ed6 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 267fc04c3d7d8b541970e6cb8ea6977ecdd88dd65c9549bb6cb6a90f096f8d3c 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html dc881e223ff36bb2a65717c18b35d5fe45ec983ea9394bf8bb924995aa54a0e4 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html e3873c76b27ca8f899e3efec1f88bc4ec320d67d50dae33855bd59238152f0c4 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html d21b19cc6d5f3893dd343c340cdaf9c629884613670cf9200abfc2b3f846416d 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html ab80dd78792e9350e6f69fc8d81a44c1462e9837a92f2a4734a7066e1cfc09d0 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html b3fd818693ae15464ccf36743bd43e08592508ccb9165d4b34cfd7b0d2b4e479 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html e0db2407412dcae9c19074b0919c35db07c9485a29efc36ab3ca6cc24f400d38 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html e77836a57e78fb5cefc560d7320efeeb8421c15e8064ae48679d00444944b181 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html be41cee08d6608a12c2cedbb556a7f0550963815fe025bb2b33ea7c9890aebb9 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 89102a8232bfd0177c2d493bbddd6e9202ec50cf28f3a294c1bbc509fe15742a 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html 54e597bc02b10a217287cd73a42229776e5a15b157fc36afd4af237db3bbf7f2 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 5cad753d53d626e753c8c1d0ad544b995c093fbb11d2ad945921a20c8f38a4f0 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 0a8aa620f1a28e0c0491ae1941aabea1e25a4fac4e54ffd8183014b72edb12da 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 31a36b57b25b08d64811b77faeb0250214d0655942cc9413cb735ff942dca156 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html d5ed44458602213171bb625cb535bb6857916e3bb1d7c80aa582c3ae387b7bfd 2 @@ -2521,2 +2521,2 @@ -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 459ad9da9e15c63c300fb253dda0e6bf6534bb63a448da74a11153cf80a5815e 2 -/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 6d4726d65dfffbf19d9d16cb1d70aaded56f8569043e0b9d3da192bcca1ee0c2 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html dc27d147c0005111e336263768b9f692d68ca922cb96e79c3a4c2ff15517fa5e 2 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 1b6944b99df55be332526883130edb8cba6245a0ee46eb01aaef86136396f6b8 2 @@ -2526,2 +2526,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 0ea8f5a884816379b30d5a1fd55b1451c66b27f704edf98bdf8055d1f2f54c1e 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 4843ea3834e452b49292a62447af9562ca8e1a159c54e630df50704d3d51caee 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 72cba3e46a20283042847514641728d813a4b527bf9328101bc9bb50ca60d1fa 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 617ada7aaac6ec252cece5781bade8d1087ae732e1bd993c03bfc1463f67b329 2 @@ -2540,2 +2540,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub 05e4d4ed4af60ab4ab24e50f33b2bfb5c1d0187792a5b35ce7ee97e930adc61e 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html d471b5122fb9e099cf7cd1b2cfa0e8c2611596cb75c421ef50c22c6f1176568b 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub a2352e895beb704f38b21f03008f2db8684365623248ea072e4811dcdc908514 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html 8636b162bbd78e3a32d5f28d05b69e7e123acd9db32f5ac604916ce26ba3dca8 2 @@ -2543,2 +2543,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 5ee573541c4b71516a6c766e857609f9e94e5b8f24706a57717d224fcbe61838 2 -/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 749c74b7e01f47537952781cdc0ff1e337e8c4b7b8601d08afb89706c8ecd98e 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 104ee765ca1424b9a61b092f11199e02c59d6bd5c78038a4c06f661d196745c9 2 +/usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 0d545e3c45ec7cfef107d06145f616f0600f1078ab6caf2db69d3951a5364da5 2 @@ -2548 +2548 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/404.html 48bef3ee80f005d19efdeb7505833beea55cc08ce9ee2640892d95fe54d76285 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/404.html 2fea0e117ad990d1958907efdcc2b54840f409324bf036a9f6263b2c52804116 2 @@ -2561,6 +2561,6 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei.html 13d6fa429cb2bd6b779a27b1147e84075eb38fde882cce295d96d6525e8e9533 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_connect.html 6e7215dbe65b8a6771661a2e725be5e19059a841393b638ff8626c8ed372f14a 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_global.html 62260eef01b2d90709d90bf8e605addaaf11a04f01851935903753a5621007c4 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_users_guide.html 267ad13b7546736c2f984d3e1e8846e9cb75507b61e108625b1a6546144aa1a3 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_call_cmd.html 23cfafe042be5e099a0617d093e5f1aebafac72d3e595abb087b90d4d614e8a0 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub ad169afb1d6e17baba4895b50bc00cbd22c278a53ce0d36488fbfe161804ae2d 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei.html c0e305b2dfb78d9d05886d584d8ffb70290fc95aa6b67b067d721d188054084a 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_connect.html 305b9b78804379b10370945398a8562a1d25503a652508093ebb1e273b0e9ed1 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_global.html b50846e0b2a80d538233776804763768e7581ef5442d56e097bd356291db4f31 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_users_guide.html 118a4bb663d2ea9b3de2cfab5242c6a9c1ede216c09a494adf719e2e83dc5666 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_call_cmd.html aaa562f5b4c99b23a62ac9314b77f038be390582bd58258c148276dfc48219e1 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub d49622614d93a422b0b4a5676b26e8b6cad570823544244598eeec8faf540697 2 @@ -2568,2 +2568,2 @@ -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/notes.html ee6a1d80f1c945ad757370009d58491fee88fbac42c5b01de3a2f45980c7fdc3 2 -/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/search.html c054b4ce4d9a6919719dee9d7bc55bb4011bff12306d358b836af1e262d7c3be 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/notes.html c74272aae540fd3a084977c0813cbfbfb6e420f4e522b22f57955c15f7349eaa 2 +/usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/search.html ca2c36c5a5e42843559b0450384348ee217e75c6d9cf83fe7217deaa2aca2bf9 2 @@ -2573,2 +2573,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/404.html eb796263eaac2bda17648afc853b888120a846629dacd39e403828b758e5c9fc 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/api-reference.html c23ec6a9e358466ce03664ca9d4e37acabce9d97ab255cbfdc2d9283844039d7 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/404.html 36bfc0609b0b5f4d50924c7e05266c486e60582e27333ce283e2f98de7b38b8d 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/api-reference.html a35d933e79f5810359800039b2b878b9fe13bfc97974caf8b3fa730eecedab75 2 @@ -2598,9 +2598,9 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub bdc77ad57eb3ed75e6f5b6a59c31b637ea40852796669febbdc3e1c61ee11155 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.html 49d53a7dc0283c5561f74f7921ab9218f52e045e97e318ad99beb8eefd58c0dd 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_collector.html 72ff0e6dd3c418803da22238955a748f83808b07fd490d746c2a8a7e72610b28 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_desc.html d9887ed843f37f73fd5e9fc673b729991108ac97f00eb1318dfe10b50ed719aa 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_examples.html ef2b8976e05b52b865b6ee6bc528ca3c9bbf23474ac02c6df34b3a9ac728b070 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_intro.html 7a9bd29e1ca7444c6ff6bf697d2d71062479db91300d0c496f9b031a472c84dd 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_selector.html a5114321e919f745da1a5456d8bf9b9f66f5ab3edcff72b5e66858e841ea7068 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_tutorial.html 9591293f5dd6823d24fb369c09d714d1ab4ba24e63dfd605511c96a8859a953e 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_viewer.html 94d0f8271fdd70c6c5afeab429fa9de911f748e4e61b835cd64c2f6853abc312 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub 7ea8ef561359e9a80a70a36f33da7bb524e296ff5caceffd03f154c73e1d8485 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.html 9c3099860becc317a74f90954da1d58e78a9636282f63f1e27712cca6624555e 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_collector.html 10fa8fd05d56aa64f202b1a9e67f1d5e4e491fd3a14931b5aea51ca006544da4 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_desc.html 155424299a8d86eda6a01b9ce8b26ee8e9d80c1f2cee08f41f98200fc7987517 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_examples.html 9974145e4237bfb3c15a8c3f6e31cb0adf21932366880f23c01fabb51cb694d8 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_intro.html 518d119a93696005865b6270093cf8c81c056490bb63383e2daca49d381d3123 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_selector.html b54d9d338615d4f79a2fc192e5713d3b8724a547024c3468d968d4c34a8f3280 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_tutorial.html 4adb79a2d76094f17c74a8afba8f5ff932be8874ac6e8848ecdf9a82c81cd0ec 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_viewer.html 04c2bf84bb7551553031c2e218709181e032a9c97a139581f8f0c45b49a5e531 2 @@ -2608,2 +2608,2 @@ -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/notes.html 709b099d0291ea24d08d621648fc7c489e45762b6f96d075b15c1efeedbf0baa 2 -/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/search.html a8961ad7089c9334ac696245a464f6671a39d3eb16c7523b7fdac4d345aae1b7 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/notes.html 60cd00740f61bb49acefd1fef5feb8eb8bb2f75a903fd28a1f7a0c5db1896c7a 2 +/usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/search.html 4dae1e76d14dd017c4bae9e44f4c4a9f61fb9aa00a8d1bcb8b8f92f28104a3de 2 @@ -2613,2 +2613,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/404.html f5f5ffd44fd549518f064e957afa754fee383825a93d45eedf7382b8203d67fb 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/api-reference.html 446693c1802b7d39da660b058eeeafe71da2e9f8b34723403a83697d16bef71e 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/404.html 8ae2c289b7303c83b27473899926f5236c539c139e0fb2851f59f7015548914b 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/api-reference.html d4ae179aff17edf68cdbcd2308769daecf7fc5ed9680070d71fd83b0238c3cc5 2 @@ -2617 +2617 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/chapter.html 74744f3af3c64b922a5be7312067bfdca780c70386408ca5bc5823408512d7bc 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/chapter.html f80b8b5d82c65a5d8f9910d75ffd7106fe562ec8d8a7f7913baea4304f38f476 2 @@ -2628,3 +2628,3 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub a3ac1c295807890025674ca7470840f298a8acfec582607f764e3a5325b1ebd4 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.html 7ff4683d2110a25fa56592ca556dae14ef0ca3b64618e578fd8f4c10cf9e69f9 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit_surefire.html a171889a01fb410dd5f1556bb461700763630e336cf4275b6fb1f9a9df1fea95 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub 84664c5ed18ff448b8fa4548e6739684ba17ba0ad1ce1131c13a3569f30c562c 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.html 2c0bcc7862064de484e460e1e95b4aa457c2ec4bced3df8f47d767a8188797fb 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit_surefire.html bb52446b504f1157d55a95c05faac0d77be96ab59a071ea73162b65f61469804 2 @@ -2632,2 +2632,2 @@ -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/notes.html dbaa9092fa6cad9a545f0092842b570db120981dec3271a8e726132137a06ebd 2 -/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/search.html 29ef2bdbab28b9b08b57a0081b45b237c56e52d41785d8fae52f8b3512488fc6 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/notes.html 9ffa551e5c287e3762374543055bce9657c9223528f78161cbaf45f8a16c8299 2 +/usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/search.html 6d03b9640d09f1eb3ce8e27b66ce6cbab87b4a1f08374b8c9bc49bfc15bf4fa1 2 @@ -2637,2 +2637,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/404.html fe442f916a761375ecdb11ef7a551191e82d9d58444d5ea9131be797a0faddd7 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/api-reference.html 294c6b5ea46b09cef3fc051093c8fd50bb58e6bc165021e2e36484baa73973d7 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/404.html e81d83d83bed7b9591e8fdaa3aaa20d75d98949f20ca5e0d4dc2e72279f25a1f 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/api-reference.html a653c14d9617703d2ea10f03e7e9ed2d7c3398f7e2078af3de5d5cf6397d07e3 2 @@ -2651,3 +2651,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub 82ebf57560b9b121e1b76213a3a741b3bcab8a60494f711224ce71bd595752ce 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html 62c00dd9326d2027a5bd13ee4df8f87fdb9693da0c7545bc11d8303d8fd0bb60 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html 6097d4f05add3df467b49027c1e5eb8d46454b51bcfb2138133d8f4289b72335 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub 834a2970b64a9e2239cc93762eb90edac52884d13c5a129fa1bfeaa1d76c2a39 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html 9d3827f2b2a0c546d53281a02e1de3191e47f06d272b3f532396c04ba22a9510 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html 3688ba850b4bb72b33a58adb837b07a80d76ad82a83d055031df20328d9dea60 2 @@ -2655,3 +2655,3 @@ -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/introduction.html 2e3b2180735040aecc8b6f658d8c37f0f69276d5c733bc9f66b859ea9f140a6a 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/notes.html 7df3274ef5ee9454596508f2c4017954e1f2cb3e02c3b96cf46694e0509379f7 2 -/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/search.html 4693fffa4c0d2beb7242bf012d49e91af74e538390ed756690e5fb92b73bafb2 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/introduction.html 6ad2f08e410b6d4f3365470389b2ed96e038eb3dc412032db25022b6188a4347 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/notes.html 24c129dce9eb3b0869b1c1815fefc5042bedcdabe8c149e897741a8c23c6b9e8 2 +/usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/search.html 79e26f87ab50ce3f93ae48585fdced6f9cd90b9240de00df58814c398cef7080 2 @@ -2661,2 +2661,2 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/404.html 5bf55d42fb2ca46d294f7ad69d273ffea470e5456bfb5f4aec693d3c24b73ee2 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/api-reference.html ec5431c94f959d7f527951851b78cb18fee118ce82105776389a47f97a6fe4d9 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/404.html 743e418bd82d0f0efdced3d196f22cd8b22ab42f12a03d63bbb536d19a22d130 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/api-reference.html f7c78151fa0128aa61b7f26c194eb3ac17584e917bab932c303da734c9c20b46 2 @@ -2675,8 +2675,8 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_client.html 648b2190c4f819335cedff3c606ce6b34a824a14156315f47c6673baf77d910b 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_server.html d6ef3f64facc5fc04c6d2b1f392b573dc71609bb1d28c9d7fd1e18a4ef213419 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_uri.html 49a7d29a2269bcbffdf9d23e1b670d544c43f91d604c58d0fdb0755242caaa78 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpc.html ce8942a66a291e0d6c47c19f4061656dd06cd5ea75c8811698713e1160c7df0b 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd.html 708d678ae1272c867a6ea4e54ab52c5f9f2b8c60527bcbb8500f89d6203372b2 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_custom_api.html 01ae22597a015d152d4bbd3df5d80f30145971891adebc1ca87adf298e368be9 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_socket.html 4ffbde594c6526f50f94a72ea763438fcedeac1364e109261aa9226a79c0c14b 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_util.html c6e6c12af9e125be707a7bc35d8c9f75a78f7dbafa9b2b7d155e3d2a3342735f 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_client.html 08d5ed56f2a38fed0b3b356c42e7acf1bb255b5c10777ebd018d6770515bec73 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_server.html e95dfb494d448b81e5415390600076f4d74d8f1278530682cd7447ce692d4ea5 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_uri.html daf5cbb6e721fc326ea26ab8188e817f9f17d9fd1bda5d32692bbc45dffeadb7 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpc.html d9f9cda10d9e63fd7bf17002cbb5c93191081fd849372945aad6caba1f31ff25 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd.html b0b9a0de97474c2c8eec0eb3e4b144da92cd7c894c07613dd1fbc57382ad3985 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_custom_api.html 71d065b0c19ccaeba29955bee83f5c695167f664776ed191d67c80d7f42d8512 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_socket.html a7105983bd8c36222f95d39e2ee34c67e236322f7022f5c0ff84b7579c12c66e 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_util.html df5abbb0198e3efbee240ed759f06e5a3bc08d8f22519a49b8fc71a5aa3fc458 2 @@ -2684,10 +2684,10 @@ -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub a42e8ed94aa48a7c96fff91a756d2f2a372d22fbe60eab626d59871a04dac6d0 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.html 3b3d3f9e279fb256b9e68bbaa0ed971ae73d164bc8dfd5d79849331ec22268a4 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets_services.html 95eb6b7f312f00e0b8bd956c293e000ff095986a03182b20f1d4e6757d7806eb 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/introduction.html 60653c77d981d507aded706e5fe2a7fdf02d75037a44024affbd388bfa19e8d0 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_alias.html d9ab7b91f159ec3b0d4de3b88141b59edda7190b0c2492f4ffe6157d6c9f831e 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_auth.html 941a7b15eff087503b0085c7ed8cd275f54e55259f36685686c0242207a9e849 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_esi.html 91f53ae9dc8358a49dd3004ddb354412f7b78142d8f081ce9e09803bf0cb84cb 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_security.html bcd6145c27b1fadfb47e21f46ee84878594f6a8ceb84ed85cc0e02c1f0b0e2a1 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/notes.html 3bddf79da6cdbe7e5a9fa6f071294458fb9616ce9c87b7455c24e3ca13c50a02 2 -/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/search.html 4d821e7252615ac8dd14185eccdd0e473bdeb124c52caddb667622de477b37d0 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub f5229e3ac14a75f3241fa70aff77cbc73a7caf63e2ebed413c6935c1cd86a419 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.html 61898677f2856e085b238b8b7eac0e9cbb5a303248ea7f60347548b565918a53 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets_services.html 31463ec5da412497dfe5e6d2f205e3b45dfdca45f41d219d19286ff6f89fd3c4 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/introduction.html fdd5452b1c3720c15470531affdbffcc2b50f5447a3010e891cf608281c795b9 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_alias.html a7e55754b49dc2e67a8651dd2c0afae8f1a4718dd7d3dfee270a3894e4fc0b77 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_auth.html da94305748c27c873bf1f5813aa05f3b0c7fd630280b250e90042b7af84eada8 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_esi.html 6f42cac88d90e5a149bca8cad05bfb109d2752cf224bb7fc26dfca647c687ddd 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/mod_security.html cb528dd5c3f45892bba71d70a6104b296b2cb050e776f4f20a7fd5eeac575dd9 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/notes.html 9d3751151b7a715cadfc180ae24fdc22ea17e9d2852f6b06970a468b02898c3d 2 +/usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/search.html 0a6b1f714a00f236e0795e1fedc58a8350ba172abe12894a2f7195d04d922c96 2 @@ -2697 +2697 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/404.html 064ed627db3ef9ed3aaf76b420d236a851f34e28e935082d1432241533a8cfbd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/404.html 4b04be73191b4ce3aeb40548ff5cb1cdafb47f16dce2521fa69f1cc7209f6d4a 2 @@ -2700,2 +2700,2 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allclasses-index.html 563706529fc34b8b89caecc9f73c4d06353c1ed3939807a3f7d6c3a909263419 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allpackages-index.html fd3dd5ede84cd420f33a28f21bf208731a7895a18e87b6e637197165bd710ed8 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allclasses-index.html 6659d1422d4258f628948d1d4a66698681d0c379dcaa97d1302033222a5712ba 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/allpackages-index.html 103405c4b27b3ca555f16f13984fdf2bb9430f56e9d1173bbfe44b0a771fbe45 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 ca0fbf57370773c5d6284fa88633b6937fe4d851348738a6ee79a7f8ed5a8d0a 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html 1b72e04891788f9aac20e21f4e58eae7a00c1956105d553ee7bc378ca5d80f0b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html 5586bdd5246e7f17c3fe3f1d96afd6db8bfc971d9d2cf25392e2b7f033706704 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html 49012fdc8b4b4cf4831032c4c9fc13bf798d2153b6a6e1ea4e48fd8e75156fbe 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html 26a2cbb12a2aa4e57e94917554b2de98cee82036bdbd3970eafaae43cc4e8657 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html edb54eb2899e7ea2ba942279a037988670af480d73ff347d4e107013d1c1710f 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html e39a370024be84c4c1e6cb00942508209465a3b9fdc490e39d720ed2d7390ced 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html 98bd1083e6b94f2bae929eda0890d1dea86a5289ae6215d297264b4caba249f9 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html 1d837023c11fd7449b785c1b9fd92ba6105272add6b13cc6f702d224f74658a4 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html 3ec06f4be88a9cb595b0cf477d3cb93395e6d991e341219bcbd6eb09b68c34f0 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html d0200b723d8d7027b1d3a6ec531d064d7f00fc8dd38c492066c17f7aad2cdf40 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html 0d8450e405b1f9ef0f98448632a86ec867b9c6822d18a4208fdfee42af56fa28 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html 1514dd76564593eee37c27f8721ce8bcdc17346e7aab5cf56f578808248a7cf3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html ef4a9968ccacf4c7c91818ee32704a8f796b5f94e5689bcce10205d066b2c3c3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html e2932214c2dd0c88c439da417ff714a0a3288b19c3ac7ca69033408e2b949325 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html f9dd9fbb887b20bfb8c770773f5e4e4eb7791278221cc19686362b219eab1b5f 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html 90742f0752fc56c9826f26ae79865bd198d13bffcb814c5d671fb8992ba3a90f 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html 1b5f824efdb409847b4c77ad8500abcc5c37e5b622d6de7daee4eb578c9e6c1e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html 1d42dfcb2e8bc5f39bd7e2fe174ffb413be84f3f7410b588dbe23370338d8d21 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html 7cc20780fa034e91193aa668fc8cdfb181384944e86715374ecd1ca384e1f3e7 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html d8b6c4da924528cafba3e6f304df9cc06216a4d3a9fff08f4050cb123e5ea0e0 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html 8a969318043966221d1b9c8c6748dd2638e57f22c196485fdc448aab08402b8c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html f7f81440a1d8b9454c12231808515b5fa9e2e83ed95e1ceec58c60a1332f2ab6 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html f99faba53ffa29c360a0941542886303b320fbc30736ac45f6bbcc7ee20bee55 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html bd19a911a9dbaf89d90642fb609eef766bddf00243144e27e879438b69fdc40d 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html 79bd81d41e34da36a2d4db71451b3be325bb24897c76d9809656a7405d463cd4 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html 6e53fd323cdb079443f18f16d2e9fe468c67732d569e413fe4e23d7438103021 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html 12f49249343ee8a6adf4721c3ac415998351523ee8c6bd1787a0fb4e769d46df 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html 1721416b3313a3ede07c0f78614d275705a2a65d87cc1ea9c8e4610656ccdb2c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html 18e5f287cec9032e9fa2d6dc70f5dfdfac2ec27b52e7321630a748c77e6b8707 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html a21591e7cb185b826331ededc9b57409382149c5df3862d2fc8eba1e9d13c7ab 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html 2464d45bc045754584b6058259e4688860d561da3a9fba4a87b884ec2b616164 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html fb279f645c002e763b21ac474d65bb53536df30797769fbf1842ace9dbed0b1a 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html 7a2685fa55da67a019e213f93a4631507be0e6ed97f0ea9ac64418c65e0bcb9c 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html 2c802db1f28d5df40ac4ca0797ca6f2acec985546f2402286f0259b05d8196f8 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html af207b9fa32bbd8a1ff7cf89613c2c69aa684ef54b9621cf3313c0044a40c7d7 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html 4c64ce231b70d9a3e92e96ac1a05cf590328c6cb0c9f1f3215883ba92fa6e28e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html 25ad8ba3c84b19fd8f78b0e06b699a15e2694ad3f3af5c6847324e4133a67ceb 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html 3a95fc083ef2e1e8c7e0926a2a260e3ad91e2e3951f9ff37bf715c8703517f46 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html 7c30dd3f1f060aa61e0dd75fd20d1478e49d3595e1b5ef3bffeac74b4ba42aa0 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html f166d4584e8de5668772020364aacc0bff68130c5278efbaa02c23ae995795da 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html ee1d4d254f51e23ae0aacc0cbf54a84e78e23b2c368653a38df820fb538a49c8 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html 84d3016497c8ebbcc17634bbf7880504ca4a09dc607fdf72b0d35eed0b839bc2 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html c9e442eda8e18bce3670942adc1d2603ee3d963f3eb678e0e0f2a46bfa4fe0d2 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html 1a77d572a6c996c272f5d8a352539ece5635d077a915b8fad08ee09ea7d9daef 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html 7012546c9066911c07f4d909eadc7daac19b4180fa4578235e2b969960392b93 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html 1d2a21e9e66abab852e809a4ea8d4f8399a6fd3e9880a6467de976d7c98fc168 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html 0357c2d80db4e55164f74710314ea2f7f9837e67e9b2c1120874708d1a7da31b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html 35998b71ea254d633eee5150736e96a75dae0deaa225365e431b286b9700d2d6 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html 5d7396c26945406a6f62da25135a88bba66c88cf6cb30e00f915cf0eb721a754 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html 4b508e0246e37a5abc8dabf3161e4502007e2fe0163236ca8c21872b179af34d 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html adc156f787259a2a4515218b29989a3554c0bf6fef18df2709a1f7774acffb28 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html a33ca5edf60838e9faddd92b5e288e56996d68f41e52c293cd80bfc607b95fa3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html 1a1f927e86b6554f0193890d541a3868b8f63abcb7579efb9e9c0181b83efe8b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html 29fe51f22f3e430c84b1eec6089cb21b4d49461249d5b5d991d5d2941ffba5fc 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html dcbe0891dc8cfb73ee55b18d5bece32cf498ce38fce0aed6c7ccfa3b156ad746 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html ea14fc726b613a8e40044a040a2d2cbe6e732bc9b7049471386bc8568419178b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html 2357249fc74e0cd9fdbd82159c81dbec10e4a1b3144ad59b705f36f523bbd3ec 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html 56ba07da37fc683019c990cf08c72353f41dd29f36e5342f5d2ed916efbc57e3 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/constant-values.html 41e2062bb2b663937b5507d895eddfb3d4feac5792e312fcc93f45e56e28ea80 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/deprecated-list.html ee42c22b48c2907b8a14d325ad36ea68ca7a9e78a26d9b73875a4d2db325c85a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html 0354b39025748c4bd8ea574e6fbed511feca5731495bf195c173777fbcbcf15d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html 81c7518672e84fc01f3fb8146fb9f4734fbc625f0f32c5107a8bee3605e4c03b 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html 8b3c110da53aa6be8e342f5cb173b61c671f76c00263cecc88c3b127f0481a26 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html aebfe5055d3e5904b8b13de5e022a8e774ab4714076f8b25a5c406734dd54c10 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html 6417394454211144d38e242807154210c01d8d9599b717a3cc20f292ef57b246 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html de9b437cf42ee8db0fc922bfd2883e69c70e8d05adcd37682a1d98dacfde5069 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html 22415bcffad1795bbc9a4609927aae0ba904446363d2b4a508f7af373d149bf9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html 3ce056586282e8cf389c9b8b0f9362566c47900b496bd8774186e4919f40a143 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html 72032147b67619ecf473a0454e424dc1402d411824487f61c4a0b339ce4f785b 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html bb4a74c38908220ffc9b26f6ef8020309cf016c858e59cf3a6943b71e729545e 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html a52dab1cf4752940f3377db336dd1d1691930635423f5054301049af5bda68d9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html 9477dfcb82f3929cebc9b52ee5aa4445ce08cb418dc7964c2aed3803c3a4efe8 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html 021cbb01ea86afe0e53355fda094755827d220f2933b5042d4bc030be352ab8e 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html 729d2f86d0694051e2cd3c42bed9a584f5b7873fc621b3ce0b606e10bd821222 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html 5f0dda9035556c950d022dabd24bc7cb06611d9999a667863e1e1262daf59408 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html c2f33d035651d00c1d9a71df1d0bb18298314e70d186792d352c2f9c4fe43c21 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html a9dc57f30a5bcdadbb399fef7ff6f75217581a3af851ff81ec2e5e0e5bb26304 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html 4b0c84e79f62537919fc293dc8d739ed14b2f6d5668c2d9dde6944ede738c35b 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html 9cf326f051b91d82f2103c30135514c124d5551e023c06655381d668106a9b1d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html e2c771353b94b13eadf2860c8a0dffa44c1e003df0ddd39ce52b7ee966f94e19 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html 44015c78e1e666b522ad2b1e31cf51d236b2c498271f5878df823a88fecb707e 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html ffc70d8d5f66399b6f8a7cdbef1f2cd281d8963d3d5441e3952c8c5f888efa11 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html c30f336b1c5f7bc48fee1309869f8719dd4bb56f49e50ba32adb14cbdc080028 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html a256f255a2c408168d8aeef491a874dd617ddc268d7cdef062e2090b82bc3698 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html f78508c5e9f5f5a8de84a2fe15bfffdba1a2cb7587da611ff4703aff6f3096bf 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html a55ddcd8bbf7ab2348a61843c7854d45627371fc51856be6afd50d04b4dfbad8 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html 5057031c90d236e0d808fd3e99a997a58adda09c2fe38e4482c92bcc1f1d7cbe 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html 5430ebd95645349a77599b05adb70f3925c6efeaaaac3947a4a58fbd6ab5e667 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html ba2fcef6b446bde970210ed96b325473408ec904f8d9ffd4965248b01461e95a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html d594a2351538cf0e6bd612cd199424f33cb9a527e2cb4d19257a057bdaf1b903 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html 0ed1656dbd5f6ae30c2ce02549192b5f3167a13430c7c357cfd2b6bdf4d985e9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html 1529a8e57ea96b31d694959d1c0e6b83e53f9728e3fceddb96c576256e9efd1d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html be60afafeccfabe1ad5efe674fd63e54ff89e7fce858b560e97a6cd5ce5246e2 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html 32d4ec0ae4b5d38e1962f5cdeaf33990e7080ffc07787ea8cb4796b39e224312 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html 16fd6ac8b4bf314107549b43609685e5eb6dc6a7b049456bb9e1d322a285e7c0 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html fed7eac35b0c838f9816b6695a4b2a7bd2721021013cb469e5520c354432108c 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html 34a432a3a1408381e3e06fe5df3a4ee51d8036a3d45a315997a5261965c337d0 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html 17704fb12d744d031729204af00da85be21f347be3320ba76b2279c186e25ab6 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html 5e7da8e536a58fde4f2981569e1cfe3dc4d5fe9b0f79ad770662aede96f48d3a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html a00a3bdcec25e282e6a1c064fea7cb490b6db9d63f3bafcdaa1ce855ec66969a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html fa255b5e6158f428ee87efc910c114a2ea6d270bb530f36c922174b7bd8ad5e9 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html 8ff6044112ae062c13bc8a9488c8e4dfaf6711ed2d0b4c6aa40a7405d59d9118 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html 1299a642f2e8d1e1be185bb8d11da6db9a8a4bde7d9710f2f0a654f59373f318 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html b5309022c653152a0d1c8621059843398d8b7b3ea272c8e95d79e28292cd583b 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html 5728711d46154a4033d014362fd11cbab2f0a55305b36c170a125b037994e0b8 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html b1a0c98e51877ab440905d1a1b065e1773dd6fc263595886759c2db8931bfe21 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html f7aad42c41c0fa328d75e95de256a95ea472d5525797928e9cc9b6707c51fb86 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html 54e6326f42717408e9f7501687f81c1aea7ee7d4b5e759c88dad0de40cac0b02 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html 8a4d2933fefd09afaf30c6d3d12e1bfd6dd6d70d7f29d83ea157815e18dc1540 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html c97f3abb755371df4d46840937eadf92612646014b7f82987bfdac661b90c61a 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html ddf869f7d202a8fe088e766fd6b9b60045fcdd6710cad2073c984fda9fca7537 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html 7e15527a395ccd839d271f6784e138be7010881be17b60e735fe485a6b482883 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html d923426d9fdea07b2534bff74be43cf81b73c45673880750abab8a837afd8266 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html a193d38a838b54d60fdd01073049128699e263c861dcab4f890479e79cd5c0a5 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html c109d3a37002af4fd227cd5550d267437a07d1f51bff9aa0ab907d85b3fbdb19 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html 5cdb0fa3ac96e442dc4a4e5b36f9d50dbd859f64ebde06a017c6f631863714dc 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html f382c058d0d3289a7c45a91408bd457b2516d03c5d7451dbf99da9caa21832cd 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html 270e8f09cfd2b6cc19c6d1b30dc04ab54c157b3f719b15f1b8a0d1627821cf51 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html 4e06d852f67ea0034f1c4a1db2850ffb752bdf47303605dbb7a6158f5b935e1f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/constant-values.html fa647d4cb4fddee4d28239c1eae91db86919357f730d53aa00cb4249c2639dbb 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/deprecated-list.html 3ec636ebc7969c95497d9ba18ba107dc445a2bd9ab820b41127b302e0b7ff9a3 2 @@ -2768,3 +2768,3 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/help-doc.html a83fdca2dd7e2a81cf2553f12b736dc63458849829453c8f50cb0f4abc78470b 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index-all.html a384c6bbb395f93630089b5b28184aa8deabbda294d920fadbd5699248260efa 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index.html 732c5a18c9644dc5018ef9f564a11b0c1ba2face9d1cd2dcd050f1a882b3d1ba 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/help-doc.html 0efe1d658b7e8a00c6d4f232e2b0421b264ec24ee9e76724670a27c36192b757 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index-all.html 22a1c0c0d6ad093c189bac2e1d77fdbfd94220b3c9c7ec440ccf1ab5582b129f 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/index.html c6b760e573740445741c9da729117160e681523e091877e1ff9cb5c1ab2ec125 2 @@ -2780 +2780 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/overview-tree.html 4a85dcaf7ceb1c397f33d9558b63e1da8d81f8d0e70152bd3f1aacdb122d5a52 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/overview-tree.html a6cf9425d25339b51ac18b9d96b087e206ffd2c2497b739a2218bde578594ea6 2 @@ -2823,2 +2823,2 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/search.html efbdd9ded452f7be82f7c7d51bd15cbf4300edd9825e55b698fb828ea8b784e5 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/serialized-form.html b3cfef81bf784bb238477e61102f8396fd4a419727a2ba543eaf3a1ec3eb6665 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/search.html 06c8c1aedbe9886cd177e8940a3f5c2a5bf7f274869c4cb05a021fb41cafc8a5 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/assets/java/serialized-form.html 24fa9f13eec1ff9492e2998eafeea1060dfdef090407b605a9a7ea32a1706ef2 2 @@ -2839,3 +2839,3 @@ -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/jinterface_users_guide.html 8a05f1e5c505af5fa1d3b2d3c1522ea91efd7191dda3a6f3cbaca9c5ca4dd0e9 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/notes.html f40b2348cca53d71982a4654f1c195708cf9bc73ebb4ee1a0c9036b01a3f4d6e 2 -/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/search.html a750d5c08c71978c88a8ad9acbb4600ecfcc3682d85f2e19e696bf3239f602d4 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/jinterface_users_guide.html f204225a210529119e058f41fd35be9779b5f087e2345674e4189e3fcaa85c8d 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/notes.html c7ace413f0bb728f745ed821b0febe8ae989100ae09486144ff63a92ecc60a67 2 +/usr/share/doc/packages/erlang-doc/lib/jinterface-1.15/doc/html/search.html 0c58cf8ecd378cfb216ece24df4ad9d50efeb5b1f53b85b3c2e0c191ace351bd 2 @@ -2845,4 +2845,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/404.html f86d2759dd35dbf5e09232dd51992739f733dff3b434e42fe656c7592af87598 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/api-reference.html de587ecdeca025ea668314aec71dff2d658821904a5c732741974ead0e2a6f34 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/app.html 6b29be4cdb7945ab3edfd9eddd6e4884f2a54dfe49e10288e66ecb37f12bd6a8 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/application.html 47f5d600bd17fb4e4010a1a7301bbbcc7e4a22ce169a38fb32ee630d2d49431c 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/404.html 3c2456698abedb80fb7d014ff25fa4de3ad929e5324f68a040619dff77f93288 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/api-reference.html 5d0537b5340bcbcfd0ba3819b76ddfe0c2d66f2505dd588897bfe88c8bd991bc 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/app.html a708e3ba4d3713e3b7da684dee23a0a33195b859d3090af4b6d3d5027f2e57b6 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/application.html b65983bee614d3eff83fe57f90bb069887e781a3aec93bd23c656c3498b634b8 2 @@ -2851,4 +2851,4 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/auth.html d4800e2571baea3c5ac754afd910e3da42c18d3f9427e833854cb3afa5d1023c 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/code.html c43b3f22994cd14b17f6d7e4e8041010c4cf0f90aba066e9bfbba2ef97abd0d1 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/config.html 2d8462f58d3fe000fa892d59ffa9965c970d19eabe15f078e089d584682c7b36 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/disk_log.html 38856186556700e1adf1e714478d6b9bed996b87a2aaebc8d96df11591637079 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/auth.html 45ceb8e16c84dcc3cc15bdf660ac71662b59aa69c3c9f6037b4ce5e4079cc7d9 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/code.html 73bc25f739476bf0fa1dca19ff9435a8642512b83ce18e3dcffedaa5fd51df84 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/config.html 1777c573819bc7bef1a4206173a05daee7490f45689003f2b9b2ca44bab60f2b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/disk_log.html 8e85e2cb2da01e0b125e63112c3035df141e9446e94d0c425cc8042bec6f8fac 2 @@ -2865,15 +2865,15 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/eep48_chapter.html 877ad08aba4ce55933f7a3b8c5c45439c733a31715b3e71f3d6bd0677f3cb8d4 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_boot_server.html ce3376286f376509c4eb7e1b4ea22d701663b2443e5d41078285203a28454f31 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_ddll.html 0403e790d94498edef9c91d20a29c46c3c60298e6a1331c003705c8e84fa3c8e 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_debugger.html 7c23844255d4974b7c42f387097fadd5a7b236c9d97659f03c1f521a2c6423e0 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_epmd.html 4ddfe92053f55146b399632e2c0dee249d4b2384d8d74604fafc0059e7a8b934 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erpc.html f388a740b8a52065d232c66a3d4839319ee28dde7e41ab2a92792dc08f3d55d7 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/error_handler.html 52c57c0363aceadd328d37ad14ab34e17ae25905766800e2e8e1e5e673c789d5 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/error_logger.html 0ff82025fcbda862e3ae1604a721f1e177556131e3dc49e243afdfc2a7bad15e 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/file.html a8d8a29647263756ea1aceaad21a87d734ad861c46eb5ed7b78322b24bb23746 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_sctp.html 980eae116dd0e7edce109562bd8bf6ebf64411a5d74c26a5879e24dd6c2855e7 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_tcp.html b4e008ddf6c744fb351e1c005f168d5fcf95eeab315104970027e6c8679a6931 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_udp.html e40ba80cdb443b568155302ffab7b5e363e84d6387862fe93a4af7125e9dc142 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global.html 1ab9d6d2b0d71442a6829ef6093385f5efd482428d48a54e949fe1e9fd85e5e8 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global_group.html a466da9d47471c23491dca4a1220d6f5e512bfd07dd0881078f2fad7c815913d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/heart.html cb161c02305f4ba160738c7269f26abdcdec1353e58a3bf346dec6c786e880f0 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/eep48_chapter.html b4a6d81a3b027a1dac25989b2c82ea5951f3252d17211b056abc94af6410d7d3 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_boot_server.html 3cbf350e7772a6997d2a7b9ede5447618e18abb1aa92023b7091436cde3f449a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_ddll.html 8e17c08f3cc57697eb3d28c6364abef433d7df0f6093db116c7e5649042c1a6a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_debugger.html 0949d1210ed0e0a3881aebc4909f78a24d9a692101bc59b158df15bc0b8ca12a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erl_epmd.html 50fc4188511dbf5e926ab561df193117b302b8c8e22906cbda4fc068e8717125 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/erpc.html 0c8d96efab203ea1d52254569cc4062af0256deebfadb512c78501ccf4d406dd 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/error_handler.html 8da4f7a8978b9a5ba28618dad9414eb07ccab5863e3c1c9ec534a4c1036bab50 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/error_logger.html 43755be5c0f4b278127f0bda15b97c4c9b78ee0c6d53d3b127d8d33e636fb896 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/file.html 6932c4ad8a4c047053f98e2d9cd19c0634de2c6b9e6ea941cc58f8b03d4a08ea 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_sctp.html 27e0f4a97399c2f83d70fe4538657c0a2636fdd049abb50a6c3dea76f4a034de 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_tcp.html f152eb77266e8ec28b80f242fc270f10e16fbcd37f997f99fc6e6b22124a0cb2 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_udp.html dca0471c1c4a81e98385528535f70577f633b47100cb5620f16c45c8023cd6fc 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global.html e0709bee4ce40222d73f0fb364be9dabb431dd130fc3a1e1b9d90a722f6dcf1e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global_group.html fa440f3134170ef43774453c48cbb006c7f74b904abe3f6ef347f2592f00ebdd 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/heart.html 7a6071d2901949fbea39209b25a758fbb060b184dfa25163a8251e4020bff25a 2 @@ -2881,26 +2881,26 @@ -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/inet.html e9138f15f166f5512d3b57bf121e1b61c8ff5858cace9feb4850276c276ade01 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/inet_res.html b65f85916ccaa7039cda990f40e6a6d757330e13ba2730ae8be15130ade420ec 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/introduction_chapter.html 5d7817430614df2f96837946d790b5c7e47a028420fb2683bfe9f48bd736f196 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub 40365346a9acfa19def02b4cc864e609c3087afd230b5166e7d351389a773d2f 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel_app.html b56a30ed5238202e5304cf16885ff2384cb923aa4f16b775902e7b8fc9cd24eb 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger.html 284628d075a6ce9d3bd7a31d26d5a507c59b30ef8b08200bd57f7aedb37461b1 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_chapter.html 44a195020d1bc5e73e15f526087bafbe662fee571e0faa4abdf6106226067364 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_cookbook.html d8f0654441387e40254d685fbbf8d39fcdc7d7b536bb434478bf0091938aa8b9 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_disk_log_h.html 0db84f396872c51fba12aee7fa549c77b4d71cd00c4452824add4d4202d29468 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_filters.html 8bcc1fc4aed30e12491072db19ad216101190cacd7d0ea70b2636a76b8d48785 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_formatter.html a34c4ceb8e7df836744c4d894669e79b40c1eaecd76814100358c810095d14ae 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_handler.html bd84e2f0463f466e5d32e0870e63797bd4d35055e512399d155f36b8c5a41c70 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_std_h.html 7a91f7dba1a94f3fae6e4829b06f10e0965954b5cd51f14b3c8b2b3a2bde95b5 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net.html 987b4784decef1e54deb0d7409deed7d3093539740729810c6d1394d620f0e79 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_adm.html 88dfcd3ad4107ec133ced9811dbe6bc32e846cd0846a72997bd52ec00fce2d3b 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_kernel.html 5367ebed82889208056bc00ea0f4ca1be94e9a7a7c6aec9ebd01eaa15967bc32 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/notes.html bd0282521ac6a82470fdaace7e1c86dca4c66a85131fc01eb2f80495d37f16d3 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/os.html fb158e7910483f69525a6e69fc100839d0d762523ff810f3d9e53abd0fb294fa 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/pg.html 980c5091d19701865a95ce45081bc8ef553a535a7617da363826e6fa821f5610 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/rpc.html 2af3c151b43d0f57dd19827f813e2c1c54815a4c9c171e0acab54b770295504d 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/search.html e195c89654b7d0adb2122a7cfbb3011124f1d40b579cdd2ce195ff431e56c6ec 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/seq_trace.html dbb364535ec5b3a0dd395c15c7e1b92bd0530dbdd2962c4c6144284b283b9a75 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket.html fc95af49d56705ce49cefddf672a2f317ca50592d141d755fe10eba16afab62a 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket_usage.html c247dca11bedd997dc99e1494b333b0306e1a91ccdf44c8b99b5ec31780cd931 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/trace.html 950281503b37b6a964b39d4320df8188773940a1c8d56b2281796a4200b2d052 2 -/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/wrap_log_reader.html 51f661c00e06a232df8dcbf0a6f8c62d51bc068fbd55260b88461c8ef8c80eed 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/inet.html 51f2f7e09cd83b07a1310cb9893646521141de1baafc92233ea3bcb1e68a941d 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/inet_res.html 4b2c050c06d2f9fad17f434b70e2405d10dd11d269f71b96def81623afb887b4 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/introduction_chapter.html b30b9d3c98ee2518937207f639e28a1b04536f64dd13c85ce25c6debe964514b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub e860074c4fd041db1f53b1484c72295ba7da3ccfaa474f1265d4e3bbb3e4cfe3 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel_app.html 2fe026443eada0e7f974613bde64df46ce7f66812efec94b580396d95e76ff24 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger.html 7c625f53393494d36655db08c10dbb93dbd2c38d8743f92302fd260bbd813495 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_chapter.html e9405bfac2d69c5e733f21e53f982db373e89e8b0354c581f53112b5ae5bf109 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_cookbook.html deeee7a163d7602d4cc19a06a9834c7a45097692566553d3ac0c7f18bb905294 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_disk_log_h.html c164f90a74407c3fee019943078719b3d71a3e2cb69d8f6970088805ddd598b7 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_filters.html 4bafd11170bdd0403b77985e75fd5291d1385c2522285f99da98df3f3c42baab 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_formatter.html 7d76adf4f0beba86942f4b68730a716c047e11e40f4222d0116eeefbe6c1467b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_handler.html 5d1038eb8c89f230afdc2154b805da598becaee28b944587f0d2afd64432ba92 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_std_h.html 0001e7bb4a23c5b0d49231c8b6ac68861dc99fd420e43aa7b4e1a81bde2a7bf7 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net.html a88da77e1ecd43b7f23d5c8246dd27deabe0e0352f6f16fa86132569fa4ec7d5 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_adm.html f5f6d320bc371b10f3f998ee48554eebd69051ae25efcc1bd0f0b4cb2caff7ea 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_kernel.html e271e4d4bbdd4665ab42048956b4fbe12ed56cfb9c998d610e1900fc1fbbd129 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/notes.html 1ed74f0c32e02413953ff8a94cfea53d88282cdc0a1a86d595712b71fa02834a 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/os.html 9b74cca0dc36ba260a5a33e837a0d68bbed3be91e504535704854704f88aa898 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/pg.html a3f1dd0095e81340e8bbfdad920aef7e431eb9ab6857e809b31539b8cb6ebd2b 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/rpc.html 1d83515318a148ebed8f6e30f1716b24f881fe8b10ef5e36d0e919af6424a5a5 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/search.html 02ad1685c968add18e033efd7f21c65f4f55a34feb25d794cf36a66f12a8083e 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/seq_trace.html cb1f1257d9a5fcb506dccf9d2d38a1ae709237111c964bcd25eb577f01d82f89 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket.html 83e25d72bcd7e8d209b07546a642e9e6e8c3df4d57b93faeb86ede1ee11c7aa1 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket_usage.html 4bf879d6ed82f006052a6daa192a00924bd17905148207617825523ff5cc9ad3 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/trace.html 8fce0a52b9b8d341194e4095970c37d2333ec32166da407e37ed1a4d0ab73839 2 +/usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/wrap_log_reader.html 9372d08499e38a326073ce072de7e577b2ccf8fe9ce2792759bf17e72e979c9d 2 @@ -2910,2 +2910,2 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/404.html 5d3c895c9888d35a86befdc8ed755377dc20e84ebd7e626ac63867260d6cb638 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/api-reference.html a211b6978b13b3c0c8deb5f6c38c8ee19065abcddaa08f5c43316cf17e4b9aa7 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/404.html 6314c79ded0d6bc68ceb55fb7bf00cda632e9a92f467ac9f5e72036a2764ce3f 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/api-reference.html 1ee2765d3748c91ca2b56d0899391830df7875f1f326da52a9a6c571151d4fed 2 @@ -2925,26 +2925,26 @@ -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub 5e5781adca001ceb1d98310ce2af753d033c232b3bfd54a0be49e86fef2e21f2 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.html 75a7eeffa6f1d668cfa1d395abe142c0d5431b751f7b0333893b1c53ec9e38ff 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_architecture.html 19d58ec74155ff673dcd873cabc20b2291535766daf67b7eac86a18c2f0083d5 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_meas.html 89a4b499ddc10a61e48b7d00d1ba759faacdf1aafc76b55cb2490950cd1e53a8 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone1.html a66e7b330f653a8ba477784bdd74178b6d8753cf4c8fddff28bb78b849ea84a9 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone2.html 861b1d00422ee6dd21a9123c20fb2eedfa48bafed0b022695ce160362105e8ce 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_transform.html d21220563cac7f11327a3f1fd09137873f9ae527c35369e8b053902a3e19dba4 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_debug.html 12cfbcc121e04ceb4e73d988a661307a03b6a019e7fcd3fc52b013d25d99cd49 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_digit_map.html fdd4edcc9f7d18bdf3b1d7a6a8cc78279ee1492413afadccc7d4c790c5603f4c 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_edist_compress.html 86812c7f87c992fa783ad3febf7b880ea0d90eabe30055bde0eff4a530c556e8 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encode.html abb883f6968577d4876e26394090aacaf3ca9185f6499ee664411b5ea020386d 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encoder.html a8dff01c2fcedeb3724946cd8de9e0d27cf10343d42a61cdff47c74b40c9a4b9 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_examples.html 0d016e8d09dca77c6239c6ff7975b421302f7bca2a85336a18f157093fcf4bbb 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_flex_scanner.html 54f6bbc4ac8bbd6e3f899ca1161cde9b1e75256c9c2b77a36b2d116677769a76 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_intro.html d034c9f3f82950280caf9d271779fdfaacc5e858e513a489746c45b4cc47d0cc 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_mib.html 27c29d63bba0cbc4b505d370d0878764ae4226c356c680a2772cff389c80b563 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_performance.html b0db2ff6ee37072d70ab1a5e108577009a44c75aceea85ed26bc2d11c7913928 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_run.html 77e58bdd7272a116bd4f41100935745a912b5bf4bb0c4ecc4453abfecdfdf4a1 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_sdp.html 653a883576a618996e30547ff166016d7c7b6cc993a777e22747947a2e8a996a 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_tcp.html 09f67ffcf3fd11deeb10386d4f32cfe40341d1cb165d21b6e3e3694223120986 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport.html f9831f26bf6d39b7e6b346c167bff95fd2355b2bd641c7f57541a67300ebfb1d 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport_mechanisms.html 81c9ad8087ef4b3e405eea67e0a275b2c63c5e6329f42177479103e11a239a00 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_udp.html 7fea5c2b179c97c32b20867083fa726656ad8170aa46146af6168031132c0614 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_user.html 9a52b5d9c4d3f03e00055b4b02322116472399adfa92bd5cdeb0628dd269131b 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/notes.html ac3d1ada30c53c8f31b6e4be92fd62b273a889c6cd5beea77d654abf99290866 2 -/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/search.html f5482f9f4c8e92ed33de4ae71a38283779d9af23ab11981ecdbd53dad31a5e37 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub ae2b6f38e0adca1921e9bdcb7fc4e24e8c83c4ce5c5388daefab00b899f4d74a 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.html 7192b1d84366e095fbb7e7bf17b16bb8181dd392ecded0d90826b7c155345094 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_architecture.html d10dc3abd25ebe0a0fe0e04f93420ac2f769c5201609e675087b18de80e68f04 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_meas.html 645d9c6ce425df5f6a092163ad4da752b4368adab9fca8483a3a41644f9bb18c 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone1.html ab6ea6e3e82f689a012b9b22acb37b11fe5b22a390266c1129c38c3797e43f60 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone2.html 266ed48ad0d08674deb7530d6409d4c9d1756c9c6760ea6fb078c45c3fa079b5 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_transform.html 536ac6a400f9e2650554a21446de32d8578e55b21194c6329257aada44887e57 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_debug.html e268d468174e8b92aba8bec551c1f7718b6ff512ac749d369127fd7776539f20 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_digit_map.html 1534e19dc8f875f6bc7e5ba7375a97e09cdd793bfb51b12b8a1305179f138b79 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_edist_compress.html 73dbd415bf83e72c719708f5972953d76b48d4a28db0364f4fcf78bd1989f683 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encode.html 1a0ea1dac3368c98e97b537b74e35073800e063accbb9ce8662fa07c6d9e6645 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encoder.html ea3b07acecb9aa7b84e92cd361f7490fada5ee342ad844a03a9d9cd22221d89d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_examples.html 465648d321597dad61d466b9fc78f3b2daf1b7c3ef6306ad9aae1d4a2b4ed0e2 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_flex_scanner.html ef925c5f373b19f08501b02b9aa6ee9b6e9ec6226b7635fc4576829bfc405e7b 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_intro.html e7c1c5d49aab75b6799b0f6ca4151a35a0675180a2c9d2b7f7f8477698400986 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_mib.html 52d94f470b9ee29c60ddb0acb7f69cc112c551be6882af5659adb9027397a1f9 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_performance.html 99b717d9edfe0378763b4bc9eec9c718378dfab75f99884cb4eddca3ebd62b5d 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_run.html 3c8abb64b0c2b268b24bc48dc7421ffc782c625ab9fbaf67461d36ed6e93817c 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_sdp.html b23c26d53bc1c830ad5d2ea310c45937fd04ab902bfb189260eec94effb433fe 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_tcp.html 0badd164fd7c159bdd9229b84cd96d7cda7197c3fa2c671d4d9c632696549749 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport.html 328a8754b137868bcfd48d93b49c1ec30c3203a55f10b37d3f323ebdcb988d9e 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport_mechanisms.html 09286d9205d2cbf062ebd96a63eedfde669d313e416b33a4729ac90e34d139e1 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_udp.html 768009e9c33ae317929456f0e4a3ded83657bc79351dfa74ccf9a3ed731935a7 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_user.html d218c27042fbdc3a5964f2e16037f9d0b547d87706f588093989ab495eb6fe7c 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/notes.html c0c4a59a4b4102bcd20f57752a2e797a76f0a3f9eeefdf25f9027d02c207eeaf 2 +/usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/search.html 56078124d2ca8eae436991d000a399c2a9960ed273e73e05241fe73a19a60119 2 @@ -2954,2 +2954,2 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/404.html fa44d4ac02415cf7da2197726b5b2d05cf59b7dcf9943018f4f532e9e23cb0f6 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/api-reference.html 50932978e6f9790b64bc6c56a35b3456153b9168e5a1e2a4757ecdba89f70122 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/404.html 2419d8252df14f1e2f53eb5327bd9509e0e01fc4b7f602024f8e0699d19a8031 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/api-reference.html 61ff578e758823304496f2ca40b916e09945924d8fdcece6f6f1eaa459d1751b 2 @@ -2969,17 +2969,17 @@ -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub 4c85add76a6523c3c51f919776decc7365da84ba0910061776daaff072977a74 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.html 41dd80cc436c53f9d8d1b8fd11e83ad32fc85ac830ec30f5566377c3bdd4d375 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_a.html 2f70b312318091e72cfecd39ea49d48f448bda1fcae55a1493204c35b24292d8 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_b.html decbe48e1dd5deda9e2308e22f57caf5e2be3025223e33f7542e7bb21e29ec32 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_c.html e598f9bf8d481d7059fab94621af8cc53f48f98b6f52955d300d6f745c8c390f 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap1.html 56bc694b1df9a4e5c0011fef5a5cfec32f602bcf0e26435c95776a76b0f7a7e4 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap2.html 3b9b860e98da6236b6c0f82137f32834d605e60d10217b83234eb597149479f9 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap3.html 24858bb5a5320975dd88afd204f89e3513c807a6743ba8c18bb3893c4edb6b18 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap4.html 79661decb89bbbc1d70025c30cae0ce98b8283ecc2a0114752f6f4f8cb76d214 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap5.html 6d69473ec0c9152c18028be6fdb0842aed42ac3dea0ef6d2fda233f72b6c7d85 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap7.html 06ac56d78e49fd0fe72fa0c3057cc64c2c524172363aa831a8ab8f8483dedfdc 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap8.html c3cdf7d239806c2e9ba05b1fccc7f93165ecea53b7080b0f7974b0033fb16ba2 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_frag_hash.html d3e8d73315f6615abe0d56d6e255a120fce0c9b3a29b8795b4e5e8e46a92234a 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_overview.html 76ffab21f036a7b16046b979adc844b0bb03edc1f256293730b562e7fd8d561b 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_registry.html 079f02660f9f41b42e0dd78e6ddbddb8b5c65d34b87c629be3d3c9343dd44cb6 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/notes.html f22da3fc00b29545a896d7bb25e0b24efad0bafdd4058cd867081728afc3c906 2 -/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/search.html b54673f3d6c4f2b69ff2a609901e0d9c81d75036c5bac5bbd9a95105a0b115f7 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub a0dba6079975ef4c4e90d1ff80c115d6cadb37322062ea31f286336842fbdd50 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.html f32bfba2fdff4c8adbd73f903358c626f495d66a2cf4214b64c816a2df781647 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_a.html 81cf51b2e04ee8a0bca1b17147063cb1609dd3f089ac1da87679b7ddb2408122 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_b.html 4a8242194d36cfef92b92f3e29e452cc93414abe8df9ddfa1cbade7cf5163df8 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_c.html fbb73d9a70cb0434cb725e4bba92affaddce3eadc4246678c9e41320502a243f 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap1.html fb142c3250ca387e8a19fd7089e92cf49cb4c6beef4dda05e725012f1a5fa77e 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap2.html fdd39159f0460bbade612106642beebf53c16d20a79a6667136dff7c4461fb20 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap3.html f378d212b5c3929df546cd2ca0ec5883175079ead10b07d0a48cbbedf2a9a02c 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap4.html 8da85d9979758603bdc9e29c21a745b11ad5d4438fa78d0dc8ba79e42a2c9c31 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap5.html 68beacc0120a2e5261210dd2e49b90f32643d1111fa1c21a942587ffa50afa75 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap7.html 06bb6e31a70f5155c4c599cb25da1a3b25acc9e1f955c2cfe92df8b8d3acf945 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap8.html 521477dfd6ea6338bee661819963dabf8efb86064633d98bf2d17dba8c38f80a 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_frag_hash.html 2e69520a5884a26fe7c087db421df26c7dbafaba69e12dc971e65e443c9e15b2 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_overview.html 7616a6770a16c45e4205420cd4a2f8a1edb3ef15dfb7c39e4aba3dc3a0696ddb 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_registry.html f6f1462225306548476dd801bf0130b2e88cc91002f7416e1779f41b5e14e733 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/notes.html 4a09b0b3fa5e378b09a12abc38265d6d9f71075bd1c9caa171027bc8b75028e7 2 +/usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/search.html f42a4ddd2601ce7ea5d24cfec6fb6ded192c9ca76fc1d71063c92394ecee5056 2 @@ -2989,2 +2989,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/404.html f3ceda220868642f7165c7117b4a30dd57c58034c22120dc1a6a3e578ad66987 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/api-reference.html e255184a2fcf0fc0f7b7dea9d4c90d7556cd3ddb7b7c003810a5e8067959741f 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/404.html 0aafd02675f1de342f59456b9d2ed2b4c2c60b1d338f869e30dae7a2247b3223 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/api-reference.html b246ec66f0559cc75fea85f0a58758cd0f6ac52b741972ea5c199fbdd121b195 2 @@ -2995,3 +2995,3 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/cdv_cmd.html 62c24ace55527e7cf58ad4e42a24a0c1742112ff4323d741607e796a5fad2935 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_ug.html 1aaba0316eb7fb2feab4aae26f5dcc0e9e414dfb1a8eeea23cde81a8f5f1eb24 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_viewer.html 7418a0f4623afaf9fa57cd79e056993c4cd3f982d82562777907df2cc66411c3 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/cdv_cmd.html 9819af69731e4e2d2fa7d6d2184194e1884092687a0604a965bfcbfed8d3b2fb 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_ug.html d18459ca61ed7bcd288926a0ba9a14baaf0c61cc21b9dfca03155a5418ae284c 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_viewer.html 33644da48bc68a0a90e5586c6112ad20b67763edbcd3de4da7fa304216303ace 2 @@ -3008,2 +3008,2 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop.html 851f85d583ce55d19a816487a21597ce5a9a17c9798ef71a2efa6ef8e98d8ed0 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop_ug.html a755840378fbeed77e4ecadb786a904770a8785f3ba3947fbadaf20ae6b45dbf 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop.html bf02dacbf97c1e7767106888893b17a3dd65ba8423bde2d03df155cd276865c7 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop_ug.html f718316843f823e0af08bdbfe1da330f1c4761cdf4ed23dd5696849e6cd5b97c 2 @@ -3011,9 +3011,9 @@ -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/introduction_ug.html bfa998fbe2b19a9f9e09de1f258a9cce79dd8dbc69d7a0af63d5c64d952480b7 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/notes.html 78eff0376291bbd8797ce8b12782fff3cd9d78bfab09c1540977e9e333f444bb 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub 1b3f455eda50da0b1dd60858047552aadb934624e50b06db2fd05ba9f47e06a1 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.html a859e2f15a83c0bc6e1a85ec84be0026f01589a359b9d35a5be8490bd661fd9b 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_app.html 4a12c2d3cbd164c1f9ca4113c59205a7922a43561b9a9a1c7d37c56430ec3ce0 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_ug.html 1633ffea0fb0fca3d6dff8ac11b814eff58347a9bb7778203dbf778893dd3d79 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/search.html c64c714b69e9d11bdfe0ff62850503a012cdd50f555c533cd43d795e2d5a8bb8 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb.html 0ce6968b63b177036040d7dc9b1f7ebe084cd2c054982edcf47a1c1bbcee5c31 2 -/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb_ug.html 6eb64d43be464148bd565f5486fccb07cc87b44610bfbaac6879abcabea2c99d 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/introduction_ug.html c4a6b7f4b5c48ff6e3e83227121bf6b4105e8e70686866178d68619e4cf408e7 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/notes.html 779c34a5e48a92f947367c83fc617b00eaf377aae170bb1f032f6ac9f18ce25d 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub d85bbe254fe1aacccc9387069f935714cffc8739f28648f1e9c5a5a414584923 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.html 4bc864b94b1b89ae0143120f69cc20de3e7d55dd885322755b30b446e422362e 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_app.html e0ced55a0d1245f9c15fcb27b9105091a42378dc8787a39024451bdb2cd0b3b4 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_ug.html 5817c5dbc5c63880b688adc82c9e9cd4cf9971bd7c6939a71bae4a7fe1380dec 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/search.html 75576bc8c9a5bf8508fc7660b59e7991497d3ee1ce6b97701e4a210f57c9defe 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb.html 270126619f1dff01890802cd498d33df902e4176b717fac7b8378a62f9cd18b0 2 +/usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb_ug.html e3cbca8c26d4de3ccd5f71685ec24eed77b2f00e614478041290c7fbae13d84f 2 @@ -3023,2 +3023,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/404.html a43d7416874fdd6daafe8e2a36fff7e28eda803d79104d41bbcfbf027c860f23 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/api-reference.html c2ffdc3bd998482eeea5933f6118f3a4a70c0b5753da2b9b715fbf9f87d2571b 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/404.html b8a0f340a13de007683ae65d62a67558677ba05a388156f7bbe9044300c38967 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/api-reference.html 2bcb522b69289fa62d800baa8d67e4f17285fdce66cf7074c90940dcb4702202 2 @@ -3028 +3028 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/databases.html 33ae18804d9b28615b755e2123ceca865d2df5405e9226b6058586b722542c2e 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/databases.html 126198f23b673b3d6cbdb468a942dc922563d401e0017c9416c0fe5f6c5a664a 2 @@ -3039,2 +3039,2 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/error_handling.html 7d83ad5a188d762e988898d961de83555d6433596703ffc673785e7bf22fee1e 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/getting_started.html bc8b888db2568ac092a95abb26dd0f5013456a3ae03e3321d29ea8a7fe3140c9 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/error_handling.html 025bce1caab668ef80ae7bff1199420eb8ddc7ca435a381e8feff22ca83811a4 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/getting_started.html b067f1634615831c95a54c46ef84f97ec4b7dc7616a52805b028b92e66766573 2 @@ -3042,5 +3042,5 @@ -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/introduction.html e09db7e96c0f3cdef2fa9d93add8a469e574495346ffa2f60045c83a86ac92be 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/notes.html 4746c089157ad4097f4162361b45a2c177623ca30ce220b62cd4f58a10a4aa31 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.epub 8cd5435adeaa33c17f1a4fee280f6527028deec117a074ba84918442cb15683a 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.html 34af3df208e7edac4b79cac14332063b3b56a832d6052324b7499e10612e161c 2 -/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/search.html 2842cde16fdcdffce8e32dd01b1157e005a83a8adf685adcf498aad2792493a6 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/introduction.html aa320da5974c38e40490f7ea2ead8e54268bf43cfa904fdb8dd53a460e028e2d 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/notes.html 562dabbbcccb7670fd8291beaf8504d68869e68c67683bdbf1107fdeb53eec5f 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.epub e1e87c57506b274851ace0b8314ed41652c67824da708c137d65f972599f64df 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.html 5e2f2b15b41bc28fa25f6ccc441d733137a5e30465d7e64473ba7d2a795543b0 2 +/usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/search.html f0bbd5859efbbb25c478da2d0f76da291a2fe8eb6df19fa98d3d24b1771867a3 2 @@ -3050,2 +3050,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/404.html 3e5042fd61679f707ea44a5cb620689c526e413181f400b686e2464571bdb9ed 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/api-reference.html 4f042296d692283df850461f86f25f2eddd5cdcfbbe392dd0f453870628b2196 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/404.html 64c441dc4b915ccd008b37facc8778bf97a6c932a803c3f614215bd68ccad16f 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/api-reference.html ab7b9a533beb3f907d794b482b03f0ee55668b0393496f147ce1ea0e25c9f5d0 2 @@ -3054,2 +3054,2 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/cpu_sup.html 84cdfaf395176c37d97677f65681ca4f995a14712f0189de6c62f119692a06c7 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/disksup.html 0db5f5d150d59f9b554118f812605269a58e7b605742e3dfb9a3fcdb54d2f146 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/cpu_sup.html 19d4b479f1f75de307ea1f43130cf9809560a6fdb4e3ab876ce9a3263a70e586 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/disksup.html cbc9864dec07580260b8ee54a8943432b717bac3a85df8c98a4e8dc1218dd2d5 2 @@ -3067,7 +3067,7 @@ -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/memsup.html ff3ba4b693132a9ad37c659003f6218111d1222c036ce53950cc38fb97087790 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/notes.html 99a66e694ce46e78c4fd1cea103c2ca112642ab8dcf1b2e1c8f4464ff28197ca 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/nteventlog.html 9fc3b987368404b30f907d115b109449d224d3678388162d810626826b3ba82f 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon.epub 7b6100260a10c4d642c8dbc1eb681658cd60cc0e72806d5c86dec9da01f6ec17 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon_app.html 19e615e93c1e8438ae40ba41c3b471b57ace01a3fedbdb9576c7d696a797f75e 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_sup.html 5f6dc2dfb7b32d66503e7948ea1d73b40b8e6f5bdff1956e59fedeea61dfd3d0 2 -/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/search.html fe2b4162f8d9228fa211730dccbe71eb67f5d7c34367a7d3ce148fd8aecaca57 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/memsup.html dd42ee59c3e71f641c25571b0cdbf464edb7661666e9c15aa11466a5d9e065d1 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/notes.html fb78fd566e5c0a246175d3b2717ccc9fc133471151fdeea247112bb166a6dd54 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/nteventlog.html 20aa4280279d11e53ae91f284356c2d14e672b11dc85b865c1fd4ff9723f05a3 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon.epub 68e82f106a4c6d22402be605206203330f9a1b85955d051a69c3127c787dc83d 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon_app.html 958d597d44ad22fcd3bcbcdfbe867600c956488a28765788debbe07088c14b87 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_sup.html 83622fc55c3bddccf7ba51e8b5d1119ae428ae8208f766cac7dd021a74320f7f 2 +/usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/search.html c9a7f0e8521563edc70e6ee0576cfacae98845044ce390d53c21ab695551755c 2 @@ -3077,2 +3077,2 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/404.html 18e4e97d4d9ab5d3dfdc51a5a084cf7c808b5256a47c63e23daa9b98367f4693 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/api-reference.html d899b82e6b0a04d7be21fa63c8b1f2b1a90807895f872e59d91b7c0ac54d2961 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/404.html 3d4b18d8bcb63ec682a37411df8680e05201c88f9941c47ede5e2f5c222b2efd 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/api-reference.html de55451045a967a7ff56aea09738fdc0a8f86e2464b5599a6811421ecb157f39 2 @@ -3092,5 +3092,5 @@ -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/leex.html 117d5b0e1d45927fb690ac5b946730a509bb8963041ea42e73b70937af4e0f6b 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/notes.html da8c65fd92ffe3554e45f5e8f1eee6721b815d48a51500c3d4f2778e3c05bfc4 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub 6fed83a7aad5151fb8f6bbdb611a8a67771f354355ad0bc202405880b56a7d5c 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/search.html 23b85165a4cee60dad0e6802fe9c3cb0b67a6467fb13520388bc59c837dc3920 2 -/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/yecc.html 839787d41f912aa8b992a1c3a06ab244cdd3b14ee4683675ef957886cb382f18 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/leex.html 1aefd624b68c37c66f50697dce6d1360103173e4aed3a9782c8f605314874390 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/notes.html 974aafb3b8ee5cfedda5dbfeef46b70cb79a15e6cf46046903e2ce278a85e221 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub 4237b38dc7163aabdb0b6aa6879c2cb9984c354ded20ff4211e94c11211ad8fd 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/search.html dad160d956937c7be8266f2b373b513ef9196b3b689174473bdfda1084a825f3 2 +/usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/yecc.html b76f488074cdc3e6a2fc4dd426d6e1b4dc0e8af2c27eca34e0b01c75ece0a2b5 2 @@ -3100,2 +3100,2 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/404.html 08c5f7ac7b6b8deea72e6e6d2e3f8a235b49e00cdbbaed103552180e60a4e2ae 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/api-reference.html 0dcf9664845a4da2085902e0c55c1f5eb080ce8cc79706fb18e82d65af361f5f 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/404.html 55451f73ee0bde40b0c940f2d503122e78dd0d15fd70936488affac52800e413 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/api-reference.html f95887c9780a521730cfa73e81a667e7deba7573eafce74316a8cfecb655679b 2 @@ -3115,7 +3115,7 @@ -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/notes.html 5804634592fd659fbc7c69cfd6a183a2e434df1b685fbe5eec5bf21bb597d6e6 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub ad3731f0734372228d151a857c80a206d55f7b3d5c4a3ae8ddff418005f0ce65 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.html 9e1125b1d942f0ade5779b9961e58716452fefa93c45126361eb358dbd4efa0f 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_app.html f266c5d3864c14843c970c2a0aeb3b2749ecbcf6275dfee9e700ebbce1bb7139 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_records.html d4c5fb5530cfee9e11dffd1d1941e194b5a5e31828dd745d1dfe20b45e77a99b 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/search.html 6221f889c65ae7f1c58d219703626180c2e5e23ed3d94ae2a3d112a3eb0ea574 2 -/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/using_public_key.html f5b4d8a47aa1c072e39e4c49151e68bdd973b01fed2faeb271ddbe2805f4a45e 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/notes.html d7fddd656cd4fa96f466da7ddb51ce5b763b59d874109b1e01cae5701298c5e0 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub f59c2b9e7491ed472a8708cead9ee0de5822eff5c441573bc5cbfb44c42cfdf7 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.html f077f341101425896ebd657cd659f9444a7cb2259acdfd861512b128af4ea8f3 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_app.html 3a2d050e7812b804823b20fa8936b91054e560d9c9cf26cf4d7b765848ade3d8 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_records.html 2b2d038606b6291afca2741340ff91c8e24284058b100e5955ca9c97936e5b0c 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/search.html 20aef36e359cf1dff330fd713aa3335d2add7dcf1368c4fc106748fc11555543 2 +/usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/using_public_key.html 18779dda7f075022f6a5e63fe923f12e0405a2903b2a9acbb806fa16fb85a3d0 2 @@ -3125,2 +3125,2 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/404.html a71475ff51821490a81305a841a158d9c4094b7b234660db357612bfcbffa3e7 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/api-reference.html a5821999b36c518df18373621a85cfd3930169d90d8ed90e3bce1d8c026ba3ff 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/404.html c8bb5a14467f3803ac67ddc482277b1bab875a323ab66707fe18cdfad7b105f7 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/api-reference.html cb2d56d6b6731e58cafa41ccd705c7e7bf01eb13e9385ed2f1b476d75c5f8deb 2 @@ -3140,7 +3140,7 @@ -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/notes.html 55c4edd2746d075d8dad9805e927925dfed69d151c7fd40ec9c52d328917b3ea 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.epub 3c71dd9b494125d739fc17d7f078ea1d6be79ba0b8d6d3c0041ed8d0ae17cf1a 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.html e586d24e780162b26a1ca5c88eefa35e56a29518f4fc8365184cd916dbcf1b69 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_examples.html 21ca9fb48b9240c9745cac4f2912070fcd99e9fb7e929e1271a7ff6dc2c8bac3 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_intro.html 3e9d23382dde465c95cd7b8c6d1cea1d70adec6d18bf746418293b67e43a8369 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_usage.html 4fba37f69f6d3e1d6be0fa61dd04488c85fc612d6b2c0dec5b2d5e06dcc3c72b 2 -/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/search.html c038f8f3697f71866cad33e0109f8f2facc2aa61b18c5e8999dc4903ec49f8b5 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/notes.html 0bdc3a46d4f904d0a3431617a170489f0888e037220c9203fabda95f3b909af0 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.epub 4f5de2eaec4c549a8c189aa4407663ee59be3ab229fff08b109cb62ef2660566 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.html 46d1bae2716fa82bde944f04a5692292bdf996951a225e014f39df382ff33d63 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_examples.html 3b6c986693953589e916129c4069a32a21a80a8194336d7ab2a5b51ca6a4928a 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_intro.html 41f4ae021c4a463fab9b9db37e332e5597681c744a5562787425e636ec0147a9 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_usage.html b78532ad71f725dc0c0a09cfcc061602bf05cab3c9ab1980502e36ebb33a735c 2 +/usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/search.html 33edaa424acfaa256c59adca50876dd25674661d7858ddf66f914fee12964d18 2 @@ -3150,2 +3150,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/404.html c6eb7131e4bdff2234668913d7884a30896b53f2eeafd4b0651fc344d14fb1cb 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/api-reference.html 39df39f14580c5fafe0bd774545c6885abe0b82267548563ec63527206406726 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/404.html cf0bdbd31b63e11bd3f5a0a6302d65f8b2ff6779752df495ed7bccb6e3fd58a6 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/api-reference.html a41ca83ae3ae58fa7fe84ffd7676cbe759cb3e4edb8af771eae5b1adeac66a86 2 @@ -3154,2 +3154,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg.html 59ceeff644865cedfa63dc48e67d7504cf6f96dd39a7e2d3ff4f21a868c223b6 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg_guide.html 79d8bc77863503d66eba6d27e50c0e2e79d091fa433cfd8e7a834b1880ae19ce 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg.html 4e1350677b8f5ff080c15fc7256d4ce1c45f70fe68f5680dddc57ffc13c0c4e7 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg_guide.html 4130c0c3833e18cfa7aa5a9519847caa8922e2a5e5ec9355fd3628897d41ace9 2 @@ -3166,2 +3166,2 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dtrace.html c146dc34e7e9995c7cc282bccbafabd89864f2f5847133069af02248e2d9e21e 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dyntrace.html 19ef3f316620dc91d45d17fd0f008fa34209713486e87a01f7cb9ce0144559fe 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dtrace.html cf0a77c45bcd46a3fb1dc4c57d052abaeb948fc5110001c541dd53f5b027585c 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dyntrace.html 8995394ce6d4afd76f832260c8fead8706c467c421214f63702fc727eecbe388 2 @@ -3169,10 +3169,10 @@ -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/instrument.html ea0a04caf57f882db9e1ff88176534213a2ddccf40fe23bcb2ac6250c46a2f58 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/lttng.html d821e5683b95cb309deefee4d268035b23524f3bfefa5aaac0bcd3a62bfe6fec 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/msacc.html f85419a65f5db8463bd06fe0d8c7a18ed79f2872503415bc0233223bdbe2a7f5 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/notes.html 145536c81948ce52586b47e74064414823e89b17561105ccf51675f281cd2007 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub bb73fba751f16217e97377e3060449a5a3bb88fd732156fd4204e977f592c2c3 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools_app.html 6ef8ec234c1eedf257176d00c816cc62d00fd474b993848b26083801b738796e 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/scheduler.html 45d4b096c33ecbba4f3a362f0cbd1d6519c764c2a590e31e3a8a392befd1e3df 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/search.html 8cea8677c58edd52c16728188fe5c065adced61522a0ae52433a08f5bca39300 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/system_information.html 968d24b948599834fd08ecf871a60367dfbcd1befbfe1ea998d96a36d4fda51a 2 -/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/systemtap.html d446ff46e47c46cf0c1c50abc3c66d0d63e4c94a5c2231b90235e7ff428329a5 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/instrument.html 4f9abaf0c376876ddd2f1012b4ece1b779c0fd33c57c0339eb64e6d09db80c4d 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/lttng.html bda4dace15b4250684188db814cd5af00f215d3efacc75c2434c0fbffd519b89 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/msacc.html a436c7dfef2131e8716344edcc8295936d54ebf4bc29f0d3b536a3579e066227 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/notes.html a9d738a271d8a2af96e0e9f04ae85935f7a9cf422e3cff37c6faa18e9acf47f4 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub 4c82780c1accf55603a8a067d1d93eac7fedfeb147ae918328ff7b03d09e626e 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools_app.html 468f85fa17d704510bfcb9f9873f5ecd5b6a2bf7703806e174c37956cfceabe3 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/scheduler.html a5220e89cc7c5b81ff7071ba738f10673235de2e2f3ac2c823981dc5610f62aa 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/search.html c90b6b3b793813d304bdd3d7da9826b4472dcc041e8625ccf9eabd490434778e 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/system_information.html ae2003996606a7eab257e3249e9522787f3edc1688afd5f30afe0f283a34f44e 2 +/usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/systemtap.html 038c4a0adafe1381c2cd57a2df5df06ad6e8a7622be13539f16a623b39a3cd26 2 @@ -3182,4 +3182,4 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/404.html 6c9faea9e79f88ac29411436f90cf3e8e6e067182b2e870a73d8455acbc33227 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/alarm_handler.html 57ec7c99879234c71538b8c19f829fe36ab433399d14af4018e60df1b5ad4049 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/api-reference.html 43b282d99651b911ea0010cddd6603b1811fb638b837eb7bd5e2964cc3f1cd54 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/appup.html 643d15999aacde787dec8de6939913f6c0fffd2cc0a7c1ee404c177cec86ad3f 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/404.html 5a2f1e8fa438915abd0ddc6b73d62edd3e63860217f42b825a536a50ec394d59 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/alarm_handler.html a52229b9a854c19679564fd59227a47eacd6778c5cc49d5ace8df6806b4745ea 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/api-reference.html 9014a2ae67e9bfc5b732358e3571477736a410acae0d0efc50b32e825cc161a6 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/appup.html 5bd148c5cb203825c997affaf632fd2133c219b9da47b50457e55123ec32f1e7 2 @@ -3198 +3198 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/error_logging.html 509cd94d4ae8a575e9b08e3b68cf20e5cf9e0f7892b6e3df28e2b6ca8c867007 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/error_logging.html eadf0ebac2011c1daa5c11419a9075491ee40e5ad82e30a3cb60624266a96709 2 @@ -3200,11 +3200,11 @@ -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/notes.html 6078ad64a953b1431333f1e741ebaae5e603be79c9a94f1e84edde66a62a5b5b 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rb.html df9a4929844030b6c132d7052bdeadbba6a75d6c131d15cd3c76899aa8299e7c 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rel.html 7b3ab49884363cdc495370dff0327b6d88ed366f9860a7cbb78869cc2380ad26 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/release_handler.html 09a72edf83c108ad304566a000965d187a616bef69fe86058eb972e0a3b04dd3 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/relup.html e8e9dfb70053a6093e4fbff7e5692f36aa7a8de3c152a3cc016d095867850abc 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub a42ab908886ac5123f7979e84e50cd469dd81e3b9894410172b68d42ac20b1d1 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_app.html bd292832781e413e46b335961218c25c3516b1f510990a1afcb4c411d93831ac 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_intro.html bd2aeadb400493f683bb7d44c4de04af296e236eb2727518c0faf58974e9509c 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/script.html ab150a83126e91ad49fb5e932ce66cc7e3840fdd0da18408c4c0621c4c81716f 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/search.html 0bbee51c32739485b9a3bbb1ff02d24f5a2a3e172e0cf47fd88a6a2bd54f931a 2 -/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/systools.html bda118e41ab4de99813d31c4c6c9896b4cf12c1b7fc923a0eb87692056a2e59d 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/notes.html bf46b80402974b50af7a9c4b29a4f22cee37458b1ffa3180f667920c3fa7a3ad 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rb.html a81f292a7a6cd0ca6889b6d1c20f82d223f9198d6dfff7702d7f788fb2b24d52 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rel.html 61a01130bbfc483241fa0adbe20b549405a49fe79c71056941ebefef2aec6a14 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/release_handler.html 811eeef01edc648720ec4b387ad56c8a48f54ee1966551326c4136e65f4024b0 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/relup.html daceee213c0ad1202b71cb9c8e15c7bd87de8d7ff4d78f3b4759d92c5b46f55e 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub 9d5a37de3b274a94afb61085cd01fef9be49cd943fec8deea533a30265d8d79c 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_app.html a9105cf9bb2f9273a330c87d0e4f3f73bad6719c8ae7142f47d99f41f77c29d9 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_intro.html 87bfc5ca0b521f6b50735ea5a39976eddb86e87d4abbe53201a1680f9cbad5af 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/script.html a893d88568a8b1d59caeb4237c661cdf7a988e5ebc6ba6ea80730a6239a3e0c1 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/search.html a727340f901cb61b848df4fe6459ae141f8262a952573b0b5d823e00bf3f2123 2 +/usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/systools.html e0925127cce1944e35225edf770e799fef8419214d8c164dd0c4394f5fd76fd5 2 @@ -3214,2 +3214,2 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/404.html 7983eab5afd600009392db32292e925eb3ba3a1e441d1db17f573c9cb0ab3287 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/api-reference.html cf5c0207e45d38bdd11d3403af61a2df8e2efb7bc84d1b221518da9e6b2c5a4d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/404.html 1212edfe880d6f849dc057510eab12dc04ee746502621d54d31453673575df0c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/api-reference.html 4af6b8f93eb91c6564f8cf20a1ab2b89ddf569f259808ecb964ecc05e34fb0ba 2 @@ -3249,57 +3249,57 @@ -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/notes.html ba8ac0f82d7a54b522784ea210b6799af6362ae106a6fbef410b31af82507fa2 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/search.html e8d335f238990e6c712534eb0cffb892b28911fd1b92220a6a5ece10ea95af0c 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub 3bf908faa2b4b32c03ce8edf10818bb81c4e482b1aa6a3bca83f00d0e6e13bbd 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.html e88ddfa05b8786a72d8233e10fdd21ed289711d40d92b5a8f43799f41200692a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_advanced_agent.html 02053ff457f8a52fd3f1a4369a5aace16c63f2ce1aea5ce940fd5dbc28b545f2 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_config_files.html 1770b8c8ca8c2745b24525aa856097789220137abe87b571200b6c8dd109ad00 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_funct_descr.html 2af8c606b26af36f42afe005c2a130fb47d4fdbef92b918e33b355fcb9f16889 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_netif.html e44c83d9070e6df4e409253b82351713a595e610cd52243bf2602a244a68c699 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app.html e534097890565a43b826b5f9ec22c0ad8d019bbe2a3edf8db43541b57b9749d6 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_a.html 4fc5718ff9378a2f171fca9453e2e674e052005361264ad952462c3244de4a72 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_b.html 3aa1a8e30617efdb88ca16b585555c43e6c993b18a7ee647424c8905e8d33df8 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_c.html 5dd28664493ecfd0dec3ef23d6d2a4d21f5bd7aac36d4be0d63f056b41353935 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_audit_trail_log.html 4baf44d195261a99db6c4e6e18b0643e111369f7cefb1fb73e94e979450f73fa 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_community_mib.html a0cfc4360481cc9ec2c0a8dc665952f4725f52f9ea4224b22dfbfcb824e25b57 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_config.html 8c40b73106dd1b7a3b9a7030e8bba91d749d2cdac15a81af2a5cf0df908b9aa9 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_def_instr_functions.html 8ef9a001a2565e2e5276d5d32b8d80343806a7a545f438ae2fd731ee186aee27 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_framework_mib.html e9d88c0d0bbd06a035ff7461b4a2776eebda9142432179b05046cb16d3cdf8be 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_generic.html c7856b56cbb86cdffd1059aa6a34b9a8bc0f55f9cf218770baf0b3c738b31a8f 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_agent.html 01d83d497466caef66b8e7f5dff93ddda7ca89c431d8da943920451c89bfb3a3 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_manager.html 4f4aeb9c109745b1fdac4920c06a2ce93bb7c013c33415c5e4a51df3412f841b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_index.html 733a44318fc1e55ace7ba50f342c06ff0597b1723cde958ce3f25fba4d044132 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_instr_functions.html 7a1966b202c13b83615da56ea18774d27171064075d87ceac3097efc2004b9df 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_intro.html 8098c7ebda0c3281f2b0c025e10a1b8a557062151f81d25de12890858c16ab3a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_config_files.html 3a22d703d0ec2733f4b63d1cd7bc90d1ecde44b94e8c6df4010dc7d2fb7cce4b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_funct_descr.html 56088e0b2c85090dc6b4e08dade5f5593b7d2b4969efc45213a37224edae3673 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_netif.html 18346db010941b7f6efeda0d24698b2f77754932e05cf85cba503e2d8792a5bf 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_mib_compiler.html 213d1ff20e87bac61ad27c2004dc208ca7bcd1ecb283dd247221cb8d78ec38ae 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_notification_mib.html 23b77fb979677c4e6b16ea70f0911fc5edb8ade6062e3dbcd8130d95f8d34b15 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_pdus.html da154302b7ddfdbda40b06e5afde47890eba05fc73bd926370abe0b0d2fd5083 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_standard_mib.html afee4c86f1ae03a35dea98206791c08796976dbc523be17bc3273e24943aaa45 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_target_mib.html a532cd6e7024aebe576eba5cdc5834f4ea15b1d8e1802dc816820ea5a9cead46 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_user_based_sm_mib.html 3d4b385b2c7d0a03746b3ea48640219f977ad5af4d826ab46debc8a0e970b610 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_view_based_acm_mib.html 7acd4604dca74ab45c8d3bd23dcad809a7afca8c61220741dc0331cab1de884a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa.html 714fd440cfd7c712e10c98349f42692411fac67370f9d9733296170c0014ef52 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_conf.html 39c75ec41259291d12363fba157848f420ff2a39ebdc81d1d527191913490325 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_discovery_handler.html 171dd3e2cd1ac3a7e6b55530ba06e91ee3548d67a38734798c6c7a700ee6aa05 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error.html 86f86eb9169632861bb1eca8002ebd61ea4d4d79f96a7568ad606ff83168ab0d 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_io.html 7575f50f2bcdb43ffde23bd698480c4cceefbc438bb05b2ff17673807b31088a 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_logger.html c9757921e1cb1af55f7f35f3edfa1f9451ccc71fe9ac3191b6c604695de817db 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_report.html 578591e36b7bb30143bf359d74066bf3cce5c4affd2685f7ec863b2ca6b943e2 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_local_db.html b1e0fe7d3b470eb177c3d2c4d27f73df8de4665aed3d2d9d64ac13db520ab7cb 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_data.html 7ad5a9197b4f17de9d7570e02ff62d1d8ee5da494db3ea6ed75dddf40f316628 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_storage.html 1d1c37baf71f0354fb188874aa2d39937f78e895c6ef5f0ae1026dcadfbe98e0 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mpd.html d6ca8e2a0128344b0b5ac8481cc912c1b50ee2cd3335f7f669d4a34a1fce4dab 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface.html fd7637cffd4c7be697febf7ceb0290c82e7fe3a603f620adcc0a3f86bce6d02b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface_filter.html b97455d02ebe8c7e9dfbf02475f95fd1968e396cdfe300991647d2e1bcd2da66 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_delivery_info_receiver.html 2aa61434a4c39f4f906a7b2c22f2fb2eb9d7f3d56ee0e84849cf3ba3ab588c91 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_filter.html 45f901ec667644edac47c1d964546fd8f6d0240c6d073fde780f919d464f6d9b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_supervisor.html 79cc93d7fe42ddae5a7203507ba952abedff5bc008f4eefa72fbab582d246036 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc.html 9af891ea6c89215d3d629d856dd8a8828e9356d73cd7b9ba9bcfab743467bceb 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc_cmd.html e1fa12b6b1324971fed8ec14df577a7586204aaa00a25f82b4c827eb45b64c11 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm.html 948e122cd61e45891bb70f184b40865c976a91ee8e61de9f868587e8fffb569b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_conf.html ea7be9383595fc1c068debccdd4ce50833e45dbca8f4ae62004775fb3a083283 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_mpd.html f060fc8887effd73f89d9f65e0f69d5ec8ea5d11021bd000faae974c91e5d75e 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface.html e73bad39b50e97b7776753807f90f16e3b7dc54070be0ea09093eeab0aec778b 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface_filter.html cd282816c2c140c4abfab4a360dbca2a2a9817051182554972520f9b54041fe5 2 -/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_user.html 94ff7110e277fbd15b4edd8d6458005562bf74baf284f7c0cb0ac3203393775a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/notes.html 64c51bb7cab57bea38893fed07256fadb67acc1310818b8aec0275ad4aba2894 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/search.html 739bde17bd1ec97a1a3e478b5e83985cda9b15e983132a19ec22e952f587eda3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub 68ef1158f779d0edb24c0189ef2f7deb1d2481207450b2d1d045d1619246c996 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.html 6f8685df7cfef3a74ccb3b0b715fa3113eac704fe405fdc33c0922ec4eee0aba 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_advanced_agent.html 1f53fa7139e709e8b0401854ae6ddb58bc01f951205e77df7a5879a4585bb128 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_config_files.html 41f2026a31f25e706b53da097e22ec4ec023118ab69fd0679962c86cac10625c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_funct_descr.html fe8934251663095ccc4cb56e004c392c8c95beafffd6a94a8721717d021f7691 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_netif.html 7221a0112c92edd4c44fa5e4c3404651cf38f795b04baae7bbc733b3705c7fd5 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app.html cae92d1627ce77e071270973bc901ffa75add768ad5cecf8d212040c754fb4d1 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_a.html f44c358c3f5a131e8f81091a5c6c9e8855e349f02b805cb23af9c0b97e3650be 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_b.html fa6f2e75bbd85246f4ebf9e25051c4b236c8694a5eaf321026ffdeb0d8d7b377 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_c.html d833098fec6e751234d34234e897b51a8c5dda1cd30a75de18bdb24fcfecfd37 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_audit_trail_log.html f7eed818ce89fa054ad535d966661bf460195eeaa107cb73d5d837418ad6bb4d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_community_mib.html a71c3adfa411122d022987998bdd1d4800808e6eb63703a0864e3e8295eebd4b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_config.html 8b7350881d73ea7c10ad7b7573035f7b92ba32bae87bf3d497c97d8eff9c2ce9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_def_instr_functions.html e4f326520ad2ae6f02548d0fcb4fb96c9132bb28b53a1eb8f218594b587ae4d6 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_framework_mib.html d9e10069e6e8f70c1b91fa832183f845553ab79adfe5f5223930c7816f4eec12 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_generic.html 276b655c5bdf1ee0beb5e4469cc18127bd59cdc94ab833daa5837d75daa9ee19 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_agent.html 8b0954fec0eb429ef9df82d5d91144cea81554af13d075b06fbda74785bece97 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_manager.html 64b746f8a8b999c6323402791ae72c3e4c6bdebd8e00d3a45ecd16c0f6ae83f1 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_index.html e943e7c4cc525a7d3b9bb4a0d502c3d2169c76fbb5e462588dc15d07a582fd1c 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_instr_functions.html a15fb067feab65356a4e65c78432ed93916055a9eb2bdc942375fbbb1aabe144 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_intro.html 49589e1407a4f65b54f0745c63f10b208e5790658d3cc367dd5a4769ba7cac6d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_config_files.html 59a07c4f41cf68c7d23e7128c394fb518629f4fab23cbcbb4aa655c347fbaaf3 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_funct_descr.html b77ad8a34e2abec0da706a76f1d07569d3885ce256403094ebf40b78613aeea7 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_netif.html 92faf0179a41f2fe9db45a40710cec29a6f98257467812674d218762262c8fc7 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_mib_compiler.html 1038684691c6c301a26fb08f9c86b58045c551814f17d82dd07983bb1a49e876 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_notification_mib.html acdecea12bf52cc0240bd4543fe3054fac1d7110c7c3472fde5a9280c3a42b5f 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_pdus.html cd9837d2d3954c946e80460884f7da798e0f1e3de03334485fc3e399ba8187d8 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_standard_mib.html dc4c8fc0c6ca3f8793cb943a8afcea54e9b44aec72fec92ae9884d395a391228 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_target_mib.html 48316c853e0ab0486e31fb301c4f545c5e5dfdce5ed783d2e41771dace19b61b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_user_based_sm_mib.html 447e6750bf33c9502758622c955f516e6410621900311fad1bf5753c326439b8 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_view_based_acm_mib.html dcf1acc6145f98ce910bf75b9555645093768b2716d929b9e655f629375fdc4b 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa.html 122a84e8db5171ef2960de31379e35b66ab606dbc97ccf4dc03b51274ab84bfa 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_conf.html 5c032dd81d16accc23f39ff5284103f70ab49b4efb9cc4c3bfa5ce209a59df5e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_discovery_handler.html a2d727599f505d37da108c1eabf32f672e8d114f6085bad122713ddb2c1f8a52 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error.html 67e69be5b2cdd8abb954b5fb0fa30cc52b914159abfaa0d418e7ab238453dd01 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_io.html dc81bdf40372c729fd32a56978056ab1be28e5e42ac3e3e74db8f4c59623d352 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_logger.html be68ba765c2c4dc9430379ebf05375067565f92e1dfe96bc5a17b73163785970 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_report.html 0ce801e6c4fa1bb59747c30d0b085196452f83995fd814e20d0929868d740186 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_local_db.html 0a541a66a3036f60850dcb5ee668fe03b4cddba6df625c59b03830192b1382fd 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_data.html c2ef935d39f4bb464208efc8a158d16a3f25614571bb0e07784d21f0b704594f 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_storage.html 6e688df9ae062aeac56a27330402bd74d030c874b84f7b0347c77a9721d016c6 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mpd.html 0d2800ed90687807c3924bd96edbe06958cde9627b39f985bfde4d3b1816c266 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface.html 56a12784ce625c5282b585019f8f8b87d7b66186652976d92b256401de4ae143 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface_filter.html ab387c21ffb3c610e1d5cd28e9b1c079aac890c55066e573b8ad61d542edf7c9 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_delivery_info_receiver.html 80871aa0497032f4a96b9d69268bc4f426ed3de03ae94b5465e27c4ba8cf8e34 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_filter.html d05e8c0d64506ee5341a9ff88eba5538201414216a1e068ba85189aeb7246d5e 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_supervisor.html fa640701a545d132a3bf664f4cda20a67e815c932af523780001651a2e4a1f53 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc.html b8603d56c1d644a98b488c3f39f8520866265e396eb732a12f0100b94c89ca14 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc_cmd.html b0513e1624e93b8d8f5e1f069317639d9535d54dfe31c82e0b6062137875c444 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm.html 0d6cdc5594983d8a9818233f3ffeaa8833c1e366d997a17beb53a095bd49b992 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_conf.html 93755fb8d479461e295a8d7ae5d9b7be22d0247baa9465db8d4d05edf93544ce 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_mpd.html 28e2f26a010059154b1d96c388b944749a05c7920a97d2e1c9ad2a6dd4ac1f6a 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface.html 1584a15d777160b598ed00afcb21a7808a5a4a8fe0fe19c2f99c8924d94c1061 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface_filter.html 83b3ad9c66d0889e419f41895482bf718266ad06d65bf38296d2ce4284d3e50d 2 +/usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_user.html c0370b101da761e34a970b4c84f333995b45bad8bef0ec9e8654aa6fbc311663 2 @@ -3309,2 +3309,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/404.html 2fb4a7f0a4dc01293e161b7dd89fed64d52dca37a3e57e994dbc6cd8125983b3 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/api-reference.html 5d8cca35d775639c8c9f0b8a0e88b4ced6e8293085252e1bb5953c408393cf17 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/404.html 2440946a0ac7aaa732186d939f69e3add69fc4645d907a16e1c0cab9391e59f2 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/api-reference.html b892cf1e492bb87d06c75237fee820d48066292e1b2404c5a08b6fc29b291646 2 @@ -3314,2 +3314,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configurations.html d4ed20914e0502a148a075afa9bbc5841b844d6018a86a2daf4f8fa1b1962814 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configure_algos.html bad85e94c2ef5acb1f3104db5c763c73f0e5bb4e9f07d5c67b2a806b0cc06841 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configurations.html 49b5e5fed08170a496211eef634539fea5b876eb6e8e440622444fceacd80b01 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configure_algos.html 54082125a9b49826e5a88d3a488c39e6e8573a7dd36300d1d2a9a9e383833deb 2 @@ -3326 +3326 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/hardening.html 87f5748426ca1a8ecc1e0ccf93e737da8decddd53dd104756ffdb60334c8964d 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/hardening.html a8c663f324f396467d41a71331016f9749bb7f5a8d18f7b6ebdef6f7cce7b56c 2 @@ -3328,17 +3328,17 @@ -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/introduction.html 4b6c1db4d4c5c91622a1d63a838a3fa1e4dfe7a66be5a41170d44dd2957912f3 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/notes.html e7a4cf1c1ee5a9b1fa3855d9ea08150aff50817ec4f2af267a230e6988afa997 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/search.html ff73515b717766052b38f8263d498015e414226a7dd05e558b34eb0adf980507 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub 52c94c79cf03745fc5feb6e4aa82e1856a2d1f09eafb8fac9078ef1e58e8a1aa 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.html 99799d4da290174520802fc3f81162f67afc83a86627e1f0ed9dcb818b4b198d 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_agent.html 8df3e1c887d3e8343eb6049dab8a1bb7ee57b0e267812e0b99aaa39dbb6bc83a 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_app.html b9fb6deef4ff6ee50b9312a236126fd7644da69383f946e169abe14511282a52 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_channel.html ed8e7f3019dacb71f07e4dc134357c6bd219326f9d91baf2d4320b52c123d9af 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_key_api.html c5ea92473172e15d73af90a68d788c7da1db5ee756455a08e427cce58064f523 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_connection.html 0c7c1a64aed400021040402400be7432358da8adf6090d4d236b55b085523674 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_file.html a0e273f0e8aef02f411babc7560100a34eaa4da40667bf5ba8bce778e923f64a 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_channel.html a1a334ec27195a55d4cf2056834c00f528917a21699b6e7b846c685afdf7004f 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_key_api.html 323405c45102a98b36bc0c07062590e147277ec3b6926c2e9d500877b822812b 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftp.html af55016010d8f9fa565a2ef65a4ab6a2b1301454d10587c6599a732dc549810c 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftpd.html 819ec27402aebd703915fc8922b2bfcc1dfb3daca676e579b7801b3f039d0890 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/terminology.html 5e1f59b04ea50e0b957a1f8275baf7da4a267a685b374ad163781f4f6a276f4b 2 -/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/using_ssh.html 3a7a9e02424025b2cee0799ec6f9c16f0f2b25f2c6b1c748ebd41f51eaa48b46 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/introduction.html b558e77c2b21a7440b455050ca49469a97496092cf1e9085d1649b466a3a3aaf 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/notes.html 6c6f0e930af562b2babccb331c65502812818a33b72a5be13bf1b6891e3a5a3b 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/search.html 9f929374b6444a2b7a6861244996134e719ee3b00795b381f4c51eb95ae3ac0d 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub fab0770e3a421c987a4935c96e2026fa7105e5a37ef238b09c275d5639f1d5fb 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.html e08cc5ccb7747aa83e28167306b2558834ce59a41b4e5c522a90877a473b446b 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_agent.html a796223a61c69e644d9937bf7f07a9eb344a590199bbcb332fa1b7979b59553b 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_app.html 0a6ffc4b82c54e677441aa6be073ba4ffd654cf140e6441734d9be1c253f37bc 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_channel.html 4a1e3a80a9f533cf4ee0bf01aa66be82bdf8fbcab945373493e0de89430a2c59 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_key_api.html f29937f6f761fac4390912bc34448c1f57e162ffb74b6220cb7aef30039cf7d4 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_connection.html 06f90be580247173b9788e720cb5ac98e46029364c77d9f94cbeed24cb7b6aad 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_file.html a3d36303715a351edb3f0b2878f2156c03dc0642ffdcea54de64e196bd06bb80 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_channel.html d01f967af0d135e4f53faca39f8bda28c1c627b7e4c9edfd546236d0fe3a32f7 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_key_api.html 7e9df4a23a5b483f907b345c6a4b628314c1b081f7df32a696240d38275d8b3c 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftp.html c0cad57aeaf973fb35a44559463ac2e9d4cdbebabcc8256b78b2abd2f5ea6ffd 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftpd.html acd813d76b63cfc83ab5f57462902ced0b3ab261cf45e1b806967687ad7f6dd1 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/terminology.html 616243db572d731658fb85461cc7a4068ffa29dc9a69ac7e14173fe981ded30b 2 +/usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/using_ssh.html 4ee0d94c7d82745001ccfe06e35e3fa004bb641353c2813ec36cb0285b8da53b 2 @@ -3348,2 +3348,2 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/404.html aba82d3ad3558771caa55050d2558c5fc86e44259e35810e5ba49496a193f2b2 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/api-reference.html bd1ca004f3598d880ba502e46aa945e5e5cc27cc8c7e62e2709ab8166f0fe851 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/404.html 4ac6308dcae76aabdcc00ee488e68b94e94dd1f5862566ab0e7ec6dcb6a440a5 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/api-reference.html ff82686cb707ec0bff7e64db94c322b6898f67e34ea5df480b48b9cdec00d39f 2 @@ -3363,12 +3363,12 @@ -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/notes.html 3d3fd34b80c499bb55e006d040d4a43457fbb0b2da93e4c241eeb11c31a6aa3d 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/search.html e19bc7b9532a04ab32758274774118752f5cc7d799c4562805edde3ac6eb0fdd 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub c360e903c99aad4634bf871f7ac251a159d4b5db2a71a07d8d71a545e0c3bf9e 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.html 8d926cf1afd3d59d1b1e29b60038dc8e6576ef85def1edd7d4346c9bcfd9fde8 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_app.html 2679df5c57fb27323786ba5e40b95563c27a5cae2344ef0e7239ff76861aaf14 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache.html a08abb8f856702355f1a3147d25431a2c808ab3bcb883465a554de860c1d1a34 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache_api.html 6024fdafe9592452ac81adc5158cec5f170bb654a129615543a1dbba4f30cbc6 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_distribution.html 0f810348e86fbc6db9205f3cabfdd038818a430ebfffd04dd972569fb11df8e9 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_protocol.html fe3834da7d7c34d611241404aa3effa93133794243c342b58cbc9789f6fbe7da 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_session_cache_api.html 4b60c8a952ba4bd5b48abcfdbc529b9c7337c1d45bc53fd6aa73e4a5419d3b97 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/standards_compliance.html 5956429194aadd5e1bbf352454e67964452bd501a30ccf16575cf8dea55241a1 2 -/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/using_ssl.html a3a8377abf11d5eba7e7a92b0f4599d779b46652d62f1766e119ea81c6f9b5df 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/notes.html 814b4198c1769569c416b2303987cad8c9dde97965649b31e29c047045fe3142 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/search.html 2b0ff8fc9b1902331a88333352aa7ae331aa9dfd062f330d279c21e286e6bd85 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub 23de92ed3a1406e93919c608fb0f1f67b71543dc69cd30d300d415bc49443292 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.html 678eeb0096caff3daefa53248befb52399bf28ae083b88fac17cc48df57d3d5e 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_app.html 6444951b2ef15ef1f12910bfa6fd41c3f2c0b7b9e9cddf74134354a55c43b22c 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache.html e3aa86515d6ad4fac858b3455ed14d65102d072307a3610c1b6110ca397bf9de 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache_api.html 9485dd855918b4f40c043a59b2b025260ff5798ab82bafb1c4024ac63a9e3ac7 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_distribution.html 865336298d2c5645444681d14fffb80000d5ea135da0cee1e468e9f82da93dd3 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_protocol.html 8bb86193dfa0802e39a624377c2b64b9f1bdecb7f11e5c8b901867b7d9e700a4 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_session_cache_api.html 9a81d8f7fb11ce72b57e6aea78ad6974725619a2db33aaf7f93b79e3a2c2a48d 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/standards_compliance.html 28424aea8b40dae93f3bfc126ff5f7981438e64dfc067351e9390009c3c1b8d8 2 +/usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/using_ssl.html b2e4d49458135f05cb35186a49cbc657b5974422de32f773fd2b370a0915dd64 2 @@ -3378,5 +3378,5 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/404.html efb33a201425814c3916ab83903d3fc8a509b7df9dd8e0d2da60a05eb62d35e4 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/api-reference.html 36d8cee736a87f80861bf000ba11a5d904a49564042e7a96ab913548db53d44a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/argparse.html 4505c268424f43b5b2a33e8c95c431929c278a00aa4c2570e0d2d01bffd9c3e3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/array.html 26ba4d7146e27263ab10677e0f17edc4cafded3e94f467f29bcdd4fccb3802eb 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/assert_hrl.html 24b54686b1ec37f1037543eebb3254ffd9864b57a08177218d0b25d5d060089f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/404.html fdb7b99642821e8e5e743e660c9684b6ea4557d1e4680355f52bb044ef679e7b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/api-reference.html 1b68cca5718d92f36c3348c8ebc8073cbf6d115f5c93749d6381f8b6eede40aa 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/argparse.html 5fa03984cd8cf6594b23d54dab8dc5f491b930173c8e598bcfc41aa5b67503ab 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/array.html e82330231301143ff426dec8465d00cd1388202f67de821c228393d1095ac6de 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/assert_hrl.html 7a1e00921ad205546ae393aec79ae992762d5e003ff6c95bfed4fbb515e4addf 2 @@ -3387,10 +3387,10 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/base64.html 26ed1cd1529338ab6ea27349537cb7451604e7e8c1bb301e8f3921076554d0a1 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/beam_lib.html cd54bf9cbfb9b18f709027cfb44a4c3be50911d3bf87b127a719e4511eeced19 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/binary.html 906f206576fff140195d356cb3746b9df5ae9bcc0c73e1c35f7c803b38355b75 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/c.html cb36154e40e707ae3d0ac5d05aaafde64c310173fdb6c4b00b0ff8b763fb9bdc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/calendar.html 6f3e639d65f7081617b04b8e23045fdaf9eba6662cc57027587c2acfe7a98e40 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/custom_shell.html 42d09c17a9f684b6f881418957fc8ed6722048315262be805bf4501bb5bd3d70 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dets.html 68580e94c391e6ec5d118378e33c3e7ded72f74c0aaaa8dc81ee5eef88ce3dd5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dict.html eedd5a3198eddd5b533c1da9bb7d33cb79d26f13bb03dbd6b0198d14c668d544 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph.html dadc8d6c78a5c3c54225b1abc7f82776e10d357721f6676deb4f29ea0c3c5440 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph_utils.html 5288806a855b849c9ec29410f1b4067b3df74eb836852a2aaec18c37d900c381 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/base64.html 12627782f3b44d6136971230ae7ed63ba6cafea0efee98bb0c55b9aaffe57a04 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/beam_lib.html cc03dbfb41319657afaab3285cc8003d4d246a016d1228a416d7f3276eec59c3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/binary.html fbb7902bfb41c026e8398c10f7a49dd20d390f33b8d505cd4d6181d58f951b6f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/c.html 54a26628451e834e681cb038169b4745bd392a3189a7e8bb7c98cad0fbc7ae4f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/calendar.html f93e9ef55b9d6272427f3e2cdbd6f840180dc046c983b818d1519363b36688f1 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/custom_shell.html b625124502500cf8bfc225a652bf9fa5a8a7849e5852d08b376461738014fb49 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dets.html a8d6a737bc8295f1042a1329dd20b69ec02d2aacbe6018909ecfbbf854b4b131 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dict.html 269429a0cd0442e013995b743a44ae976e4fbb03542d2cac21a5b9a6cc34a98a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph.html 0a749a5c2e6fd99947f395f01ad2d12f2655e611fcbf2056151ecbccc809a989 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph_utils.html b75765cfc1f590318b47a3e33b99373fb856b84686aaa7c1fc3c0b492af49f78 2 @@ -3407,26 +3407,26 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin.html c097015e0f0a344af76e7c6219ab9026649ca1df8a244642ce737394feaf64e1 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin_expand.html bd9ef7fa149c02c7b8c86201a33f7f7d6ff6459183fe83899197d2aa0ed35572 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/epp.html 3beb700da91830ee927d3296baceca13bc22fbea183cdfdea5fb9aa4dca3c759 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_anno.html fa49292d7af2746e85f2fc81c57ab4a0d9b1e416aba24c7ebe47d73847369b6e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_error.html 93589b25971eb2ab25d9c937c80ba27304b5d79629cd822c4e93ebd81f2c7664 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_eval.html 37c03f6f1b9797f22fe59611ea3cd1752a278489a2115db621b472dbf4124622 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_expand_records.html 1ce24d02723b690d02e92d6994e11006d6ffddd3f45abe40a7a2c9da0b4c5790 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_features.html 71597fa2d8083936ca7960348652903b2290bb6eb985b881f8e2762380ae6bfb 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_id_trans.html 5db34e6db28c69b52d67f4f812a7a86fcfe7b73b7009026d4a099db1f41a85eb 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_internal.html 1209e8f60f65f7b6764e0c190291d76615b89fbb9fc67f7b714543d0d1e6d50b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_lint.html a324dd4f1f55d753f10387a321fd466369e6f4c58785bc94853402ee4f8ba787 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_parse.html 8a3e7afbb0bc2da57bd4558c75b1d61b0993119d1e92c2c5f15df0d69b3097fc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_pp.html 7e9569eaf8b75b35bedf5734eeffd7cd5ba5fd950281afd14bf9b2c9440ff4cf 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_scan.html 5aae4f221e5b1d7110870d8555220b9861eeeb304f622b2eb79e9d2b9825b737 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_tar.html f36d129378830092471071f494c9c76b51e2c2fcd8d3dd4ab974e84303e05130 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/escript.html 74c7b926095aae35f24a606c510655cbd965f2bb088b51a326d269bc78d11a40 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ets.html a88ca9ca92ef390ae24c11dfa526bb74d0446b8944df53b5666d24ff1594b630 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/file_sorter.html 31dca7c27874c2f47e6e119557eee87407c3bda4529717f4686282259d77e7f8 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filelib.html dff5ca98877aea003181693461cf1e857af6f9d71f8e571fae5992e84828317f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filename.html 0404832936aae818ef7cfb2860891215b33c5f86c7205439f9a287a452330ea2 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_sets.html fa03d422e29429da11c870967836690723cf3051e8ba59d19bb415eb4add6f91 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_trees.html 6cdba29596283249505dfc47439dcfcc314004c3dda62debbadf96d9bc31e5e8 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_event.html d5c5b70b82c82a50feefb1ca693c5cb34017b51653e6f28b0d35732e0c6db316 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_fsm.html c6d5335aec799da0d69432b1bd270abbc10ad0ddddf854882b72b2b972b4031a 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_server.html b12b0b9c01af8f9f4cb26a426b6205b7179bbe008664ece0727c98abc6419425 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_statem.html aaf9867d311fff0e2d68c88ba84633a548341e727e24b89b9d4b232bd58a2b92 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin.html 060d2092eb4aafbc35df7d86064a2e4eb31a87741fbb2832c5b98e3c00f41c47 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin_expand.html c5ef277bbfa7b3e998aeb3df849b3f2825221919fc47948f8995bb5226942791 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/epp.html 87eddb15b17148b44f041e372ec2a744c245e01378db03cc71150c4267c5ceb4 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_anno.html 370dbc665af5182fcbd942add67059bbeaab458810550f50c3ec75ca1f6192e8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_error.html 73e3b2200256428d3c5b3787842b8d0bff2fc39c7cae5bc543fe4c60fb16966c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_eval.html 118c0ba2a61b6714a4876b17a3d23847f691f7395718cc9921f3425827bfca83 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_expand_records.html 70fd6c2e95ec0b16adda4469065573f67ebae5a70a45f9b201622009055a6e01 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_features.html b956a88a6cc0efdfe48e91fb2ea4843c2c83230e75244dff227dccb955fb688c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_id_trans.html 85b02437c0af17ef271040473ef5f23292799e4cb60fe1b54fe456ed89332b39 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_internal.html da893e4978fa4f93b67d611e3314105309cb283ed44f30209d2f591cdcb1e93a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_lint.html 301fc6040d45a8846057262661719f63177d7fe1d2c4d4f5369b9b7c6121c9e7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_parse.html 510f75192b2a686cbff4fa8b58ebfc47b016e7cb85519e921de30b991548afcd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_pp.html e89bf1ffebddaa40f8c3ea4224f6f9a9862078262fe7249ac1033931223507fa 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_scan.html 5f46270cafc69c669beb0f202195b4407a248b4bc4a5e20bc817e7d88ca5cead 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_tar.html b0bedf861453548dec06e31675202316f8cb4c13bc2ad08b5e1522a0241814ef 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/escript.html 13894b9cdaa791a5f34ba1e5eecbf7af32e8a6cde6650e0f5d4981da86f71208 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ets.html 48a5eeb50f3b23e9304ae9695b55822a7bce5f9fdd05746122b13aec58214d21 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/file_sorter.html 058b51136fd387daaee52cb99ddf3ae53cd832e71b0370b2e54560c11e254b4b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filelib.html 4c6900f4382a54b6faf86336b2504fc7574c2c327a3ce9a10d5dad54770d712a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filename.html d8ab83b7a840e80614c56d1e63fd9d45db3fc20663fde829d0d52977920bc0d2 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_sets.html 0aa52d4156ba8924bf4bbaacf009b1d2ca87b1399f9915bddc59f5a4de057cc4 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_trees.html 66e61c89848e3cc4ccba48b476698ae5de2fc231283b7ef75eea7f55e9befacd 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_event.html 11f056fddbcf9e21946d5e36374bde2f01e48d8bfc8dd70040d9ffd1674bd367 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_fsm.html ba2287f5b265070d257dd4d2fe8b5702a8f653be8b81681d5366ba7ba6c98cca 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_server.html 976bbcd4f5e0fb854680fd9c5a52ad241ee5c2f0e411478f6b49ec1dae5b2b61 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_statem.html df3e67c3ed58a032de863fde1d3ef19477fa3ec7d236199cc82364534afa1a41 2 @@ -3434,45 +3434,45 @@ -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/introduction.html da52baf5a764011479944b48482cca21e4b96b0fb111aab0d08b7781df5a2247 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io.html 47fcd1afc1411792f61fbf9a25366666e8639b088cefd5424118f59523d9f431 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_lib.html e5273dc7c1d878049263bd804a85366ee5f3b606acbc0892f1cad9e1577a1e94 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_protocol.html 3d43375e415e3079e951c2abc298b0406d8eef4b451da65129cc163915a2692f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/json.html 8d4a0917cf6c15d27531aa36826bd0185b1ab7f6485ba3e9111ee67aad0335b5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/lists.html 834ef6d3f616b665e76ad7b5260db2be0dd3168674ae5499811fb8f0de78152f 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/log_mf_h.html a10a895fa9e6b92378478e401e5806cc780d8dee67aa05163fe0bbb38cf66231 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/maps.html e8eb72270c532db6f83cc52f15eab78a6cdd4273eea832bd52c5e27a560bdd19 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/math.html 90b595e4363654d0f4a9de192fcd77ee343a897aafb18f15a5f8af13e2a0e238 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ms_transform.html 6e4830b4fafec6dd158a056ed7d21ec737d65b6fe5c25c31fe5a02fefe7b64e7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/notes.html e20273006317ad317b02664e637267c90ae48047b3e2869a5ec8c1cc088ccd44 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/orddict.html 12609046ff09ef921d11092e8cc4223fc1b3dea7f89e3b0d898e5e898a929377 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ordsets.html 0921b5fc36f07281b38d032231a8cef60784e016d2ff9ad488e912946b715728 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/peer.html c259ecd2986676982c8e443441561cfb40b71388f72e1e03d6d968ceef51742e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/pool.html e1ae25d4f22d1961580edd8758401281eb63f61d7f6613ec7b2d92e9a60fa48e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proc_lib.html ffb41562cef3089456b4c11dd0d3445397d70306f8b39c64960be97edc6a5b4d 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proplists.html 0a0e8e7188f5e88736ef1452a032cf9fe6e52394e14348d2839af1ebeaccef23 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/qlc.html c7703980e562defa6717b31798b4dafc7638e051131c3a35c4451dc54e737d6b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/queue.html dbb1ba235e0d08c31e8664b91c6318b23a01750aa0888917b64e53c2497e0ebe 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/rand.html f1692d7ef33b64beffc8019ec78caf94ac0dc09faef803d2ac84abd5a696880e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/random.html d1708f9dcaf5b3ef1c54dbf4b36f915107f88567eb4fee8c40ee73b6449bc991 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re.html 36e7cb737d76904dba6cfc48a81b25a2ed75a6c59e07f22e161afa30afc0d788 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re_incompat.html d40a8638a0becefa9ce3ad160c7ecc5a34d28b92e4d716fb0a95640ad9bc4647 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/search.html 4f49712081724e49647a5e2bed1bd3f22846187d73b78d7934a311841df3a32b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sets.html 43108d0b9503d4a3a818252ca5140b086d105c3404bda5074adea4bbba30dd2c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell.html e20cae83259364f50d2876ecd2cbf5e91fe52d96a239c3a762f6f8065f5a1111 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_default.html b7ab115673d412633e46ff4b8c64401c7d5c423da1d4f216fbf57660acc396c5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_docs.html ec4f955f4ed61a84171b9f02eb39d9a43d1f3f5da0cc177350b2fdd8d79cd44b 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/slave.html 625ae16bbc787492245f037b9a7f1921b5427bcea83cec082837d30a71c57ed8 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sofs.html 5b63e5376da91ccc7908033cc3acbfdd918f5d6874a862fbf75aaa821899849c 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub 4e6458e1312ffa4471480d21d7b2d4c81a4d4116f1579a54f0516a2a68e66bd5 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib_app.html 17ed5a0949dfd11ce24c888f15c3d94098fe3e35c3ff07033b8781a12d7c4fd0 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/string.html 6044ffc5426e928c2c4d5eab983a699d0368732df61aeeda0e01493812aff605 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor.html 0b1ef63076fc21b7331d1ec89304d54a9d59cf4d0d11638b86293c2c762f61f3 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor_bridge.html 1c45df0016b0ee58e92f95ba202c9af72d5d36d13c0d4882c521d4c19e6ca4bd 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sys.html 03e188efd2f033c0aa8ce13c5c20771ee882286d5fe7f053139625c34416ba19 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/terminal_interface.html ee71eadd6a39b2835fdd64dd31bd5d268dac8e029f5115a437abd363138b5ac7 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/timer.html 8eaacfbd70417839210be67e1fdc5500993938a177244ba142a2d85357755dce 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode.html 41f26e1131aa7156620c0f32be6c25f4f88fa02268361aecb7a8248cec78c7f6 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode_usage.html aaf5305641e9d5b7fc992db2f04043351a49b945dc71dbe1172eaf5cd029b5c4 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string.html 4b955c23f587789225ad2e13ed8a1560597ec2413e9821bdde059a85976c412e 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string_usage.html b1686b1dc0542de4f3a16d244bd543b7badcec69a62e58e31486690923104961 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/win32reg.html c217164e49ebf84359cb1f5f99fb11ecd8463503f1246add4c51db775f7855be 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zip.html 67ef9ae8d69e94bfe2bf539ba7125920b74136ca1948226deba96a862e3ae7fc 2 -/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zstd.html 35738cc0859a7503e6873325818463802161d9e5406b9dd47358114aae9569af 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/introduction.html 6648495d98f35c49d7dcffbbc6fe4e6a77afdd5baa086459faacca91bd1e3c17 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io.html 8c69be81bf14390513389472faec8f2a2c817a16b83d6413c1b594a7520113f5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_lib.html cb29358f7181c2fe49349a038bb8ea12e7e9e5606b8f42f8b3546548996bbf21 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_protocol.html 1c982fe168e3c4419375aafbe505aed71fa4ec285a8101071d85a2d5570bcd7b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/json.html b89bd353509704695bfec541f2fa0dbc7f97e5c27cf7d0ba5175f82487fa861a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/lists.html ddf81fbd01edab248a731cd87ac82c2ab696249b148bd8f967e0be2e45bd72b1 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/log_mf_h.html 3780dda76ce5d735aa910de2c8a7f6169c4098048f16e1789f2b4bf4f76962ce 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/maps.html bd9be8e2d25f763c717ea322c5dbc3b6f23d5372809f1794b0320d4f9f14dcc6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/math.html b6ed70a1ada2d417ee22e18976dd782840eb2e9057cc32c948c2de7d7f4221a8 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ms_transform.html ae48f4e4505027588b139fd869d5af80ff953df9eb215e5d0874aed009a851dc 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/notes.html 8065a591cc72e82e69df0538bf0ea40f18db9fd98d8ce45c8a409a731a434639 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/orddict.html 86a5cea538ff6d707584094e1602877790837c0904c2575ebc9a4868c7757464 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ordsets.html 3233ab359222cb946e27f961970a066c583d56bfab1b6ef6656d577d9d0e5ec7 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/peer.html 8849cbebafc12979cf209e6320867e8b75c5e6e2ee993b2083bf6cfe60942d0f 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/pool.html 41ef68ba35ff598883341ff601ae7ec34b4ec3b51a1993520adf0a6d1779989d 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proc_lib.html f352fa62d86249b395d7bd66021ebd7641408b0c7516776c845f45abc5770941 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proplists.html 66cd9f953fafa202082c16f9b0cb65266ca60f297c67624f62fe40f3187ffafb 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/qlc.html 98aee6a40c96267e8d48faded14be7df477c334c2c902a6709c98fb2715ae6a5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/queue.html ce96fb2403a56ab4c995bf81ff3a9001eeeb445c354ee8ab01318e1ed1f95b47 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/rand.html a4c1e41d8e34049eac7c8833c0049e9fe5033de7873d463ed809e1b692048e16 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/random.html a0369692593f5d9412c2709a8c61bb0cae2307c4504d559aa0b6cf3aaa91ee8a 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re.html 2179123ec8f3236d91a4e579b0207beef115ca1981122df64e16d35bd157d3d5 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re_incompat.html 1e3d06641b04cb469a005aa68ec1a1eeca7e122fbae0c322442d816f923ae578 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/search.html 778942247747492ff5804e1130ac34fd45f8ef0e95201cf58186c6bffa915cf6 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sets.html 06e90dcaa93bd43b339c5448f5b864e153e899163a4374a8209ac0ecba75df0b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell.html 810ac86b0a568eef9fa8ab195b4f53cf371c402c4ec1a993c188399eeaab4ae0 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_default.html 9a496f452a95c64c1a74fcc669d74e9046d651583a448681272e7e4e1672c140 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_docs.html 90a737bdf94aa135ffaccb71544d4a22c8303cf07c27dc88ebfaffa5b049d529 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/slave.html 42f432e37e796a58f19ac6e11bd6acbf106e4ec019bb1a3572090d5e617c401c 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sofs.html d8a4a1f8e784cdc8728ad05b05e1f334500b1b4b676a4cdb546fd96678068000 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub 9c6be107c505d07d613e937d553b9c6ab6df092d8a488d39acc6673b1d318923 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib_app.html 785fc1fcc0b4bff9edf5156a3f5fef643926a547b2b8f93b5e23a993bcef2964 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/string.html c5ac93af93a8169cec4c032ecee05a8c044029f63dfd901cda65e7b73df65ca3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor.html ee968978b8cefc6a8cb6e1c4dcfe3f0146878174642f812741532e8c66d8b75b 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor_bridge.html 6e477b918a9f567d4c316a0dafb0ed30e2eb76abc3da4cbff4cf3ea535145302 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sys.html e0617dc1ad5c84de60948d91a0d206bae5869a589b280f912a3c6e89ea5a34a9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/terminal_interface.html a3b0e35bd8b49eb4f0d6b1505f16878cf37752f9931331daa5e752773fb314c2 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/timer.html 6a2053cf31cf2ce363059778ce89aae2f54ef728ed45cdc994f01ff356c0cd05 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode.html 7f0d181d4f61a83fe3d9d3b72641d67614e5783ca201834e4cfeb6e412f77d10 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode_usage.html 2180c5559067dab8860db3f72d55bf20addbef5aadee03e38344c6f780ba68b3 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string.html eb2636c8dce6cbe14aa6d7db78a40d21abb00a70ef8f88f12d39a2d550b9bfbf 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string_usage.html 2e213e862d249c74ccdb9ca3c940c932cdd71d10bcf65e86d9152c7d94a279e9 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/win32reg.html c45f8809d355a2bc1d9be36c3f6cfac073c87ef317ac09fa3270d3c0116f14f1 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zip.html 8b690ad618935e5a297db7039b3a0ceb8021fe4c5d78510e9e518e2423ce525e 2 +/usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zstd.html d1323340074447360629dbb9a368316b50f8a3d32f51d57d6d374264927896ca 2 @@ -3482,2 +3482,2 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/404.html efa4f625f26dd4621396597d810b043d7937b3642bca05a37149a016f6f8c58b 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/api-reference.html 859923130013efdc545982405348727e1731cf310f882ba9fd838411153aa215 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/404.html 20f09fd43dd99aab1989e0467bc4ab72e193b29e2f8b113905a800bebad69928 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/api-reference.html 6d7f3647eab8ce3531dd48ff8020309ac60657632a127f70661c56ce69e30c55 2 @@ -3487 +3487 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/chapter.html e3f69a1dbfe5ecb4441b60afac4dbfbc2d1ad5388746b3d4bdb868a80e77817e 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/chapter.html 8da6c0eeec96c816a7d402938e5f4515711623abd7c9d6ff8136b7d765b1a315 2 @@ -3498,6 +3498,6 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/epp_dodger.html 9d52b5326e18d054f111e5cb1c09e4562c0e5b7fc049525b843df84ee26731c7 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_comment_scan.html f0b6c5e4381af2ef6d8a46b18117164fab5d3618d31942fb2c7af356f1bde1db 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_prettypr.html 51860fa52f059c7f5ab0a6307c2c669d22920cc5ed1d540cd3d01bb38e431bad 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_recomment.html 173b54e1b7ebb883eafa2780d341e113923f2c319e10f175602b2f00c81b45ee 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax.html 0cc16b663a043b01ec671ab0a9f40e09ad61ced74cfdf61139df9601272923d0 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax_lib.html 322e869ea1a46d91c4a9998358d584f6e039372d8e37365dba5fe158a0a143e1 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/epp_dodger.html f102a0842f5f0dbcb8e4434ee7349b06406ff40d2411829aebe1119fd010da06 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_comment_scan.html d39a822f37c7b318a9e392ba89303c0c439d5f8ed5fccbc0c98bad085682a469 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_prettypr.html a5945a86f126ccbca53dc2d834872180664140314236af2f1f289ddf249147e0 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_recomment.html 739ea4aa7887d27b4380d49fc7e108d2f341b9aa667991b270b359311cb2ba54 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax.html 4fad63bd2733aaa3729b78df7c327b60ea29344aeba8b798d24cf21b9fc8e0c4 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax_lib.html 73bd06a6880b63579f85312504c3ced040d5ab80b41c9b47d26b51d8a0e88b49 2 @@ -3505,5 +3505,5 @@ -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl.html adce818cc74a5d8adb0db67edbc2c0c32fd25d6d8a5cfbd8de0bf3782a90f7c7 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl_transform.html 5a744cbf7fa34493842abcc25a56fab77b5ab4afa535213af4a52dc5f390c87f 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/notes.html 54a2967b1516fbaef07205063693b799732e24a8b79cff9f24dcd9c757d0fc64 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/prettypr.html 6cc192f1e01d91c2cc8d79a6894187e6b4dbd80a20894d7e0531147561aead0b 2 -/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/search.html b9e1184c21ebc58dfda8d2224e39fcf809c2cc9200cbf9a058ba49bbb59d00bd 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl.html 409309b4e1394c10e033901346ae6031f052df25c9df22b766b079b909616ba7 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl_transform.html cb5a8892485c5e3ff231d41c2a36cfc9ba1df97bc657f2db49e59d5f2bc2e194 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/notes.html 5dd336e1c0a283190c7acf2972416c53e0fcbf033e6c41413741c0be56faf166 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/prettypr.html c60f62c3dc0ffd75949bd4db83d66e56667b6303b273047b0e37f54171fd2124 2 +/usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/search.html 5693bd070d1b0e0ade852130110cb8d396da641d0854afe0bb0065a770ec5b67 2 @@ -3513,2 +3513,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/404.html 49355f270fb970a47ddc2ea8feb129058d3a4c1e718e896da12f5c7c5a7156be 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/api-reference.html 865951867f429d3648d2e048d4c24008a261da560c1b0781d6fd3fea2ed8085b 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/404.html d3be28a08fa5addb3e66168fe1e081d95bae5d737e07aa5d11fa9a0033446286 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/api-reference.html 0ee854a329e6b5c3ee40c5f8a42e058bd238b9b00dd274797b8e21536192b3f9 2 @@ -3527 +3527 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/getting_started.html 28feaa90765b562b4701dc8e39df30f94f5183ab434a69da8e50f6431bcd0d03 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/getting_started.html 4395f15ec8859258fdae3f36e1ad452a8ea867de45015208dbdeecc1739e4d98 2 @@ -3529,6 +3529,6 @@ -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/introduction.html cbc5fd42fce36d7f7d099e5ced07137ae3763551466015a6d82826677023f100 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/notes.html b6389b9785bd5b83608efa1cccdb0071fbe6978bbdb0b1961ebae78b071f2fc4 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/search.html d1e7ba7ebfb29679a2eed9bd4956a04044f14b1daed0fc334fe20af31eb8a514 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub 5a0ec70914abc252723506e8872057851443faa6a61fd0d3ae0fbfb83ca4ed79 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.html 663076409f92fed66536bf7c8fb656535ce38fc766ad1bb8fcda30be493b1173 2 -/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp_logger.html ac7e4bb8777656a542cd206b0dc81193fd6b225753f17f6ca0421095f2a4bf38 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/introduction.html e4913d20930826c1f24bfb1a0737dd960c17f731f96d3de92236435a9bddeb0d 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/notes.html 74b67a8f54dbf586caa01a4f0ad9b8665674cc364a62046d392e06f4d1f5ba3c 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/search.html c8dcfd0f528bab56b9cfdd2917915456d66c7bbe50847edd48ddd2db282506ea 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub 21b47e7440182a2fd5e7cca5b42251175d454b2d590e1d47abe39a7a1c572252 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.html faa553df69ae7e0919008db37dbe81d027b38fee02afba24fc4d033601b18841 2 +/usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp_logger.html 899f6dc7768e7813f7233095bdac9985fae1d1b9303a054078f609bb36253448 2 @@ -3538,2 +3538,2 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/404.html 32c66bed4ca00a0db620f2d4ca282b17504f53aeb85a416f4c1395e2ccab3668 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/api-reference.html 0610aad57caf5c69e56c44664675bbbb608818b992869e17201c9a685dc287b0 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/404.html 17bbed124b55d205f9f7010e86adc7c30ab780f17fc6ef0c2b67a389192038a1 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/api-reference.html e94e99192b9d61e5d4f412598035f4349fbe1865058861309f3a09476d996ea6 2 @@ -3544,4 +3544,4 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover.html 4d58acd90b227455875fe15785a10266785c4ba1ed79f03a23a6a9bf0e15950b 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover_chapter.html 792f55503cf1ae168d5155576acad638679589e83b64f088822179559714f2e1 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof.html e1a8445fb54dda76bebbf32f04d6f7f71910811b01753f8feb753bc4aa91893f 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof_chapter.html 0e2e362a150b2c62c4968b6b4325f648cc7c1fd02081fe8624279cde65b86336 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover.html 1aceacc7331afa09c83eb541c6a9604b23c460044e9052902f4a19ed558c889d 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover_chapter.html 0b0b557f00062872c08d5b16640e3d6a6fe62d65570a37cac31ff0fb5a0e9362 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof.html 3d2e014ecf4897da60fd9ed90896b4ac7749d2a8bf08d88063406774a01d63de 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof_chapter.html 3cb0d48526c91eba1ee0f8d33f7917087a5d1f67cd7122d382e0ce12f308bf8c 2 @@ -3558,5 +3558,5 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/eprof.html 30f3a034be9f30654e641b456383eb6537cc1d8b729fd0c8f914e61ed612f0fa 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang-el.html 4b210f55eed67591bf2dacc2a4a2fb9580086d57d157da6db0b842deaeecca5e 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang_mode_chapter.html 974b9bffe4f2e2f008868142d2c4a60bc6295a92d5e1071fbf6f8c275adce816 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof.html e207fe4cf4a6520b8b9050ac1d2d15e674f69f02047751cbdd54acc97fe9ad79 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof_chapter.html 617f6006c92f9e5b956196c0dce8eaa6af54f67667d220253599c5114676d0c2 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/eprof.html b0000f1e93b7d3ce6020e6dbdf222982e9b0a4e796b2b21c66db377a34e8d00e 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang-el.html 5cf140568c5e7bb1ab83d22c4ffe794af5c0688c6db2490104aba003bba6be95 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang_mode_chapter.html d0c09ad7c28be3dc4243e54f10a6bf70326f6994240c1a8c3d648a73f7f6da6d 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof.html 2d9819c62741f5acd2d9280ad02ef56a7fba60aed6daa3af20571d42ff5671fb 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof_chapter.html 3a333ef1bfae6768f53b7faac00ff1677a74e234e6fa1ff5607fda548c5fc761 2 @@ -3564,10 +3564,10 @@ -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt.html a0534ef200e96e530337e51431d4b86f6506749e86be9f6e8fd8169f352ec9ad 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt_chapter.html 6cb0ab46e7a0445d848ef2ceb8c9ec8872df7efbfa69e4facf41528105bdae9b 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/make.html c0b85b5d41000d64009e7f67e97a0ce97474e7eb3860dd8ff47283f1ff1973cc 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/notes.html 725f1e8222d2e482519977f4dd70815c434ac64d434865d1e72c2e72e5be8446 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/search.html dbc18c292a2099a4f301097923665a1ab8b081b9d9c0eb29c1c7a26ec24ddc11 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tags.html 115f7ce30962fdcfc8be84ba6612fb2199fcee5876346ee1c212cfec12dc48db 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub fae3440dccc51873cdb283c360cd49d8416310dc40e427aba908a009b043fc35 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tprof.html ba773f431b05f50daf60f878f99fe8cd98739152d964c591ac6a211b830a501c 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref.html 8c709ebe9c28158286ee90ccf20042b3715ccdd1c32f3d5619d162d111d1925c 2 -/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref_chapter.html 61a8b1aca29918907d1fd43c9deee11b4c5ea11d7c676b41be0ce823ae8709cb 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt.html b72507eb79ed9c11fab3fa532161ae808c697ea999429f089c6ec92a7b971ba2 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt_chapter.html bf0817a02aa66c467a6ab63c28236ffa81ba0ea93ed794bb98d743f242ed4504 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/make.html 0ecf5efe8c312919f06b6484541ea6c00812edfa5c8cbf0f293553346b3d645d 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/notes.html 419a89b180d0f2062eb50a44bf03ad48f6bdd84973509b29605260847c68d371 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/search.html 4d0bf5ba86ff343a7271d09e727ab609d13707a5d39b8e0d7f3b67dcd22a518f 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tags.html 4e07427c43ba4006c0476fd0692d295811aff55e98719edfdade0d12ff5333c7 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub 31b506d5e66f8aa0c3a8cdbdb40a843fa27e12dcdac32fa214939b0955b6e2fd 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tprof.html 35ffde42d06ec3637ad1e6708a91d7ee04f5c337a9771737a3517e2fbcfc23f2 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref.html 115baec362588b22b89102235f16cde193539f210c1ea05b3c3d4edf416e41d7 2 +/usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref_chapter.html 25b1fb91083cefb5cc3805223ad9cc0da74a04e29dd3e48d594bd639f486a5bc 2 @@ -3577,2 +3577,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/404.html 19c969ac54c7d2f618035ae926f1a124a81a790ed175e905edb895d48f4cab06 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/api-reference.html 9099111a7f8fcb70ff7c3fd1b33390cc6910ef2d98889aa31e6b0541f7cc3656 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/404.html e4b3011a466794a596ca8c94a91951894135cb4e53432cb80492847701c64281 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/api-reference.html 95ea37a922e8dd7c7233d9a790789d7aa460ddd4e58c71351ab266d3de868eeb 2 @@ -3581 +3581 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/chapter.html 50d8431f28defda951697e05dbd20d03e7d3923526128a73c8df1efd771cf47b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/chapter.html e314480e7bb52d4de51a309e0ea708ecf689b316855acf09db613842d5450ae1 2 @@ -3592,2 +3592,2 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/gl.html 911ebcb732381d2f0199e3335ef5772a07d4044f16344dda0d74893dc4fb5be4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/glu.html 0ce88ce00128ba8a419b05cfffc5255a580c5241f7f0c893a89799feeeadf6be 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/gl.html 80bd8ea02d6de8dc6734b59d6b3442f43810cddad21017fd8c5b294ee460c528 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/glu.html fd9b3dc51c3f34d057de79c11e9283c8fd1907189a9dc4688d14734c3a22ec5e 2 @@ -3595,239 +3595,239 @@ -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/notes.html 9e9a441d89d6773385a07c15ce07ae905105939ecac964dc34431487c30fb718 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/search.html 20e0440c63365dcada48038882f1c7ebac37166f2fe779f998ac87360b534917 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub bf632da86c01b7d9c770b5b3288be8b40367f2a02ad9f69eb6f8bad271371ba3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.html 91dfec727b0e7011338aaf3540d748d6393394c4e664200f5edd5f381edfe1c7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorEntry.html 20c07d1ad722103e1f8fa0ffec0ee1f695a6f57cffc590d86387cc1aa4a159fa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorTable.html 2663fc9b02cacf07820475e17eb766bb1cbe0b5b59fe2b335562591536fde4c1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxActivateEvent.html c5505248627b927625c84a9d9a41c865db4cb3602d8b74c6bdc7429d7fc0ae34 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxArtProvider.html 815f2e344d67d806bfbdf1d7dcd225ca657b46e5f5f86ef784f11a94c2497b23 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiDockArt.html d83f289860664081ea5dbff5341acc49f7303f59f2f0f5ddf7a3a012306a7b46 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManager.html 7d4335e25e7d3c2bb95e9f939ae9a37927c7a5fb1c80c727e65552eda703ce86 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManagerEvent.html d375846fc7608fc7bff48515a0a0a2d7e4a6318f447d0b95405179fee2be590f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebook.html 39a3640ef0e3613a7d18ebb78184685db691acd3abc98b67a90c0a707b61eccc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebookEvent.html 86eff98374f18fcf7cff7810d3e8d3c803d455fadbbb18025c2ab6745acd7b24 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiPaneInfo.html 76095662e7ce7915820f2f0e98f6f846daac5c61837d8c978fb877523c0a1ffd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiSimpleTabArt.html d3d049f87ecc737477ed6182ac1bbcec6b262ab323d4aa54a9b05d4812f18bf5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiTabArt.html 5501dc33916d066905b8a0cb943dcf56fb014c97513b3c584beb0d536a572bda 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmap.html 06bc485cd01a05b1cf6165d67965b65fd6dfeaf2c1add6bce8a8e1ce7562353f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapButton.html 9c530880dc2dbad6ad2c382d4c2867429f1a1d26df4fcc141df57d59805c627c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapDataObject.html 6f2e5a5beb375bb801a7b1751ecdb23df00599ccee1d7a2ac50485f8f792e392 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlBase.html e0bbd3c1c1f1a43e6c1eb36284fdca23f4b8acd4861dd21007f8b09e9d4fe942 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlEvent.html a8a3a7d67afecd11ac73db533fed8518e8329fbd5975bce2122f3e0c81f8f294 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBoxSizer.html e3d4e69694418dce79afd704f43e2107ec18696879962b5e42d4842557427281 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBrush.html 771ec760439befaf75c2ec4a1eb87b0fb1908918849c167ebc29cc99a6dbb837 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedDC.html ea6613b60ce43321fc24b286d8310787b0767a24ec648bb42084e362bb50e008 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedPaintDC.html 1b0e7370b490b957e9e0267b414487cd642cf582576c9698fe8c77c846facdbc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxButton.html 10a8379b9458a4fe0dccf0ceb08a028ba786de873f7b25a028dcf38dead2df1c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarCtrl.html b9bb34bb60cb02b00394101d4cccb98b1f39eb60bf64a0ae2e6b3766a680d0ac 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarDateAttr.html 9afd921ad2a93180dc7fa33681c7e3f9b0db60e457bc2dcf72710db14e4914e7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarEvent.html 137b106228bd94942720ac4d5140cf82555683421db666da3da5caa30ef3bb6d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCaret.html a3ed744cf5749e121c8d69367af89d6645da074347e1fd5b57ce91d74be53a17 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckBox.html 8f00f78b245781a96612ec31802ac8ce8eb144dd6225f0261718548c4335ed18 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckListBox.html b88771fb22e441fc54be8e37b317f01c5f420b0b0378188299e08775948c1de6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChildFocusEvent.html 9dfd5d37823c9b504d014c505315a2e78b8b1d576660b544b7cd67f4aa462dd6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoice.html b7c56aaec9c5cf03eea1d126fbdd3a27d4243dd03181f23fb8d0f00009e2d89c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoicebook.html e7e2ce1b675f25d42dbd6048509cf4684779ab65665b112b287678dcb38a4c74 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClientDC.html 80ccf3dd4268ec62c23373b155e20fb774b08c98db070873ef55d4ebff44a61b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboard.html 96b48fa9ba275ad45eedf7c37ee816c89977672ae2a61c19444f0c5f48c2a98d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboardTextEvent.html 651c44697b84d5e81b705d554bdf02d082d353ee0779fc89336bec6498754d1f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCloseEvent.html 266b4bb5d11eb1a0c6c1dbe442dacc8d075359b4bafdee4da050f48825b2e073 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourData.html 93f08cfe2eeaf7594d6a8795ac043d4ca5d018cf841a6897cf2ca34ec50b1220 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourDialog.html 7f43bb20bfb274df2c6073d2a8549b3879b9153148c854b4fa80376135d6a2d1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerCtrl.html 9443a6b9c57bca114186311f8c5fe29032e3a10d696c636641da2bc70dd35095 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerEvent.html 58a963f779c08b7e7565136015c825efa6fa4a655fff3583df5bc388b09644d7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxComboBox.html 4be3b654edd99173f21bde93bc8a312e901a40a2f08ba5dfb3399f16945a85f5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCommandEvent.html f0f729cb524422e0200d4b2b3f322e9c3686f086fe397c0d4af0c6338489cabf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxContextMenuEvent.html 831f19870a760f90c28bd9ac8d080ec53adb906ed216b43a75a29b8f8c1cfcd7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControl.html b0800712d178481aaf2613143332ac1d7b0bffdde7d0c3fc919a95a3a0d2b373 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControlWithItems.html 8ebb809738a1b8b124690656f51da8ab99fd42fbad51114746b6b9e57122423f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCursor.html 096bd62a27e0173dca4d3f5775738245af8c087939dd69eb791721677a4e7afe 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDC.html ed195d4fe3638b42d8239e92708386f21602c46fa3eb7011d701343bb6dc6466 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDCOverlay.html b414cf6040db62b642b56c11ef95a522652c946a0bd9e00e0874a79b1c004ce8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDataObject.html a2faf42bb66aa08b639d3c580a2c62c41b9df85fec1406d8adaa1ace3a293134 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDateEvent.html 05e955a69f409be093df3548387ae6f1face6a7ec56a703d13e41ec0b99735cf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDatePickerCtrl.html a8bcf2ad50b46bc571b6a36c8e31617577a28dc28cbc01a0ca9a81c53ef2e673 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDialog.html 3662b3af0c9a6368a1a517ec9d9598784b294fffdfe264da886b4f82fae4579c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirDialog.html 85db94e4490a97d7f3a8b2161de1d03eb0aa8b69ecf4df2d90d5f36916c125dd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirPickerCtrl.html 36bcb12dacbcae77a3d7907d382fb4558a4fc4e1a693e00ea42cf5f4cf387bbc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplay.html 9d3bde554cb5dba38b214f8b3473b63fa6e7ad1c628de50b5a72100f24f725fa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplayChangedEvent.html 5c1e941caede1b97e480601115d82fe587cb335d42927889cffdcf00da7be4a9 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDropFilesEvent.html 991407b777f70ba37620bba3f19c6bc9b9ed466904a21202e1060f97e3618f98 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEraseEvent.html 6027b0e34b98c0e2ebc82f11b96a0416e47102d99dcf605389ad48d871b90047 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvent.html 6e0f15a627b77e586b2cbbeeaacd25607486aed402dd3cbb912799fee1c7cd1e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvtHandler.html 0ac650a5210801afe8c3ee609f2e63a76a697a1eda5ddeab77ee65259ac204ed 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDataObject.html 7eb88b34ce1413fc9ee21a9929cb02578a2e51878a246f44b64a53a347118718 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDialog.html 19856a7d90986fe6e067d36d389b75e9a8b33957c10b956644af26d42413082f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDirPickerEvent.html bd0a624efa775c244f0a9bfd6a854307c77b059e85615be6ad55483b4dcb9938 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFilePickerCtrl.html c709fd6f07ed0bd52fd8762bd9ffda9dcc39e5f3c9db90b34e2493bc28e97a82 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceData.html acd1b3fb3561f5fd5ea0404652fe0e82a31a8e4940f25839b8b114f122f4a09c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceDialog.html 5df29858d2a9c91a80d8760318c2b8aebf0dd56365a316b315472b1188666853 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFlexGridSizer.html 2169cb25674142ce847bf2e9461a0cf85dfa071dba4873eb3372c0e7b4d867e3 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFocusEvent.html 06ea61637c8f5f4e943703a5202152bf2c13a3e27687af2467ed6d837ec0968c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFont.html e5f4a5027984da1b644fc4d0869573ee8ecedf1d80a2b6de1e11f0f61bd8bdac 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontData.html c8344677ca17ea870f0d4711e5a3d3e903d1ac997c5b8937ae11916c5b52de2d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontDialog.html fcf6916c855392bf45e4befb2e91c9e83e58dbc4b394109fc1f05144b3150fa0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerCtrl.html 308e332f899dced61955dc0c4bd03ef960c6d65cfee747473ef48e89feb5444a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerEvent.html af5a921bb6956c3dbf55480ece72b057425f9901d4859909532157208f1cd46b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFrame.html 795cf16cd4390b763b380a2aa0889240ab7dbbc581e400bb56dc94f76fa72366 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGBSizerItem.html 9c386031867d7fd471a4d40f65f15714906572e0d0ec9612265f8752b1e1095f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGCDC.html 4c32dd82c1bb383da9bca47808d854f940618016116802656d83a497ba733f27 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLCanvas.html 4d5fb682ed3ff26f3bbf63ab4160760b0cebf895401e2611c2d444d8729903e7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLContext.html c621815137d72df066c7ffb2a28bbb0f2aff948ab43d0f2ab1801cfcb69eec98 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGauge.html fb3384e88dc18395487ffffa76dd0fbe7fe5fef2efb17987d6c67603356083c8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGenericDirCtrl.html ae1c6d4043b2f5f725d340eb91e9670e64c2cf5a8667a691ae8cccbcffdc206f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsBrush.html b2df517621f5d5f90ce0542da98bbb425cdd1f81007b3993ddb8959840629603 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsContext.html a8ffc5c33455d72c87f13c0f9d9d3664ba5d666cacd3691e0168c661ffcc6a66 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsFont.html 8082920de75f52125ed622c92c7e796df26ce7bc528edc935918b2fe697f4651 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsGradientStops.html 6c3528696ec2c8face22c23eb55f5ada0f41a364d25e4578e00da4fcf5fd6f9d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsMatrix.html 29ac244d711aa9d86457974eb51542522f2a8db1d414d279055f6d5cb1be2807 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsObject.html eae6ff4358fed33b0d262fdca354648fc7a28454664bd112b4c4604617b95ac1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPath.html f32d3eebdcec0d8f0bfb8ca1c64bb193b6cba3cd94fd30de8efbbb337880f09c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPen.html 500f9ffd139ab497dde5a7faefc855805b79755fbd1f0da6774638d881a3b7a7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsRenderer.html e868bf37403e35047e56e2ca74085551ba7a449f6908b0850537c2f82a2a4617 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGrid.html 59b4fc5c06c0b3fb237fea85e53f57946b08fcfa513aebe17978f0538560f4e8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridBagSizer.html 8b319276ce49ac09ef19bef9f3d069108b626b9d8f8eb609fff58b4e0a5c9f6d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellAttr.html 5d993648bfeef8601fa783ad953fbd25a40e05f9cddf66bfa9f475b530bc44bd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolEditor.html 7a7cefc23f0075ed9bfd22671d589149b58c5ab30fa03524c08690f029d95768 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolRenderer.html c830675810824e68fb172b3b630d0abe5d8f18b44acea2f8ed7b6cc8b07b7758 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellChoiceEditor.html 32629f8845789b7470c7f142575bac23ab25e0b424a82730bdb6b61b699da965 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellEditor.html 9d18ba6a4cd08b99cc48478fe96d41d8d9274193e239ad72a5681edea4ae5107 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatEditor.html dcede9df877096cae7aaf5702999400c842c63a209ae15dcbe6ee005274732d7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatRenderer.html c32d6aa4e8bc8cbda0d29f21a724dc3ffb7b99ddb92bf28ad3c1226f05466344 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberEditor.html 67b8dc7762574fc237060a357cbca04f417732302dc9eb8db05624d59ea84314 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberRenderer.html f1c2d73eccf6ab3fa58c08dac6803863490c730e3d0be3a143340687d8836005 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellRenderer.html 54448823943187686c3ed21e4b8c1649b8ef836992748ed8f425c118e6dc1bf7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellStringRenderer.html c81f515b05201909cced94ba7c7d2d1107f94cbe9733cd4583d1f644203def1f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellTextEditor.html 9268bf1dfa2e12f398f63065b2a7d6bb63d3c0186ff1765c094d91ec7cb9a7b1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridEvent.html eb82a9282da8454d176e0b7197d5eb5d9891a18a7665d2a95c1f58609b630a44 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridSizer.html 050adfc2e1b574c893f169e9060ffdc579bc9eee52798d8525e5786bb65d4b9b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHelpEvent.html b9e8dd86516130b63d7212f9457a65b018e915203eeed716911513c2e1a51e21 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlEasyPrinting.html edd8b5e3ce47f62c86de6f78f6e79f132c579125d3c93414c587d98cfbbcbb6d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlLinkEvent.html 489f2babce235a5e9ae654f3c6af0b3a836329c1a005a02ce210e2c437c256dc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlWindow.html fddcbdccb65a83f7c607cecba1a46b604d763800f615c18163d22055309314fc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIcon.html 12c0aea02b6109b21d1cf93408f6c3c6086e866607d611cb432465aa36d9028d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconBundle.html 20b16739eaacfcd91d3d1f2708630d24790f0d2c4e1cf5f4dcb07bedcc31ec96 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconizeEvent.html 61b72538cd17b2437211a719c22c47b9e8ce7ff30aba01328cb410cdd4833dad 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIdleEvent.html 1f05e8d6c016b5ec612722a8c235657fe46c99d6848648cf337d507a319cb74d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImage.html bd5e5402f96c34d0716f9a3885c2600b8b2b7d8b854740235a17c6c18f43324a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImageList.html 107d7f032c536ddfd0f188d895d80287403ca29117fdb1f1d057324145e61a3b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxInitDialogEvent.html 5aaa3bcd84fbd5bcbf00b2283c845faebc3d030176e8e49976002cf9122274eb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxJoystickEvent.html 52fb04657bd88aa000fee94c99501779b26d3180a7992507081ae70c9d99283a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxKeyEvent.html 2d14109f149473cfcf70d12a6706c8838c3914b24a8718490411abc67e6d92e5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLayoutAlgorithm.html c38434d5674cf408996f2db468bac264192c0f64b96dd97162d16cd66c0d6570 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListBox.html 79947a61adb7d7079931a487734d037be7135f9d1aae8570905030a10517aa72 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListCtrl.html c1d4a3833bd016f312dd4df8fdcf2ef9948a33b415fdfe465706c6a78d853bc8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListEvent.html 3bb9cdb10898c97f5bc04bf1b46c220cd523671815504b64c1df9e8adde5399f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItem.html 004a1cfdd0fc084cb6ac78307192e5e26389bd762b3c7a8111d81a3e280d3725 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItemAttr.html 58a67ebeeca0aa1ba10bafeb386cb5dddc32084c9bdf3a0f32bce8fc6448fa7a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListView.html 429162f27a57b05aa52639ea4fac76cc35c85d4d1c1eb1d87b5065c020bd20ee 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListbook.html f5821d51a2c884c4486820e3a6f35da3f33795d3debe7ec7ef113a2d2c9c6106 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLocale.html 76330b90de4d105e7460e9aad838f43afb79f61b4c7a5893ff7a8ba7d67a4dfe 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLogNull.html 624457f642a7eb5b912ad13f566fb0dad6d238b1500e5a171c2ff638f52c5348 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIChildFrame.html 7580a7ba0b9a3db1774bc9afbf85e720d37849231443d3e9c7593dc6ff713b57 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIClientWindow.html 70235637c95856ed5c135d416bfc3ed5f9d07defd01b321632cf3d1e8f4729ee 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIParentFrame.html c1b285d57fd2927f66f99c4cdf147b765158e26bcc8043e09552d178e06be5c8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMask.html 4f30d6e78a71258eb862071c3b3c40e9c26d5a0b653129714e66fdbfe8828c8c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMaximizeEvent.html 22a6562c8ab3b2f491b55063551c364c5923a535e6250801b3bb6871632fad9e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMemoryDC.html 3be157b5773f3a0a08f8b74bec7ebe552cc0d7f49bda64cc321c930010e83e5d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenu.html d0abf683b582701dca58470927f646ef4ce024c7453ba33e6aebdfe17cc95d1e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuBar.html 6d4dc48d40aa0ea72b1906ee980c925c083448588d2e705b42d7a595d9db7848 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuEvent.html d53323e17ec4563b583c1bdef2aca64728a6e23f6088e220f4623fc16eb97ba8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuItem.html 78172cf7bfb7694daa0f8e8734459fb4cec7b85b6b4667f107fde98e4f597f68 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMessageDialog.html 206d97fb886197fad309015dd0e70f00408fbd5a2ab9c7b626b348abba2dd285 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMiniFrame.html 3af14f78d2c22bf19c14e98b04f40c7e3a07dedc622b48c39f449c05c94fe2ee 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMirrorDC.html 0314db61553e5a912a79a627c344a698d83e039dcca93fe4b3fd0c9ddf80771e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureChangedEvent.html fcbc2c6519e76c1960dc054b018b7685dbd7096e408ed63787121059fdf354dc 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureLostEvent.html 3d3b6250757f461864270e3bd7b4c85738c7316072b2dc22a67cd36c8cf82a35 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseEvent.html 619620ffb40d75500f55c73c398643aa97007c0917023374e6d4da7e3ff810aa 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMoveEvent.html d5c41932e093cfae16b902be339634dffda985a09d3fd9cbaa4dde6d2772dba6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMultiChoiceDialog.html db16f954501aa4c901c2b3fdf9da8c379509e97cc1d75936f38c05f0a8360f1b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNavigationKeyEvent.html 1465973db7493c08a776091cdcb33c7b9e86de55bb8bbd39282e56dba4d0c7f4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotebook.html d81b85107e9431f1ce90cfd8aabc081cfb3d5f0990e1326b072f669786fe1920 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotificationMessage.html 8b737fa2fd6a9823e0bb42b21a6c46ab7ae2ef655059790f31c8329886f75f17 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotifyEvent.html b75f212c1aedc5ab4865415bf67093e49af7c452d43910951c2bc5c82b045ee6 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxOverlay.html 60bc391984af0b77bb744dd1b1031bd28cc4744a4459047c8c7e53c81fd5c788 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialog.html 5099d2aa74cc0a4e634e4cf4a3e5b95db15995505adfcc6a676ab6c9c8e6e85e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialogData.html 5892445390319337acea33f10251ccc9ebb49f91760cbb75d88f51a96672128e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintDC.html 113ac30ea582cd88d42e9d1c8a69a491abadadc3769184612817db24af4b003a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintEvent.html 59331637425004057c9a7351bbacc3ed45777b0bf5af258373e9934a1a314e68 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPalette.html f1aaecbabe072bc761133bb33d9006d6a047afd6b4df042cea71487be20b6eda 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaletteChangedEvent.html fdc06eead2f7747178611917575b3304ea23b3975c3039fba19de1a470b5afa4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPanel.html b7602229716f0d65c7f5f8b48536becdb8d3b510b2d337631fb970920d14d54a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPasswordEntryDialog.html a55ccf6b2994ba49a4d84b96a0d260d5440bc380646231ea18540c1287eccfc7 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPen.html addfe105f2bc884ed87a0fa6fae1432bfd3bf669dd8a7385e76855e6e8d9644c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPickerBase.html 33c2364dc2eb3f01970661476c1de6dadf04187d8dd3f1a5a382f07c21b2b846 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupTransientWindow.html 4a5a6382492eae5dca82551d32c7a5429729151d51f33969483bcd819f18a548 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupWindow.html 3c2c1ab4f99a0f7d9f633e12db6a3b1036168f3bf4d46f22b381847cb39880db 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPostScriptDC.html 243a5bd6362364db5dcc9e060cfbb9d54acf5327c8c9117169531417a0f3370c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewCanvas.html ed4f6422febfae361a11406d2e52fd98e83f2c84750f76b36110a31eb84a212c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewControlBar.html 92d09ebd312abf4ca6e5cf8b9e5c4c3e21572b5e744c6c295120071ee9484446 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewFrame.html 5ca7463b68fe89b1dc511d1bd0570a38d50492c391a36d3e2e11fbd789ee3147 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintData.html fd3940ff36ea77205c96ca6ff001a40fc6d02cd9ea16666ef9c63fc3622c20a1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialog.html f549563e59672dcc1fd0b32d64cc7a7f214a4662e6157af33880e4f5328e9a79 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialogData.html 720f3b679c0f3a837cae41f3c2fdcbafd64aad2207796c12d1e701495e593c8e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintPreview.html ee24dfbac95f222a0060b4ec675d1a814d4656a9ea38f03b48daf13bd68b700f 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrinter.html 406ad566c4cf4cf7f88a8fd64c0f35407b7f58f5ad14bb0621b0f22aa87fe40b 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintout.html 58c70e94b8e197cd2540f1648f842f82bcc1ee29c34fa294866efee819318a31 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxProgressDialog.html 51f6e00241be0aecea3408b5923df266ab9272ea521de9ec103d4c54b7c06727 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxQueryNewPaletteEvent.html 5269b44397513b55e84320a1decb269a842ca51f513e6eb19b5469998988a834 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioBox.html 5f0caaec703896bec43d0acb3470d8eb2bbdc86da8ccc7cc01cbd7eea35340ce 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioButton.html e0f0be23640076812a762ac61e015c055e8923caecf1feb3e46843826e09e536 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRegion.html 1df8c3b12eaf4445d349d1b1d3eb69595dcadd9b3154b656710831cf21a5afd4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashEvent.html 230786b57b9fb26f745e8f3e43996aa96f950154033731f1ab5d384c5a359052 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashLayoutWindow.html 6a94f8c18ce00da5494853b553d4b84c59ab52aef1205af81ba073a436cdd8ac 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashWindow.html b7a3a849d6e45ede9b05b4deaf7190595392d5373c350f39f85631c045b2faa4 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScreenDC.html 4c20bfe6f2fb2c61da676f4be5edf7daf8d3ffd89f777c19b3c9e983b90b58b5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollBar.html a849a3994ad92a7065e7b4ce06ad9707f82bbae53ffa8288330c034ebeda0310 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollEvent.html e3447314c643e02efc285c4f111fe59366bf2c5354c595951ca6c6c7c2efdb47 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollWinEvent.html e16d076bd3276d3ea077c2eee0aa4ce7a6aad91454c7efd1486abeaf1db48658 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrolledWindow.html 2e3049526ea7430ad1d1736f81a3fb5b9c589283c70e9cc279b37831c43b4186 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSetCursorEvent.html 830898db6de2855e3fe8de713184d5b4f3b06a84d04452cd744a5c1cd767a580 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxShowEvent.html 81410e9a2efd33837f46d008fce3bcb1f32de84dde9bff0d9925b774de2ec740 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSingleChoiceDialog.html be2efd7bff5dc252595613e90490198ba4f883f54473d6b9f2f195283606b170 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizeEvent.html 62cdda332f0e6dd4fe719a7440934e008a1a90b0a41a81c04a1b621a3ca6edcb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizer.html 1e44ce85ad4b98c748d73cbf451ea27bfd1c56ffc60d563e3413ad9af15e3e14 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerFlags.html 456ef9c18a15d5176e2bae3f66f9b1cc8dcc8894ad51d4cb88b31bd2a29a9a3c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerItem.html 317248ecb5c1600ef34e8cc8686185b846088553b10f534f4c624504e0b0ad12 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSlider.html ad9f57f16d1850df5b0d86142aae25a1f719e9c544c2485a0cfd287485c10562 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinButton.html 0070dd1681733826040a4d310b86282fb2d5548a71200a33fe5633f70f292af0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinCtrl.html d4d67f9a81584ba87f97bf081b46aae5a71fb61e656f48b6337dc2d577d68e1e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinEvent.html e9fa945a228aeb3ec803c5086b9ef6775445a3a1e73ed54004da041e0d15b493 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplashScreen.html dc2f234cd57950fb175a014b45953285120aba1ce9a0a47ab374b724a1367c4c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterEvent.html 416b0aff4e0069f2f9cb81f94fcac5fa1dc9ff71a34d7e4a2b96f3db2d2e09dd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterWindow.html 9eef763d361d10b48300a334638dfdae4d07cf299f30570923e9b31de1ce37d0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBitmap.html f6d92f762947b8bb795f555e0ece2a4cf6fed0ac5a134d599ad92e4c3a790826 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBox.html e4b0292e73783068e712275a1e85b1fb3e465e28c49294c3bb12fd48c75b8266 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBoxSizer.html ba5f3ec09202ce79332a6f157fc63d9147f80bb2f05651e98f35800320064d5a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticLine.html 03df311639ded5f17eb39fa813dd5f984f03093070d133b0b864dd9b2b9dead5 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticText.html 1c6c6dad65d6dc01784ca995c8413630be3fe5cf47bd3cd9b1f9919291b16fdf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStatusBar.html c2e061e5c67b0cfdd0ddd156230100d451d2f7af47917aea27cdd2cd61c352e2 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStdDialogButtonSizer.html 6e51fd69bd5a0f89134266e31d7de81b1b9547b1f1f6c20c90c4ef50d2d9d77e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextCtrl.html a093973e1f8b5a8601b762be73dfa3197b8e36f328f2b069e364e193d7e84abf 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextEvent.html 12aff95188b886c91b6eb7c9c038f2784be74ea5a5c41d25095178cd2ad01f6c 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSysColourChangedEvent.html 9ebfeb5efdf66673193421ca2a18c0ea3127158fe02794ec7b1bd8fb85e5c170 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemOptions.html 3c91733ba84567b8f7ef1827890e61b8524abef31f3398c438e7f3d260059326 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemSettings.html 5c03416580c4446bd5b726beafb92be3f1c032ab7af3aa938f50ffad25fdb2ca 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIcon.html d84949039b1d0b353de6120222398f9948cac5c5a3a84fa22fc6a3fef85230f1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIconEvent.html 740f8ab339917b566a7e6f2093fdc0c49be2d4d9ec51127d0ac22d3dd5105439 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextAttr.html 20480c2c4632b2bb29f83983c775ec698453ce1794ae11a61efa5e2ecf0b98dd 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextCtrl.html 6e1c94e86fee76608f3c589e47ad82a4c9b512fd1c1cbf9017283290157ea6e8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextDataObject.html 77673759f3b563168b7f93ae9029aa3848983c2ab5d0301a9c6b5337a4b29c91 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextEntryDialog.html 15c4ad40b20e008d565d73db661bf11f2a4805d3e9658a3347d5310bb1978a12 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToggleButton.html 99051aa9a6bda5ae811ddc053304c1d7315769b36cb040b0a1daae4f8c39b24d 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolBar.html 4c33b39e75af11314e9df92b2e994fa80dd0dbb5d3dcb07019860b0110c61c97 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolTip.html dce27f9b5c95cb5f8b0bd98ce246ae3ef8efb7e7834550f2bf80ee9d91e8d452 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolbook.html 833214deb2b94c0e2ac6bef253c1c114264551140e2c6253778c29f1bb4af5eb 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTopLevelWindow.html bad00a13f9eed117ee0ff26017ad124062b3497bc26932754dd737bcb22452f1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeCtrl.html 43eebc82b0d1f2ad274f1c54c1ecd7e85456477bfc3d0d42357cc3fc574aba15 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeEvent.html a9febc4da9cb159869ac184f540b76813d005b30b8a05c55ed0f48a88672b75a 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreebook.html 2a3a866f9219d7af2a7b066f3719bea1d8ed042f916273b413b9a934b0acda40 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxUpdateUIEvent.html 0577c95a6355fb4f98f07553242b34c87edcdea48a774f7c710d813b9b63e1d0 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebView.html 95f9f7f6a008ee922b373920d0ec81ca17b4fd43ffe9af27cde40bc8dd42d98e 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebViewEvent.html df217d32c99a66b10fe17bf98bc2f347cbf2db57445db9c0d684a9cf4f66e3c8 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindow.html 2f1db49f01c5cc12f2f07887a498897c89101b283ed2fd111f01302613455e84 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowCreateEvent.html ee56daec6a0561d9437ee403bfb56ef49603ef1e593f4b91d7ba8eb1aa96e6f1 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDC.html 96ae90c1980e8a61ce1887cf65032b1560912719908ccddf9cbb0f1599e3e3de 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDestroyEvent.html 73828a1218bd501ea12ae7b8b9271965e95ab965cbbf43d3d6458f67d2e43006 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxXmlResource.html e3cf5a54198b52ead1fbca442a62c2925a328476f74edf10edd6e9af25787401 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_misc.html ebc80fe64eb02125ee6fbb09d799ce17a22126c8c9a91f8d6530291f7759f597 2 -/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_object.html f01f1d72d4d438a24241337b8bd01cd593c553b3cb40d3525b9017bd5e1c7e43 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/notes.html 17986efbddd535529e07e785a8e97c4b2781a2ef5f92c6fde0ad73ba8b767fbe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/search.html d8cf7ede4185288016581d86685dfa3917c0650910bd0eb68c696ea469b9b886 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub c35db8ac5ca13f84346887fc7a0705e60b2214e66189660f3c3c00d84af80911 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.html 7a74b8b5f367a4dc8f98900bc0caa592e5bc97751d664569a2f863a0be6d7790 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorEntry.html d6db8351b208453f0af4b166a930ebecc9b07ce733cb6bfe53642fed7774ba54 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorTable.html 966038078711db45d188df60515d31e6102b5568ba779988c6211431817ed213 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxActivateEvent.html 7caa99a681c09af743e2027415007ccf96e132b753435f508f732227462db059 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxArtProvider.html f5df526acfefe62db11d0f83ad5331ec9b7b70c04c66e2c65589685cb74da01b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiDockArt.html b762907e230b1bcda97512f576f00158cde4d8ec28aba454f40a89fe33e4829b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManager.html 1b0e75e935f11fe73b2894acbb7fc01e11b8bf90656b18752b4c3fb5cc5579bd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManagerEvent.html 733a1df4fb5140f5cdcc4083b7e599d6ee332911716b7a044899702f99f5d5f3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebook.html c34a074ee1f9d52c62631c1778d74c788be0e97524854f68d1b8d6d66464efce 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebookEvent.html 1f1f22101d5602427c47092f3da67638298e00a7aaab5f13e3d9e6ba4fc3c9d7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiPaneInfo.html 186afc7bfee23213434319ad80e66f5617d380d5fe7efcf04fd83817491efce9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiSimpleTabArt.html 54734dd005afe961c98d7202155405c123fca1ec6a0323d398f5649cce760c24 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiTabArt.html 2832c82b3d007894c8451eab22b1ea45911190260e91cf485cfad5504e4f9c0e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmap.html 6e8316415ffe50e7841cd76159e388bddc918b77a654fa8c1e564878b9c9ebf6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapButton.html 7853938753b1701d3b804be58e912906ae94859442cd5c7808236c438abaf81c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapDataObject.html 4239f275726e5653a5db5e221e614384c53a4fc07abc6d1859d2c2ff8741405f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlBase.html 753f1a84d162dd119217410eb801871471df2b4cdccdcfe77e6e666ab177ce58 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlEvent.html 459b5210c7fb989f27824bc15664e7ec779eb435fd75e0354e0c2f0c4a1d1133 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBoxSizer.html 964181c95bc81a8dfd3b45331aa5329d21be734e4663626c048c604cadb64fd1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBrush.html 379db43f21c4b394f5a3e572216fd7acc24d9519cd0632f3023ee2fc8ed8ef5d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedDC.html a41955cc4461eb4e45f7e98e68c443275c1f4f9555dfe13a07dfa3c517f6b48a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedPaintDC.html 512b253dde5846d041c4963812d64023bb6d1ab8df2585bab86197f0b21609f8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxButton.html 38a5ffad7e8ae8917625c6ad12f7361c16e1f3286648dcc4ab952983a9eb5615 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarCtrl.html 4e7943a04e5d469c6eaaf1caaeb3cad07972602eec56a46dd673e01a59bd13ac 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarDateAttr.html 1f8a869db40d1cc12a7cc7a89cc8d9eab6bfff338d6e49a40e4c0e0c2fdf359b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarEvent.html 9b58efb679cb116a38e1af8c437cfadebae268d010a0fd596fda977c8472e621 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCaret.html b9d8dc3bd1916decef3efcd10929e3c71858072dc82cc7f6253580ec44066259 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckBox.html d92801b59ec28f0a2e3ce52c09d842ab9e3dcff1ec7a3e69f8a97394f7ae49e9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckListBox.html 3201b24fecaa1ecddff27bc9a19f5368be34c9b7f743c8d64d67ed178bcf4516 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChildFocusEvent.html 208263f288df2d5053ae895842fe4a6007eac6a745e64cc31abe35b39ed67966 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoice.html 22061812bb3dfe1f2a0486f84acff31424f11312692cad1cdef688395e30be84 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoicebook.html 6c354fa26947d4c8923e8f51aabef60e70b52d9954dff348ac571b4656a88d09 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClientDC.html 021eb563c088bdfac915f95bc3bb7d6280d03460d07761af7b234c40d2f9f054 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboard.html f77c068ef886210550fcbc900776c777e5031cd1cd606561f8692b1b4358dd94 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboardTextEvent.html 8536aed0707fe8e6c3250058ded02526eb32ab51c09a15f903fb6e2010b459ae 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCloseEvent.html cb30af57b30101864f62a9d8122c35dac3b1b168f40df78638531980067bff82 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourData.html 2976d4a6e5c6a6d74d506045b17602ad008a40efaa3be5f1e4c06b47d47b5e51 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourDialog.html 8ccf6c16144e03c3958d8982df36b57674ab45f0b32e9729ef90dd88aac86fc4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerCtrl.html a1cfcc444bdba5c90e967c3cd56ae2a6b3a3b5d7310fd96824559a9c8f0dbd96 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerEvent.html 9c2a91c3316cdd3121ad6ebff15c3f2b25c9df007a970e7e5f912d0592e55f8a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxComboBox.html 2ffe07cef10e3f790ad8666a2c80193332365f0c374f779b722e11682edd6234 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCommandEvent.html 800a42e2ae88b95ee5e39a80bed64b35d0fc2e7b828f48dee170474b23c7ae94 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxContextMenuEvent.html 9ef59d5c3295e659e5e4ee458f71b0a4b3640fec2c19911b39057f9153baeb93 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControl.html 3829ac44aa4768f31b5afd6caa0c1a6c270d25065283deb1f5c9a56b7cca58fe 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControlWithItems.html 15a4dbf01d2e66e12d0e98e460d23a4f10ea0a63a9cc66ada0b16733984d841e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCursor.html 6e2767d3b0b390d98be13c6906d55e4df45b2975f3414df0f34935e2bdbf89e7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDC.html 944cd3f5cfafe0ccd1456cfb142a1afc407823d0b7c8480a33b65dc6ade96507 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDCOverlay.html 5b91a52b4193281bc35a20182c79d38490c1f3464ea208fbcd56632f44698561 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDataObject.html 6a0627082172dfeef032f1e3b871ed274c932d4fa3499772e24952d514014a81 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDateEvent.html c908989fa5453e18de9aa63736ffaa55b0559fa8cd63e35069ca2a5c1e7e80bd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDatePickerCtrl.html 5633155bd1490323d5c1508bb33ec082caea027a8cd4adffc555e70ee2f03c62 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDialog.html 158e63e6ad6231db597399ff1131e1aef1e48c4e76d21cac9097a9eee1242013 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirDialog.html b87137b15b03b1ad5f9c9aa7ac3bc274a5eed7497f7281b965c73d90f4b0dd64 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirPickerCtrl.html 21a13b612dd1cad53166ac57ed9c0a7e4e5c179d01ce19c5813ee5765c542bfa 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplay.html 418d4f17dfeb4cad4521aae8cf97214b2d6333694b1537664d5d1d230646d462 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplayChangedEvent.html 8adfca1104172c4f25434ccc028a6423b0c19902b4d966b4fff1b554910529cb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDropFilesEvent.html b26bcd4dc4d08a2b21f448395c0bc47e001cb6f1cebf574f0c937f3ce51f8694 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEraseEvent.html 88286622b011ebe71aee1e912f6f6dd97ef7e31d12c2d0a4327be962f8be3b06 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvent.html 373b1f4d7a23f449fceef518dd890b47ffa6beac7e2c68071f5cb0c14251422b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvtHandler.html 1955a6e08a1f7ed330dfb0858aa64dbf940aa45375ad5d4b568c97549e9a798c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDataObject.html e7207a8c8f6606871ba4248056520ffc1fa5ebda0de69425fff208ece4c0e2af 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDialog.html 08d9e19408e88c793547c6e672eb565c5f62c0e96f6c685d15b3d4f9be430525 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDirPickerEvent.html dcad0f8e5c1e35c07031bb4ea934b6772656eb5adb366fa4452193ac18ac3ffb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFilePickerCtrl.html f1ca05459c262558e371adeafa881de621be7175bd3a59c4eb8104033e29380a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceData.html 5ff98cebc34738e413df3e43807bec01e030b85f389595b129e181ba0076bc3a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceDialog.html 0b63261bcc80fcf333fbd7a5c67f874334230c3b32cc075007d9d23a49093c76 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFlexGridSizer.html 89ca62b1c0c416eebee88a37d580150573bfd3672cf0a72b5b1d279edac9dbec 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFocusEvent.html bf808d9d2f99221c69a7845228a487caaec5d372a65bdd8e810c53d383edc9fc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFont.html 9d8a2a3fa768581163ebb9a5d90e9a5cfeb7409d249bcb26c5e2ba5370835f84 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontData.html bb1f333d3b85e247a2155c70e9a755290f3996fe183040ab15aa6ee5486e4eb1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontDialog.html 6a392a6b9b1af3c8f3a3866becc44317e2c25c72f951085ea0d3bd26925f14a6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerCtrl.html 1b103f8a6203449499ac27b318c932b56d293a4ba922eaf1b93a7ddcf89c094d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerEvent.html 8602ee7175d6801fb7f0c60bdc86901cad3bb4ca0e2117f3791704febbf1949c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFrame.html cd0e163988e9d6273113cfd08cfcb947e7f9b7c09877b4e2a17d984f7bd001e1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGBSizerItem.html 90a5ab00e2963382e2cc8b4d816abfc2ee91fa6fac1916e8789e3a9a262ca873 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGCDC.html 4bbe796fb5c6b153547f84f001ddf71cd0799ae778615c9527c27b52c629edd6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLCanvas.html 17192feb101bed4586ce22137c30c6e4e93c8ef4e2726659088e2587bd20f156 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLContext.html 311cf2851e4dff84b3315f985447d66b6f43d196824bb31be2793e772906865f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGauge.html 32038a49030c16989f71850834fcef3ef59a3024698571719a66a5b1c5f6998a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGenericDirCtrl.html a4ff551a23662a65058e6fa83c7754acab88bf1c16f9ef1ba70a01dfb00b963a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsBrush.html 9a9c0afbe7cc7fec4da98ecd7f9a12847cc04c802aa466b607351689decd3d57 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsContext.html 43c6fff889f4e174eec5d365d63ceaaba6be71488e721541e7b86ca849210664 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsFont.html 9f0b5246c5fe0dce7190885c8a8fe47209b7147b19e74401d2d7a2efa0ccd710 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsGradientStops.html 26b26b9460bfd8f0d1a93d504c8339d3d99a7d59dfaccbb6f72ecf7336af6d0a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsMatrix.html bcd5ed56978194177a98ca34a642c45cf7c6d9d623756561b36ebf31b46f4893 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsObject.html 4f1d665cc592c909509b602e79189aa7b175f76df0b7b03e7f853034c69a010d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPath.html e37f0593b0fa5b49768aa2b01b636e47a21174da24c7d3d579bd805aab705972 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPen.html e8a5ca00649d24afc43f2b30756bdf35b07c2a6273adcd66b7a867766519ad2b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsRenderer.html f4d157b45c0f510c35f4026d1affd381f4368acccdfbda1092ed48c8ba201c6e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGrid.html 885d1a6a9aca3e6d2d0088ebd1e98d38ede04e6ad2904a24f430a566f4fc3ce0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridBagSizer.html 3c56334201986d8eada1c96e3c757887ce3184ef11fc16e7728dd6d7acb2f553 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellAttr.html e85af5ab736cf105ca5ad266cadcd219e247c35f912d45dd0096b5b27185073c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolEditor.html e4ce0ffa5f6a4ea9523eb1fba04048a12be564fad13dda9c65ef889f0a231384 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolRenderer.html ff0a5f06d954efe71ca7990affd7033a36eed414e7de36a83f4a5c32aa9ab13a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellChoiceEditor.html 51e38a70d20ae570a77f833b28b94084520b647243f5b93a16e7597dbc386aab 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellEditor.html 9cfd742b739ae1538f7a25820cfdccdf3644bbd858b78a4b26e478c9bc6a9118 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatEditor.html 3f08649ceb31f0abbd75f4841125c4d5582ba559e7e9b8e4f9921b515652ea8d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatRenderer.html 19996aa2744306e8a38ade9691682811b1ae6cd9d52f3e1e4ce8c9746ac50f7f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberEditor.html fceee3341e985a065a1bee8dfea34a00b8ae6c21b2bd87d11ef40ce63e1da3ed 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberRenderer.html cb0e37e5d793da09d267db60fca781b55570fc3666b143690e90a03803f5712d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellRenderer.html 972849ca865ca17c247c58cb3d6bfd2675d2bb2fa72b903683c932330ea59588 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellStringRenderer.html 55a2186f986c40327ec0c615818322f45b3cb64f3626552e8d6ae64d4d38ac92 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellTextEditor.html 401a33f3ef222e15c4402068df4cdb78138fe6acbe412e426b4fe178f535a3d1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridEvent.html a2034f52413032cd2776b64f42cc391d7e327d555290108e3d276b33064e8209 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridSizer.html 4df465f3b6d1e1eee0cda0f8ed6b4caab3d1fca2a2cf1a49e67053a42477b777 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHelpEvent.html 3a150649aa3857b6eb8e80776fb5c3996261866b4947bd5f2a7fea965e53a3eb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlEasyPrinting.html 5e361c61d7eeceb0ab06e33a70eaa5852cdaf6a66f050723784e5f3f2fef1088 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlLinkEvent.html bb341e5c365cde1fb6e709414efd1976ed31fe769594df57bce5bcce51bfa9cd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlWindow.html 7eb190cefa12e9bf3dcc4cf990185a4c8bdd7aaa18d3ced9e2ac259744e4a15d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIcon.html 0058f4cb4bb2d1cbc5bb7e23ee5bfa6e76bc76931f3c222c744b97a208ab7c27 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconBundle.html 1a0ea2a14301a3ba6bc2a7f58cd60eb1b1b68d26ab428a570e4ffa22c520b701 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconizeEvent.html e2a167345596535cf62cd4933947cde48003110b3f4faa722f6ba76f3d76a588 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIdleEvent.html e1bd6a8e8a3ac6f30375dab965f63bf4e36ced6f62e78d691273ab3e06b23245 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImage.html e40a2b00272209780384c314a074d96ce3ef2b4d6a6b5a93c9d3b653b19763f8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImageList.html 6bb64a4686992ded9ac312dba49f4d0a33eeb28e3993f1313604510af28acef4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxInitDialogEvent.html 33515f92a418dbbe55840795dbf93b19619bd6331c37d969bd07646751538cf4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxJoystickEvent.html 5bb7a06057bd743d04c90ee900000ce6842a81436e015b621d6f433f7f83cd54 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxKeyEvent.html be48ad8f45637a62f89a2faaa3d69e177f740b2bff768e6dbd58648d00dc92cd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLayoutAlgorithm.html 0db28cfb30af1c61ab6c0ea14ece73bf30ce9e234a560d775508f8d18b3934a6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListBox.html 9471072bdd4fb93d9055419c3af34f638d27793a423b4ba3dc10559b457e895f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListCtrl.html 932bae6d68f4f2f8a8251ee11b7fe47fd5d2e0d6e84551c62594b79635ef2449 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListEvent.html 52650586cacc91def034c0da0308bcbee8bbf762a678a982eac6ed770b69ad88 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItem.html c17c5db8805a2f711b895974fa94acf6c9cc4bf2418702266c14ed337e8004c8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItemAttr.html 940c5541fa9c8d43b48421ec8e69899e1348b4e1a347ede2f5adad218c3c9d4f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListView.html 57c93526722213edd61ce693afc87336de5c0d38ff900c003649fce9c9fb16b4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListbook.html 9ef83da603868ff0f772af3aa71fb91c055ed52f825349a0beb09a59ea1dda0d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLocale.html a93bdbb878ed3f295f9b8db262c66791c9c0fe373f90551557e3ea1aa6220f43 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLogNull.html c0ad68a3047823f314e10c724f1ee0239c0c10b520c1a3186b46ceff74f19b49 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIChildFrame.html a680b1526852d682e0f0ba8b60a7e52a35b93d533f67e21257d845872482de01 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIClientWindow.html 46304e1e9840e2dcae03eaf9fba268eed1782ec4fafa73772a46841f8484ed51 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIParentFrame.html dabcc1bc7a6d941085916baf2de468f9d9c923d4b33fb498d3f20debff0c36cb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMask.html 1a1cb9e1979070d64c14597d7e8d208367692527c4e062a7834c7635c4f10b03 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMaximizeEvent.html 373056b0c6781fe210050b9936bdc38e04c56277e1714735c94069df99ac5335 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMemoryDC.html dda9fddae677c03daaddd9d87599e3800bac3e15741eaa82b585aac31d931594 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenu.html 54f1838e96cfd3f2099b5b43e1a6bbf98da4b55e45fd63569e3b04fd93cfedc5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuBar.html ab2be08604774b87c8cd515e3be13fcea78c5c8cada9e6fad9c06048928383a5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuEvent.html b09d56f59eaca0703aac1581e6b67be4621a7af2f2177f0915ee5d8f40675010 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuItem.html 9438e6f302ea2c2b08cd769e0355df68c867f1152c221fa6766672e84b290c64 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMessageDialog.html af61a3c013c45e5535b867ed1477eacdab57c4c71f8ca55dce5deafcb861a845 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMiniFrame.html cd3709c3b60014aba483fba2db6b36d605714020cd6158b73d77b9e13ecfdf70 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMirrorDC.html 5b505fae7a0ce4763b44b38871febd06dc82c03c513e1399c0293b79823509f2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureChangedEvent.html 376793c5f6735342df8b954a7bffbc3a316adb94eb759840ee4684a2ff8442e0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureLostEvent.html 8b84c4f76748b0f8a42ca81a8ac75913ac6172f2b25fcf198b241ce1fa17239d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseEvent.html c124150057ba19041f06bf2cb88a0a55ca61e7badeab361738ed1a27b7558c5b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMoveEvent.html 8d90dbb230651b380b6356cd1b656bc49e95a743a541bc560f4b92a86085366e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMultiChoiceDialog.html 2010efd6c05369e0cd7abe23a73256457b5592d23ba8e1a21ed7155dd501604f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNavigationKeyEvent.html 139a5c2b71da79870e7ae28ba3c7245376794e5b1a65817e46f31560ec0775dd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotebook.html 71eb6517f8a8c3a257c39aed833b0ddf56b607a19193ab782677852f30c7bf01 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotificationMessage.html 5570d142f894ce330651dc36951787f6f98f05f97225fbf56690c75804e405f6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotifyEvent.html c5b1deb0162a5283f09b829644055a9faeab935f2a07ed1d793c82dc6922575b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxOverlay.html f025190a717a7fe81b8cb4a2f8bf2c4c475e04f5a3d24641df128793b653598a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialog.html 3d633e09664826d216375225f8da723bcd3b8663ec582e35b6ca2dd127dc08d8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialogData.html 4fa3ef21a7080345196f14d824c3be28c0f9f67e94df4ae53da8a347349150e8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintDC.html dfff853285f295ec9402af79c00283f951953df8b65d5d79886f7fe99c2867c1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintEvent.html 223cfe4bfc785056e39039a9eeba46124a9e4f43abe41aa6ea9347349165ac3d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPalette.html 559b6327a91475589c35f2cf9451802a7e53c0d8746bbec0a06113e876b510e3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaletteChangedEvent.html 844c8db183643a933a4279832972b7456eae615fe23a1c3dc68e2973abd53a68 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPanel.html da13c9bfced7bc5695113d15250eacb0630032d144298b19496f762660bedccd 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPasswordEntryDialog.html 2bcba5e170720841da8dd5df7d1a240e7bfc634d33b474c813e69b67b1334c8f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPen.html 1584b2c61fd91d185601e3e8f9a3f6408e96d34adc42b4bfee7c56b260055ff3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPickerBase.html 6b49b86734def36e14405c4de9b246bd2ea021704008b94e61340699857fcef1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupTransientWindow.html db51901bc808c41aa9d13cf9ce97c7ba722b84125a67b3a981628339ae3868db 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupWindow.html c77009b38589f21b68b73d2c45d279f65d799b6e161179ea5a9fa5f7f4439406 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPostScriptDC.html 49bfa69fbecce18434840dd94b9d91cecd507e6e664261fcdeb5e870803aaf41 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewCanvas.html 8b50cf21dc3658c10097904f6183b130cb3ea7e5d5b1d593f5f67a1051b13a45 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewControlBar.html b7378fc5394ee8fb01d49df2d42876e4c572b941456f5e226d77e8c9d93f0486 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewFrame.html abcb932fd2bec74fccca7cc5ddfaa6f1d9f92a8493acbde8c82c1a5f59185ee4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintData.html 6d92c9fdd9b720a2c710c38f2480daa21aefe0200178adf0df220d31a52e8ba5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialog.html b24726752b534687eb8c329de44840a318a25fc60361a7185f62ec736ba89f6d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialogData.html eeb118be8ed467592304c15565e62b1c31d329ec3891c203630413bd67bb273c 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintPreview.html 74bc1749bfe259b4f289d3d828eb07b4622e22480050cdbe3467627400b2bb97 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrinter.html 0dfb664dc8ef136f8bd90a8fa70ca3630b70cfa337f3246b187a16bea67800a6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintout.html 2a4f2883deb3a61d8db19cc86835fac56ac6bc6f7116f55282c2a2d2da6b1526 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxProgressDialog.html d3f041ecbfd83328e8763d4a9d0e39b7a804e725ad1073cba65dd80ae81e11ff 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxQueryNewPaletteEvent.html 33e1712cfc5381e140230172238db7c14f78b38bdd8fab64b179d51bf649554f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioBox.html a993c09ba874149726d648557dd30084fe5cce8037da618a0642e86d33e14d3d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioButton.html 298206f6a84360e23e28ab47eeabe7bea2fcd2cc968b22962aa27e63403e8827 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRegion.html b47c688c99c4992ff3e5c682922e7aec10a12b137404f0e665534a00e1da167b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashEvent.html 6e1961c074598d1ce81b7d0a4cf3d67755686cd3c983b79d57b06ab083c31818 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashLayoutWindow.html 49ef605fb565b0a2bd2a7507ec92bc4da536022bfba96101b707ef462858590d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashWindow.html 73b52d96c307c1c7b92cb7a829fc16469a6eb9ef39176d4f1f743efe72080c1d 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScreenDC.html 36703d05792eba87834adfbf57fba1c62b7e1fc65a4079733853db6d6c5ebf7e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollBar.html 053ccc40a00168cd8108790336461f18cc41ec76dc533619b740ebfef53869ab 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollEvent.html 153443cab71106a07ec3d2fe7512ce375f1d9538a3c06e90f28591f928d789b7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollWinEvent.html a0e5a8bb165b8940f433468fe166933ce8fd573e127551c66adfbafcab14454a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrolledWindow.html 1b584c099b7eb4afb71f887e38da20a3091b782aad0fd57e385a080ed705629a 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSetCursorEvent.html 0955c82e43ea4d0e3fe8b29bb2da312471b79d290d642ec5b1fdebb2e5c4cc6e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxShowEvent.html 34a619c3b20f8159e0b21e42dc1890478b401882f6e5f428067d6a3356df70f3 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSingleChoiceDialog.html be969fb41149e746d6716a13f4906d9c05c194a00423e65c293752d45c86f2a2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizeEvent.html a4ef0a19b0894cd3a0bb40cbb03b2f02a51d004b182537e053baabc6bfaa4d93 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizer.html fb542652321e266fab2d193795697afb4411889ddd89184cdbd89e8078d59f93 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerFlags.html 5f0936e6b47d210628d10fb03ecd20a0a88ce7828de1abf621d73603a6abc1e1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerItem.html 771b7a3024b4297b74439a8f9e3232feedeab6d3337e9df7367cfca38b6e0805 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSlider.html 85b11a2099498309198df171eb9aeb7b8db6e35406f320c9794e3fb2d1479f00 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinButton.html f270a9d43d8110c20e1bdc3b05e606eba119db7a3112589df89c1b6d09f74f6b 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinCtrl.html 8772189a9faac404991defade398eb0045b71ee08601b3ef3b5705602c06af4f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinEvent.html 3f7ed0ed389ac4c52a346f598e48394c8019ebc9c69c674aa8faed80eb22e6c5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplashScreen.html ffa66e4466b82cf3c5890ca46d18b7bc96d0e6b24205f841b8470d416bb773ce 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterEvent.html 394e5dcd328fd68135e7d78b239b914bcb5f47ce00c1ec2d7ee372eefb029c43 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterWindow.html b430188ba500aa42b30e1e1bded59246c47c62978a8c36547ce87ac8290b17bb 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBitmap.html a77a7f2dd4b1ad713a9a3e52b46d0aa97bffde002ce9f1e9d743dca849e6fad6 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBox.html 017c17dfd0896e20c536fb7dd52187e0db270e15c7c55d4a224324cab32a8a41 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBoxSizer.html 700f3981ecd64247e7ac7dad1fd4d01f5187f91ae122b8710e49551d5c5674e7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticLine.html 3095c63371d7adb0c1d0359c587e3979d1f5a4ce5e1afafc5de95361fde1811e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticText.html a479bac4342ff6032e1149dbabc837c652660dd8c493c4ee2d6936bd31e7fb27 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStatusBar.html f0a2fc4a2ba8d6e166ae1f819e11b55e3ab87a7dcc3c2ef81f444aead4d934cc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStdDialogButtonSizer.html 3302c9b20e43491405d3fb23bae913177be13e40ab65bf133a12f7ff75d3ed33 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextCtrl.html a2f22740f9432b60be9ed394066f70c5046327a732cc7ba5c43ce9316b235cd1 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextEvent.html 41ec762ead654170f8307dbfd128c30453cb74bd9d73aec08d7272fd87f7afa2 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSysColourChangedEvent.html 4dbc1514ad52491b52b52db0a24a9af73c66d7746feb648fd0ca21029c29a4af 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemOptions.html 5eb6a15247a7aba36b083341cc0ed699aa6b12e1eeac13d372f12611b60b5c94 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemSettings.html a5e32a2a4e9a395abd4f5a31c5e8dd264c4245e802a8b323b6faa17fa66781c4 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIcon.html 22555802c9cb1f16b89797b58f00030b63b7650d4a03f03009390274ed4db90e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIconEvent.html 5148e61813f52c738386c4d160967f729190323d8430451d3e7fa7d4bbb8d26f 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextAttr.html 7078ca8e78096e99206050310b80bb094df1c1b737d2928230021bcaed0408fc 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextCtrl.html 1f76a3dbcc8b0ace49ac0a79054edbc675800f326f41ea3774f86452623fb0c9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextDataObject.html 62fed0645e11731850ca6c0efa09765f27ca64889c5c5137b28e2a192da3b616 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextEntryDialog.html 3dad0af7be496b989f089a9f4616ab0e8ed9de62ca1c1e1ac1572572462723e5 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToggleButton.html 31a6c30164ac4afde5e4f7bd645b0708af9993bb99a46f4a4e472acaf4604c38 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolBar.html b05a45f3e9f1ca4caf4a626fda876716ac38535ba196fb751909950da2d57cd9 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolTip.html e2ff4984f03bfc83990bee904209a683b8207bc5483f0378513f034670bfea35 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolbook.html ae55213b0667a5cba5ad74a46671689481563c003fee9dd545d3aed681ab4c82 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTopLevelWindow.html 3fe28da9d38606288109a16ecc4fade808f61dbd92426b1bd773137739c7f411 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeCtrl.html 2f412363b3c7e9694a64c6c2f816935a61650f0f3a7dd0f43efeb84acfc1319e 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeEvent.html 06abc6b3b60c75d59726eeecf84841415acfa352bc6d7e66b8291479a74cfc41 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreebook.html 699894c2bd6ea05a4cdef284be830212c7d1a5f5474b1b4d1ad3c1eab3c994db 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxUpdateUIEvent.html 4884e6c14d797d64f536004ff50df0884864dc9191937e019ac739aefe1dbaf7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebView.html 38f5852e5b9289fc4bf53e3cc59cf5acc4dba6487112ac3134dc3c08ffacd104 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebViewEvent.html b4555d3ef5b02948ee179d054ec66fbfde14ad3a329bef275a98fbdfd94b9657 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindow.html acc2e143ffcea7183f7c350bf2a5ea524d1c7fbcde82c62fa137658ee4765189 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowCreateEvent.html aa2aefd9b31604545dabc784a9bae7a0852497c217ed51f1078454d00d9b55b8 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDC.html 8269f122ef131596e04e03c7e71fe21e2f3cac3263061716dbdc66043b34f906 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDestroyEvent.html 07878c8d396ef5eb6c4b39ed24546b52f6920933e9b9762040d37b93bbd44bb0 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxXmlResource.html 12903865f06fe7af5232b4b4281e7213aee3db1d1726be9e83822436885cfd35 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_misc.html 4a24b5577fc7942ccf2a3a671d604be68d52812b06959907e920f847c8374cc7 2 +/usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_object.html 566385513be87448e3f6ce7a6e01464500427412ede146ea4291a1759a93c54c 2 @@ -3837,2 +3837,2 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/404.html ffeb2f4bda2a061c81203008f4b1662b35680e14b48a805c3e772df786646dbe 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/api-reference.html d94b89aff6de45ab05180522fc09c489300e5dac0e9ed2257a96657e5eee90dd 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/404.html ccbbeecfe51a509c501282be3cc80c4b4e5f0e18752abedb17c6b769016cd69d 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/api-reference.html 4af3e39c14f6882f7dc97a8b276f2c181a5aca3b212366f6af34db7221a736b1 2 @@ -3863,12 +3863,12 @@ -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/notes.html 5e1c7fcd853e7caeb747ac39d1caf51fb2495628401cf7c91b2b2d5db41d5643 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/search.html 1d931e41556fa1bee11ecb823bada50f4fa04556baa48ed01e1bb93008935ca2 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl.html a9eec7d221c08ae6c16b726105168596b1489189c1d7971951565c94c7db18bc 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_eventp.html d9694bf8af5421ecdf7ae38cc992a752a340f8ad505d52a050263629fcdbd0cf 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_examples.html 70a2aab59a929f3cb4cfbd406aacc277f989dd80809c5b92b6116f94d303ae9e 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_sax_parser.html f52725bdc4a32bd6718d4279418049f8d60fa08c562860be7d350e49daec9982 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_scan.html 8219af2d3e3e94188ec3bed3b55dc2e7975b80a60345d7ed4fb67f6589a5ae9c 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_ug.html c6fbd803f03d6f210e5f95f6cb7eda7faca83e95a50a34c13a4b6015de6f9ce0 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xpath.html 40bbf06610ecf3a5d7c098943a21fa02812a76bc502937c8acbaa9c5f4995dbd 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs.html 194a253ca2f1ff6e39370a205248530c4bcc62c01017684c419186f8c1f95693 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs_examples.html 166278777a0115e5524015b9d122215b6356707961e22842a2244879a75b37e9 2 -/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xsd.html fa07718fdc71c49b774711d04370c0384563253f1e71163524975dcd119d6ddc 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/notes.html d25423a56b2f31dbacc88b7550cab66157d0c7c5aec83bd9c78bc8e974041922 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/search.html 374b2ba65d1334960d4ce571f7b0b6c26a13a253ad3ce9f98ca174c7b93fa55f 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl.html 1c2bdc180632d041f15b924deb4405ee343f2ecb8d56311ea6e68d525699d4fc 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_eventp.html 77c18f3fddd7f215c428d95cfaabf7d21e18a6a9531cb5f175f99e05f2a2de21 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_examples.html 0c6f95e175c7989ac5bb0b90173e81fb49df28e176972aa3dbacd026b98db42b 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_sax_parser.html 4c7c70817494a433dc17ad43c341ca11538272c238aa7c620b0c53ae39c5b32a 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_scan.html 6ee30b574531fe64dc4a7e230159a55b54156bf30b5c158780d7396cb80e5aaf 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_ug.html 537986499d44beb89bb5d37d91d17aea80974a0f30551c730e30a04e52cd2a1c 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xpath.html 6652ca02aa4c91d0cc30b94e615f5053d5b712acc1d4ea6ca81e87c12a10947d 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs.html 42f49c1fbdd082998157cb6b3610d6cc5cb8d4fd8b3763b80e62372c5b68dd8c 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs_examples.html 362988cce377f11539eaa7d6a50425be6859046a1a5536605d7a24c74f25496b 2 +/usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xsd.html c2a7d1c24ce8c3b4add1eefc9a4fcf491f7b1eacd353ef307b5efe1464f64394 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-7C9EBC10.js 2 (none) 100644 root root 0 4294967295 +/usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-96375997.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/sidebar_items-0FCC6507.js 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 2 (none) 100644 root root 0 4294967295 /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 2 (none) 100644 root root 0 4294967295 comparing file checksum creating rename script RPM meta information is different Extracting packages /usr/share/doc/packages/erlang-doc/doc/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/404.html 2026-03-12 21:36:44.610211717 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/404.html 2026-03-12 21:36:44.614211740 +0000 @@ -104,7 +104,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/deprecations.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/deprecations.html 2026-03-12 21:36:44.646211931 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/deprecations.html 2026-03-12 21:36:44.642211907 +0000 @@ -196,7 +196,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/man_index.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/man_index.html 2026-03-12 21:36:44.714212333 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/man_index.html 2026-03-12 21:36:44.718212358 +0000 @@ -137,7 +137,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/readme.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/readme.html 2026-03-12 21:36:44.750212547 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/readme.html 2026-03-12 21:36:44.750212547 +0000 @@ -128,7 +128,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/removed.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/removed.html 2026-03-12 21:36:44.778212713 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/removed.html 2026-03-12 21:36:44.786212760 +0000 @@ -175,7 +175,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 2026-03-12 21:36:44.810212903 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/scheduled_for_removal.html 2026-03-12 21:36:44.810212903 +0000 @@ -151,7 +151,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/search.html 2026-03-12 21:36:44.834213044 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/search.html 2026-03-12 21:36:44.834213044 +0000 @@ -104,7 +104,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/system/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/doc/system/404.html 2026-03-12 21:36:44.854213163 +0000 +++ new//usr/share/doc/packages/erlang-doc/doc/system/404.html 2026-03-12 21:36:44.854213163 +0000 @@ -108,7 +108,7 @@ Erlang programming language

-

Copyright © 1996-2026 Ericsson AB

+

Copyright © 1996-2042 Ericsson AB

/usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- "old//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml" 2026-03-05 20:52:20.000000000 +0000 +++ "new//usr/share/doc/packages/erlang-doc/doc/system/Erlang System Documentation.epub/OEBPS/applications.xhtml" 2042-04-07 10:10:47.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	2026-03-12 21:36:49.554241016 +0000
    +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlc_cmd.html	2026-03-12 21:36:49.558241039 +0000
    @@ -217,7 +217,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.586241206 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erlsrv_cmd.html 2026-03-12 21:36:49.586241206 +0000 @@ -231,28 +231,28 @@ ** A Console control handler that ignores the log off events, ** and lets the default handler take care of other events. */
    -BOOL WINAPI service_aware_handler(DWORD ctrl){ - if(ctrl == CTRL_LOGOFF_EVENT) +BOOL WINAPI service_aware_handler(DWORD ctrl){ + if(ctrl == CTRL_LOGOFF_EVENT) return TRUE; - if(ctrl == CTRL_SHUTDOWN_EVENT) + if(ctrl == CTRL_SHUTDOWN_EVENT) return TRUE; return FALSE; -} +} -void initialize_handler(void){ - char buffer[2]; +void initialize_handler(void){ + char buffer[2]; /* * We assume we are running as a service if this * environment variable is defined. */ - if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer, - (DWORD) 2)){ + if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer, + (DWORD) 2)){ /* ** Actually set the control handler */ - SetConsoleCtrlHandler(&service_aware_handler, TRUE); - } -}

    Notes

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

    Notes

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

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.614241371 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/erts_alloc.html 2026-03-12 21:36:49.618241396 +0000 @@ -429,7 +429,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.642241538 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/escript_cmd.html 2026-03-12 21:36:49.646241561 +0000 @@ -89,30 +89,30 @@ -

    Run a script written in Erlang.

    Synopsis

    script-name [arg1 arg2...]

    Description

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

    Run a script written in Erlang.

    Synopsis

    script-name [arg1 arg2...]

    Description

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

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

    script-name [arg1 arg2...]

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

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

    For example:

    $ chmod u+x factorial
     $ cat factorial
    #!/usr/bin/env escript
     %% -*- erlang -*-
     %%! -sname factorial -mnesia debug verbose
    -main([String]) ->
    +main([String]) ->
         try
    -        N = list_to_integer(String),
    -        F = fac(N),
    -        io:format("factorial ~w = ~w\n", [N,F])
    +        N = list_to_integer(String),
    +        F = fac(N),
    +        io:format("factorial ~w = ~w\n", [N,F])
         catch
             _:_ ->
    -            usage()
    +            usage()
         end;
    -main(_) ->
    -    usage().
    +main(_) ->
    +    usage().
     
    -usage() ->
    -    io:format("usage: factorial integer\n"),
    -    halt(1).
    +usage() ->
    +    io:format("usage: factorial integer\n"),
    +    halt(1).
     
    -fac(0) -> 1;
    -fac(N) -> N * fac(N-1).
    $ ./factorial 5
    +fac(0) -> 1;
    +fac(N) -> N * fac(N-1).
    $ ./factorial 5
     factorial 5 = 120
     $ ./factorial
     usage: factorial integer
    @@ -125,7 +125,7 @@
     If the directive is present, it must be located on the second line.

    If a comment selecting the encoding exists, it can be located on the second line.

    Note

    The encoding specified by the above mentioned comment applies to the script itself. The encoding of the I/O-server, however, must be set explicitly as -follows:

    io:setopts([{encoding, latin1}])

    The default encoding of the I/O-server for +follows:

    io:setopts([{encoding, latin1}])

    The default encoding of the I/O-server for standard_io is unicode if its supported. (see section Summary of Options) in @@ -144,7 +144,7 @@ script (the pathname is usually, but not always, absolute).

    If the file contains source code (as in the example above), it is processed by the epp preprocessor. This means that you, for example, can use predefined macros (such as ?MODULE) and include directives like the -include_lib -directive. For example, use

    -include_lib("kernel/include/file.hrl").

    to include the record definitions for the records used by function +directive. For example, use

    -include_lib("kernel/include/file.hrl").

    to include the record definitions for the records used by function file:read_link_info/1. You can also select encoding by including an encoding comment here, but if a valid encoding comment exists on the second line, it takes precedence.

    The script is checked for syntactic and semantic correctness before it is run. @@ -152,7 +152,7 @@ script will still be run. If there are errors, they are printed and the script will not be run and its exit status is 127.

    Both the module declaration and the export declaration of the main/1 function are optional.

    By default, the script will be compiled by the Erlang compiler.

    It is possible to force it to be interpreted by including the following line -somewhere in the script file:

    -mode(interpret).

    Execution of interpreted code is slower than compiled code, and some language +somewhere in the script file:

    -mode(interpret).

    Execution of interpreted code is slower than compiled code, and some language constructs will not work, but there is no requirement for the Erlang compiler application to be available.

    Change

    Before Erlang/OTP 27 the script would be interpreted by default.

    Precompiled escripts

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.674241727 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/garbagecollection.html 2026-03-12 21:36:49.678241750 +0000 @@ -89,23 +89,23 @@ -

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

    Overview

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

    Creating Data

    Terms are created on the heap by evaluating expressions. There are two major types of terms: immediate terms which require no heap space (small integers, atoms, pids, port ids etc) and cons or boxed terms (tuple, big num, binaries etc) that do require heap space. Immediate terms do not need any heap space because they are embedded into the containing structure.

    Let's look at an example that returns a tuple with the newly created data.

    data(Foo) ->
    -   Cons = [42|Foo],
    -   Literal = {text, "hello world!"},
    -   {tag, Cons, Literal}.

    In this example we first create a new cons cell with an integer and a tuple with some text. Then a tuple of size three wrapping the other values with an atom tag is created and returned.

    On the heap tuples require a word size for each of its elements as well as for the header. Cons cells always require two words. Adding these things together, we get seven words for the tuples and 26 words for the cons cells. The string "hello world!" is a list of cons cells and thus requires 24 words. The atom tag and the integer 42 do not require any additional heap memory since it is an immediate. Adding all the terms together, the heap space required in this example should be 33 words.

    Compiling this code to beam assembly (erlc -S) shows exactly what is happening.

    ...
    -{test_heap,6,1}.
    -{put_list,{integer,42},{x,0},{x,1}}.
    -{put_tuple,3,{x,0}}.
    -{put,{atom,tag}}.
    -{put,{x,1}}.
    -{put,{literal,{text,"hello world!"}}}.
    -return.

    Looking at the assembler code we can see three things: The heap requirement in this function turns out to be only six words, as seen by the {test_heap,6,1} instruction. All the allocations are combined to a single instruction. The bulk of the data {text, "hello world!"} is a literal. Literals, sometimes referred to as constants, are not allocated in the function since they are a part of the module and allocated at load time.

    If there is not enough space available on the heap to satisfy the test_heap instructions request for memory, then a garbage collection is initiated. It may happen immediately in the test_heap instruction, or it can be delayed until a later time depending on what state the process is in. If the garbage collection is delayed, any memory needed will be allocated in heap fragments. Heap fragments are extra memory blocks that are a part of the young heap, but are not allocated in the contiguous area where terms normally reside. See The young heap for more details.

    The collector

    Erlang has a copying semi-space garbage collector. This means that when doing a garbage collection, the terms are copied from one distinct area, called the from space, to a new clean area, called the to space. The collector starts by scanning the root-set (stack, registers, etc).

    Garbage collection: initial values

    It follows all the pointers from the root-set to the heap and copies each term word by word to the to space.

    After the header word has been copied a move marker is destructively placed in it pointing to the term in the to space. Any other term that points to the already moved term will see this move marker and copy the referring pointer instead. For example, if the have the following Erlang code:

    foo(Arg) ->
    -    T = {test, Arg},
    -    {wrapper, T, T, T}.

    Only one copy of T exists on the heap and during the garbage collection only the first time T is encountered will it be copied.

    Garbage collection: root set scan

    After all terms referenced by the root-set have been copied, the collector scans the to space and copies all terms that these terms reference. When scanning, the collector steps through each term on the to space and any term still referencing the from space is copied over to the to space. Some terms contain non-term data (the payload of a on heap binary for instance). When encountered by the collector, these values are simply skipped.

    Garbage collection: heap scan

    Every term object we can reach is copied to the to space and stored on top of the scan stop line, and then the scan stop is moved to the end of the last object.

    Garbage collection: heap scan

    When scan stop marker catches up to the scan start marker, the garbage collection is done. At this point we can deallocate the entire from space and therefore reclaim the entire young heap.

    Generational Garbage Collection

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

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

    Garbage collection: heap scan

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

    Garbage collection: heap scan

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

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

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

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

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

    The young heap

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

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

    Sizing the heap

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

    There are two occasions when the young heap grows:

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

    There are two occasions when the young heap is shrunk:

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

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

    Literals

    When garbage collecting a heap (young or old) all literals are left in place and not copied. To figure out if a term should be copied or not when doing a garbage collection the following pseudo code is used:

    if (erts_is_literal(ptr) || (on_old_heap(ptr) && !fullsweep)) {
    +

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

    Overview

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

    Creating Data

    Terms are created on the heap by evaluating expressions. There are two major types of terms: immediate terms which require no heap space (small integers, atoms, pids, port ids etc) and cons or boxed terms (tuple, big num, binaries etc) that do require heap space. Immediate terms do not need any heap space because they are embedded into the containing structure.

    Let's look at an example that returns a tuple with the newly created data.

    data(Foo) ->
    +   Cons = [42|Foo],
    +   Literal = {text, "hello world!"},
    +   {tag, Cons, Literal}.

    In this example we first create a new cons cell with an integer and a tuple with some text. Then a tuple of size three wrapping the other values with an atom tag is created and returned.

    On the heap tuples require a word size for each of its elements as well as for the header. Cons cells always require two words. Adding these things together, we get seven words for the tuples and 26 words for the cons cells. The string "hello world!" is a list of cons cells and thus requires 24 words. The atom tag and the integer 42 do not require any additional heap memory since it is an immediate. Adding all the terms together, the heap space required in this example should be 33 words.

    Compiling this code to beam assembly (erlc -S) shows exactly what is happening.

    ...
    +{test_heap,6,1}.
    +{put_list,{integer,42},{x,0},{x,1}}.
    +{put_tuple,3,{x,0}}.
    +{put,{atom,tag}}.
    +{put,{x,1}}.
    +{put,{literal,{text,"hello world!"}}}.
    +return.

    Looking at the assembler code we can see three things: The heap requirement in this function turns out to be only six words, as seen by the {test_heap,6,1} instruction. All the allocations are combined to a single instruction. The bulk of the data {text, "hello world!"} is a literal. Literals, sometimes referred to as constants, are not allocated in the function since they are a part of the module and allocated at load time.

    If there is not enough space available on the heap to satisfy the test_heap instructions request for memory, then a garbage collection is initiated. It may happen immediately in the test_heap instruction, or it can be delayed until a later time depending on what state the process is in. If the garbage collection is delayed, any memory needed will be allocated in heap fragments. Heap fragments are extra memory blocks that are a part of the young heap, but are not allocated in the contiguous area where terms normally reside. See The young heap for more details.

    The collector

    Erlang has a copying semi-space garbage collector. This means that when doing a garbage collection, the terms are copied from one distinct area, called the from space, to a new clean area, called the to space. The collector starts by scanning the root-set (stack, registers, etc).

    Garbage collection: initial values

    It follows all the pointers from the root-set to the heap and copies each term word by word to the to space.

    After the header word has been copied a move marker is destructively placed in it pointing to the term in the to space. Any other term that points to the already moved term will see this move marker and copy the referring pointer instead. For example, if the have the following Erlang code:

    foo(Arg) ->
    +    T = {test, Arg},
    +    {wrapper, T, T, T}.

    Only one copy of T exists on the heap and during the garbage collection only the first time T is encountered will it be copied.

    Garbage collection: root set scan

    After all terms referenced by the root-set have been copied, the collector scans the to space and copies all terms that these terms reference. When scanning, the collector steps through each term on the to space and any term still referencing the from space is copied over to the to space. Some terms contain non-term data (the payload of a on heap binary for instance). When encountered by the collector, these values are simply skipped.

    Garbage collection: heap scan

    Every term object we can reach is copied to the to space and stored on top of the scan stop line, and then the scan stop is moved to the end of the last object.

    Garbage collection: heap scan

    When scan stop marker catches up to the scan start marker, the garbage collection is done. At this point we can deallocate the entire from space and therefore reclaim the entire young heap.

    Generational Garbage Collection

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

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

    Garbage collection: heap scan

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

    Garbage collection: heap scan

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

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

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

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

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

    The young heap

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

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

    Sizing the heap

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

    There are two occasions when the young heap grows:

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

    There are two occasions when the young heap is shrunk:

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

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

    Literals

    When garbage collecting a heap (young or old) all literals are left in place and not copied. To figure out if a term should be copied or not when doing a garbage collection the following pseudo code is used:

    if (erts_is_literal(ptr) || (on_old_heap(ptr) && !fullsweep)) {
       /* literal or non fullsweep - do not copy */
    -} else {
    -  copy(ptr);
    -}

    The erts_is_literal check works differently on different architectures and operating systems.

    On 64 bit systems that allow mapping of unreserved virtual memory areas (most operating systems except Windows), an area of size 1 GB (by default) is mapped and then all literals are placed within that area. Then all that has to be done to determine if something is a literal or not is two quick pointer checks. This system relies on the fact that a memory page that has not been touched yet does not take any actual space. So even if 1 GB of virtual memory is mapped, only the memory which is actually needed for literals is allocated in ram. The size of the literal area is configurable through the +MIscs erts_alloc option.

    On 32 bit systems, there is not enough virtual memory space to allocate 1 GB for just literals, so instead small 256 KB sized literal regions are created on demand and a card mark bit-array of the entire 32 bit memory space is then used to determine if a term is a literal or not. Since the total memory space is only 32 bits, the card mark bit-array is only 256 words large. On a 64 bit system the same bit-array would have to be 1 tera words large, so this technique is only viable on 32 bit systems. Doing lookups in the array is a little more expensive then just doing the pointer checks that can be done in 64 bit systems, but not extremely so.

    On 64 bit windows, on which erts_alloc cannot do unreserved virtual memory mappings, a special tag within the Erlang term object is used to determine if something is a literal or not. This is very cheap, however, the tag is only available on 64 bit machines, and it is possible to do a great deal of other nice optimizations with this tag in the future (like for instance a more compact list implementation) so it is not used on operating systems where it is not needed.

    This behaviour is different from how it worked prior to Erlang/OTP 19.0. Before 19.0 the literal check was done by checking if the pointer pointed to the young or old heap block. If it did not, then it was considered a literal. This lead to considerable overhead and strange memory usage scenarios, so it was removed in 19.0.

    Binary heap

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

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

    Virtual Binary heap

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

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

    Messages

    Messages can become a part of the process heap at different times. This depends on how the process is configured. +} else { + copy(ptr); +}

    The erts_is_literal check works differently on different architectures and operating systems.

    On 64 bit systems that allow mapping of unreserved virtual memory areas (most operating systems except Windows), an area of size 1 GB (by default) is mapped and then all literals are placed within that area. Then all that has to be done to determine if something is a literal or not is two quick pointer checks. This system relies on the fact that a memory page that has not been touched yet does not take any actual space. So even if 1 GB of virtual memory is mapped, only the memory which is actually needed for literals is allocated in ram. The size of the literal area is configurable through the +MIscs erts_alloc option.

    On 32 bit systems, there is not enough virtual memory space to allocate 1 GB for just literals, so instead small 256 KB sized literal regions are created on demand and a card mark bit-array of the entire 32 bit memory space is then used to determine if a term is a literal or not. Since the total memory space is only 32 bits, the card mark bit-array is only 256 words large. On a 64 bit system the same bit-array would have to be 1 tera words large, so this technique is only viable on 32 bit systems. Doing lookups in the array is a little more expensive then just doing the pointer checks that can be done in 64 bit systems, but not extremely so.

    On 64 bit windows, on which erts_alloc cannot do unreserved virtual memory mappings, a special tag within the Erlang term object is used to determine if something is a literal or not. This is very cheap, however, the tag is only available on 64 bit machines, and it is possible to do a great deal of other nice optimizations with this tag in the future (like for instance a more compact list implementation) so it is not used on operating systems where it is not needed.

    This behaviour is different from how it worked prior to Erlang/OTP 19.0. Before 19.0 the literal check was done by checking if the pointer pointed to the young or old heap block. If it did not, then it was considered a literal. This lead to considerable overhead and strange memory usage scenarios, so it was removed in 19.0.

    Binary heap

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

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

    Virtual Binary heap

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

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

    Messages

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

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

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

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

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

    Message allocating strategies

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.710241941 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/inet_cfg.html 2026-03-12 21:36:49.710241941 +0000 @@ -117,11 +117,11 @@ The user configuration file is always examined last in the configuration process, making it possible for the user to override any default values or previously made settings. Call inet:get_rc() to view the state of the inet -configuration database.

    The valid configuration parameters are as follows:

    • {file, Format, File}.
      -  Format = atom()
      -  File = string()

      Specify a system file that Erlang is to read configuration data from. Format -tells the parser how the file is to be interpreted:

      • resolv (Unix resolv.conf)
      • host_conf_freebsd (FreeBSD host.conf)
      • host_conf_bsdos (BSDOS host.conf)
      • host_conf_linux (Linux host.conf)
      • nsswitch_conf (Unix nsswitch.conf)
      • hosts (Unix hosts)

      File is to specify the filename with full path.

    • {resolv_conf, File}.
      -  File = string()

      Specify a system file that Erlang is to read resolver configuration from for +configuration database.

      The valid configuration parameters are as follows:

      • {file, Format, File}.
        +  Format = atom()
        +  File = string()

        Specify a system file that Erlang is to read configuration data from. Format +tells the parser how the file is to be interpreted:

        • resolv (Unix resolv.conf)
        • host_conf_freebsd (FreeBSD host.conf)
        • host_conf_bsdos (BSDOS host.conf)
        • host_conf_linux (Linux host.conf)
        • nsswitch_conf (Unix nsswitch.conf)
        • hosts (Unix hosts)

        File is to specify the filename with full path.

      • {resolv_conf, File}.
        +  File = string()

        Specify a system file that Erlang is to read resolver configuration from for the internal DNS client inet_res, and monitor for changes, even if it does not exist. The path must be absolute.

        This can override the configuration parameters nameserver and search depending on the contents of the specified file. They can also change any time @@ -129,61 +129,61 @@ in the future. This emulates the old behavior of not configuring the DNS client when the node is started in short name distributed mode.

        If this parameter is not specified, it defaults to /etc/resolv.conf unless environment variable ERL_INET_ETC_DIR is set, which defines the directory -for this file to some maybe other than /etc.

      • {hosts_file, File}.
        -  File = string()

        Specify a system file that Erlang is to read resolver configuration from for +for this file to some maybe other than /etc.

      • {hosts_file, File}.
        +  File = string()

        Specify a system file that Erlang is to read resolver configuration from for the internal hosts file resolver, and monitor for changes, even if it does not exist. The path must be absolute.

        These host entries are searched after all added with {file, hosts, File} above or {host, IP, Aliases} below when lookup option file is used.

        If the file is specified as an empty string "", no file is read or monitored in the future. This emulates the old behavior of not configuring the DNS client when the node is started in short name distributed mode.

        If this parameter is not specified, it defaults to /etc/hosts unless environment variable ERL_INET_ETC_DIR is set, which defines the directory -for this file to some maybe other than /etc.

      • {registry, Type}.
        -  Type = atom()

        Specify a system registry that Erlang is to read configuration data from. -win32 is the only valid option.

      • {host, IP, Aliases}.
        -  IP = tuple()

        Aliases = [string()]

        Add host entry to the hosts table.

      • {domain, Domain}.
        -  Domain = string()

        Set domain name.

      • {nameserver, IP [,Port]}.
        -  IP = tuple()
        -  Port = integer()

        Add address (and port, if other than default) of the primary nameserver to use -for inet_res.

      • {alt_nameserver, IP [,Port]}.
        -  IP = tuple()
        -  Port = integer()

        Add address (and port, if other than default) of the secondary nameserver for -inet_res.

      • {search, Domains}.
        -  Domains = [string()]

        Add search domains for inet_res.

      • {lookup, Methods}.
        -  Methods = [atom()]

        Specify lookup methods and in which order to try them. The valid methods are +for this file to some maybe other than /etc.

      • {registry, Type}.
        +  Type = atom()

        Specify a system registry that Erlang is to read configuration data from. +win32 is the only valid option.

      • {host, IP, Aliases}.
        +  IP = tuple()

        Aliases = [string()]

        Add host entry to the hosts table.

      • {domain, Domain}.
        +  Domain = string()

        Set domain name.

      • {nameserver, IP [,Port]}.
        +  IP = tuple()
        +  Port = integer()

        Add address (and port, if other than default) of the primary nameserver to use +for inet_res.

      • {alt_nameserver, IP [,Port]}.
        +  IP = tuple()
        +  Port = integer()

        Add address (and port, if other than default) of the secondary nameserver for +inet_res.

      • {search, Domains}.
        +  Domains = [string()]

        Add search domains for inet_res.

      • {lookup, Methods}.
        +  Methods = [atom()]

        Specify lookup methods and in which order to try them. The valid methods are as follows:

        • native (use system calls)
        • file (use host data retrieved from system configuration files and/or the user configuration file)
        • dns (use the Erlang DNS client inet_res for nameserver queries)

        The lookup method string tries to parse the hostname as an IPv4 or IPv6 string and return the resulting IP address. It is automatically tried first when native is not in the Methods list. To skip it in this case, the pseudo lookup method nostring can be inserted anywhere in the Methods -list.

      • {cache_size, Size}.
        -  Size = integer()

        Set the resolver cache size for dns lookups. native lookups are not -cached. Defaults to 100 DNS records.

      • {cache_refresh, Time}.
        -  Time = integer()

        Set how often (in milliseconds) the resolver cache for inet_res is -refreshed (that is, expired DNS records are deleted). Defaults to 1 hour.

      • {timeout, Time}.
        -  Time = integer()

        Set the time to wait until retry (in milliseconds) for DNS queries made by -inet_res. Defaults to 2 seconds.

      • {retry, N}.
        -  N = integer()

        Set the number of DNS queries inet_res will try before giving up. Defaults -to 3.

      • {servfail_retry_timeout, Time}.
        -  Time = non_neg_integer()

        After all name servers have been tried, there is a timeout before the name +list.

      • {cache_size, Size}.
        +  Size = integer()

        Set the resolver cache size for dns lookups. native lookups are not +cached. Defaults to 100 DNS records.

      • {cache_refresh, Time}.
        +  Time = integer()

        Set how often (in milliseconds) the resolver cache for inet_res is +refreshed (that is, expired DNS records are deleted). Defaults to 1 hour.

      • {timeout, Time}.
        +  Time = integer()

        Set the time to wait until retry (in milliseconds) for DNS queries made by +inet_res. Defaults to 2 seconds.

      • {retry, N}.
        +  N = integer()

        Set the number of DNS queries inet_res will try before giving up. Defaults +to 3.

      • {servfail_retry_timeout, Time}.
        +  Time = non_neg_integer()

        After all name servers have been tried, there is a timeout before the name servers are tried again. This is to prevent the server from answering the query with what's in the servfail cache, inet_res. Defaults to 1500 milli -seconds .

      • {inet6, Bool}.
        +seconds .

      • {inet6, Bool}.
           Bool = true | false

        Tells the DNS client inet_res to look up IPv6 addresses. Defaults to -false.

      • {usevc, Bool}.
        +false.

      • {usevc, Bool}.
           Bool = true | false

        Tells the DNS client inet_res to use TCP (Virtual Circuit) instead of UDP. -Defaults to false.

      • {edns, Version}.
        +Defaults to false.

      • {edns, Version}.
           Version = false | 0

        Sets the EDNS version that inet_res will use. The only allowed version is -zero. Defaults to false, which means not to use EDNS.

      • {udp_payload_size, Size}.
        -  N = integer()

        Sets the allowed UDP payload size inet_res will advertise in EDNS queries. +zero. Defaults to false, which means not to use EDNS.

      • {udp_payload_size, Size}.
        +  N = integer()

        Sets the allowed UDP payload size inet_res will advertise in EDNS queries. Also sets the limit when the DNS query will be deemed too large for UDP forcing a TCP query instead; this is not entirely correct, as the advertised UDP payload size of the individual nameserver is what is to be used, but this simple strategy will do until a more intelligent (probing, caching) algorithm needs to be implemented. Default to 1280, which stems from the standard -Ethernet MTU size.

      • {udp, Module}.
        -  Module = atom()

        Tell Erlang to use another primitive UDP module than inet_udp.

      • {tcp, Module}.
        -  Module = atom()

        Tell Erlang to use another primitive TCP module than inet_tcp.

      • clear_hosts.

        Clear the hosts table.

      • clear_ns.

        Clear the list of recorded nameservers (primary and secondary).

      • clear_search.

        Clear the list of search domains.

      User Configuration Example

      Assume that a user does not want Erlang to use the native lookup method, but +Ethernet MTU size.

    • {udp, Module}.
      +  Module = atom()

      Tell Erlang to use another primitive UDP module than inet_udp.

    • {tcp, Module}.
      +  Module = atom()

      Tell Erlang to use another primitive TCP module than inet_tcp.

    • clear_hosts.

      Clear the hosts table.

    • clear_ns.

      Clear the list of recorded nameservers (primary and secondary).

    • clear_search.

      Clear the list of search domains.

    User Configuration Example

    Assume that a user does not want Erlang to use the native lookup method, but wants Erlang to read all information necessary from start and use that for resolving names and addresses. If lookup fails, Erlang is to request the data from a nameserver (using the Erlang DNS client, set to use EDNS allowing larger @@ -192,19 +192,19 @@ (in this example named erl_inetrc, stored in directory ./cfg_files) can then look as follows (Unix):

    %% -- ERLANG INET CONFIGURATION FILE --
     %% read the hosts file
    -{file, hosts, "/etc/hosts"}.
    +{file, hosts, "/etc/hosts"}.
     %% add a particular host
    -{host, {134,138,177,105}, ["finwe"]}.
    +{host, {134,138,177,105}, ["finwe"]}.
     %% do not monitor the hosts file
    -{hosts_file, ""}.
    +{hosts_file, ""}.
     %% read and monitor nameserver config from here
    -{resolv_conf, "/usr/local/etc/resolv.conf"}.
    +{resolv_conf, "/usr/local/etc/resolv.conf"}.
     %% enable EDNS
    -{edns,0}.
    +{edns,0}.
     %% disable caching
    -{cache_size, 0}.
    +{cache_size, 0}.
     %% specify lookup method
    -{lookup, [file, dns]}.

    And Erlang can, for example, be started as follows:

    % erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'
    +{lookup, [file, dns]}.

    And Erlang can, for example, be started as follows:

    % erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'
    @@ -252,7 +252,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.742242130 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/init.html 2026-03-12 21:36:49.746242153 +0000 @@ -120,8 +120,8 @@ initialization process.

  • -extra - Everything following -extra is considered plain arguments and can be retrieved using get_plain_arguments/0.

    Example:

    % erl -extra +A 1 --
     ...
    -1> init:get_plain_arguments().
    -["+A","1","--"]

    The -extra flag can be passed on the command line, through ERL_*FLAGS or +1> init:get_plain_arguments(). +["+A","1","--"]

  • The -extra flag can be passed on the command line, through ERL_*FLAGS or -args_file. It only effects the remaining command-line flags in the entity in which it is passed. If multiple -extra flags are passed they are concatenated using the same order rules as ERL_*FLAGS or -args_file in @@ -169,13 +169,13 @@ atoms.

    Example

    % erl -- a b -children thomas claire -ages 7 3 -- x y
     ...
     
    -1> init:get_plain_arguments().
    -["a","b","x","y"]
    -2> init:get_argument(children).
    -{ok,[["thomas","claire"]]}
    -3> init:get_argument(ages).
    -{ok, [["7","3"]]}
    -4> init:get_argument(silly).
    +1> init:get_plain_arguments().
    +["a","b","x","y"]
    +2> init:get_argument(children).
    +{ok,[["thomas","claire"]]}
    +3> init:get_argument(ages).
    +{ok, [["7","3"]]}
    +4> init:get_argument(silly).
     error

    See Also

    erl_prim_loader, heart

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

    Returns all values associated with the command-line user flag Flag.

    If Flag is provided several times, each Values is returned in preserved order. Example:

    % erl -a b c -a d
     ...
    -1> init:get_argument(a).
    -{ok,[["b","c"],["d"]]}

    The following flags are defined automatically and can be retrieved using this +1> init:get_argument(a). +{ok,[["b","c"],["d"]]}

    The following flags are defined automatically and can be retrieved using this function:

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

      2> init:get_argument(root).
      -{ok,[["/usr/local/otp/releases/otp_beam_solaris8_r10b_patched"]]}
    • progname - The name of the program which started Erlang:

      3> init:get_argument(progname).
      -{ok,[["erl"]]}
    • home - The home directory (on Unix, the value of $HOME):

      4> init:get_argument(home).
      -{ok,[["/home/harry"]]}

    Returns error if no value is associated with Flag.

    +{ok,[["/usr/local/otp/releases/otp_beam_solaris8_r10b_patched"]]}
  • progname - The name of the program which started Erlang:

    3> init:get_argument(progname).
    +{ok,[["erl"]]}
  • home - The home directory (on Unix, the value of $HOME):

    4> init:get_argument(home).
    +{ok,[["/home/harry"]]}
  • Returns error if no value is associated with Flag.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.778242343 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/introduction.html 2026-03-12 21:36:49.778242343 +0000 @@ -138,7 +138,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.802242486 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/match_spec.html 2026-03-12 21:36:49.802242486 +0000 @@ -281,64 +281,64 @@ matches or does not. The effect when the expression matches is a trace message rather than a returned term. The ActionTerms are executed as in an imperative language, that is, for their side effects. Functions with side effects are also -allowed when tracing.

    Tracing Examples

    Match an argument list of three, where the first and third arguments are equal:

    [{['$1', '_', '$1'],
    -  [],
    -  []}]

    Match an argument list of three, where the second argument is a number > 3:

    [{['_', '$1', '_'],
    -  [{ '>', '$1', 3}],
    -  []}]

    Match an argument list of three, where the third argument is either a tuple +allowed when tracing.

    Tracing Examples

    Match an argument list of three, where the first and third arguments are equal:

    [{['$1', '_', '$1'],
    +  [],
    +  []}]

    Match an argument list of three, where the second argument is a number > 3:

    [{['_', '$1', '_'],
    +  [{ '>', '$1', 3}],
    +  []}]

    Match an argument list of three, where the third argument is either a tuple containing argument one and two, or a list beginning with argument one and two -(that is, [a,b,[a,b,c]] or [a,b,{a,b}]):

    [{['$1', '$2', '$3'],
    -  [{'orelse',
    -      {'=:=', '$3', {{'$1','$2'}}},
    -      {'and',
    -        {'=:=', '$1', {hd, '$3'}},
    -        {'=:=', '$2', {hd, {tl, '$3'}}}}}],
    -  []}]

    The above problem can also be solved as follows:

    [{['$1', '$2', {'$1', '$2}], [], []},
    - {['$1', '$2', ['$1', '$2' | '_']], [], []}]

    Match two arguments, where the first is a tuple beginning with a list that in +(that is, [a,b,[a,b,c]] or [a,b,{a,b}]):

    [{['$1', '$2', '$3'],
    +  [{'orelse',
    +      {'=:=', '$3', {{'$1','$2'}}},
    +      {'and',
    +        {'=:=', '$1', {hd, '$3'}},
    +        {'=:=', '$2', {hd, {tl, '$3'}}}}}],
    +  []}]

    The above problem can also be solved as follows:

    [{['$1', '$2', {'$1', '$2}], [], []},
    + {['$1', '$2', ['$1', '$2' | '_']], [], []}]

    Match two arguments, where the first is a tuple beginning with a list that in turn begins with the second argument times two (that is, [{[4,x],y},2] or -[{[8], y, z},4]):

    [{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
    -  []}]

    Match three arguments. When all three are equal and are numbers, append the +[{[8], y, z},4]):

    [{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
    +  []}]

    Match three arguments. When all three are equal and are numbers, append the process dump to the trace message, otherwise let the trace message be "as is", -but set the sequential trace token label to 4711:

    [{['$1', '$1', '$1'],
    -  [{is_number, '$1'}],
    -  [{message, {process_dump}}]},
    - {'_', [], [{set_seq_token, label, 4711}]}]

    As can be noted above, the parameter list can be matched against a single +but set the sequential trace token label to 4711:

    [{['$1', '$1', '$1'],
    +  [{is_number, '$1'}],
    +  [{message, {process_dump}}]},
    + {'_', [], [{set_seq_token, label, 4711}]}]

    As can be noted above, the parameter list can be matched against a single MatchVariable or an '_'. To replace the whole parameter list with a single variable is a special case. In all other cases the MatchHead must be a -proper list.

    Generate a trace message only if the trace control word is set to 1:

    [{'_',
    -  [{'==',{get_tcw},{const, 1}}],
    -  []}]

    Generate a trace message only if there is a seq_trace token:

    [{'_',
    -  [{'==',{is_seq_trace},{const, 1}}],
    -  []}]

    Remove the 'silent' trace flag when the first argument is 'verbose', and add -it when it is 'silent':

    [{'$1',
    -  [{'==',{hd, '$1'},verbose}],
    -  [{trace, [silent],[]}]},
    - {'$1',
    -  [{'==',{hd, '$1'},silent}],
    -  [{trace, [],[silent]}]}]

    Add a return_trace message if the function is of arity 3:

    [{'$1',
    -  [{'==',{length, '$1'},3}],
    -  [{return_trace}]},
    - {'_',[],[]}]

    Generate a trace message only if the function is of arity 3 and the first -argument is 'trace':

    [{['trace','$2','$3'],
    -  [],
    -  []},
    - {'_',[],[]}]

    ETS Examples

    Match all objects in an ETS table, where the first element is the atom -'strider' and the tuple arity is 3, and return the whole object:

    [{{strider,'_','_'},
    -  [],
    -  ['$_']}]

    Match all objects in an ETS table with arity > 1 and the first element is -'gandalf', and return element 2:

    [{'$1',
    -  [{'==', gandalf, {element, 1, '$1'}},{'>=',{size, '$1'},2}],
    -  [{element,2,'$1'}]}]

    In this example, if the first element had been the key, it is much more +proper list.

    Generate a trace message only if the trace control word is set to 1:

    [{'_',
    +  [{'==',{get_tcw},{const, 1}}],
    +  []}]

    Generate a trace message only if there is a seq_trace token:

    [{'_',
    +  [{'==',{is_seq_trace},{const, 1}}],
    +  []}]

    Remove the 'silent' trace flag when the first argument is 'verbose', and add +it when it is 'silent':

    [{'$1',
    +  [{'==',{hd, '$1'},verbose}],
    +  [{trace, [silent],[]}]},
    + {'$1',
    +  [{'==',{hd, '$1'},silent}],
    +  [{trace, [],[silent]}]}]

    Add a return_trace message if the function is of arity 3:

    [{'$1',
    +  [{'==',{length, '$1'},3}],
    +  [{return_trace}]},
    + {'_',[],[]}]

    Generate a trace message only if the function is of arity 3 and the first +argument is 'trace':

    [{['trace','$2','$3'],
    +  [],
    +  []},
    + {'_',[],[]}]

    ETS Examples

    Match all objects in an ETS table, where the first element is the atom +'strider' and the tuple arity is 3, and return the whole object:

    [{{strider,'_','_'},
    +  [],
    +  ['$_']}]

    Match all objects in an ETS table with arity > 1 and the first element is +'gandalf', and return element 2:

    [{'$1',
    +  [{'==', gandalf, {element, 1, '$1'}},{'>=',{size, '$1'},2}],
    +  [{element,2,'$1'}]}]

    In this example, if the first element had been the key, it is much more efficient to match that key in the MatchHead part than in the MatchConditions part. The search space of the tables is restricted with regards to the MatchHead so that only objects with the matching key are searched.

    Match tuples of three elements, where the second element is either 'merry' or -'pippin', and return the whole objects:

    [{{'_',merry,'_'},
    -  [],
    -  ['$_']},
    - {{'_',pippin,'_'},
    -  [],
    -  ['$_']}]

    Function ets:test_ms/2 can be useful for testing complicated ETS matches.

    +'pippin', and return the whole objects:

    [{{'_',merry,'_'},
    +  [],
    +  ['$_']},
    + {{'_',pippin,'_'},
    +  [],
    +  ['$_']}]

    Function ets:test_ms/2 can be useful for testing complicated ETS matches.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:49.950243363 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/notes.html 2026-03-12 21:36:49.958243410 +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-2026 Ericsson AB

            +

            Copyright © 1996-2042 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 2026-03-12 21:36:50.014243742 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/persistent_term.html 2026-03-12 21:36:50.014243742 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:36:50.034243861 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/portsignals.html 2026-03-12 21:36:50.038243884 +0000 @@ -326,7 +326,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.062244026 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/processmanagementoptimizations.html 2026-03-12 21:36:50.066244051 +0000 @@ -253,7 +253,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.090244193 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/ptables.html 2026-03-12 21:36:50.094244216 +0000 @@ -383,7 +383,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.118244359 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/run_erl_cmd.html 2026-03-12 21:36:50.122244382 +0000 @@ -192,7 +192,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.146244524 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/search.html 2026-03-12 21:36:50.146244524 +0000 @@ -104,7 +104,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.166244643 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_cmd.html 2026-03-12 21:36:50.170244666 +0000 @@ -141,7 +141,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.194244808 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/start_erl_cmd.html 2026-03-12 21:36:50.198244833 +0000 @@ -181,7 +181,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.218244951 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/supercarrier.html 2026-03-12 21:36:50.222244975 +0000 @@ -163,12 +163,12 @@ and free entire pages and we don't want to waste an entire page just to hold the block header of the following pages.

    Instead we store the meta information about all the free segments in a dedicated area apart from the sa and sua areas. Every free segment is -represented by a descriptor struct (ErtsFreeSegDesc).

    typedef struct {
    +represented by a descriptor struct (ErtsFreeSegDesc).

    typedef struct {
         RBTNode snode;      /* node in 'stree' */
         RBTNode anode;      /* node in 'atree' */
         char* start;
         char* end;
    -}ErtsFreeSegDesc;

    To find the smallest free segment that will satisfy a carrier allocation +}ErtsFreeSegDesc;

    To find the smallest free segment that will satisfy a carrier allocation (best fit), the free segments are organized in a tree sorted by size (stree). We search in this tree at allocation. If no free segment of sufficient size was found, the area (sa or sua) is instead expanded. @@ -244,7 +244,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.246245116 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/threadprogress.html 2026-03-12 21:36:50.250245141 +0000 @@ -337,7 +337,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.278245306 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/time_correction.html 2026-03-12 21:36:50.282245331 +0000 @@ -366,9 +366,9 @@ the event occurs.

    Do

    Determine the order of events by saving a tuple containing monotonic time and a strictly monotonically increasing integer as -follows:

    Time = erlang:monotonic_time(),
    -UMI = erlang:unique_integer([monotonic]),
    -EventTag = {Time, UMI}

    These tuples are strictly monotonically ordered on the current runtime system +follows:

    Time = erlang:monotonic_time(),
    +UMI = erlang:unique_integer([monotonic]),
    +EventTag = {Time, UMI}

    These tuples are strictly monotonically ordered on the current runtime system instance according to creation time. It is important that the monotonic time is in the first element (the most significant element when comparing two-tuples). Using the monotonic time in the tuples, you can calculate time @@ -442,7 +442,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.306245473 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tracing.html 2026-03-12 21:36:50.310245496 +0000 @@ -101,23 +101,23 @@ to inspecting the stack we can only say where we're going to return to, which is not quite the same thing.

    As an illustration, when the caller option is enabled all trace messages from bar/1 will say that they were called from foo/0, even though it -went through a bunch of other functions on the way:

    foo() ->
    -    lots(),
    +went through a bunch of other functions on the way:

    foo() ->
    +    lots(),
         ok.
     
    -lots() ->
    -    'of'().
    +lots() ->
    +    'of'().
     
    -'of'() ->
    -    indirections().
    +'of'() ->
    +    indirections().
     
    -indirections() ->
    -    bar(10).
    +indirections() ->
    +    bar(10).
     
    -bar(0) ->
    +bar(0) ->
         done;
    -bar(N) ->
    -    bar(N - 1).

    Export tracing

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

    Export tracing

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.334245638 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/tty.html 2026-03-12 21:36:50.338245663 +0000 @@ -148,7 +148,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.362245805 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/werl_cmd.html 2026-03-12 21:36:50.366245828 +0000 @@ -159,7 +159,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/erts-16.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 2026-03-12 21:36:50.402246042 +0000 +++ new//usr/share/doc/packages/erlang-doc/erts-16.1.1/doc/html/zlib.html 2026-03-12 21:36:50.406246065 +0000 @@ -98,18 +98,18 @@ data. The data format is described by RFC 1950, RFC 1951, and -RFC 1952.

    A typical (compress) usage is as follows:

    Z = zlib:open(),
    -ok = zlib:deflateInit(Z,default),
    +RFC 1952.

    A typical (compress) usage is as follows:

    Z = zlib:open(),
    +ok = zlib:deflateInit(Z,default),
     
    -Compress = fun F(end_of_data) ->
    -                 zlib:deflate(Z, [], finish);
    -               F(Data) ->
    -                 [zlib:deflate(Z, Data)|F(Read())]
    +Compress = fun F(end_of_data) ->
    +                 zlib:deflate(Z, [], finish);
    +               F(Data) ->
    +                 [zlib:deflate(Z, Data)|F(Read())]
                end,
    -Compressed = Compress(Read()),
    -ok = zlib:deflateEnd(Z),
    -zlib:close(Z),
    -list_to_binary(Compressed)

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

    In all functions errors, {'EXIT',{Reason,Backtrace}}, can be thrown, where Reason describes the error.

    Typical Reasons:

    • badarg - Bad argument.

    • not_initialized - The stream hasn't been initialized, eg. if inflateInit/1 wasn't called prior to a call to inflate/2.

    • not_on_controlling_process - The stream was used by a process that doesn't control it. Use set_controlling_process/2 if you need to transfer a @@ -818,11 +818,11 @@ full too often can seriously degrade the compression.

      If Flush is set to finish, pending input is processed, pending output is flushed, and deflate/3 returns. Afterwards the only possible operations on the stream are deflateReset/1 or deflateEnd/1.

      Flush can be set to finish immediately after -deflateInit if all compression is to be done in one step.

      Example:

      zlib:deflateInit(Z),
      -B1 = zlib:deflate(Z,Data),
      -B2 = zlib:deflate(Z,<< >>,finish),
      -zlib:deflateEnd(Z),
      -list_to_binary([B1,B2])
      +deflateInit if all compression is to be done in one step.

      Example:

      zlib:deflateInit(Z),
      +B1 = zlib:deflate(Z,Data),
      +B2 = zlib:deflate(Z,<< >>,finish),
      +zlib:deflateEnd(Z),
      +list_to_binary([B1,B2])
    @@ -1374,20 +1374,20 @@ {'EXIT',{{need_dictionary,Adler},_StackTrace}} exception.

    The dictionary chosen by the compressor can be determined from the Adler value returned or thrown by the call to the inflate function. The compressor and decompressor must use the same dictionary (See deflateSetDictionary/2).

    After setting the dictionary the inflate operation should be retried without new -input.

    Example:

    deprecated_unpack(Z, Compressed, Dict) ->
    -     case catch zlib:inflate(Z, Compressed) of
    -          {'EXIT',{{need_dictionary,_DictID},_}} ->
    -                 ok = zlib:inflateSetDictionary(Z, Dict),
    -                 Uncompressed = zlib:inflate(Z, []);
    +input.

    Example:

    deprecated_unpack(Z, Compressed, Dict) ->
    +     case catch zlib:inflate(Z, Compressed) of
    +          {'EXIT',{{need_dictionary,_DictID},_}} ->
    +                 ok = zlib:inflateSetDictionary(Z, Dict),
    +                 Uncompressed = zlib:inflate(Z, []);
               Uncompressed ->
                      Uncompressed
          end.
     
    -new_unpack(Z, Compressed, Dict) ->
    -    case zlib:inflate(Z, Compressed, [{exception_on_need_dict, false}]) of
    -        {need_dictionary, _DictId, Output} ->
    -            ok = zlib:inflateSetDictionary(Z, Dict),
    -            [Output | zlib:inflate(Z, [])];
    +new_unpack(Z, Compressed, Dict) ->
    +    case zlib:inflate(Z, Compressed, [{exception_on_need_dict, false}]) of
    +        {need_dictionary, _DictId, Output} ->
    +            ok = zlib:inflateSetDictionary(Z, Dict),
    +            [Output | zlib:inflate(Z, [])];
             Uncompressed ->
                 Uncompressed
         end.
    @@ -1463,18 +1463,18 @@ desired, and the function will return {finished, Output} once all queued data has been decompressed.

    This function can introduce some output latency (reading input without producing any output).

    If a preset dictionary is required for further decompression, this function -returns a need_dictionary tuple. See inflateSetDictionary/2) for details.

    Example:

    walk(Compressed, Handler) ->
    -    Z = zlib:open(),
    -    zlib:inflateInit(Z),
    -    loop(Z, Handler, zlib:safeInflate(Z, Compressed)),
    -    zlib:inflateEnd(Z),
    -    zlib:close(Z).
    -
    -loop(Z, Handler, {continue, Output}) ->
    -    Handler(Output),
    -    loop(Z, Handler, zlib:safeInflate(Z, []));
    -loop(Z, Handler, {finished, Output}) ->
    -    Handler(Output).
    +returns a need_dictionary tuple. See inflateSetDictionary/2) for details.

    Example:

    walk(Compressed, Handler) ->
    +    Z = zlib:open(),
    +    zlib:inflateInit(Z),
    +    loop(Z, Handler, zlib:safeInflate(Z, Compressed)),
    +    zlib:inflateEnd(Z),
    +    zlib:close(Z).
    +
    +loop(Z, Handler, {continue, Output}) ->
    +    Handler(Output),
    +    loop(Z, Handler, zlib:safeInflate(Z, []));
    +loop(Z, Handler, {finished, Output}) ->
    +    Handler(Output).
    @@ -1613,7 +1613,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.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 2026-03-12 21:36:50.430246207 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/404.html 2026-03-12 21:36:50.434246230 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.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 2026-03-12 21:36:50.454246349 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/api-reference.html 2026-03-12 21:36:50.458246374 +0000 @@ -118,7 +118,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.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 2026-03-05 20:51:35.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/asn1ct.xhtml 2042-04-07 10:09:56.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 2026-03-05 20:51:35.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/asn1_getting_started.xhtml 2042-04-07 10:09:56.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	2026-03-05 20:51:35.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/asn1_spec.xhtml	2042-04-07 10:09:56.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	2026-03-05 20:51:35.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/content.opf	2042-04-07 10:09:56.000000000 +0000
      @@ -4,10 +4,10 @@
                version="3.0">
         
           asn1 - 5.4.2
      -    urn:uuid:37ad25e8-0213-f19f-fe26-f8d100d9f7be
      +    urn:uuid:be84d51e-6a41-0c56-7987-d2a9750a2d37
           en
       
      -    2026-03-05T20:51:35Z
      +    2042-04-07T10:09:56Z
       
         
         
      /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	2026-03-05 20:51:35.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1.epub/OEBPS/notes.xhtml	2042-04-07 10:09:56.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 2026-03-12 21:36:50.642247464 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_getting_started.html 2026-03-12 21:36:50.646247488 +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	2026-03-12 21:36:50.682247700 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_introduction.html	2026-03-12 21:36:50.678247677 +0000
      @@ -156,7 +156,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.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 2026-03-12 21:36:50.702247819 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_overview.html 2026-03-12 21:36:50.706247842 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.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 2026-03-12 21:36:50.738248032 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1_spec.html 2026-03-12 21:36:50.742248057 +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	2026-03-12 21:36:50.774248246 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/asn1ct.html	2026-03-12 21:36:50.782248293 +0000
        @@ -460,9 +460,9 @@
         mostly work for old specifications based on the 1997 standard for ASN.1, but
         not for most modern-style applications. Another limitation is that the test
         functions may not work if options that change code generations strategies such
        -as the options macro_name_prefix and record_name_prefix have been used.

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

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

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

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

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

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

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

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

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

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/asn1-5.4.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 2026-03-12 21:36:50.814248482 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/notes.html 2026-03-12 21:36:50.814248482 +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-2026 Ericsson AB

            +

            Copyright © 1996-2042 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 2026-03-12 21:36:50.838248626 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/asn1-5.4.2/doc/html/search.html 2026-03-12 21:36:50.842248649 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:50.866248791 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/404.html 2026-03-12 21:36:50.870248814 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:50.894248958 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/api-reference.html 2026-03-12 21:36:50.898248981 +0000 @@ -248,7 +248,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:50.926249147 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/basics_chapter.html 2026-03-12 21:36:50.930249171 +0000 @@ -155,15 +155,15 @@ the reason for termination is. If you use Erlang pattern matching effectively, you can take advantage of this property. The result is concise and readable test case functions that look much more like scripts than actual programs. A simple -example:

            session(_Config) ->
            -    {started,ServerId} = my_server:start(),
            -    {clients,[]} = my_server:get_clients(ServerId),
            -    MyId = self(),
            -    connected = my_server:connect(ServerId, MyId),
            -    {clients,[MyId]} = my_server:get_clients(ServerId),
            -    disconnected = my_server:disconnect(ServerId, MyId),
            -    {clients,[]} = my_server:get_clients(ServerId),
            -    stopped = my_server:stop(ServerId).

            As a test suite runs, all information (including output to stdout) is recorded +example:

            session(_Config) ->
            +    {started,ServerId} = my_server:start(),
            +    {clients,[]} = my_server:get_clients(ServerId),
            +    MyId = self(),
            +    connected = my_server:connect(ServerId, MyId),
            +    {clients,[MyId]} = my_server:get_clients(ServerId),
            +    disconnected = my_server:disconnect(ServerId, MyId),
            +    {clients,[]} = my_server:get_clients(ServerId),
            +    stopped = my_server:stop(ServerId).

            As a test suite runs, all information (including output to stdout) is recorded in many different log files. A minimum of information is displayed in the user console (only start and stop information, plus a note for each failed test case).

            The result from each test case is recorded in a dedicated HTML log file, created @@ -238,7 +238,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/basics_chapter.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/config_file_chapter.xhtml 2042-04-07 10:09:35.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	2026-03-05 20:51:16.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/content.opf	2042-04-07 10:09:35.000000000 +0000
            @@ -4,10 +4,10 @@
                      version="3.0">
               
                 common_test - 1.29
            -    urn:uuid:6114719a-8f9d-9a04-94c6-6ca81267efe8
            +    urn:uuid:0dfdc616-c00d-669d-b357-7e909036f94d
                 en
             
            -    2026-03-05T20:51:16Z
            +    2042-04-07T10:09:35Z
             
               
               
            /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	2026-03-05 20:51:16.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/cover_chapter.xhtml	2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_ftp.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_hooks_chapter.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_master_chapter.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_master.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_netconfc.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.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 2042-04-07 10:09:35.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	2026-03-05 20:51:16.000000000 +0000
            +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_property_test.xhtml	2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_run_cmd.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_snmp.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_ssh.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct_telnet.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/ct.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/dependencies_chapter.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/event_handler_chapter.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/example_chapter.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/getting_started_chapter.xhtml 2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/run_test_chapter.xhtml 2042-04-07 10:09:35.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	2026-03-05 20:51:16.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/unix_telnet.xhtml	2042-04-07 10:09:35.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 2026-03-05 20:51:16.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test.epub/OEBPS/write_test_chapter.xhtml 2042-04-07 10:09:35.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 2026-03-12 21:36:51.374251802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/common_test_app.html 2026-03-12 21:36:51.378251826 +0000 @@ -133,7 +133,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.402251967 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/config_file_chapter.html 2026-03-12 21:36:51.406251992 +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	2026-03-12 21:36:51.442252205 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/cover_chapter.html	2026-03-12 21:36:51.442252205 +0000
    @@ -135,44 +135,44 @@
     Running Tests and Analyzing Results).

    The Cover Specification File

    General Config

    Here follows the general configuration terms that are allowed in a cover specification file:

    %% List of Nodes on which cover will be active during test.
     %% Nodes = [atom()]
    -{nodes, Nodes}.
    +{nodes, Nodes}.
     
     %% Files with previously exported cover data to include in analysis.
     %% CoverDataFiles = [string()]
    -{import, CoverDataFiles}.
    +{import, CoverDataFiles}.
     
     %% Cover data file to export from this session.
     %% CoverDataFile = string()
    -{export, CoverDataFile}.
    +{export, CoverDataFile}.
     
     %% Cover analysis level.
     %% Level = details | overview
    -{level, Level}.
    +{level, Level}.
     
     %% Directories to include in cover.
     %% Dirs = [string()]
    -{incl_dirs, Dirs}.
    +{incl_dirs, Dirs}.
     
     %% Directories, including subdirectories, to include.
    -{incl_dirs_r, Dirs}.
    +{incl_dirs_r, Dirs}.
     
     %% Specific modules to include in cover.
     %% Mods = [atom()]
    -{incl_mods, Mods}.
    +{incl_mods, Mods}.
     
     %% Directories to exclude in cover.
    -{excl_dirs, Dirs}.
    +{excl_dirs, Dirs}.
     
     %% Directories, including subdirectories, to exclude.
    -{excl_dirs_r, Dirs}.
    +{excl_dirs_r, Dirs}.
     
     %% Specific modules to exclude in cover.
    -{excl_mods, Mods}.
    +{excl_mods, Mods}.
     
     %% Cross cover compilation
     %% Tag = atom(), an identifier for a test run
     %% Mod = [atom()], modules to compile for accumulated analysis
    -{cross,[{Tag,Mods}]}.

    The terms incl_dirs_r and excl_dirs_r tell Common Test to search the +{cross,[{Tag,Mods}]}.

    The terms incl_dirs_r and excl_dirs_r tell Common Test to search the specified directories recursively and include or exclude any module found during the search. The terms incl_dirs and excl_dirs result in a non-recursive search for modules (that is, only modules found in the specified directories are @@ -181,7 +181,7 @@ recompile the modules. It is not sufficient to specify these directories in the cover specification file for Common Test.

    OTP application Config

    When using a cover specification in the testing of an OTP application itself, there is a special incl_app directive that includes the applications modules for -the cover compilation.

    {incl_app, AppName, Cover :: overview | details}.

    Note

    If you desire to also use some other general cover configuration together with +the cover compilation.

    {incl_app, AppName, Cover :: overview | details}.

    Note

    If you desire to also use some other general cover configuration together with this option you should insert the AppName in between the option and its value creating a three tuple.

    Cross Cover Analysis

    The cross cover mechanism allows cover analysis of modules across multiple tests. It is useful if some code, for example, a library module, is used by many @@ -202,7 +202,7 @@ {cross,[{s1,[m1]}]}.

    Then m1 is cover compiled in test run s2, but not shown in the coverage log. Instead, if ct_cover:cross_cover_analyse/2 is called after both s1 and s2 test runs are completed, the accumulated result for m1 is available in the -cross cover log for test run s1.

    The call to the analyze function must be as follows:

    ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

    Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for +cross cover log for test run s1.

    The call to the analyze function must be as follows:

    ct_cover:cross_cover_analyse(Level, [{s1,S1LogDir},{s2,S2LogDir}]).

    Here, S1LogDir and S2LogDir are the directories named <TestName>.logs for each test respectively.

    Notice the tags s1 and s2, which are used in the cover specification file and in the call to ct_cover:cross_cover_analyse/2. The purpose of these is only to map the modules specified in the cover specification to the log @@ -270,7 +270,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.490252489 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct.html 2026-03-12 21:36:51.498252537 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:36:51.526252703 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_cover.html 2026-03-12 21:36:51.526252703 +0000 @@ -282,7 +282,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.558252893 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ftp.html 2026-03-12 21:36:51.562252916 +0000 @@ -554,10 +554,10 @@

    Opens an FTP connection and sends a file to the remote host.

    LocalFile and RemoteFile must be absolute paths.

    If the target host is a "special" node, the FTP address must be specified in the -configuration file as follows:

    {node,[{ftp,IpAddr}]}.

    If the target host is something else, for example, a UNIX host, the -configuration file must also include the username and password (both strings):

    {unix,[{ftp,IpAddr},
    -       {username,Username},
    -       {password,Password}]}.

    See also ct:require/2.

    +configuration file as follows:

    {node,[{ftp,IpAddr}]}.

    If the target host is something else, for example, a UNIX host, the +configuration file must also include the username and password (both strings):

    {unix,[{ftp,IpAddr},
    +       {username,Username},
    +       {password,Password}]}.

    See also ct:require/2.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.602253153 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks.html 2026-03-12 21:36:51.602253153 +0000 @@ -1366,7 +1366,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.634253343 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_hooks_chapter.html 2026-03-12 21:36:51.638253367 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:36:51.670253556 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master.html 2026-03-12 21:36:51.674253579 +0000 @@ -413,7 +413,7 @@

    Gets a reference to the Common Test master event manager. The reference can be -used to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
    +used to, for example, add a user-specific event handler while tests are running.

    Example:

    gen_event:add_handler(ct_master:get_event_mgr_ref(), my_ev_h, [])
    @@ -763,7 +763,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.702253746 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_master_chapter.html 2026-03-12 21:36:51.702253746 +0000 @@ -108,7 +108,7 @@ of test specifications. If it is a list, the specifications are handled (and the corresponding tests executed) in sequence. An element in a TestSpecs list can also be list of test specifications. The specifications in such a list are -merged into one combined specification before test execution.

    Example:

    ct_master:run(["ts1","ts2",["ts3","ts4"]])

    Here, the tests specified by "ts1" run first, then the tests specified by "ts2", +merged into one combined specification before test execution.

    Example:

    ct_master:run(["ts1","ts2",["ts3","ts4"]])

    Here, the tests specified by "ts1" run first, then the tests specified by "ts2", and finally the tests specified by both "ts3" and "ts4".

    The InclNodes argument to run/3 is a list of node names. Function run/3 runs the tests in TestSpecs just like run/1, but also takes any test in TestSpecs, which is not explicitly tagged with a particular node name, and @@ -142,32 +142,32 @@ install an event handler).

    Consider the example in section Test Specifications in section Running Tests and Analysing Results, now extended with node information and -intended to be executed by Common Test Master:

    {define, 'Top', "/home/test"}.
    -{define, 'T1', "'Top'/t1"}.
    -{define, 'T2', "'Top'/t2"}.
    -{define, 'T3', "'Top'/t3"}.
    -{define, 'CfgFile', "config.cfg"}.
    -{define, 'Node', ct_node}.
    -
    -{node, node1, 'Node@host_x'}.
    -{node, node2, 'Node@host_y'}.
    -
    -{logdir, master, "'Top'/master_logs"}.
    -{logdir, "'Top'/logs"}.
    -
    -{config, node1, "'T1'/'CfgFile'"}.
    -{config, node2, "'T2'/'CfgFile'"}.
    -{config, "'T3'/'CfgFile'"}.
    -
    -{suites, node1, 'T1', all}.
    -{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    -{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    -{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
    +intended to be executed by Common Test Master:

    {define, 'Top', "/home/test"}.
    +{define, 'T1', "'Top'/t1"}.
    +{define, 'T2', "'Top'/t2"}.
    +{define, 'T3', "'Top'/t3"}.
    +{define, 'CfgFile', "config.cfg"}.
    +{define, 'Node', ct_node}.
    +
    +{node, node1, 'Node@host_x'}.
    +{node, node2, 'Node@host_y'}.
    +
    +{logdir, master, "'Top'/master_logs"}.
    +{logdir, "'Top'/logs"}.
    +
    +{config, node1, "'T1'/'CfgFile'"}.
    +{config, node2, "'T2'/'CfgFile'"}.
    +{config, "'T3'/'CfgFile'"}.
    +
    +{suites, node1, 'T1', all}.
    +{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    +{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    +{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.
     
    -{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
    -{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
    +{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
    +{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.
     
    -{skip_suites, 'T3', all, "Not implemented"}.

    This example specifies the same tests as the original example. But now if +{skip_suites, 'T3', all, "Not implemented"}.

    This example specifies the same tests as the original example. But now if started with a call to ct_master:run(TestSpecName), test t1 is executed on node ct_node@host_x (node1), test t2 on ct_node@host_y (node2) and test t3 on both node1 and node2. Configuration file t1 is only read on @@ -184,13 +184,13 @@ Common Test node in question (typically ct@somehost if started with the ct_run program), is performed. Tests without explicit node association are always performed too, of course.

    Automatic Startup of Test Target Nodes

    Initial actions can be started and performed automatically on test target nodes -using test specification term init.

    Two subterms are supported, node_start and eval.

    Example:

    {node, node1, node1@host1}.
    -{node, node2, node1@host2}.
    -{node, node3, node2@host2}.
    -{node, node4, node1@host3}.
    -{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
    -{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
    -{init, node4, {eval, {module, function, []}}}.

    This test specification declares that node1@host1 is to be started using the +using test specification term init.

    Two subterms are supported, node_start and eval.

    Example:

    {node, node1, node1@host1}.
    +{node, node2, node1@host2}.
    +{node, node3, node2@host2}.
    +{node, node4, node1@host3}.
    +{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
    +{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
    +{init, node4, {eval, {module, function, []}}}.

    This test specification declares that node1@host1 is to be started using the user callback function callback_module:my_slave_callback/0, and nodes node1@host2 and node2@host2 are to be started with the default callback module ct_slave. The specified username and password are used to log on to @@ -255,7 +255,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.750254030 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_netconfc.html 2026-03-12 21:36:51.758254078 +0000 @@ -102,7 +102,7 @@ to the server.

    Alternately, open/1,2 can be used to establish a single session on a dedicated connection. (Or, equivalently, only_open/1,2 followed by hello/1-3.)

    Connect/session options can be specified in a configuration file with entries -like the following.

    {server_id(), [option()]}.

    The server_id/0 or an associated ct:target_name/0 can then be passed to +like the following.

    {server_id(), [option()]}.

    The server_id/0 or an associated ct:target_name/0 can then be passed to the aforementioned functions to use the referenced configuration.

    Signaling

    Protocol operations in the NETCONF protocol are realized as remote procedure calls (RPCs) from client to server and a corresponding reply from server to client. RPCs are sent using like-named functions (eg. @@ -115,8 +115,8 @@ in most cases since a non-response by the server or a missing message-id causes the call to hang indefinitely.

    Logging

    The NETCONF server uses error_logger for logging of NETCONF traffic. A special purpose error handler is implemented in ct_conn_log_h. To use this error -handler, add the cth_conn_log hook in the test suite, for example:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

    conn_log_mod() is the name of the Common Test module implementing the +handler, add the cth_conn_log hook in the test suite, for example:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].

    conn_log_mod() is the name of the Common Test module implementing the connection protocol, for example, ct_netconfc.

    Hook option log_type specifies the type of logging:

    • raw - The sent and received NETCONF data is logged to a separate text file "as is" without any formatting. A link to the file is added to the test case HTML log.

    • pretty - The sent and received NETCONF data is logged to a separate text @@ -127,17 +127,17 @@ option hosts and list the names of the servers/connections to be used in the suite. The connections must be named for this to work, that is, they must be opened with open/2.

      Option hosts has no effect if log_type is set to html or silent.

      The hook options can also be specified in a configuration file with -configuration variable ct_conn_log:

      {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

      For example:

      {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
      -                            {hosts,[ct:key_or_name()]}]}]}

      Note

      Hook options specified in a configuration file overwrite the hard-coded hook +configuration variable ct_conn_log:

      {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.

      For example:

      {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
      +                            {hosts,[ct:key_or_name()]}]}]}

      Note

      Hook options specified in a configuration file overwrite the hard-coded hook options in the test suite.

      Logging Example 1:

      The following ct_hooks statement causes pretty printing of NETCONF traffic to separate logs for the connections named nc_server1 and nc_server2. Any other -connections are logged to default NETCONF log.

      suite() ->
      -   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
      -                                              {hosts,[nc_server1,nc_server2]}]}
      -                               ]}]}].

      Connections must be opened as follows:

      open(nc_server1,[...]),
      -open(nc_server2,[...]).

      Logging Example 2:

      The following configuration file causes raw logging of all NETCONF traffic in to -one single text file:

      {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

      The ct_hooks statement must look as follows:

      suite() ->
      -    [{ct_hooks, [{cth_conn_log, []}]}].

      The same ct_hooks statement without the configuration file would cause HTML +connections are logged to default NETCONF log.

      suite() ->
      +   [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
      +                                              {hosts,[nc_server1,nc_server2]}]}
      +                               ]}]}].

      Connections must be opened as follows:

      open(nc_server1,[...]),
      +open(nc_server2,[...]).

      Logging Example 2:

      The following configuration file causes raw logging of all NETCONF traffic in to +one single text file:

      {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.

      The ct_hooks statement must look as follows:

      suite() ->
      +    [{ct_hooks, [{cth_conn_log, []}]}].

      The same ct_hooks statement without the configuration file would cause HTML logging of all NETCONF connections in to the test case HTML log.

      @@ -2138,8 +2138,8 @@

      Edits configuration data.

      By default only the running target is available, unless the server includes :candidate or :startup in its list of capabilities.

      OptParams can be used for specifying optional parameters (default-operation, test-option, or error-option) to be added to the edit-config request. The -value must be a list containing valid simple XML, for example:

      [{'default-operation', ["none"]},
      - {'error-option', ["rollback-on-error"]}]

      If OptParams is not given, the default value [] is used.

      +value must be a list containing valid simple XML, for example:

      [{'default-operation', ["none"]},
      + {'error-option', ["rollback-on-error"]}]

      If OptParams is not given, the default value [] is used.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.798254315 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test.html 2026-03-12 21:36:51.794254290 +0000 @@ -100,30 +100,30 @@ directory has a subdirectory property_test, where everything needed for the property tests are collected. The usual Erlang application directory structure is assumed.

    A typical Common Test test suite using ct_property_test is organized as -follows:

    -module(my_prop_test_SUITE).
    --compile(export_all).
    +follows:

    -module(my_prop_test_SUITE).
    +-compile(export_all).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -all() -> [prop_ftp_case].
    +all() -> [prop_ftp_case].
     
    -init_per_suite(Config) ->
    -    ct_property_test:init_per_suite(Config).
    +init_per_suite(Config) ->
    +    ct_property_test:init_per_suite(Config).
     
     %%%---- test case
    -prop_ftp_case(Config) ->
    -    ct_property_test:quickcheck(
    -      ftp_simple_client_server:prop_ftp(),
    +prop_ftp_case(Config) ->
    +    ct_property_test:quickcheck(
    +      ftp_simple_client_server:prop_ftp(),
           Config
    -     ).

    and the the property test module (in this example + ).

    and the the property test module (in this example ftp_simple_client_server.erl) as almost a usual property testing module (More -examples are in the User's Guide):

    -module(ftp_simple_client_server).
    --export([prop_ftp/0...]).
    +examples are in the User's Guide):

    -module(ftp_simple_client_server).
    +-export([prop_ftp/0...]).
     
    --include_lib("common_test/include/ct_property_test.hrl").
    +-include_lib("common_test/include/ct_property_test.hrl").
     
    -prop_ftp() ->
    -    ?FORALL( ....
    +
    prop_ftp() -> + ?FORALL( ....
    @@ -841,7 +841,7 @@ 'EQC', 'PROPER' or 'TRIQ' set, depending on which tool that is first found. This could make parts of the Erlang property tests code to be included or excluded with the macro directives -ifdef(Macro). or -ifndef(Macro)..

    The file(s) in the property_test subdirectory could, or should, include the -ct_property_test include file:

    -include_lib("common_test/include/ct_property_test.hrl").

    This included file will:

    The default StatisticsSpec is:

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.822254457 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_property_test_chapter.html 2026-03-12 21:36:51.826254480 +0000 @@ -93,51 +93,51 @@ property based testing tools in Common Test test suites.

    Basic knowledge of property based testing is assumed in the following. It is also assumed that at least one of the following property based testing tools is installed and available in the library path:

    What Is Supported?

    The ct_property_test module does the following:

    • Compiles the files with property tests in the subdirectory property_test
    • Tests properties in those files using the first found Property Testing Tool.
    • Saves the results - that is the printouts - in the usual Common Test Log

    Introductory Example

    Assume that we want to test the lists:sort/1 function.

    We need a property to test the function. In normal way, we create -property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    --export([prop_sort/0]).
    +property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    +-export([prop_sort/0]).
     
     %%% This will include the .hrl file for the installed testing tool:
    --include_lib("common_test/include/ct_property_test.hrl").
    +-include_lib("common_test/include/ct_property_test.hrl").
     
     %%% The property we want to check:
     %%%   For all possibly unsorted lists,
     %%%   the result of lists:sort/1 is sorted.
    -prop_sort() ->
    -    ?FORALL(UnSorted, list(),
    -            is_sorted(lists:sort(UnSorted))
    -           ).
    +prop_sort() ->
    +    ?FORALL(UnSorted, list(),
    +            is_sorted(lists:sort(UnSorted))
    +           ).
     
     %%% Function to check that a list is sorted:
    -is_sorted([]) ->
    +is_sorted([]) ->
         true;
    -is_sorted([_]) ->
    +is_sorted([_]) ->
         true;
    -is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    -    is_sorted([H2|SortedTail]);
    -is_sorted(_) ->
    -    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    --compile(export_all). % Only in tests!
    +is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    +    is_sorted([H2|SortedTail]);
    +is_sorted(_) ->
    +    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    +-compile(export_all). % Only in tests!
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -all() -> [prop_sort
    -         ].
    +all() -> [prop_sort
    +         ].
     
     %%% First prepare Config and compile the property tests for the found tool:
    -init_per_suite(Config) ->
    -    ct_property_test:init_per_suite(Config).
    +init_per_suite(Config) ->
    +    ct_property_test:init_per_suite(Config).
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         Config.
     
     %%%================================================================
     %%% Test suites
     %%%
    -prop_sort(Config) ->
    -    ct_property_test:quickcheck(
    -      ct_prop:prop_sort(),
    +prop_sort(Config) ->
    +    ct_property_test:quickcheck(
    +      ct_prop:prop_sort(),
           Config
    -     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
    +     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
     .....
     Common Test: Running make in test directories...
     
    @@ -161,13 +161,13 @@
     Testing lib.common_test.ct_property_test_SUITE: TEST COMPLETE, 1 ok, 0 failed of 1 test cases
     
     ....

    A stateful testing example

    Assume a test that generates some parallel stateful commands, and runs 300 -tests:

    prop_parallel(Config) ->
    -    numtests(300,
    -             ?FORALL(Cmds, parallel_commands(?MODULE),
    +tests:

    prop_parallel(Config) ->
    +    numtests(300,
    +             ?FORALL(Cmds, parallel_commands(?MODULE),
                          begin
    -                         RunResult = run_parallel_commands(?MODULE, Cmds),
    -                         ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
    -                     end)).

    The ct_property_test:present_result/4 is a help function for printing some + RunResult = run_parallel_commands(?MODULE, Cmds), + ct_property_test:present_result(?MODULE, Cmds, RunResult, Config) + end)).

    The ct_property_test:present_result/4 is a help function for printing some statistics in the CommonTest log file.

    Our example test could for example be a simple test of an ftp server, where we perform get, put and delete requests, some of them in parallel. Per default, the result has three sections:

    *** User 2019-12-11 13:28:17.504 ***
    @@ -271,7 +271,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.858254670 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_rpc.html 2026-03-12 21:36:51.862254693 +0000 @@ -538,7 +538,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.890254860 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_run_cmd.html 2026-03-12 21:36:51.890254860 +0000 @@ -185,10 +185,10 @@ [-ct_hooks_order test | config] [-exit_status ignore_config]

    Refresh HTML Index Files

     ct_run -refresh_logs [-logdir LogDir] [-basic_html]
       [-keep_logs all | NLogs]

    Run Common Test in Interactive Mode

     ct_run -shell
    -  [-config ConfigFile1 ConfigFile2 ... ConfigFileN]
    -  [-userconfig CallbackModule1 ConfigString1 and CallbackModule2
    -   ConfigString2 and .. and CallbackModuleN ConfigStringN]
    -  [-decrypt_key Key] | [-decrypt_file KeyFile]

    Start a Common Test Master Node

     ct_run -ctmaster

    See Also

    For information about the start flags, see section + [-config ConfigFile1 ConfigFile2 ... ConfigFileN] + [-userconfig CallbackModule1 ConfigString1 and CallbackModule2 + ConfigString2 and .. and CallbackModuleN ConfigStringN] + [-decrypt_key Key] | [-decrypt_file KeyFile]

    Start a Common Test Master Node

     ct_run -ctmaster

    See Also

    For information about the start flags, see section Running Tests and Analyzing Results in the User's Guide.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.914255002 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_slave.html 2026-03-12 21:36:51.918255026 +0000 @@ -532,7 +532,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:51.954255239 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_snmp.html 2026-03-12 21:36:51.958255262 +0000 @@ -115,15 +115,15 @@ Optional.

  • {agent_target_param_def, [term()] | {data_dir_file, rel_path()}} - Optional.

  • Parameter MgrAgentConfName in the functions is to be a name you allocate in your test suite using a require statement. Example (where -MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be +MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be confused with users.

    SNMP traps, inform, and report messages are handled by the user callback module. For details, see the SNMP application.

    It is recommended to use the .hrl files created by the Erlang/OTP MIB compiler to define the Object Identifiers (OIDs). For example, to get the Erlang node -name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, +name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, config, server, net_if, and so on (for a list of valid parameters and types, see the User's Guide for the SNMP application). -This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    -            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the +This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    +            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the example above). Pass this name as argument SnmpAppConfName to ct_snmp:start/3. ct_snmp specifies default values for some SNMP application configuration parameters (such as {verbosity,trace} for @@ -1895,7 +1895,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.014255594 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_ssh.html 2026-03-12 21:36:52.014255594 +0000 @@ -98,14 +98,14 @@ that have been started on existing SSH connections (that is, when the original connection type is ssh). Whenever the connection type is sftp, use the SSH connection reference only.

    The following options are valid for specifying an SSH/SFTP connection (that is, -can be used as configuration elements):

    [{ConnType, Addr},
    - {port, Port},
    - {user, UserName}
    - {password, Pwd}
    - {user_dir, String}
    - {public_key_alg, PubKeyAlg}
    - {connect_timeout, Timeout}
    - {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    +can be used as configuration elements):

    [{ConnType, Addr},
    + {port, Port},
    + {user, UserName}
    + {password, Pwd}
    + {user_dir, String}
    + {public_key_alg, PubKeyAlg}
    + {connect_timeout, Timeout}
    + {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.054255832 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_suite.html 2026-03-12 21:36:52.058255855 +0000 @@ -1617,7 +1617,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.102256117 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_telnet.html 2026-03-12 21:36:52.098256092 +0000 @@ -101,14 +101,14 @@ true
  • Polling limit (max number of times to poll to get a remaining string terminated) = 0
  • Polling interval (sleep time between polls) = 1 second
  • The TCP_NODELAY option for the telnet socket is disabled (set to false) per default
  • These parameters can be modified by the user with the following configuration -term:

    {telnet_settings, [{connect_timeout,Millisec},
    -                   {command_timeout,Millisec},
    -                   {reconnection_attempts,N},
    -                   {reconnection_interval,Millisec},
    -                   {keep_alive,Bool},
    -                   {poll_limit,N},
    -                   {poll_interval,Millisec},
    -                   {tcp_nodelay,Bool}]}.

    Millisec = timeout(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test +term:

    {telnet_settings, [{connect_timeout,Millisec},
    +                   {command_timeout,Millisec},
    +                   {reconnection_attempts,N},
    +                   {reconnection_interval,Millisec},
    +                   {keep_alive,Bool},
    +                   {poll_limit,N},
    +                   {poll_interval,Millisec},
    +                   {tcp_nodelay,Bool}]}.

    Millisec = timeout(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test and ct_telnet retrieves the information automatically.

    keep_alive can be specified per connection, if necessary. For details, see unix_telnet.

    Logging

    The default logging behavior of ct_telnet is to print information about performed operations, commands, and their corresponding results to the test case @@ -117,8 +117,8 @@ such as expect/3. However, ct_telnet can be configured to use a special purpose event handler, implemented in ct_conn_log_h, for logging all Telnet traffic. To use this handler, install a Common Test hook named -cth_conn_log. Example (using the test suite information function):

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection +cth_conn_log. Example (using the test suite information function):

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection protocol, that is, ct_telnet.

    The cth_conn_log hook performs unformatted logging of Telnet data to a separate text file. All Telnet communication is captured and printed, including any data sent from the server. The link to this text file is located at the top @@ -135,15 +135,15 @@ disabled, which results with no prefix data. If the value is set to full prefix contains timestamp and additonal information. If the value is set to short prefix includes only human readable timestamp.

    All cth_conn_log hook options described can also be specified in a -configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    -                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook +configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    +                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook options in the test suite.

    Logging Example:

    The following ct_hooks statement causes printing of Telnet traffic to separate logs for the connections server1 and server2. Traffic for any other -connections is logged in the default Telnet log.

    suite() ->
    -    [{ct_hooks,
    -      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry -like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, []}]}].

    See Also

    unix_telnet

    +connections is logged in the default Telnet log.

    suite() ->
    +    [{ct_hooks,
    +      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry +like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, []}]}].

    See Also

    unix_telnet

    @@ -846,9 +846,9 @@ instead of only one Match. Also HaltReason is returned.

  • sequence - All patterns must be matched in a sequence. A match is not concluded until all patterns are matched. This option can be interrupted by one or more HaltPatterns. MatchList is always returned, that is, a list of -Match instead of only one Match. Also HaltReason is returned.

  • Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the +Match instead of only one Match. Also HaltReason is returned.

    Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the function returns {error,{nnn,["NNN"]}}. If both "ABC" and "XYZ" are -matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function +matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function returns HaltReason = {nnn,["NNN"]}.

    Options repeat and sequence can be combined to match a sequence multiple times.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.130256282 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/ct_testspec.html 2026-03-12 21:36:52.134256305 +0000 @@ -204,7 +204,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.162256472 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/dependencies_chapter.html 2026-03-12 21:36:52.166256495 +0000 @@ -119,65 +119,65 @@ start and stop functionality separately.) The configuration can also be implemented as a common function, maybe grouped with the start function. Finally, the testing of connecting and disconnecting a client can be grouped -into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -suite() -> [{require,my_server_cfg}].
    +suite() -> [{require,my_server_cfg}].
     
    -init_per_testcase(start_and_stop, Config) ->
    +init_per_testcase(start_and_stop, Config) ->
         Config;
     
    -init_per_testcase(config, Config) ->
    -    [{server_pid,start_server()} | Config];
    +init_per_testcase(config, Config) ->
    +    [{server_pid,start_server()} | Config];
     
    -init_per_testcase(_, Config) ->
    -    ServerPid = start_server(),
    -    configure_server(),
    -    [{server_pid,ServerPid} | Config].
    +init_per_testcase(_, Config) ->
    +    ServerPid = start_server(),
    +    configure_server(),
    +    [{server_pid,ServerPid} | Config].
     
    -end_per_testcase(start_and_stop, _) ->
    +end_per_testcase(start_and_stop, _) ->
         ok;
     
    -end_per_testcase(_, Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    stop_server(ServerPid).
    +end_per_testcase(_, Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    stop_server(ServerPid).
     
     %%% test cases...
     
    -all() -> [start_and_stop, config, connect_and_disconnect].
    +all() -> [start_and_stop, config, connect_and_disconnect].
     
     %% test that starting and stopping works
    -start_and_stop(_) ->
    -    ServerPid = start_server(),
    -    stop_server(ServerPid).
    +start_and_stop(_) ->
    +    ServerPid = start_server(),
    +    stop_server(ServerPid).
     
     %% configuration test
    -config(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    configure_server(ServerPid).
    +config(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    configure_server(ServerPid).
     
     %% test connecting and disconnecting client
    -connect_and_disconnect(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    {ok,SessionId} = my_server:connect(ServerPid),
    -    ok = my_server:disconnect(ServerPid, SessionId).
    +connect_and_disconnect(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    {ok,SessionId} = my_server:connect(ServerPid),
    +    ok = my_server:disconnect(ServerPid, SessionId).
     
     %%% common functions...
     
    -start_server() ->
    -    {ok,ServerPid} = my_server:start(),
    +start_server() ->
    +    {ok,ServerPid} = my_server:start(),
         ServerPid.
     
    -stop_server(ServerPid) ->
    -    ok = my_server:stop(),
    +stop_server(ServerPid) ->
    +    ok = my_server:stop(),
         ok.
     
    -configure_server(ServerPid) ->
    -    ServerCfgData = ct:get_config(my_server_cfg),
    -    ok = my_server:configure(ServerPid, ServerCfgData),
    +configure_server(ServerPid) ->
    +    ServerCfgData = ct:get_config(my_server_cfg),
    +    ok = my_server:configure(ServerPid, ServerCfgData),
         ok.

    Saving Configuration Data

    Sometimes it is impossible, or infeasible, to implement independent test cases. Maybe it is not possible to read the SUT state. Maybe resetting the SUT is impossible and it takes too long time to restart the system. In situations where @@ -199,40 +199,40 @@ data is to be saved by finction end_per_suite and read by function init_per_suite in the suite that follows. When passing data between suites, Saver carries the name -of the test suite.

    Example:

    -module(server_b_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +of the test suite.

    Example:

    -module(server_b_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -init_per_suite(Config) ->
    +init_per_suite(Config) ->
         %% read config saved by previous test suite
    -    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
    +    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
         %% extract server identity (comes from server_a_SUITE)
    -    ServerId = proplists:get_value(server_id, OldConfig),
    -    SessionId = connect_to_server(ServerId),
    -    [{ids,{ServerId,SessionId}} | Config].
    +    ServerId = proplists:get_value(server_id, OldConfig),
    +    SessionId = connect_to_server(ServerId),
    +    [{ids,{ServerId,SessionId}} | Config].
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         %% save config for server_c_SUITE (session_id and server_id)
    -    {save_config,Config}
    +    {save_config,Config}
     
     %%% test cases...
     
    -all() -> [allocate, deallocate].
    +all() -> [allocate, deallocate].
     
    -allocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {ok,Handle} = allocate_resource(ServerId, SessionId),
    +allocate(Config) ->
    +    {ServerId,SessionId} = proplists:get_value(ids, Config),
    +    {ok,Handle} = allocate_resource(ServerId, SessionId),
         %% save handle for deallocation test
    -    NewConfig = [{handle,Handle}],
    -    {save_config,NewConfig}.
    +    NewConfig = [{handle,Handle}],
    +    {save_config,NewConfig}.
     
    -deallocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {allocate,OldConfig} = proplists:get_value(saved_config, Config),
    -    Handle = proplists:get_value(handle, OldConfig),
    -    ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple +deallocate(Config) -> + {ServerId,SessionId} = proplists:get_value(ids, Config), + {allocate,OldConfig} = proplists:get_value(saved_config, Config), + Handle = proplists:get_value(handle, OldConfig), + ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple {skip_and_save,Reason,ConfigList}.

    The result is that the test case is skipped with Reason printed to the log file (as described earlier) and ConfigList is saved for the next test case. ConfigList can be read using proplists:get_value(saved_config, Config), as @@ -246,22 +246,22 @@ property. Test case groups are defined through function groups/0 in the test suite (for details, see section Test Case Groups.

    For example, to ensure that if allocate in server_b_SUITE crashes, -deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is -independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, +deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is +independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, dealloc is not executed but marked as SKIPPED in the HTML log. get_resource_status runs no matter what happens to the alloc_and_dealloc cases.

    Test cases in a sequence are executed in order until all succeed or one fails. If one fails, all following cases in the sequence are skipped. The cases in the sequence that have succeeded up to that point are reported as successful in the -log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    -             {scenarioB, [sequence], [testB1, testB2, testB3]}].
    +log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    +             {scenarioB, [sequence], [testB1, testB2, testB3]}].
     
    -all() -> [test1,
    +all() -> [test1,
               test2,
    -          {group,scenarioA},
    +          {group,scenarioA},
               test3,
    -          {group,scenarioB},
    -          test4].

    A sequence group can have subgroups. Such subgroups can have any property, that + {group,scenarioB}, + test4].

    A sequence group can have subgroups. Such subgroups can have any property, that is, they are not required to also be sequences. If you want the status of the subgroup to affect the sequence on the level above, return {return_group_result,Status} from @@ -320,7 +320,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.194256662 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/event_handler_chapter.html 2026-03-12 21:36:52.194256662 +0000 @@ -120,12 +120,12 @@ ct_run -event_handler_init instead of -event_handler.

    Note

    All event handler modules must have gen_event behavior. These modules must be precompiled and their locations must be added explicitly to the Erlang code server search path (as in the previous example).

    An event_handler tuple in argument Opts has the following definition (see -ct:run_test/1):

    {event_handler,EventHandlers}
    +ct:run_test/1):

    {event_handler,EventHandlers}
     
    -EventHandlers = EH | [EH]
    -EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}
    -InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are -installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. +EventHandlers = EH | [EH] +EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs} +InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are +installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. Event handler my_evh2 is started with the name of the current node in the init argument list.

    Event handlers can also be plugged in using one of the following test specification terms:

    • {event_handler, EventHandlers}
    • {event_handler, EventHandlers, InitArgs}
    • {event_handler, NodeRefs, EventHandlers}
    • {event_handler, NodeRefs, EventHandlers, InitArgs}

    EventHandlers is a list of module names. Before a test session starts, the @@ -258,7 +258,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.222256828 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/example_chapter.html 2026-03-12 21:36:52.226256851 +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 2026-03-12 21:36:52.262257064 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/getting_started_chapter.html 2026-03-12 21:36:52.258257041 +0000 @@ -115,47 +115,47 @@ the test suite module implements callback functions (mandatory or optional) for various purposes, for example:

    • Init/end configuration function for the test suite
    • Init/end configuration function for a test case
    • Init/end configuration function for a test case group
    • Test cases

    The configuration functions are optional. The following example is a test suite without configuration functions, including one simple test case, to check that -module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    --compile(export_all).
    +module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    +-compile(export_all).
     
    -all() ->
    -    [mod_exists].
    +all() ->
    +    [mod_exists].
     
    -mod_exists(_) ->
    -    {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    A Test Suite with Configuration Functions

    If you need to perform configuration operations to run your test, you can +mod_exists(_) -> + {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    A Test Suite with Configuration Functions

    If you need to perform configuration operations to run your test, you can implement configuration functions in your suite. The result from a configuration function is configuration data, or Config. This is a list of key-value tuples that get passed from the configuration function to the test cases (possibly through configuration functions on "lower level"). The data flow looks as follows:

    Configuration Data Flow in a Suite

    The following example shows a test suite that uses configuration functions to open and close a log file for the test cases (an operation that is unnecessary -and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    --export([all/0, init_per_suite/1, end_per_suite/1]).
    --export([check_restart_result/1, check_no_errors/1]).
    +and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    +-export([all/0, init_per_suite/1, end_per_suite/1]).
    +-export([check_restart_result/1, check_no_errors/1]).
     
    --define(value(Key,Config), proplists:get_value(Key,Config)).
    +-define(value(Key,Config), proplists:get_value(Key,Config)).
     
    -all() -> [check_restart_result, check_no_errors].
    +all() -> [check_restart_result, check_no_errors].
     
    -init_per_suite(InitConfigData) ->
    -    [{logref,open_log()} | InitConfigData].
    +init_per_suite(InitConfigData) ->
    +    [{logref,open_log()} | InitConfigData].
     
    -end_per_suite(ConfigData) ->
    -    close_log(?value(logref, ConfigData)).
    +end_per_suite(ConfigData) ->
    +    close_log(?value(logref, ConfigData)).
     
    -check_restart_result(ConfigData) ->
    -    TestData = read_log(restart, ?value(logref, ConfigData)),
    -    {match,_Line} = search_for("restart successful", TestData).
    +check_restart_result(ConfigData) ->
    +    TestData = read_log(restart, ?value(logref, ConfigData)),
    +    {match,_Line} = search_for("restart successful", TestData).
     
    -check_no_errors(ConfigData) ->
    -    TestData = read_log(all, ?value(logref, ConfigData)),
    -    case search_for("error", TestData) of
    -        {match,Line} -> ct:fail({error_found_in_log,Line});
    +check_no_errors(ConfigData) ->
    +    TestData = read_log(all, ?value(logref, ConfigData)),
    +    case search_for("error", TestData) of
    +        {match,Line} -> ct:fail({error_found_in_log,Line});
             nomatch -> ok
         end.

    The test cases verify, by parsing a log file, that our SUT has performed a successful restart and that no unexpected errors are printed.

    To execute the test cases in the recent test suite, type the following on the UNIX/Linux command line (assuming that the suite module is in the current -working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored +working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored in unique log directories on a different level). The following illustration shows the log file structure:

    HTML Log File Structure

    Questions and Answers

    Here follows some questions that you might have after reading this section with corresponding tips and links to the answers:

    • Question: "How and where can I specify variable data for my tests that must @@ -232,7 +232,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.286257206 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/install_chapter.html 2026-03-12 21:36:52.286257206 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.314257373 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/introduction.html 2026-03-12 21:36:52.314257373 +0000 @@ -157,7 +157,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.354257610 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/notes.html 2026-03-12 21:36:52.362257656 +0000 @@ -1185,7 +1185,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.414257965 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/run_test_chapter.html 2026-03-12 21:36:52.418257989 +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	2026-03-12 21:36:52.450258178 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/search.html	2026-03-12 21:36:52.450258178 +0000
    @@ -108,7 +108,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.474258321 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/test_structure_chapter.html 2026-03-12 21:36:52.474258321 +0000 @@ -183,7 +183,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.494258440 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/unix_telnet.html 2026-03-12 21:36:52.498258463 +0000 @@ -94,14 +94,14 @@

    Callback module for ct_telnet, for connecting to a Telnet server on a UNIX -host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    -       {port,PortNum},                 % optional
    -       {username,UserName},
    -       {password,Password},
    -       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, +host.

    It requires the following entry in the configuration file:

    {unix,[{telnet,HostNameOrIpAddress},
    +       {port,PortNum},                 % optional
    +       {username,UserName},
    +       {password,Password},
    +       {keep_alive,Bool}]}.            % optional

    To communicate through Telnet to the host specified by HostNameOrIpAddress, use the interface functions in ct_telnet, for example, open(Name) and cmd(Name,Cmd).

    Name is the name you allocated to the Unix host in your require statement, -for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server +for example:

    suite() -> [{require,Name,{unix,[telnet]}}].

    or

    ct:require(Name,{unix,[telnet]}).

    The "keep alive" activity (that is, that Common Test sends NOP to the server every 10 seconds if the connection is idle) can be enabled or disabled for one particular connection as described here. It can be disabled for all connections using telnet_settings (see ct_telnet).

    The {port,PortNum} tuple is optional and if omitted, default Telnet port 23 is @@ -255,7 +255,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.522258605 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/why_test_chapter.html 2026-03-12 21:36:52.522258605 +0000 @@ -163,7 +163,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/common_test-1.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 2026-03-12 21:36:52.558258818 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/common_test-1.29/doc/html/write_test_chapter.html 2026-03-12 21:36:52.562258843 +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 2026-03-12 21:36:52.594259032 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/404.html 2026-03-12 21:36:52.594259032 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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 2026-03-12 21:36:52.618259175 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/api-reference.html 2026-03-12 21:36:52.622259197 +0000 @@ -145,7 +145,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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 2026-03-12 21:36:52.646259340 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/beam_ssa.html 2026-03-12 21:36:52.650259364 +0000 @@ -146,8 +146,8 @@
    br ^common_end_of_catch common_end_of_catch: - @tmp = phi { @catched_val, ^landing_pad_block }, - { @successful_result, ^protected_blockN } + @tmp = phi { @catched_val, ^landing_pad_block }, + { @successful_result, ^protected_blockN } @result_of_catch_expr = catch_end @tag, @tmp

    Just as for a try-catch expression all code that can cause an exception in one of the protected blocks must have explicit control flow edges to the landing pad block.

    Exception Re-issuing

    A typical user-written try-catch expression will catch a subset of @@ -174,7 +174,7 @@ succeeded:body-instruction unless one of the following exceptions apply:

    • The function call can statically be proven to always fail.

    • The function call is to the erlang-module and can statically be proven to always succeed or fail.

    Variable Naming

    A variable name in BEAM SSA is either an atom or a non-negative -integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler +integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler transforms maintain a counter, the cnt-field in the b_function and opt_st records, which is incremented each time a new variable or label is created. In the following description the value of the @@ -233,7 +233,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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 2026-03-12 21:36:52.750259957 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl.html 2026-03-12 21:36:52.750259957 +0000 @@ -11521,7 +11521,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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 2026-03-12 21:36:52.786260169 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_clauses.html 2026-03-12 21:36:52.794260217 +0000 @@ -641,7 +641,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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 2026-03-12 21:36:52.822260384 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/cerl_trees.html 2026-03-12 21:36:52.826260407 +0000 @@ -698,7 +698,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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 2026-03-12 21:36:52.862260620 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compile.html 2026-03-12 21:36:52.862260620 +0000 @@ -106,7 +106,7 @@ compiler recursively from inside a parse transform.

    The list can be retrieved with env_compiler_options/0.

    Order of Compiler Options

    Options given in the compile() attribute in the source code take precedence over options given to the compiler, which in turn take precedence over options given in the environment.

    A later compiler option takes precedence over an earlier one in the -option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless +option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless the source code for module something contains a compile(nowarn_missing_spec) attribute.

    Change

    In Erlang/OTP 26 and earlier, the option order was the opposite of what is described here.

    Inlining

    The compiler can do function inlining within an Erlang @@ -124,14 +124,14 @@ which functions to inline, or {inline,[{Name,Arity},...]} to have the compiler inline all calls to the given functions. If the option is given inside a compile directive in an Erlang module, {Name,Arity} can be written as -Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
    +Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
     
    -pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to +pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to be inlined. Default is 24, which keeps the size of the inlined code roughly the same as the un-inlined version (only relatively small functions are inlined).

    Example:

    %% Aggressive inlining - will increase code size.
    --compile(inline).
    --compile({inline_size,100}).

    Inlining of List Functions

    The compiler can also inline various list manipulation functions from the module +-compile(inline). +-compile({inline_size,100}).

    Inlining of List Functions

    The compiler can also inline various list manipulation functions from the module list in STDLIB.

    This feature must be explicitly enabled with a compiler option or a -compile() attribute in the source module.

    To enable inlining of list functions, use option inline_list_funcs.

    The following functions are inlined:

    Parse Transformations

    Parse transformations are used when a programmer wants to use Erlang syntax but with different semantics. The original Erlang code is then transformed into @@ -861,10 +861,10 @@ function definitions. This is the preferred method of enabling and disabling features, since it is a local property of a module.

  • makedep - Produces a Makefile rule to track headers dependencies. No object file is produced.

    By default, this rule is written to <File>.Pbeam. However, if option -binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
    +binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
     
    --include_lib("eunit/include/eunit.hrl").
    --include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
    +-include_lib("eunit/include/eunit.hrl").
    +-include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
       /usr/local/lib/erlang/lib/eunit/include/eunit.hrl \
       header.hrl
  • makedep_side_effect - The dependencies are created as a side effect to the normal compilation process. This means that the object file will also be @@ -930,7 +930,7 @@ before Erlang/OTP R14A when calling a local function with the same name as an auto-imported BIF without module prefix.

    If the BIF is to be called, use the erlang module prefix in the call, not {no_auto_import,[{F,A}, ...]}.

    If this option is written in the source code, as a -compile directive, the -syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly +syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly smaller output file.

  • no_lint - Skips the pass that checks for errors and warnings. Only applicable together with the from_abstr option. This is mainly for implementations of other languages on top of Erlang, which have already done @@ -1320,7 +1320,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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 2026-03-05 20:51:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/beam_ssa.xhtml 2042-04-07 10:09:31.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 2026-03-05 20:51:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/compile.xhtml 2042-04-07 10:09:31.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 2026-03-05 20:51:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/content.opf 2042-04-07 10:09:31.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> compiler - 9.0.2 - urn:uuid:354fccdd-8fea-b9b7-bd75-71dc7b0a2ecc + urn:uuid:fdf75ffc-e853-0e27-0887-62515d4b27f4 en - 2026-03-05T20:51:12Z + 2042-04-07T10:09:31Z /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 2026-03-05 20:51:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/notes.xhtml 2042-04-07 10:09:31.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 2026-03-05 20:51:12.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/compiler.epub/OEBPS/ssa_checks.xhtml 2042-04-07 10:09:31.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 2026-03-12 21:36:53.078261900 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/notes.html 2026-03-12 21:36:53.074261877 +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-2026 Ericsson AB

      +

      Copyright © 1996-2042 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 2026-03-12 21:36:53.106262067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/search.html 2026-03-12 21:36:53.110262090 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/compiler-9.0.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 2026-03-12 21:36:53.130262209 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/compiler-9.0.2/doc/html/ssa_checks.html 2026-03-12 21:36:53.134262232 +0000 @@ -100,32 +100,32 @@ functionality.

      Syntax

      SSA checks are embedded in the source code as comments starting with with one of %ssa%, %%ssa% or %%%ssa%. This is a short introduction the syntax, for the full syntax please refer to the -ssa_check_when_clause production in erl_parse.yrl.

      SSA checks can be placed inside any Erlang function, for example:

      t0() ->
      +ssa_check_when_clause production in erl_parse.yrl.

      SSA checks can be placed inside any Erlang function, for example:

      t0() ->
       %ssa% () when post_ssa_opt ->
       %ssa%   ret(#{}).
      -  #{}.

      will check that t0/0 returns the literal #{}. If we want to check -that a function returns its first formal parameter, we can write:

      t1(A, _B) ->
      +  #{}.

      will check that t0/0 returns the literal #{}. If we want to check +that a function returns its first formal parameter, we can write:

      t1(A, _B) ->
       %ssa% (X, _) when post_ssa_opt ->
       %ssa%   ret(X).
         A.

      Note how we match the first formal parameter using X. The reason for having our own formal parameters for the SSA check, is that we don't want to introduce new identifiers at the Erlang level to support SSA-level checks. Consider if t1/2 had been defined as t1([A|As], B) we would have had to introduce a new identifier for the aggregate -value [A|As].

      The full syntax for a SSA check clause is:

      <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

      where <expected-result> can be one of pass (the check must +value [A|As].

      The full syntax for a SSA check clause is:

      <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

      where <expected-result> can be one of pass (the check must succeed), fail and xfail (the check must fail). Omitting <expected-result> is parsed as an implicit pass.

      <formals> is a comma-separated list of variables.

      <pipeline-location> specifies when in the compiler pipeline to run the checks. For now the only supported value for <pipeline-location> is post_ssa_opt which runs the checks after the ssa_opt pass.

      <checks> is a comma-separated list of matches against the BEAM SSA -code. For non-flow-control operations the syntax is:

      <variable> = <operation> ( <arguments> ) <annotation>?

      where <operation> is the #b_set.op field from the internal SSA -representation. BIFs are written as bif:<atom>.

      <arguments> is a comma-separated list of variables or literals.

      For flow control operations and labels, the syntax is as follows:

      br(<bool>, <true-label>, <false-label>)
      +code. For non-flow-control operations the syntax is:

      <variable> = <operation> ( <arguments> ) <annotation>?

      where <operation> is the #b_set.op field from the internal SSA +representation. BIFs are written as bif:<atom>.

      <arguments> is a comma-separated list of variables or literals.

      For flow control operations and labels, the syntax is as follows:

      br(<bool>, <true-label>, <false-label>)
       
      -switch(<value>, <fail-label>, [{<label>,<value>},...])
      +switch(<value>, <fail-label>, [{<label>,<value>},...])
       
      -ret(<value>)
      +ret(<value>)
       
       label <value>

      where <value> is a literal or a variable.

      A check can also include an assertion on operation annotations. The assertion is written as a map-like pattern following the argument -list, for example:

      t0() ->
      +list, for example:

      t0() ->
       %ssa% () when post_ssa_opt ->
       %ssa% _ = call(fun return_int/0) { result_type => {t_integer,{17,17}},
       %ssa%                              location => {_,32} },
      @@ -133,9 +133,9 @@
       %ssa%    result_type => {t_tuple,2,true,#{1 => {t_integer,{1,1}},
       %ssa%                                     2 => {t_integer,{2,2}}}}
       %ssa% }.
      -    X = return_int(),
      -    Y = return_tuple(),
      -    {X, Y}.

      Semantics

      When an SSA assertion is matched against the BEAM SSA for a function, + X = return_int(), + Y = return_tuple(), + {X, Y}.

      Semantics

      When an SSA assertion is matched against the BEAM SSA for a function, patterns are applied sequentially. If the current pattern doesn't match, the checker tries with the next instruction. If the checker reaches the end of the SSA representation without having matched all @@ -191,7 +191,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.158262375 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/404.html 2026-03-12 21:36:53.158262375 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.190262563 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/algorithm_details.html 2026-03-12 21:36:53.190262563 +0000 @@ -188,7 +188,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.218262730 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/api-reference.html 2026-03-12 21:36:53.218262730 +0000 @@ -118,7 +118,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-05 20:51:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/content.opf 2042-04-07 10:10:13.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> crypto - 5.7 - urn:uuid:e4dc55d9-d5ba-b523-1fa6-38d69abc1172 + urn:uuid:f604f1d9-b374-8e9d-281c-048d3db51f76 en - 2026-03-05T20:51:50Z + 2042-04-07T10:10:13Z /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 2026-03-05 20:51:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/crypto.xhtml 2042-04-07 10:10:13.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 2026-03-05 20:51:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/engine_keys.xhtml 2042-04-07 10:10:13.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 2026-03-05 20:51:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/engine_load.xhtml 2042-04-07 10:10:13.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 2026-03-05 20:51:50.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.epub/OEBPS/new_api.xhtml 2042-04-07 10:10:13.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 2026-03-12 21:36:53.446264082 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto.html 2026-03-12 21:36:53.446264082 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:36:53.478264271 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/crypto_app.html 2026-03-12 21:36:53.482264294 +0000 @@ -157,7 +157,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.506264437 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_keys.html 2026-03-12 21:36:53.510264461 +0000 @@ -107,30 +107,30 @@ string or binary and depends on the Engine loaded
  • an Erlang map is constructed with the Engine reference, the key reference and possibly a key passphrase if needed by the Engine. See the Reference Manual for details of the map.
  • Use Cases

    Sign with an engine stored private key

    This example shows how to construct a key reference that is used in a sign -operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
    +operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
     ...
    -{ok,#Ref<0.2399045421.3028942852.173962>}
    -2> PrivKey = #{engine => EngineRef,
    -               key_id => "id of the private key in Engine"}.
    +{ok,#Ref<0.2399045421.3028942852.173962>}
    +2> PrivKey = #{engine => EngineRef,
    +               key_id => "id of the private key in Engine"}.
     ...
    -3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
    -<<65,6,125,254,54,233,84,77,83,63,168,28,169,214,121,76,
    -  207,177,124,183,156,185,160,243,36,79,125,230,231,...>>

    Verify with an engine stored public key

    Here the signature and message in the last example is verifyed using the public +3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey). +<<65,6,125,254,54,233,84,77,83,63,168,28,169,214,121,76, + 207,177,124,183,156,185,160,243,36,79,125,230,231,...>>

    Verify with an engine stored public key

    Here the signature and message in the last example is verifyed using the public key. The public key is stored in an engine, only to exemplify that it is -possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    -                 key_id => "id of the public key in Engine"}.
    +possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    +                 key_id => "id of the public key in Engine"}.
     ...
    -5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
    +5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
     true
     6>

    Using a password protected private key

    The same example as the first sign example, except that a password protects the -key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
    +key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
                       key_id => "id of the pwd protected private key in Engine",
    -		  password => "password"}.
    +		  password => "password"}.
     ...
    -7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
    -<<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
    +7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
    +<<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
       175,106,77,241,141,120,72,149,181,181,194,154,175,76,
    -  223,...>>
    +  223,...>>
     8>
    @@ -183,7 +183,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.538264626 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/engine_load.html 2026-03-12 21:36:53.542264651 +0000 @@ -98,32 +98,32 @@ performance over its software-based counterpart, which is known as cryptographic acceleration.

    Note

    The file name requirement on the engine dynamic library can differ between SSL versions.

    Use Cases

    Dynamically load an engine from default directory

    If the engine is located in the OpenSSL/LibreSSL installation engines -directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    - {ok, #Ref}

    Load an engine with the dynamic engine

    Load an engine with the help of the dynamic engine by giving the path to the -library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    - {ok, #Ref}

    Load an engine and replace some methods

    Load an engine with the help of the dynamic engine and just replace some engine -methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    -{ok, #Ref}
    -4> ok = crypto:engine_register(Engine, [engine_method_digests]).
    +directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    + {ok, #Ref}

    Load an engine with the dynamic engine

    Load an engine with the help of the dynamic engine by giving the path to the +library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    + {ok, #Ref}

    Load an engine and replace some methods

    Load an engine with the help of the dynamic engine and just replace some engine +methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    +{ok, #Ref}
    +4> ok = crypto:engine_register(Engine, [engine_method_digests]).
     ok

    Load with the ensure loaded function

    This function makes sure the engine is loaded just once and the ID is added to the internal engine list of OpenSSL. The following calls to the function will -check if the ID is loaded and then just get a new reference to the engine.

     5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>,
    -                                               <<"/some/path/otp_test_engine.so">>).
    - {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
    +check if the ID is loaded and then just get a new reference to the engine.

     5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>,
    +                                               <<"/some/path/otp_test_engine.so">>).
    + {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
      ok

    To unload it use crypto:engine_unload/1 which removes the references to the -engine.

     6> crypto:engine_unload(Engine).
    - ok

    List all engines currently loaded

     8> crypto:engine_list().
    -[<<"dynamic">>, <<"MD5">>]
    +engine.

     6> crypto:engine_unload(Engine).
    + ok

    List all engines currently loaded

     8> crypto:engine_list().
    +[<<"dynamic">>, <<"MD5">>]
    @@ -175,7 +175,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.566264793 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/fips.html 2026-03-12 21:36:53.570264816 +0000 @@ -198,7 +198,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.598264982 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/new_api.html 2026-03-12 21:36:53.606265030 +0000 @@ -114,85 +114,85 @@ initialises the crypto context. One or more calls crypto_update/2 does the actual encryption or decryption for each block.

    This example shows first the encryption of two blocks and then decryptions of the cipher text, but divided into three blocks just to show that it is possible -to divide the plain text and cipher text differently for some ciphers:

    	1> application:start(crypto).
    +to divide the plain text and cipher text differently for some ciphers:

    	1> application:start(crypto).
     	ok
    -	2> Key = <<1:128>>.
    -	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    -	3> IV = <<0:128>>.
    -	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    -	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
    +	2> Key = <<1:128>>.
    +	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    +	3> IV = <<0:128>>.
    +	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    +	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
     	#Ref<0.3768901617.1128660993.124047>
    -	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
    -	<<67,44,216,166,25,130,203,5,66,6,162>>
    -	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
    -	<<16,79,94,115,234,197,94,253,16,144,151,41>>
    +	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
    +	<<67,44,216,166,25,130,203,5,66,6,162>>
    +	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
    +	<<16,79,94,115,234,197,94,253,16,144,151,41>>
     	7>
    -	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
    +	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
     	#Ref<0.3768901617.1128660994.124255>
    -	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
    -	<<"First b">>
    -	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    -        94,253,16,144,151>>).
    -	<<"ytesSecond byte">>
    -	10> crypto:crypto_update(StateDec, <<41>>).
    -	<<"s">>
    +	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
    +	<<"First b">>
    +	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    +        94,253,16,144,151>>).
    +	<<"ytesSecond byte">>
    +	10> crypto:crypto_update(StateDec, <<41>>).
    +	<<"s">>
     	11>

    Note that the internal data that the StateEnc and StateDec references are destructivly updated by the calls to crypto_update/2. This is to gain time in the calls of the nifs interfacing the cryptolib. In a loop where the state is saved in the loop's state, it also saves one update of the loop state per crypto operation.

    For example, a simple server receiving text parts to encrypt and send the result -back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    -	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
    +back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    +	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
     
    -	crypto_loop(State) ->
    +	crypto_loop(State) ->
     	receive
    -        {Text, Requester} ->
    -        Requester ! crypto:crypto_update(State, Text),
    -	loop(State)
    +        {Text, Requester} ->
    +        Requester ! crypto:crypto_update(State, Text),
    +	loop(State)
     	end.

    Example of crypto_one_time/5

    The same example as in the previous section, -but now with one call to crypto_one_time/5:

    	1> Key = <<1:128>>.
    -	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    -	2> IV = <<0:128>>.
    -	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    -	3> Txt = [<<"First bytes">>,<<"Second bytes">>].
    -	[<<"First bytes">>,<<"Second bytes">>]
    -	4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true).
    -	<<67,44,216,166,25,130,203,5,66,6,162,16,79,94,115,234,
    -	197,94,253,16,144,151,41>>
    +but now with one call to crypto_one_time/5:

    	1> Key = <<1:128>>.
    +	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    +	2> IV = <<0:128>>.
    +	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    +	3> Txt = [<<"First bytes">>,<<"Second bytes">>].
    +	[<<"First bytes">>,<<"Second bytes">>]
    +	4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true).
    +	<<67,44,216,166,25,130,203,5,66,6,162,16,79,94,115,234,
    +	197,94,253,16,144,151,41>>
     	5>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one single binary: <<"First bytesSecond bytes">>.

    Example of crypto_one_time_aead/6

    The same example as in the previous section, but now with one -call to crypto_one_time_aead/6:

    	1> Key = <<1:128>>.
    -	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    -	2> IV = <<0:128>>.
    -	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    -	3> Txt = [<<"First bytes">>,<<"Second bytes">>].
    -	[<<"First bytes">>,<<"Second bytes">>]
    -	4> AAD = <<"Some additional auth data">>.
    -	<<"Some additional auth data">>
    -	5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true).
    -	{<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72,
    -	192,103,176,90,104,15,71,158>>,
    -	<<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>}
    +call to crypto_one_time_aead/6:

    	1> Key = <<1:128>>.
    +	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    +	2> IV = <<0:128>>.
    +	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    +	3> Txt = [<<"First bytes">>,<<"Second bytes">>].
    +	[<<"First bytes">>,<<"Second bytes">>]
    +	4> AAD = <<"Some additional auth data">>.
    +	<<"Some additional auth data">>
    +	5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true).
    +	{<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72,
    +	192,103,176,90,104,15,71,158>>,
    +	<<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>}
     	6>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one -single binary: <<"First bytesSecond bytes">>.

    Example of mac_init mac_update and mac_final

    	1> Key = <<1:128>>.
    -	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    -	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
    +single binary: <<"First bytesSecond bytes">>.

    Example of mac_init mac_update and mac_final

    	1> Key = <<1:128>>.
    +	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    +	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
     	#Ref<0.2424664121.2781478916.232610>
    -	3> crypto:mac_update(StateMac, <<"First bytes">>).
    +	3> crypto:mac_update(StateMac, <<"First bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	4> crypto:mac_update(StateMac, " ").
    +	4> crypto:mac_update(StateMac, " ").
     	#Ref<0.2424664121.2781478916.232610>
    -	5> crypto:mac_update(StateMac, <<"last bytes">>).
    +	5> crypto:mac_update(StateMac, <<"last bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	6> crypto:mac_final(StateMac).
    -	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
    -	249>>
    -	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
    -	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
    -	249>>
    -	8> v(7) == v(6).
    +	6> crypto:mac_final(StateMac).
    +	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
    +	249>>
    +	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
    +	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
    +	249>>
    +	8> v(7) == v(6).
     	true
     	9>

    Retired cipher names

    This table lists the retired cipher names in the first column and suggests names to replace them with in the second column.

    The new names follows the OpenSSL libcrypto names. The format is @@ -244,7 +244,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.646265266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/notes.html 2026-03-12 21:36:53.650265291 +0000 @@ -549,7 +549,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/crypto-5.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 2026-03-12 21:36:53.674265433 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/crypto-5.7/doc/html/search.html 2026-03-12 21:36:53.674265433 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 2026-03-12 21:36:53.706265622 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/404.html 2026-03-12 21:36:53.706265622 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 2026-03-12 21:36:53.734265787 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/api-reference.html 2026-03-12 21:36:53.734265787 +0000 @@ -136,7 +136,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/content.opf 2026-03-05 20:51:46.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/content.opf 2042-04-07 10:10:08.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> debugger - 6.0.3 - urn:uuid:dad68f7e-0816-191e-dea5-4e49f7c83653 + urn:uuid:233b82d0-5599-a027-b29a-e2dfe13377f6 en - 2026-03-05T20:51:46Z + 2042-04-07T10:10:08Z /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml 2026-03-05 20:51:46.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/debugger_chapter.xhtml 2042-04-07 10:10:08.000000000 +0000 @@ -38,12 +38,12 @@ window, View Module window, or Attach Process window.

    Executable Lines

    To have an effect, a breakpoint must be set at an executable line, which is a line of code containing an executable expression such as a matching or a function call. A blank line or a line containing a comment, function head, or -pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    -2:   case get_file(Module,Compiled) of
    -3:     {ok,File} ->
    -4:       case code:which(Module) of
    +pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    +2:   case get_file(Module,Compiled) of
    +3:     {ok,File} ->
    +4:       case code:which(Module) of
     5:         ?TAG ->
    -6:           {loaded,File};
    +6:           {loaded,File};
     7:         _ ->
     8:           unloaded
     9:       end;
    @@ -64,13 +64,13 @@
     returns unbound or {value,Value}.

    Conditional Break Dialog Window

    Right-click the Module entry to open a popup menu from which the appropriate module can be selected.

    Example:

    A conditional breakpoint calling c_test:c_break/1 is added at line 6 in module fact. Each time the breakpoint is reached, the function is called. When N is -equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    -6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    --export([c_break/1]).
    +equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    +6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    +-export([c_break/1]).
     
    -c_break(Bindings) ->
    -    case int:get_binding('N', Bindings) of
    -        {value, 3} ->
    +c_break(Bindings) ->
    +    case int:get_binding('N', Bindings) of
    +        {value, 3} ->
                 true;
             _ ->
                 false
    @@ -79,12 +79,12 @@
     right-click the Module entry.

    To bring up all functions of the module in the listbox, click the OK button (or press the Return or Tab key) when a module name has been specified,.

    Stack Trace

    The Erlang emulator keeps track of a stack trace, information about recent function calls. This information is used if an error occurs, for example:

    1> catch a+1.
    -{'EXIT',{badarith,[{erlang,'+',[a,1],[]},
    -                   {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]},
    -                   {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]},
    -                   {shell,exprs,7,[{file,"shell.erl"},{line,674}]},
    -                   {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]},
    -                   {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section +{'EXIT',{badarith,[{erlang,'+',[a,1],[]}, + {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]}, + {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]}, + {shell,exprs,7,[{file,"shell.erl"},{line,674}]}, + {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]}, + {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section Errors and Error Handling in the Erlang Reference Manual.

    Debugger emulates the stack trace by keeping track of recently called interpreted functions. (The real stack trace cannot be used, as it shows which /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/int.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/int.xhtml 2026-03-05 20:51:46.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/int.xhtml 2042-04-07 10:10:08.000000000 +0000 @@ -563,7 +563,7 @@

    Sets when and how to attach automatically to a process executing code in interpreted modules.

    By default when the interpreter is started, automatic attach is disabled.

    If Flags is an empty list, automatic attach is disabled.

    Otherwise Flags should be a list containing at least one of the following flags:

    • init - Attach when a process for the first time calls an interpreted -function.
    • break - Attach whenever a process reaches a breakpoint.
    • exit - Attach when a process terminates.

    When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    +function.
  • break - Attach whenever a process reaches a breakpoint.
  • exit - Attach when a process terminates.
  • When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/i.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/i.xhtml 2026-03-05 20:51:46.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/i.xhtml 2042-04-07 10:10:08.000000000 +0000 @@ -28,9 +28,9 @@ interpreted processes and break points.

    It is possible to attach to interpreted processes by only giving the corresponding process identity. By default, an attachment window is displayed. Processes at other Erlang nodes can be attached manually or automatically.

    The functions in this module are defined in the Erlang shell. That is, -they can be called without the i: prefix. For example:

    1> ii(t).
    -{module,t}
    -2> iaa([init]).
    +they can be called without the i: prefix. For example:

    1> ii(t).
    +{module,t}
    +2> iaa([init]).
     true
    /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/notes.xhtml 2026-03-05 20:51:46.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.epub/OEBPS/notes.xhtml 2042-04-07 10:10:08.000000000 +0000 @@ -17,24 +17,24 @@

    Debugger Release Notes

    -

    This document describes the changes made to the Debugger application.

    Debugger 6.0.3

    Fixed Bugs and Malfunctions

    • Fixed unbound error in interpreted modules

      Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

    Debugger 6.0.2

    Fixed Bugs and Malfunctions

    • Fixed debugger priv dir, which was removed and caused crashes when the icons could not be found.

      Own Id: OTP-19687 Aux Id: PR-9994, GH-9858

    Debugger 6.0.1

    Fixed Bugs and Malfunctions

    • Restore deleted icon so that debugger does not crash on startup.

      Own Id: OTP-19641 Aux Id: GH-9858, PR-9861

    Debugger 6.0

    Fixed Bugs and Malfunctions

    • Error handling has been improved when modules fail to load.

      Own Id: OTP-19484 Aux Id: GH-7819, PR-9399

    Improvements and New Features

    • Comprehensions have been extended with zip generators according to EEP 73.

      Example:

      1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
      -[5,7,9]

      Own Id: OTP-19184 Aux Id: PR-8926

    • New strict generators have been added for comprehensions.

      The currently existing generators are "relaxed": they ignore terms in the +

      This document describes the changes made to the Debugger application.

      Debugger 6.0.3

      Fixed Bugs and Malfunctions

      • Fixed unbound error in interpreted modules

        Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

      Debugger 6.0.2

      Fixed Bugs and Malfunctions

      • Fixed debugger priv dir, which was removed and caused crashes when the icons could not be found.

        Own Id: OTP-19687 Aux Id: PR-9994, GH-9858

      Debugger 6.0.1

      Fixed Bugs and Malfunctions

      • Restore deleted icon so that debugger does not crash on startup.

        Own Id: OTP-19641 Aux Id: GH-9858, PR-9861

      Debugger 6.0

      Fixed Bugs and Malfunctions

      • Error handling has been improved when modules fail to load.

        Own Id: OTP-19484 Aux Id: GH-7819, PR-9399

      Improvements and New Features

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        +[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • New strict generators have been added for comprehensions.

        The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

        The new strict generators fail with exception badmatch if a pattern doesn't match.

        Examples:

        Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        -[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

        1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
        +[{ok,1},{error,2}]

        If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
        +that term not matching will cause a crash:

        2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
         ** exception error: no match of right hand side value ok

        Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

        The strict version for bitstring generators is <:=.

        Own Id: OTP-19317 Aux Id: PR-8625

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

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

      Debugger 5.5.0.1

      Fixed Bugs and Malfunctions

      • Fix unbound error in interpreted modules

        Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

      Debugger 5.5

      Fixed Bugs and Malfunctions

      • Defining a fun in the shell using the syntax fun Name/Arity would fail. This has been corrected so that the following now works:

        1> F = fun is_atom/1.
         #Fun.erl.42.18682967>
        -> F(a).
        +> F(a).
         true
         3> Id = fun id/1.
         #Fun.erl.42.18682967>
        -4> Id(42).
        +4> Id(42).
         ** exception error: undefined shell command id/1
        -5> id(I) -> I.
        +5> id(I) -> I.
         ok
        -6> Id(42).
        +6> Id(42).
         42

        The Debugger has also been corrected to correctly handle this syntax for a BIF.

        Own Id: OTP-19322 Aux Id: GH-8963, PR-8987

      Improvements and New Features

      • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

        Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

      Debugger 5.4

      Fixed Bugs and Malfunctions

      • The dependencies for this application are now listed in the app file.

        Own Id: OTP-18831 Aux Id: PR-7441

      Improvements and New Features

      • Type specs have been added to all API functions.

        Own Id: OTP-18819 Aux Id: PR-7781

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

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

      • The Debugger now use a trace session for its internal use of tracing to avoid interfering with the user's use of tracing.

        Own Id: OTP-19074 Aux Id: PR-8389

      Debugger 5.3.4

      Fixed Bugs and Malfunctions

      • Guards with nested record expression could wrongly evaluate to false.

        Own Id: OTP-18958 Aux Id: GH-8120, PR-8275

      Debugger 5.3.3

      Fixed Bugs and Malfunctions

      • Map comprehensions now work in the Debugger.

        Own Id: OTP-18888 Aux Id: GH-7914

      Debugger 5.3.2

      Fixed Bugs and Malfunctions

      • The call int:no_break(Module) did not remove any breakpoints.

        Own Id: OTP-18644 Aux Id: GH-7336

      • The maybe expression is now supported in the Debugger.

        Own Id: OTP-18740 Aux Id: GH-7410, PR-7599

      Debugger 5.3.1.3

      Fixed Bugs and Malfunctions

      • Guards with nested record expression could wrongly evaluate to false.

        Own Id: OTP-18958 Aux Id: GH-8120, PR-8275

      Debugger 5.3.1.2

      Fixed Bugs and Malfunctions

      • The maybe expression is now supported in the Debugger.

        Own Id: OTP-18740 Aux Id: GH-7410, PR-7599

      Debugger 5.3.1.1

      Fixed Bugs and Malfunctions

      • The call int:no_break(Module) did not remove any breakpoints.

        Own Id: OTP-18644 Aux Id: GH-7336

      Debugger 5.3.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that would cause analysis to crash.

        Own Id: OTP-18372 Aux Id: GH-6580

      Debugger 5.3

      Improvements and New Features

      • The configuration files .erlang, .erlang.cookie and .erlang.crypt can now be located in the XDG /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html 2026-03-12 21:36:53.882266665 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger.html 2026-03-12 21:36:53.886266688 +0000 @@ -312,7 +312,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 2026-03-12 21:36:53.914266855 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/debugger_chapter.html 2026-03-12 21:36:53.922266903 +0000 @@ -110,12 +110,12 @@ window, View Module window, or Attach Process window.

        Executable Lines

        To have an effect, a breakpoint must be set at an executable line, which is a line of code containing an executable expression such as a matching or a function call. A blank line or a line containing a comment, function head, or -pattern in a case statement or receive statement is not executable.

        In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

        1: is_loaded(Module,Compiled) ->
        -2:   case get_file(Module,Compiled) of
        -3:     {ok,File} ->
        -4:       case code:which(Module) of
        +pattern in a case statement or receive statement is not executable.

        In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

        1: is_loaded(Module,Compiled) ->
        +2:   case get_file(Module,Compiled) of
        +3:     {ok,File} ->
        +4:       case code:which(Module) of
         5:         ?TAG ->
        -6:           {loaded,File};
        +6:           {loaded,File};
         7:         _ ->
         8:           unloaded
         9:       end;
        @@ -136,13 +136,13 @@
         returns unbound or {value,Value}.

        Conditional Break Dialog Window

        Right-click the Module entry to open a popup menu from which the appropriate module can be selected.

        Example:

        A conditional breakpoint calling c_test:c_break/1 is added at line 6 in module fact. Each time the breakpoint is reached, the function is called. When N is -equal to 3, the function returns true and the process stops.

        Extract from fact.erl:

        5. fac(0) -> 1;
        -6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

        Definition of c_test:c_break/1:

        -module(c_test).
        --export([c_break/1]).
        -
        -c_break(Bindings) ->
        -    case int:get_binding('N', Bindings) of
        -        {value, 3} ->
        +equal to 3, the function returns true and the process stops.

        Extract from fact.erl:

        5. fac(0) -> 1;
        +6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

        Definition of c_test:c_break/1:

        -module(c_test).
        +-export([c_break/1]).
        +
        +c_break(Bindings) ->
        +    case int:get_binding('N', Bindings) of
        +        {value, 3} ->
                     true;
                 _ ->
                     false
        @@ -151,12 +151,12 @@
         right-click the Module entry.

        To bring up all functions of the module in the listbox, click the OK button (or press the Return or Tab key) when a module name has been specified,.

        Stack Trace

        The Erlang emulator keeps track of a stack trace, information about recent function calls. This information is used if an error occurs, for example:

        1> catch a+1.
        -{'EXIT',{badarith,[{erlang,'+',[a,1],[]},
        -                   {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]},
        -                   {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]},
        -                   {shell,exprs,7,[{file,"shell.erl"},{line,674}]},
        -                   {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]},
        -                   {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

        For details about the stack trace, see section +{'EXIT',{badarith,[{erlang,'+',[a,1],[]}, + {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]}, + {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]}, + {shell,exprs,7,[{file,"shell.erl"},{line,674}]}, + {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]}, + {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

        For details about the stack trace, see section Errors and Error Handling in the Erlang Reference Manual.

        Debugger emulates the stack trace by keeping track of recently called interpreted functions. (The real stack trace cannot be used, as it shows which @@ -326,7 +326,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html 2026-03-12 21:36:53.950267068 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/i.html 2026-03-12 21:36:53.958267116 +0000 @@ -99,9 +99,9 @@ interpreted processes and break points.

        It is possible to attach to interpreted processes by only giving the corresponding process identity. By default, an attachment window is displayed. Processes at other Erlang nodes can be attached manually or automatically.

        The functions in this module are defined in the Erlang shell. That is, -they can be called without the i: prefix. For example:

        1> ii(t).
        -{module,t}
        -2> iaa([init]).
        +they can be called without the i: prefix. For example:

        1> ii(t).
        +{module,t}
        +2> iaa([init]).
         true
        @@ -1315,7 +1315,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 2026-03-12 21:36:53.990267306 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/int.html 2026-03-12 21:36:53.994267328 +0000 @@ -645,7 +645,7 @@

        Sets when and how to attach automatically to a process executing code in interpreted modules.

        By default when the interpreter is started, automatic attach is disabled.

        If Flags is an empty list, automatic attach is disabled.

        Otherwise Flags should be a list containing at least one of the following flags:

        • init - Attach when a process for the first time calls an interpreted -function.
        • break - Attach whenever a process reaches a breakpoint.
        • exit - Attach when a process terminates.

        When the specified event occurs, the function Function is called as:

        spawn(Module, Name, [Pid | Args])

        Pid is the pid of the process executing interpreted code.

        +function.
      • break - Attach whenever a process reaches a breakpoint.
      • exit - Attach when a process terminates.

      When the specified event occurs, the function Function is called as:

      spawn(Module, Name, [Pid | Args])

      Pid is the pid of the process executing interpreted code.

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

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html 2026-03-12 21:36:54.022267495 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/introduction.html 2026-03-12 21:36:54.022267495 +0000 @@ -145,7 +145,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html 2026-03-12 21:36:54.054267685 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/notes.html 2026-03-12 21:36:54.058267708 +0000 @@ -89,24 +89,24 @@ -

      This document describes the changes made to the Debugger application.

      Debugger 6.0.3

      Fixed Bugs and Malfunctions

      • Fixed unbound error in interpreted modules

        Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

      Debugger 6.0.2

      Fixed Bugs and Malfunctions

      • Fixed debugger priv dir, which was removed and caused crashes when the icons could not be found.

        Own Id: OTP-19687 Aux Id: PR-9994, GH-9858

      Debugger 6.0.1

      Fixed Bugs and Malfunctions

      • Restore deleted icon so that debugger does not crash on startup.

        Own Id: OTP-19641 Aux Id: GH-9858, PR-9861

      Debugger 6.0

      Fixed Bugs and Malfunctions

      • Error handling has been improved when modules fail to load.

        Own Id: OTP-19484 Aux Id: GH-7819, PR-9399

      Improvements and New Features

      • Comprehensions have been extended with zip generators according to EEP 73.

        Example:

        1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
        -[5,7,9]

        Own Id: OTP-19184 Aux Id: PR-8926

      • New strict generators have been added for comprehensions.

        The currently existing generators are "relaxed": they ignore terms in the +

        This document describes the changes made to the Debugger application.

        Debugger 6.0.3

        Fixed Bugs and Malfunctions

        • Fixed unbound error in interpreted modules

          Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

        Debugger 6.0.2

        Fixed Bugs and Malfunctions

        • Fixed debugger priv dir, which was removed and caused crashes when the icons could not be found.

          Own Id: OTP-19687 Aux Id: PR-9994, GH-9858

        Debugger 6.0.1

        Fixed Bugs and Malfunctions

        • Restore deleted icon so that debugger does not crash on startup.

          Own Id: OTP-19641 Aux Id: GH-9858, PR-9861

        Debugger 6.0

        Fixed Bugs and Malfunctions

        • Error handling has been improved when modules fail to load.

          Own Id: OTP-19484 Aux Id: GH-7819, PR-9399

        Improvements and New Features

        • Comprehensions have been extended with zip generators according to EEP 73.

          Example:

          1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
          +[5,7,9]

          Own Id: OTP-19184 Aux Id: PR-8926

        • New strict generators have been added for comprehensions.

          The currently existing generators are "relaxed": they ignore terms in the right-hand side expression that do not match the left-hand side pattern.

          The new strict generators fail with exception badmatch if a pattern doesn't match.

          Examples:

          Using the current relaxed generator operator <-, any element not matching -the pattern {_,_} will be silently discarded:

          1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
          -[{ok,1},{error,2}]

          If the intention is that all lists processed by a list comprehension must only +the pattern {_,_} will be silently discarded:

          1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
          +[{ok,1},{error,2}]

          If the intention is that all lists processed by a list comprehension must only contain tuples of size two, using the new strict version of the operator ensures -that term not matching will cause a crash:

          2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
          +that term not matching will cause a crash:

          2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
           ** exception error: no match of right hand side value ok

          Using the strict generator operator to mark the intention that all list elements must match the pattern could help finding mistakes quicker if something unpexected is added to the list processed by the generator.

          The strict version for bitstring generators is <:=.

          Own Id: OTP-19317 Aux Id: PR-8625

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

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

        Debugger 5.5.0.1

        Fixed Bugs and Malfunctions

        • Fix unbound error in interpreted modules

          Own Id: OTP-19719 Aux Id: GH-10057, PR-10066

        Debugger 5.5

        Fixed Bugs and Malfunctions

        • Defining a fun in the shell using the syntax fun Name/Arity would fail. This has been corrected so that the following now works:

          1> F = fun is_atom/1.
           #Fun.erl.42.18682967>
          -> F(a).
          +> F(a).
           true
           3> Id = fun id/1.
           #Fun.erl.42.18682967>
          -4> Id(42).
          +4> Id(42).
           ** exception error: undefined shell command id/1
          -5> id(I) -> I.
          +5> id(I) -> I.
           ok
          -6> Id(42).
          +6> Id(42).
           42

          The Debugger has also been corrected to correctly handle this syntax for a BIF.

          Own Id: OTP-19322 Aux Id: GH-8963, PR-8987

        Improvements and New Features

        • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

          Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

        Debugger 5.4

        Fixed Bugs and Malfunctions

        • The dependencies for this application are now listed in the app file.

          Own Id: OTP-18831 Aux Id: PR-7441

        Improvements and New Features

        • Type specs have been added to all API functions.

          Own Id: OTP-18819 Aux Id: PR-7781

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

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

        • The Debugger now use a trace session for its internal use of tracing to avoid interfering with the user's use of tracing.

          Own Id: OTP-19074 Aux Id: PR-8389

        Debugger 5.3.4

        Fixed Bugs and Malfunctions

        • Guards with nested record expression could wrongly evaluate to false.

          Own Id: OTP-18958 Aux Id: GH-8120, PR-8275

        Debugger 5.3.3

        Fixed Bugs and Malfunctions

        • Map comprehensions now work in the Debugger.

          Own Id: OTP-18888 Aux Id: GH-7914

        Debugger 5.3.2

        Fixed Bugs and Malfunctions

        • The call int:no_break(Module) did not remove any breakpoints.

          Own Id: OTP-18644 Aux Id: GH-7336

        • The maybe expression is now supported in the Debugger.

          Own Id: OTP-18740 Aux Id: GH-7410, PR-7599

        Debugger 5.3.1.3

        Fixed Bugs and Malfunctions

        • Guards with nested record expression could wrongly evaluate to false.

          Own Id: OTP-18958 Aux Id: GH-8120, PR-8275

        Debugger 5.3.1.2

        Fixed Bugs and Malfunctions

        • The maybe expression is now supported in the Debugger.

          Own Id: OTP-18740 Aux Id: GH-7410, PR-7599

        Debugger 5.3.1.1

        Fixed Bugs and Malfunctions

        • The call int:no_break(Module) did not remove any breakpoints.

          Own Id: OTP-18644 Aux Id: GH-7336

        Debugger 5.3.1

        Fixed Bugs and Malfunctions

        • Fixed a bug that would cause analysis to crash.

          Own Id: OTP-18372 Aux Id: GH-6580

        Debugger 5.3

        Improvements and New Features

        • The configuration files .erlang, .erlang.cookie and .erlang.crypt can now be located in the XDG @@ -235,7 +235,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html 2026-03-12 21:36:54.086267875 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/debugger-6.0.3/doc/html/search.html 2026-03-12 21:36:54.090267897 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html 2026-03-12 21:36:54.114268040 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/404.html 2026-03-12 21:36:54.114268040 +0000 @@ -110,7 +110,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 2026-03-12 21:36:54.142268206 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/api-reference.html 2026-03-12 21:36:54.142268206 +0000 @@ -118,7 +118,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/content.opf 2026-03-05 20:52:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/content.opf 2042-04-07 10:10:32.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> dialyzer - 5.4 - urn:uuid:5a271230-a9a2-d09b-a7f4-4dabae70f498 + urn:uuid:dd1e2c9b-9c64-921e-3cde-eaf656117fba en - 2026-03-05T20:52:07Z + 2042-04-07T10:10:32Z /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml 2026-03-05 20:52:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer_chapter.xhtml 2042-04-07 10:10:32.000000000 +0000 @@ -59,29 +59,29 @@ deduce). One implication of this is that if the user gives a spec for a function which overlaps with Dialyzer's inferred type, but is more restrictive, Dialyzer will trust those restrictions. This may then generate an error elsewhere that -follows from the erroneously restricted spec.

          Examples:

          Non-overlapping argument:

          -spec foo(boolean()) -> string().
          +follows from the erroneously restricted spec.

          Examples:

          Non-overlapping argument:

          -spec foo(boolean()) -> string().
           %% Dialyzer will infer: foo(integer()) -> string().
          -foo(N) ->
          -    integer_to_list(N).

          Since the type of the argument in the spec is different from the type that +foo(N) -> + integer_to_list(N).

          Since the type of the argument in the spec is different from the type that Dialyzer inferred, Dialyzer will generate the following warning:

          some_module.erl:7:2: Invalid type specification for function some_module:foo/1.
            The success typing is some_module:foo
          -          (integer()) -> string()
          +          (integer()) -> string()
            But the spec is some_module:foo
          -          (boolean()) -> string()
          - They do not overlap in the 1st argument

          Non-overlapping return:

          -spec bar(a | b) -> atom().
          +          (boolean()) -> string()
          + They do not overlap in the 1st argument

          Non-overlapping return:

          -spec bar(a | b) -> atom().
           %% Dialyzer will infer: bar(a | b) -> binary().
          -bar(a) -> <<"a">>;
          -bar(b) -> <<"b">>.

          Since the return value in the spec and the return value inferred by Dialyzer are +bar(a) -> <<"a">>; +bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are different, Dialyzer will generate the following warning:

    some_module.erl:11:2: Invalid type specification for function some_module:bar/1.
      The success typing is some_module:bar
    -          ('a' | 'b') -> <<_:8>>
    +          ('a' | 'b') -> <<_:8>>
      But the spec is some_module:bar
    -          ('a' | 'b') -> atom()
    - The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
    +          ('a' | 'b') -> atom()
    + The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
     %% Dialyzer will infer: baz(b | c | d) -> -1 | 0 | 1.
    -baz(b) -> -1;
    -baz(c) -> 0;
    -baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and +baz(b) -> -1; +baz(c) -> 0; +baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and inferred type:

    baz(b) -> 0 | 1.

    Notice how the c and d from the argument to baz/1 and the -1 in the return from the inferred type were dropped once the spec and inferred type were intersected. This could result in warnings being emitted for later functions.

    For example, if baz/1 is called like this:

    call_baz1(A) ->
    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml differs (HTML document, ASCII text, with very long lines)
    --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml	2026-03-05 20:52:07.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/dialyzer.xhtml	2042-04-07 10:10:32.000000000 +0000
    @@ -146,21 +146,21 @@
     repeating options which would otherwise need to be given explicitly to Dialyzer
     on every invocation.

    The location of the configuration file can be set via the DIALYZER_CONFIG environment variable, and defaults to within the user_config from -filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    -        {default_apps,[stdlib,kernel,erts]},
    -        {default_warning_apps,[stdlib]}
    -      }.
    -      {warnings, [no_improper_lists]}.
    -      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    -      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    Requesting or Suppressing Warnings in Source Files

    Attribute -dialyzer() can be used for turning off warnings in a module by +filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    +        {default_apps,[stdlib,kernel,erts]},
    +        {default_warning_apps,[stdlib]}
    +      }.
    +      {warnings, [no_improper_lists]}.
    +      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    +      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    Requesting or Suppressing Warnings in Source Files

    Attribute -dialyzer() can be used for turning off warnings in a module by specifying functions or warning options. For example, to turn off all warnings -for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source +for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source file:

    -dialyzer(no_improper_lists).

    Attribute -dialyzer() is allowed after function declarations. Lists of warning -options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in +options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in useful warnings, but often functions with specifications that are strictly more allowing than the success typing cannot easily be modified to be less allowing. To turn off the warning for underspecified function f/0, include the following -line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also +line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also enumerated, see type warn_option/0.

    Attribute -dialyzer() can also be used for turning on warnings. For example, if a module has been fixed regarding unmatched returns, adding the following line can help in assuring that no new unmatched return warnings are introduced:

    -dialyzer(unmatched_returns).
    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/notes.xhtml differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/notes.xhtml 2026-03-05 20:52:07.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.epub/OEBPS/notes.xhtml 2042-04-07 10:10:32.000000000 +0000 @@ -17,9 +17,9 @@

    Dialyzer Release Notes

    -

    This document describes the changes made to the Dialyzer application.

    Dialyzer 5.4

    Fixed Bugs and Malfunctions

    • The -Wno_unknown option will now prevent a warning being printed to standard output when the command line interface is used.

      Own Id: OTP-19262 Aux Id: GH-8822, PR-8885

    Improvements and New Features

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

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

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

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

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

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

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

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

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

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

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

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

    Dialyzer 5.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash caused by the use of opaque types.

      Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

    Dialyzer 5.3

    Fixed Bugs and Malfunctions

    • Fixed type inference for erlang:system_info(logical_processors).

      Own Id: OTP-19307 Aux Id: PR-8954, GH-8948

    • Dialyzer would crash when attempting to analyze a module compiled with the line_coverage option.

      Own Id: OTP-19344 Aux Id: GH-9027, PR-9034

    Improvements and New Features

    • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

      Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

    Dialyzer 5.2.1

    Fixed Bugs and Malfunctions

    • Man pages are now available for erl, erlc, dialyzer, and all other programs that are included in Erlang/OTP.

      Own Id: OTP-19201 Aux Id: PR-8740

    Dialyzer 5.2

    Improvements and New Features

    • The --gui option for Dialyzer has been removed.

      Own Id: OTP-18667 Aux Id: PR-7443

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

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

    Dialyzer 5.1.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash caused by the use of opaque types.

      Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

    Dialyzer 5.1.3

    Fixed Bugs and Malfunctions

    • Fixed an issue with bitstring type inference on segments following UTF-8/16/32 segments.

      Own Id: OTP-19068 Aux Id: GH-8383

    Dialyzer 5.1.2

    Fixed Bugs and Malfunctions

    • Fix dialyzer --output flag to work. This option was accidentally removed in +

      This document describes the changes made to the Dialyzer application.

      Dialyzer 5.4

      Fixed Bugs and Malfunctions

      • The -Wno_unknown option will now prevent a warning being printed to standard output when the command line interface is used.

        Own Id: OTP-19262 Aux Id: GH-8822, PR-8885

      Improvements and New Features

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

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

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

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

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

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

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

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

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

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

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

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

      Dialyzer 5.3.1

      Fixed Bugs and Malfunctions

      • Fixed a crash caused by the use of opaque types.

        Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

      Dialyzer 5.3

      Fixed Bugs and Malfunctions

      • Fixed type inference for erlang:system_info(logical_processors).

        Own Id: OTP-19307 Aux Id: PR-8954, GH-8948

      • Dialyzer would crash when attempting to analyze a module compiled with the line_coverage option.

        Own Id: OTP-19344 Aux Id: GH-9027, PR-9034

      Improvements and New Features

      • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

        Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

      Dialyzer 5.2.1

      Fixed Bugs and Malfunctions

      • Man pages are now available for erl, erlc, dialyzer, and all other programs that are included in Erlang/OTP.

        Own Id: OTP-19201 Aux Id: PR-8740

      Dialyzer 5.2

      Improvements and New Features

      • The --gui option for Dialyzer has been removed.

        Own Id: OTP-18667 Aux Id: PR-7443

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

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

      Dialyzer 5.1.3.1

      Fixed Bugs and Malfunctions

      • Fixed a crash caused by the use of opaque types.

        Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

      Dialyzer 5.1.3

      Fixed Bugs and Malfunctions

      • Fixed an issue with bitstring type inference on segments following UTF-8/16/32 segments.

        Own Id: OTP-19068 Aux Id: GH-8383

      Dialyzer 5.1.2

      Fixed Bugs and Malfunctions

      • Fix dialyzer --output flag to work. This option was accidentally removed in OTP 26.0.

        Own Id: OTP-18767 Aux Id: PR-7657

      • Fixed a crash in contract checking relating to opaque types.

        Own Id: OTP-18772 Aux Id: GH-7676

      Dialyzer 5.1.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that caused dialyzer to crash when analyzing bogus code that contained the literal atom undefined in segment sizes.

        Own Id: OTP-18629 Aux Id: GH-7325

      • Dialyzer could crash when attempting to analyze a module that defined a type called product/.

        Own Id: OTP-18738 Aux Id: GH-7584

      Dialyzer 5.1

      Fixed Bugs and Malfunctions

      • When checking behaviors, Dialyzer could generate false warning that a callback /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 2026-03-12 21:36:54.274268988 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer.html 2026-03-12 21:36:54.278269013 +0000 @@ -217,21 +217,21 @@ repeating options which would otherwise need to be given explicitly to Dialyzer on every invocation.

        The location of the configuration file can be set via the DIALYZER_CONFIG environment variable, and defaults to within the user_config from -filename:basedir/3.

        An example configuration file's contents might be:

              {incremental,
        -        {default_apps,[stdlib,kernel,erts]},
        -        {default_warning_apps,[stdlib]}
        -      }.
        -      {warnings, [no_improper_lists]}.
        -      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
        -      {add_pathsz,["/users/smeagol/fish/ebin"]}.

        Requesting or Suppressing Warnings in Source Files

        Attribute -dialyzer() can be used for turning off warnings in a module by +filename:basedir/3.

        An example configuration file's contents might be:

              {incremental,
        +        {default_apps,[stdlib,kernel,erts]},
        +        {default_warning_apps,[stdlib]}
        +      }.
        +      {warnings, [no_improper_lists]}.
        +      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
        +      {add_pathsz,["/users/smeagol/fish/ebin"]}.

        Requesting or Suppressing Warnings in Source Files

        Attribute -dialyzer() can be used for turning off warnings in a module by specifying functions or warning options. For example, to turn off all warnings -for the function f/0, include the following line:

        -dialyzer({nowarn_function, f/0}).

        To turn off warnings for improper lists, add the following line to the source +for the function f/0, include the following line:

        -dialyzer({nowarn_function, f/0}).

        To turn off warnings for improper lists, add the following line to the source file:

        -dialyzer(no_improper_lists).

        Attribute -dialyzer() is allowed after function declarations. Lists of warning -options or functions are allowed:

        -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

        Warning options can be restricted to functions:

        -dialyzer({no_improper_lists, g/0}).
        -dialyzer({[no_return, no_match], [g/0, h/0]}).

        The warning option for underspecified functions, -Wunderspecs, can result in +options or functions are allowed:

        -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

        Warning options can be restricted to functions:

        -dialyzer({no_improper_lists, g/0}).
        -dialyzer({[no_return, no_match], [g/0, h/0]}).

        The warning option for underspecified functions, -Wunderspecs, can result in useful warnings, but often functions with specifications that are strictly more allowing than the success typing cannot easily be modified to be less allowing. To turn off the warning for underspecified function f/0, include the following -line:

        -dialyzer({no_underspecs, f/0}).

        For help on the warning options, use dialyzer -Whelp. The options are also +line:

        -dialyzer({no_underspecs, f/0}).

        For help on the warning options, use dialyzer -Whelp. The options are also enumerated, see type warn_option/0.

        Attribute -dialyzer() can also be used for turning on warnings. For example, if a module has been fixed regarding unmatched returns, adding the following line can help in assuring that no new unmatched return warnings are introduced:

        -dialyzer(unmatched_returns).
        @@ -823,7 +823,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 2026-03-12 21:36:54.302269155 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/dialyzer_chapter.html 2026-03-12 21:36:54.310269201 +0000 @@ -131,29 +131,29 @@ deduce). One implication of this is that if the user gives a spec for a function which overlaps with Dialyzer's inferred type, but is more restrictive, Dialyzer will trust those restrictions. This may then generate an error elsewhere that -follows from the erroneously restricted spec.

        Examples:

        Non-overlapping argument:

        -spec foo(boolean()) -> string().
        +follows from the erroneously restricted spec.

        Examples:

        Non-overlapping argument:

        -spec foo(boolean()) -> string().
         %% Dialyzer will infer: foo(integer()) -> string().
        -foo(N) ->
        -    integer_to_list(N).

        Since the type of the argument in the spec is different from the type that +foo(N) -> + integer_to_list(N).

        Since the type of the argument in the spec is different from the type that Dialyzer inferred, Dialyzer will generate the following warning:

        some_module.erl:7:2: Invalid type specification for function some_module:foo/1.
          The success typing is some_module:foo
        -          (integer()) -> string()
        +          (integer()) -> string()
          But the spec is some_module:foo
        -          (boolean()) -> string()
        - They do not overlap in the 1st argument

        Non-overlapping return:

        -spec bar(a | b) -> atom().
        +          (boolean()) -> string()
        + They do not overlap in the 1st argument

        Non-overlapping return:

        -spec bar(a | b) -> atom().
         %% Dialyzer will infer: bar(a | b) -> binary().
        -bar(a) -> <<"a">>;
        -bar(b) -> <<"b">>.

        Since the return value in the spec and the return value inferred by Dialyzer are +bar(a) -> <<"a">>; +bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are different, Dialyzer will generate the following warning:

    some_module.erl:11:2: Invalid type specification for function some_module:bar/1.
      The success typing is some_module:bar
    -          ('a' | 'b') -> <<_:8>>
    +          ('a' | 'b') -> <<_:8>>
      But the spec is some_module:bar
    -          ('a' | 'b') -> atom()
    - The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
    +          ('a' | 'b') -> atom()
    + The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
     %% Dialyzer will infer: baz(b | c | d) -> -1 | 0 | 1.
    -baz(b) -> -1;
    -baz(c) -> 0;
    -baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and +baz(b) -> -1; +baz(c) -> 0; +baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and inferred type:

    baz(b) -> 0 | 1.

    Notice how the c and d from the argument to baz/1 and the -1 in the return from the inferred type were dropped once the spec and inferred type were intersected. This could result in warnings being emitted for later functions.

    For example, if baz/1 is called like this:

    call_baz1(A) ->
    @@ -223,7 +223,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 2026-03-12 21:36:54.346269416 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/notes.html 2026-03-12 21:36:54.350269438 +0000 @@ -89,9 +89,9 @@ -

    This document describes the changes made to the Dialyzer application.

    Dialyzer 5.4

    Fixed Bugs and Malfunctions

    • The -Wno_unknown option will now prevent a warning being printed to standard output when the command line interface is used.

      Own Id: OTP-19262 Aux Id: GH-8822, PR-8885

    Improvements and New Features

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

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

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

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

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

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

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

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

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

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

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

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

    Dialyzer 5.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash caused by the use of opaque types.

      Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

    Dialyzer 5.3

    Fixed Bugs and Malfunctions

    • Fixed type inference for erlang:system_info(logical_processors).

      Own Id: OTP-19307 Aux Id: PR-8954, GH-8948

    • Dialyzer would crash when attempting to analyze a module compiled with the line_coverage option.

      Own Id: OTP-19344 Aux Id: GH-9027, PR-9034

    Improvements and New Features

    • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

      Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

    Dialyzer 5.2.1

    Fixed Bugs and Malfunctions

    • Man pages are now available for erl, erlc, dialyzer, and all other programs that are included in Erlang/OTP.

      Own Id: OTP-19201 Aux Id: PR-8740

    Dialyzer 5.2

    Improvements and New Features

    • The --gui option for Dialyzer has been removed.

      Own Id: OTP-18667 Aux Id: PR-7443

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

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

    Dialyzer 5.1.3.1

    Fixed Bugs and Malfunctions

    • Fixed a crash caused by the use of opaque types.

      Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

    Dialyzer 5.1.3

    Fixed Bugs and Malfunctions

    • Fixed an issue with bitstring type inference on segments following UTF-8/16/32 segments.

      Own Id: OTP-19068 Aux Id: GH-8383

    Dialyzer 5.1.2

    Fixed Bugs and Malfunctions

    • Fix dialyzer --output flag to work. This option was accidentally removed in +

      This document describes the changes made to the Dialyzer application.

      Dialyzer 5.4

      Fixed Bugs and Malfunctions

      • The -Wno_unknown option will now prevent a warning being printed to standard output when the command line interface is used.

        Own Id: OTP-19262 Aux Id: GH-8822, PR-8885

      Improvements and New Features

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

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

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

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

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

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

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

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

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

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

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

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

      Dialyzer 5.3.1

      Fixed Bugs and Malfunctions

      • Fixed a crash caused by the use of opaque types.

        Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

      Dialyzer 5.3

      Fixed Bugs and Malfunctions

      • Fixed type inference for erlang:system_info(logical_processors).

        Own Id: OTP-19307 Aux Id: PR-8954, GH-8948

      • Dialyzer would crash when attempting to analyze a module compiled with the line_coverage option.

        Own Id: OTP-19344 Aux Id: GH-9027, PR-9034

      Improvements and New Features

      • Erlang/OTP type specifications has been updated to eliminate overlapping domains.

        Own Id: OTP-19310 Aux Id: GH-8810, GH-8821, PR-8986

      Dialyzer 5.2.1

      Fixed Bugs and Malfunctions

      • Man pages are now available for erl, erlc, dialyzer, and all other programs that are included in Erlang/OTP.

        Own Id: OTP-19201 Aux Id: PR-8740

      Dialyzer 5.2

      Improvements and New Features

      • The --gui option for Dialyzer has been removed.

        Own Id: OTP-18667 Aux Id: PR-7443

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

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

      Dialyzer 5.1.3.1

      Fixed Bugs and Malfunctions

      • Fixed a crash caused by the use of opaque types.

        Own Id: OTP-19439 Aux Id: ERIERL-1183, PR-9314

      Dialyzer 5.1.3

      Fixed Bugs and Malfunctions

      • Fixed an issue with bitstring type inference on segments following UTF-8/16/32 segments.

        Own Id: OTP-19068 Aux Id: GH-8383

      Dialyzer 5.1.2

      Fixed Bugs and Malfunctions

      • Fix dialyzer --output flag to work. This option was accidentally removed in OTP 26.0.

        Own Id: OTP-18767 Aux Id: PR-7657

      • Fixed a crash in contract checking relating to opaque types.

        Own Id: OTP-18772 Aux Id: GH-7676

      Dialyzer 5.1.1

      Fixed Bugs and Malfunctions

      • Fixed a bug that caused dialyzer to crash when analyzing bogus code that contained the literal atom undefined in segment sizes.

        Own Id: OTP-18629 Aux Id: GH-7325

      • Dialyzer could crash when attempting to analyze a module that defined a type called product/.

        Own Id: OTP-18738 Aux Id: GH-7584

      Dialyzer 5.1

      Fixed Bugs and Malfunctions

      • When checking behaviors, Dialyzer could generate false warning that a callback @@ -547,7 +547,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html 2026-03-12 21:36:54.378269605 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/search.html 2026-03-12 21:36:54.382269629 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 2026-03-12 21:36:54.410269795 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/dialyzer-5.4/doc/html/typer_cmd.html 2026-03-12 21:36:54.410269795 +0000 @@ -153,7 +153,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:54.438269960 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/404.html 2026-03-12 21:36:54.438269960 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:54.458270079 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/api-reference.html 2026-03-12 21:36:54.458270079 +0000 @@ -179,7 +179,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/content.opf 2042-04-07 10:10:23.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> diameter - 2.5.2 - urn:uuid:33af4c8b-3a15-06c1-9331-dfd1dbde9ce0 + urn:uuid:d28e04bb-834e-3cc5-9e00-00aa9ff5afa7 en - 2026-03-05T20:52:00Z + 2042-04-07T10:10:23Z /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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameter_app.xhtml 2042-04-07 10:10:23.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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameterc_cmd.xhtml 2042-04-07 10:10:23.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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameter_codec.xhtml 2042-04-07 10:10:23.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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameter_dict.xhtml 2042-04-07 10:10:23.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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/diameter.xhtml 2042-04-07 10:10:23.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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.epub/OEBPS/notes.xhtml 2042-04-07 10:10:23.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 2026-03-12 21:36:54.690271453 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter.html 2026-03-12 21:36:54.694271478 +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 2026-03-12 21:36:54.730271691 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_app.html 2026-03-12 21:36:54.730271691 +0000 @@ -684,12 +684,12 @@ diameter:start_service/2) is determined by the Application Identifier in the header of the incoming request message, the selected module being the one whose corresponding dictionary declares itself as defining either the application in -question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    -                 avps   = [#diameter_avp{}],
    -                 msg    = record() | undefined,
    -                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    -                 bin    = binary(),
    -                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the +question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    +                 avps   = [#diameter_avp{}],
    +                 msg    = record() | undefined,
    +                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    +                 bin    = binary(),
    +                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the relay application. Otherwise it contains the record representing the request as outlined in diameter_dict(4).

    The errors field specifies any results codes identifying errors found while decoding the request. This is used to set Result-Code and/or Failed-AVP in a @@ -1010,7 +1010,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:54.758271857 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_codec.html 2026-03-12 21:36:54.766271904 +0000 @@ -104,7 +104,7 @@ results may differ from those returned by the functions documented here, depending on configuration.

    The header() and packet() records below are defined in diameter.hrl, -which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from +which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from dictionary file compilation.

    DATA TYPES

    • uint8()  = 0..255

    • uint24() = 0..16777215

    • uint32() = 0..4294967295 - 8-bit, 24-bit and 32-bit integers occurring in Diameter and AVP headers.

    • avp() = #diameter_avp{} - The application-neutral representation of an AVP. Primarily intended for use by relay applications @@ -514,7 +514,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:54.794272070 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_dict.html 2026-03-12 21:36:54.798272093 +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-2026 Ericsson AB

      +

      Copyright © 1996-2042 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 2026-03-12 21:36:54.822272237 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_examples.html 2026-03-12 21:36:54.822272237 +0000 @@ -141,7 +141,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:54.850272402 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_intro.html 2026-03-12 21:36:54.854272426 +0000 @@ -169,7 +169,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:54.882272592 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_make.html 2026-03-12 21:36:54.886272615 +0000 @@ -490,7 +490,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 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 2026-03-12 21:36:54.918272805 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_sctp.html 2026-03-12 21:36:54.922272829 +0000 @@ -410,7 +410,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:54.946272971 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_service.html 2026-03-12 21:36:54.950272994 +0000 @@ -185,7 +185,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:54.982273184 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_soc.html 2026-03-12 21:36:54.986273209 +0000 @@ -149,7 +149,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:55.018273398 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_tcp.html 2026-03-12 21:36:55.022273422 +0000 @@ -445,7 +445,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:55.050273588 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_transport.html 2026-03-12 21:36:55.054273611 +0000 @@ -270,7 +270,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:55.078273753 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameter_using.html 2026-03-12 21:36:55.082273778 +0000 @@ -141,7 +141,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/diameter-2.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 2026-03-12 21:36:55.110273943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/diameterc_cmd.html 2026-03-12 21:36:55.110273943 +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-2026 Ericsson AB

      +

      Copyright © 1996-2042 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 2026-03-12 21:36:55.146274156 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/notes.html 2026-03-12 21:36:55.146274156 +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-2026 Ericsson AB

          +

          Copyright © 1996-2042 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 2026-03-12 21:36:55.178274345 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/diameter-2.5.2/doc/html/search.html 2026-03-12 21:36:55.178274345 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html 2026-03-12 21:36:55.206274512 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/404.html 2026-03-12 21:36:55.206274512 +0000 @@ -106,7 +106,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html 2026-03-12 21:36:55.234274678 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/api-reference.html 2026-03-12 21:36:55.234274678 +0000 @@ -195,7 +195,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 2026-03-12 21:36:55.270274892 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/chapter.html 2026-03-12 21:36:55.274274915 +0000 @@ -601,7 +601,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          Missing in old package: /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-96375997.js Missing in old package: /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/dist/search_data-96375997.js /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 2026-03-12 21:36:55.306275104 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/doc_storage.html 2026-03-12 21:36:55.306275104 +0000 @@ -177,7 +177,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 2026-03-12 21:36:55.346275342 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc.html 2026-03-12 21:36:55.354275390 +0000 @@ -1372,7 +1372,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 2026-03-12 21:36:55.374275507 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_cmd.html 2026-03-12 21:36:55.378275532 +0000 @@ -134,7 +134,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html 2026-03-12 21:36:55.402275674 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet.html 2026-03-12 21:36:55.406275697 +0000 @@ -409,7 +409,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html 2026-03-12 21:36:55.426275815 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_chunks.html 2026-03-12 21:36:55.426275815 +0000 @@ -183,7 +183,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 2026-03-12 21:36:55.450275957 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_doclet_markdown.html 2026-03-12 21:36:55.454275982 +0000 @@ -93,8 +93,8 @@
          -

          Doclet converting an edoc application to use EEP-59 and Markdown.

          This doclet has to be used together with edoc_layout_chunks.

          Example:

           1> edoc:application(example, [{preprocess, true}, {doclet, edoc_doclet_markdown},
          -       {layout, edoc_layout_chunks}]).

          It will convert the overview to Markdown and any module documentation to use -doc attributes and Markdown. Any XHTML tags in the edoc documentation that are not part of the tags supported by Erlang Documentation Format will be added as HTML tags in the Markdown.

          It does not delete the old edoc documentation.

          See also: edoc_layout_chunks.

          +

          Doclet converting an edoc application to use EEP-59 and Markdown.

          This doclet has to be used together with edoc_layout_chunks.

          Example:

           1> edoc:application(example, [{preprocess, true}, {doclet, edoc_doclet_markdown},
          +       {layout, edoc_layout_chunks}]).

          It will convert the overview to Markdown and any module documentation to use -doc attributes and Markdown. Any XHTML tags in the edoc documentation that are not part of the tags supported by Erlang Documentation Format will be added as HTML tags in the Markdown.

          It does not delete the old edoc documentation.

          See also: edoc_layout_chunks.

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

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 2026-03-12 21:36:55.482276147 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_extract.html 2026-03-12 21:36:55.490276195 +0000 @@ -618,7 +618,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html 2026-03-12 21:36:55.518276362 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_html_to_markdown.html 2026-03-12 21:36:55.522276385 +0000 @@ -184,7 +184,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 2026-03-12 21:36:55.546276527 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout.html 2026-03-12 21:36:55.550276551 +0000 @@ -370,7 +370,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 2026-03-12 21:36:55.582276741 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_layout_chunks.html 2026-03-12 21:36:55.586276764 +0000 @@ -713,7 +713,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 2026-03-12 21:36:55.614276929 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_lib.html 2026-03-12 21:36:55.614276929 +0000 @@ -414,7 +414,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 2026-03-12 21:36:55.646277119 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/edoc_run.html 2026-03-12 21:36:55.646277119 +0000 @@ -323,7 +323,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 2026-03-12 21:36:55.674277286 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/notes.html 2026-03-12 21:36:55.678277309 +0000 @@ -89,9 +89,9 @@ -

          This document describes the changes made to the EDoc application.

          Edoc 1.4.1

          Fixed Bugs and Malfunctions

          • Rendering of some tables in the documentation has been improved.

            Own Id: OTP-19752 Aux Id: PR-10142

          Edoc 1.4

          Fixed Bugs and Malfunctions

          • Refactor code to not rely on +nowarn_shadow_vars.

            Own Id: OTP-19574 Aux Id: PR-9678

          Improvements and New Features

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

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

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

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

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

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

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

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

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

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

          Edoc 1.3.2

          Fixed Bugs and Malfunctions

          • Broken links in release notes have been mended.

            Own Id: OTP-19139 Aux Id: PR-8584

          Edoc 1.3.1

          Fixed Bugs and Malfunctions

          • Fix broken makefile dependency when building HTML documentation.

            Own Id: OTP-19116 Aux Id: PR-8534

          Edoc 1.3

          Fixed Bugs and Malfunctions

          • EEP 48 doc chunks now properly include links within {@type } macros.

            Own Id: OTP-18945 Aux Id: PR-8063

          • @hidden now means hidden in EEP 48 doc chunks instead of none.

            Own Id: OTP-18946 Aux Id: PR-8063

          Improvements and New Features

          Edoc 1.2.1

          Fixed Bugs and Malfunctions

          • Emit <code> instead of <tt>.

            Own Id: OTP-18782 Aux Id: PR-7643

          Edoc 1.2

          Fixed Bugs and Malfunctions

          • Fix unused types warnings in internal edoc module.

            Own Id: OTP-17550 Aux Id: GH-5094 PR-5106

          Improvements and New Features

          • Add source file to the warning on skipped tags when generating EEP-48 style +

            This document describes the changes made to the EDoc application.

            Edoc 1.4.1

            Fixed Bugs and Malfunctions

            • Rendering of some tables in the documentation has been improved.

              Own Id: OTP-19752 Aux Id: PR-10142

            Edoc 1.4

            Fixed Bugs and Malfunctions

            • Refactor code to not rely on +nowarn_shadow_vars.

              Own Id: OTP-19574 Aux Id: PR-9678

            Improvements and New Features

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

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

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

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

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

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

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

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

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

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

            Edoc 1.3.2

            Fixed Bugs and Malfunctions

            • Broken links in release notes have been mended.

              Own Id: OTP-19139 Aux Id: PR-8584

            Edoc 1.3.1

            Fixed Bugs and Malfunctions

            • Fix broken makefile dependency when building HTML documentation.

              Own Id: OTP-19116 Aux Id: PR-8534

            Edoc 1.3

            Fixed Bugs and Malfunctions

            • EEP 48 doc chunks now properly include links within {@type } macros.

              Own Id: OTP-18945 Aux Id: PR-8063

            • @hidden now means hidden in EEP 48 doc chunks instead of none.

              Own Id: OTP-18946 Aux Id: PR-8063

            Improvements and New Features

            Edoc 1.2.1

            Fixed Bugs and Malfunctions

            • Emit <code> instead of <tt>.

              Own Id: OTP-18782 Aux Id: PR-7643

            Edoc 1.2

            Fixed Bugs and Malfunctions

            • Fix unused types warnings in internal edoc module.

              Own Id: OTP-17550 Aux Id: GH-5094 PR-5106

            Improvements and New Features

            • Add source file to the warning on skipped tags when generating EEP-48 style docs.

              Own Id: OTP-17556 Aux Id: PR-5023

            • Fix the doc chunks generators to emit documentation even if there is not module level documentation.

              Fix the doc chunks generators to respect the @hidden and @private tags properly for both modules and functions.

              Own Id: OTP-17733 Aux Id: PR-5205

            Edoc 1.1

            Improvements and New Features

            • Add option link_predefined_types that is used to create links to erlang @@ -208,7 +208,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 2026-03-12 21:36:55.702277452 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/edoc-1.4.1/doc/html/search.html 2026-03-12 21:36:55.706277476 +0000 @@ -85,7 +85,7 @@
              - + /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 2026-03-12 21:36:55.726277594 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/404.html 2026-03-12 21:36:55.730277617 +0000 @@ -110,7 +110,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 2026-03-12 21:36:55.754277759 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/api-reference.html 2026-03-12 21:36:55.754277759 +0000 @@ -118,7 +118,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/content.opf differs (XML 1.0 document, ASCII text) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/content.opf 2026-03-05 20:52:06.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/content.opf 2042-04-07 10:10:30.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> eldap - 1.2.16 - urn:uuid:481b8fda-7e37-f5c3-e1ae-355184b3841a + urn:uuid:716ef2cc-004e-3108-f8b0-b722b93ed981 en - 2026-03-05T20:52:06Z + 2042-04-07T10:10:30Z /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/eldap.xhtml differs (HTML document, ASCII text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/eldap.xhtml 2026-03-05 20:52:06.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.epub/OEBPS/eldap.xhtml 2042-04-07 10:10:30.000000000 +0000 @@ -853,13 +853,13 @@ -

              Add an entry. The entry must not exist.

                add(Handle,
              +

              Add an entry. The entry must not exist.

                add(Handle,
                     "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
              -       [{"objectclass", ["person"]},
              -        {"cn", ["Bill Valentine"]},
              -        {"sn", ["Valentine"]},
              -        {"telephoneNumber", ["545 555 00"]}]
              -     )
              +
              [{"objectclass", ["person"]}, + {"cn", ["Bill Valentine"]}, + {"sn", ["Valentine"]}, + {"telephoneNumber", ["545 555 00"]}] + )
              @@ -1171,7 +1171,7 @@ -

              Creates an extensible match filter. For example,

                eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

              creates a filter which performs a caseExactMatch on the attribute sn and +

              Creates an extensible match filter. For example,

                eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

              creates a filter which performs a caseExactMatch on the attribute sn and matches with the value "Bar". The default value of dnAttributes is false.

              @@ -1389,9 +1389,9 @@ -

              Modify an entry.

                modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
              -         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
              -	  eldap:mod_add("description", ["LDAP Hacker"]) ])
              +

              Modify an entry.

                modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
              +         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
              +	  eldap:mod_add("description", ["LDAP Hacker"]) ])
              @@ -1711,8 +1711,8 @@

              Paged results is an extension to the LDAP protocol specified by RFC2696

              This function creates a control with the specified page size for use in -search/3, for example:

              Control = eldap:paged_result_control(50),
              -{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
              +search/3, for example:

              Control = eldap:paged_result_control(50),
              +{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
              @@ -1745,12 +1745,12 @@

              Paged results is an extension to the LDAP protocol specified by RFC2696

              This function creates a control with the specified page size and cookie for use in search/3 to retrieve the next results page.

              For example:

              PageSize = 50,
              -Control1 = eldap:paged_result_control(PageSize),
              -{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
              +Control1 = eldap:paged_result_control(PageSize),
              +{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
               %% retrieve the returned cookie from the search results
              -{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
              -Control2 = eldap:paged_result_control(PageSize, Cookie1),
              -{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
              +{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
              +Control2 = eldap:paged_result_control(PageSize, Cookie1),
              +{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
               %% etc
              @@ -1870,8 +1870,8 @@

              Search the directory with the supplied the SearchOptions.

              The base and filter options must be supplied. Default values: scope is wholeSubtree/0, deref is -derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

                Filter = eldap:substrings("cn", [{any,"V"}]),
              -  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

              The timeout option in the SearchOptions is for the ldap server, while the +derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

                Filter = eldap:substrings("cn", [{any,"V"}]),
              +  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

              The timeout option in the SearchOptions is for the ldap server, while the timeout in eldap:open/2 is used for each individual request in the search operation.

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html 2026-03-12 21:36:55.874278470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/eldap.html 2026-03-12 21:36:55.874278470 +0000 @@ -940,13 +940,13 @@ -

              Add an entry. The entry must not exist.

                add(Handle,
              +

              Add an entry. The entry must not exist.

                add(Handle,
                     "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
              -       [{"objectclass", ["person"]},
              -        {"cn", ["Bill Valentine"]},
              -        {"sn", ["Valentine"]},
              -        {"telephoneNumber", ["545 555 00"]}]
              -     )
              +
              [{"objectclass", ["person"]}, + {"cn", ["Bill Valentine"]}, + {"sn", ["Valentine"]}, + {"telephoneNumber", ["545 555 00"]}] + )
              @@ -1258,7 +1258,7 @@ -

              Creates an extensible match filter. For example,

                eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

              creates a filter which performs a caseExactMatch on the attribute sn and +

              Creates an extensible match filter. For example,

                eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

              creates a filter which performs a caseExactMatch on the attribute sn and matches with the value "Bar". The default value of dnAttributes is false.

              @@ -1476,9 +1476,9 @@ -

              Modify an entry.

                modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
              -         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
              -	  eldap:mod_add("description", ["LDAP Hacker"]) ])
              +

              Modify an entry.

                modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
              +         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
              +	  eldap:mod_add("description", ["LDAP Hacker"]) ])
              @@ -1798,8 +1798,8 @@

              Paged results is an extension to the LDAP protocol specified by RFC2696

              This function creates a control with the specified page size for use in -search/3, for example:

              Control = eldap:paged_result_control(50),
              -{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
              +search/3, for example:

              Control = eldap:paged_result_control(50),
              +{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
              @@ -1832,12 +1832,12 @@

              Paged results is an extension to the LDAP protocol specified by RFC2696

              This function creates a control with the specified page size and cookie for use in search/3 to retrieve the next results page.

              For example:

              PageSize = 50,
              -Control1 = eldap:paged_result_control(PageSize),
              -{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
              +Control1 = eldap:paged_result_control(PageSize),
              +{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
               %% retrieve the returned cookie from the search results
              -{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
              -Control2 = eldap:paged_result_control(PageSize, Cookie1),
              -{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
              +{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
              +Control2 = eldap:paged_result_control(PageSize, Cookie1),
              +{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
               %% etc
              @@ -1957,8 +1957,8 @@

              Search the directory with the supplied the SearchOptions.

              The base and filter options must be supplied. Default values: scope is wholeSubtree/0, deref is -derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

                Filter = eldap:substrings("cn", [{any,"V"}]),
              -  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

              The timeout option in the SearchOptions is for the ldap server, while the +derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

                Filter = eldap:substrings("cn", [{any,"V"}]),
              +  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

              The timeout option in the SearchOptions is for the ldap server, while the timeout in eldap:open/2 is used for each individual request in the search operation.

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

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 2026-03-12 21:36:55.910278685 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/notes.html 2026-03-12 21:36:55.914278708 +0000 @@ -147,7 +147,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html differs (HTML document, UTF-8 Unicode text, with very long lines) --- old//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 2026-03-12 21:36:55.938278850 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eldap-1.2.16/doc/html/search.html 2026-03-12 21:36:55.942278874 +0000 @@ -108,7 +108,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.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 2026-03-12 21:36:55.966279016 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/404.html 2026-03-12 21:36:55.966279016 +0000 @@ -108,7 +108,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.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 2026-03-12 21:36:56.006279254 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei.html 2026-03-12 21:36:56.014279300 +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	2026-03-12 21:36:56.058279561 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_connect.html	2026-03-12 21:36:56.058279561 +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	2026-03-12 21:36:56.090279751 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_global.html	2026-03-12 21:36:56.094279775 +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-2026 Ericsson AB

      +

      Copyright © 1996-2042 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 2026-03-12 21:36:56.118279917 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/ei_users_guide.html 2026-03-12 21:36:56.122279940 +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 2026-03-12 21:36:56.154280130 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_call_cmd.html 2026-03-12 21:36:56.158280155 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-05 20:51:34.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/content.opf 2042-04-07 10:09:54.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> erl_interface - 5.6.1 - urn:uuid:c9904c8e-3e6f-ad54-4f8f-4fd3d37314cd + urn:uuid:28f026d7-ba85-eb76-4d24-54acb89b170f en - 2026-03-05T20:51:34Z + 2042-04-07T10:09:54Z /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 2026-03-05 20:51:34.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei_connect.xhtml 2042-04-07 10:09:54.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	2026-03-05 20:51:34.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei_global.xhtml	2042-04-07 10:09:54.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 2026-03-05 20:51:34.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 2042-04-07 10:09:54.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 2026-03-05 20:51:34.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/erl_interface.epub/OEBPS/ei.xhtml 2042-04-07 10:09:54.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	2026-03-05 20:51:34.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	2042-04-07 10:09:54.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 2026-03-12 21:36:56.354281316 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/notes.html 2026-03-12 21:36:56.358281340 +0000 @@ -432,7 +432,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.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 2026-03-12 21:36:56.390281529 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/erl_interface-5.6.1/doc/html/search.html 2026-03-12 21:36:56.394281552 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:56.410281648 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/404.html 2026-03-12 21:36:56.414281671 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:56.434281790 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/api-reference.html 2026-03-12 21:36:56.438281813 +0000 @@ -145,7 +145,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/content.opf 2042-04-07 10:10:24.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> et - 1.7.2 - urn:uuid:ba756649-72a6-d389-6d73-3fe30c4eb16f + urn:uuid:b847ec75-5aa7-ab79-2830-17b168f920bc en - 2026-03-05T20:52:00Z + 2042-04-07T10:10:24Z /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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_desc.xhtml 2042-04-07 10:10:24.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 2026-03-05 20:52:00.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_examples.xhtml 2042-04-07 10:10:24.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	2026-03-05 20:52:00.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.epub/OEBPS/et_tutorial.xhtml	2042-04-07 10:10:24.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 2026-03-12 21:36:56.614282857 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et.html 2026-03-12 21:36:56.618282881 +0000 @@ -521,7 +521,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:56.662283141 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_collector.html 2026-03-12 21:36:56.654283093 +0000 @@ -1506,7 +1506,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:36:56.690283308 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_desc.html 2026-03-12 21:36:56.694283331 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:36:56.730283544 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_examples.html 2026-03-12 21:36:56.738283592 +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	2026-03-12 21:36:56.770283781 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_intro.html	2026-03-12 21:36:56.770283781 +0000
        @@ -156,7 +156,7 @@
                   Erlang programming language
         
               

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:56.794283923 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_selector.html 2026-03-12 21:36:56.798283948 +0000 @@ -394,7 +394,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:36:56.826284113 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_tutorial.html 2026-03-12 21:36:56.830284137 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:36:56.854284279 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/et_viewer.html 2026-03-12 21:36:56.858284303 +0000 @@ -536,7 +536,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:56.882284444 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/notes.html 2026-03-12 21:36:56.886284469 +0000 @@ -164,7 +164,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:56.910284611 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/et-1.7.2/doc/html/search.html 2026-03-12 21:36:56.910284611 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:56.934284753 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/404.html 2026-03-12 21:36:56.938284776 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:56.958284895 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/api-reference.html 2026-03-12 21:36:56.958284895 +0000 @@ -128,7 +128,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:36:56.986285062 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/chapter.html 2026-03-12 21:36:56.994285109 +0000 @@ -591,7 +591,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-05 20:52:03.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub/OEBPS/content.opf 2042-04-07 10:10:27.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> eunit - 2.10 - urn:uuid:d2c44b52-8d16-12ee-32c6-93f82f749cfc + urn:uuid:0e1be952-c3c3-aa3e-4e4e-46b577ffa39d en - 2026-03-05T20:52:03Z + 2042-04-07T10:10:27Z /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 2026-03-05 20:52:03.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.epub/OEBPS/notes.xhtml 2042-04-07 10:10:27.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 2026-03-12 21:36:57.106285773 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit.html 2026-03-12 21:36:57.110285796 +0000 @@ -315,7 +315,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.134285939 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/eunit_surefire.html 2026-03-12 21:36:57.138285962 +0000 @@ -123,7 +123,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 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 2026-03-12 21:36:57.166286129 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/notes.html 2026-03-12 21:36:57.170286152 +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-2026 Ericsson AB

                +

                Copyright © 1996-2042 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 2026-03-12 21:36:57.198286317 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/eunit-2.10/doc/html/search.html 2026-03-12 21:36:57.198286317 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.222286460 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/404.html 2026-03-12 21:36:57.222286460 +0000 @@ -110,7 +110,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.246286603 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/api-reference.html 2026-03-12 21:36:57.246286603 +0000 @@ -118,7 +118,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/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 2026-03-05 20:52:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub/OEBPS/content.opf 2042-04-07 10:10:32.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> ftp - 1.2.4 - urn:uuid:9367f24d-4056-66a4-c390-9aa8e0ffc630 + urn:uuid:044d9111-0795-81e8-41d8-312368a8bd98 en - 2026-03-05T20:52:08Z + 2042-04-07T10:10:32Z /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 2026-03-05 20:52:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.epub/OEBPS/ftp_client.xhtml 2042-04-07 10:10:32.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 2026-03-12 21:36:57.382287408 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp.html 2026-03-12 21:36:57.382287408 +0000 @@ -1880,7 +1880,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 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 2026-03-12 21:36:57.410287574 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/ftp_client.html 2026-03-12 21:36:57.414287597 +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-2026 Ericsson AB

                +

                Copyright © 1996-2042 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 2026-03-12 21:36:57.438287741 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/introduction.html 2026-03-12 21:36:57.438287741 +0000 @@ -146,7 +146,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.470287930 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/notes.html 2026-03-12 21:36:57.470287930 +0000 @@ -160,7 +160,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.494288072 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ftp-1.2.4/doc/html/search.html 2026-03-12 21:36:57.498288095 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.514288191 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/404.html 2026-03-12 21:36:57.518288215 +0000 @@ -110,7 +110,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.542288356 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/api-reference.html 2026-03-12 21:36:57.542288356 +0000 @@ -210,7 +210,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.578288570 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_client.html 2026-03-12 21:36:57.578288570 +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-2026 Ericsson AB

                +

                Copyright © 1996-2042 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 2026-03-12 21:36:57.614288784 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_server.html 2026-03-12 21:36:57.622288831 +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-2026 Ericsson AB

          +

          Copyright © 1996-2042 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 2026-03-12 21:36:57.650288996 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/http_uri.html 2026-03-12 21:36:57.650288996 +0000 @@ -244,7 +244,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:36:57.690289234 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpc.html 2026-03-12 21:36:57.694289257 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:36:57.742289542 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd.html 2026-03-12 21:36:57.746289566 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:36:57.774289732 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_custom_api.html 2026-03-12 21:36:57.778289755 +0000 @@ -284,7 +284,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.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 2026-03-12 21:36:57.806289922 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_socket.html 2026-03-12 21:36:57.806289922 +0000 @@ -280,7 +280,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.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 2026-03-12 21:36:57.846290158 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/httpd_util.html 2026-03-12 21:36:57.842290135 +0000 @@ -948,7 +948,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/inets-9.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 2026-03-05 20:51:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/content.opf 2042-04-07 10:09:39.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> inets - 9.4.2 - urn:uuid:ab1eff12-b4a1-39a0-2882-9236d5c6bf9d + urn:uuid:0daaaba3-7275-fec2-d076-70f0245cbe2e en - 2026-03-05T20:51:19Z + 2042-04-07T10:09:39Z /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 2026-03-05 20:51:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/http_client.xhtml 2042-04-07 10:09:39.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 2026-03-05 20:51:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/httpc.xhtml 2042-04-07 10:09:39.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 2026-03-05 20:51:19.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/inets-9.4.2/doc/html/inets.epub/OEBPS/httpd.xhtml 2042-04-07 10:09:39.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	2026-03-12 21:37:01.498311803 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_tcp.html	2026-03-12 21:37:01.502311827 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:01.538312039 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/gen_udp.html 2026-03-12 21:37:01.542312064 +0000 @@ -919,8 +919,8 @@ Leaves a multicast group.

  • option/0 - See inet:setopts/2.

  • UDP packets are sent with this socket using send(Socket, ...). When UDP packets arrive to the Socket's UDP port, and the socket is in an active mode, the packets are delivered as messages to the -controlling process (socket owner):

    {udp, Socket, PeerIP, PeerPort, Packet} % Without ancillary data
    -{udp, Socket, PeerIP, PeerPort, AncData, Packet} % With ancillary data

    PeerIP and PeerPort are the address from which Packet was sent. +controlling process (socket owner):

    {udp, Socket, PeerIP, PeerPort, Packet} % Without ancillary data
    +{udp, Socket, PeerIP, PeerPort, AncData, Packet} % With ancillary data

    PeerIP and PeerPort are the address from which Packet was sent. Packet is a list of bytes ([byte/0] if option list is active and a binary/0 if option binaryis active (they are mutually exclusive).

    The message contains an AncData field only if any of the socket @@ -928,8 +928,8 @@ recvtclass or recvttl are active.

    When a socket in {active, N} mode (see inet:setopts/2 for details), transitions to passive ({active, false}) mode (N counts down to 0), -the controlling process is notified by a message on this form:

    {udp_passive, Socket}

    If the OS protocol stack reports an error for the socket, the following -message is sent to the controlling process:

    {udp_error, Socket, Reason}

    Reason is mostly a POSIX Error Code.

    If the socket is in passive mode (not in an active mode), received data +the controlling process is notified by a message on this form:

    {udp_passive, Socket}

    If the OS protocol stack reports an error for the socket, the following +message is sent to the controlling process:

    {udp_error, Socket, Reason}

    Reason is mostly a POSIX Error Code.

    If the socket is in passive mode (not in an active mode), received data can be retrieved with therecv/2,3](recv/2) calls. Note that incoming UDP packets that are longer than the receive buffer option specifies can be truncated without warning.

    The default value for the receive buffer option is {recbuf, 9216}.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:01.574312254 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global.html 2026-03-12 21:37:01.582312301 +0000 @@ -1257,7 +1257,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:01.606312443 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/global_group.html 2026-03-12 21:37:01.614312490 +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	2026-03-05 20:51:10.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/socket.xhtml	2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/trace.xhtml 2042-04-07 10:09:28.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 2026-03-12 21:37:02.422317279 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel_app.html 2026-03-12 21:37:02.426317304 +0000 @@ -363,7 +363,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.482317635 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger.html 2026-03-12 21:37:02.490317683 +0000 @@ -95,20 +95,20 @@

      API module for Logger, the standard logging facility in Erlang/OTP.

      This module implements the main API for logging in Erlang/OTP. To create a log event, use the API functions or the log -macros, for example:

      ?LOG_ERROR("error happened because: ~p", [Reason]).   % With macro
      -logger:error("error happened because: ~p", [Reason]). % Without macro

      To configure the Logger backend, use +macros, for example:

      ?LOG_ERROR("error happened because: ~p", [Reason]).   % With macro
      +logger:error("error happened because: ~p", [Reason]). % Without macro

      To configure the Logger backend, use Kernel configuration parameters or configuration functions in the Logger API.

      By default, the Kernel application installs one log handler at system start. This handler is named default. It receives and processes standard log events produced by the Erlang runtime system, standard behaviours and different Erlang/OTP applications. The log events are by default printed to the terminal.

      If you want your systems logs to be printed to a file instead, you must configure the default handler to do so. The simplest way is to include the -following in your sys.config:

      [{kernel,
      -  [{logger,
      -    [{handler, default, logger_std_h,
      -      #href_anchor"ss">config => #{file => "path/to/file.log"}}}]}]}].

      For more information about:

      • the Logger facility in general, see the User's Guide.
      • how to configure Logger, see the +following in your sys.config:

        [{kernel,
        +  [{logger,
        +    [{handler, default, logger_std_h,
        +      #href_anchor"ss">config => #{file => "path/to/file.log"}}}]}]}].

        For more information about:

        Macros

        The following macros are defined in logger.hrl, which is included in a module -with the directive

            -include_lib("kernel/include/logger.hrl").
        • ?LOG_EMERGENCY(StringOrReport[,Metadata])
        • ?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])
        • ?LOG_ALERT(StringOrReport[,Metadata])
        • ?LOG_ALERT(FunOrFormat,Args[,Metadata])
        • ?LOG_CRITICAL(StringOrReport[,Metadata])
        • ?LOG_CRITICAL(FunOrFormat,Args[,Metadata])
        • ?LOG_ERROR(StringOrReport[,Metadata])
        • ?LOG_ERROR(FunOrFormat,Args[,Metadata])
        • ?LOG_WARNING(StringOrReport[,Metadata])
        • ?LOG_WARNING(FunOrFormat,Args[,Metadata])
        • ?LOG_NOTICE(StringOrReport[,Metadata])
        • ?LOG_NOTICE(FunOrFormat,Args[,Metadata])
        • ?LOG_INFO(StringOrReport[,Metadata])
        • ?LOG_INFO(FunOrFormat,Args[,Metadata])
        • ?LOG_DEBUG(StringOrReport[,Metadata])
        • ?LOG_DEBUG(FunOrFormat,Args[,Metadata])
        • ?LOG(Level,StringOrReport[,Metadata])
        • ?LOG(Level,FunOrFormat,Args[,Metadata])

        All macros expand to a call to Logger, where Level is taken from the macro +with the directive

            -include_lib("kernel/include/logger.hrl").
        • ?LOG_EMERGENCY(StringOrReport[,Metadata])
        • ?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])
        • ?LOG_ALERT(StringOrReport[,Metadata])
        • ?LOG_ALERT(FunOrFormat,Args[,Metadata])
        • ?LOG_CRITICAL(StringOrReport[,Metadata])
        • ?LOG_CRITICAL(FunOrFormat,Args[,Metadata])
        • ?LOG_ERROR(StringOrReport[,Metadata])
        • ?LOG_ERROR(FunOrFormat,Args[,Metadata])
        • ?LOG_WARNING(StringOrReport[,Metadata])
        • ?LOG_WARNING(FunOrFormat,Args[,Metadata])
        • ?LOG_NOTICE(StringOrReport[,Metadata])
        • ?LOG_NOTICE(FunOrFormat,Args[,Metadata])
        • ?LOG_INFO(StringOrReport[,Metadata])
        • ?LOG_INFO(FunOrFormat,Args[,Metadata])
        • ?LOG_DEBUG(StringOrReport[,Metadata])
        • ?LOG_DEBUG(FunOrFormat,Args[,Metadata])
        • ?LOG(Level,StringOrReport[,Metadata])
        • ?LOG(Level,FunOrFormat,Args[,Metadata])

        All macros expand to a call to Logger, where Level is taken from the macro name, or from the first argument in the case of the ?LOG macro. Location data is added to the metadata as described under the metadata/0 type definition.

        The call is wrapped in a case statement and will be evaluated only if Level is equal to or below the configured log level.

        See Also

        config, erlang, io, logger_disk_log_h, @@ -1805,26 +1805,26 @@ consistent no matter which handler the system uses. Normal usage is to add a call to logger:add_handlers/1 just after the processes that the handler needs are started, and pass the application's logger configuration as the argument. -For example:

        -behaviour(application).
        -start(_, []) ->
        -    case supervisor:start_link({local, my_sup}, my_sup, []) of
        -        {ok, Pid} ->
        -            ok = logger:add_handlers(my_app),
        -            {ok, Pid, []};
        +For example:

        -behaviour(application).
        +start(_, []) ->
        +    case supervisor:start_link({local, my_sup}, my_sup, []) of
        +        {ok, Pid} ->
        +            ok = logger:add_handlers(my_app),
        +            {ok, Pid, []};
                 Error -> Error
              end.

        This reads the logger configuration parameter from the my_app application and starts the configured handlers. The contents of the configuration use the same rules as the logger handler configuration.

        If the handler is meant to replace the default handler, the Kernel's default handler have to be disabled before the new handler is added. A sys.config file -that disables the Kernel handler and adds a custom handler could look like this:

        [{kernel,
        -  [{logger,
        +that disables the Kernel handler and adds a custom handler could look like this:

        [{kernel,
        +  [{logger,
             %% Disable the default Kernel handler
        -    [{handler, default, undefined}]}]},
        - {my_app,
        -  [{logger,
        +    [{handler, default, undefined}]}]},
        + {my_app,
        +  [{logger,
             %% Enable this handler as the default
        -    [{handler, default, my_handler, #{}}]}]}].
        +
        [{handler, default, my_handler, #{}}]}]}].
      @@ -2779,8 +2779,8 @@ -

      Update the formatter configuration for the specified handler.

      The new configuration is merged with the existing formatter configuration.

      To overwrite the existing configuration without any merge, use

      set_handler_config(HandlerId, formatter,
      -	      {FormatterModule, FormatterConfig}).
      +

      Update the formatter configuration for the specified handler.

      The new configuration is merged with the existing formatter configuration.

      To overwrite the existing configuration without any merge, use

      set_handler_config(HandlerId, formatter,
      +	      {FormatterModule, FormatterConfig}).
      @@ -2843,8 +2843,8 @@

      Update configuration data for the specified handler. This function behaves as if -it was implemented as follows:

      {ok, {_, Old}} = logger:get_handler_config(HandlerId),
      -logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use +it was implemented as follows:

      {ok, {_, Old}} = logger:get_handler_config(HandlerId),
      +logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use set_handler_config/2 .

      @@ -2937,8 +2937,8 @@

      Update primary configuration data for Logger. This function behaves as if it was -implemented as follows:

      Old = logger:get_primary_config(),
      -logger:set_primary_config(maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use +implemented as follows:

      Old = logger:get_primary_config(),
      +logger:set_primary_config(maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use set_primary_config/1 .

      @@ -2970,7 +2970,7 @@

      Set or update metadata to use when logging from current process

      If process metadata exists for the current process, this function behaves as if -it was implemented as follows:

      logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

      If no process metadata exists, the function behaves as +it was implemented as follows:

      logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

      If no process metadata exists, the function behaves as set_process_metadata/1 .

      @@ -3002,8 +3002,8 @@

      Update configuration data for the Logger proxy. This function behaves as if it -was implemented as follows:

      Old = logger:get_proxy_config(),
      -logger:set_proxy_config(maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use +was implemented as follows:

      Old = logger:get_proxy_config(),
      +logger:set_proxy_config(maps:merge(Old, Config)).

      To overwrite the existing configuration without any merge, use set_proxy_config/1 .

      For more information about the proxy, see section Logger Proxy in the Kernel User's Guide.

      @@ -3666,13 +3666,13 @@

      Create a log event at the given log level, with the given message to be logged and metadata.

      Example:

      %% A plain string
      -1> logger:log(info, "Hello World").
      +1> logger:log(info, "Hello World").
       %% A plain string with metadata
      -2> logger:log(debug, "Hello World", #{ meta => data }).
      +2> logger:log(debug, "Hello World", #{ meta => data }).
       %% A format string with arguments
      -3> logger:log(warning, "The roof is on ~ts",[Cause]).
      +3> logger:log(warning, "The roof is on ~ts",[Cause]).
       %% A report
      -4> logger:log(warning, #{ what => roof, cause => Cause }).

      Equivalent to log(Level, FormatOrFun, Args, #{}) if called as +4> logger:log(warning, #{ what => roof, cause => Cause }).

    Equivalent to log(Level, FormatOrFun, Args, #{}) if called as log(Level, FormatOrFun, Args).

    @@ -3711,12 +3711,12 @@ useful in scenarios when the message/metadata is very expensive to compute. This is because the fun is only evaluated when the message/metadata is actually needed, which may be not at all if the log event is not to be logged. Examples:

    %% A plain string with expensive metadata
    -1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
    +1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
     %% An expensive report
    -2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
    +2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
     %% A plain string with expensive metadata and normal metadata
    -3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[],
    -               #{ meta => data }).

    When metadata is given both as an argument and returned from the fun they are +3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[], + #{ meta => data }).

    When metadata is given both as an argument and returned from the fun they are merged. If equal keys exists the values are taken from the metadata returned by the fun.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.530317919 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_chapter.html 2026-03-12 21:37:02.534317944 +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	2026-03-12 21:37:02.574318180 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_cookbook.html	2026-03-12 21:37:02.574318180 +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	2026-03-12 21:37:02.602318346 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_disk_log_h.html	2026-03-12 21:37:02.602318346 +0000
    @@ -129,12 +129,12 @@
     and the disk_log handler, and are documented in the
     User's Guide.

    Notice that when changing the configuration of the handler in runtime, the disk_log options (file, type, max_no_files, max_no_bytes) must not be -modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    -                   #{config => #{file => "./my_disk_log",
    +modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    +                   #{config => #{file => "./my_disk_log",
                                      type => wrap,
                                      max_no_files => 4,
                                      max_no_bytes => 10000,
    -                                 filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when + filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when starting an Erlang node, change the Kernel default logger to use logger_disk_log_h. Example:

    erl -kernel logger '[{handler,default,logger_disk_log_h,
                           #{config => #{file => "./system_disk_log"}}}]'

    See Also

    logger, logger_std_h, disk_log

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.634318536 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_filters.html 2026-03-12 21:37:02.638318559 +0000 @@ -210,8 +210,8 @@ events from, for example, a specific functional area. This allows filtering or other specialized treatment in a Logger handler.

    A domain field must be a list of atoms, creating smaller and more specialized domains as the list grows longer. The greatest domain is [], which comprises -all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    -D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 +all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    +D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 is a sub-domain D1. Both D1 and D2 are sub-domains of [].

    The above domains are used for logs originating from Erlang/OTP. D1 specifies that the log event comes from Erlang/OTP in general, and D2 indicates that the log event is a so called SASL report.

    The Extra parameter to the domain/2 function is specified when @@ -226,11 +226,11 @@ filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, decide if the event is allowed or not.

    Log events that do not contain any domain field, match only when Compare is -equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
    +equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
     ok
    -2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
    +2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
     ...
    -3> logger:add_handler_filter(h1, no_sasl, Filter).
    +3> logger:add_handler_filter(h1, no_sasl, Filter).
     ok
    @@ -275,9 +275,9 @@ filter matches if the value of Operator is:

    • neq - and the compare function returns lt or gt.

    • eq - and the compare function returns eq.

    • lt - and the compare function returns lt.

    • gt - and the compare function returns gt.

    • lteq - and the compare function returns lt or eq.

    • gteq - and the compare function returns gt or eq.

    If the filter matches and Action is log, the log event is allowed. If the filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, will decide if the -event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    -Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    -logger:add_handler_filter(h1, debug_only, Filter).
    +event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    +Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    +logger:add_handler_filter(h1, debug_only, Filter).
     ok
    @@ -373,7 +373,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.666318726 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_formatter.html 2026-03-12 21:37:02.670318749 +0000 @@ -584,7 +584,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.702318938 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_handler.html 2026-03-12 21:37:02.706318963 +0000 @@ -559,7 +559,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.734319128 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/logger_std_h.html 2026-03-12 21:37:02.734319128 +0000 @@ -150,9 +150,9 @@ protection behaviour. The same parameters are used both in the standard handler and the disk_log handler, and are documented in the User's Guide.

    Notice that if changing the configuration of the handler in runtime, the type, -file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    -                   #{config => #{file => "./system_info.log",
    -                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, +file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    +                   #{config => #{file => "./system_info.log",
    +                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, to log to file instead of standard_io, change the Kernel default logger configuration. Example:

    erl -kernel logger '[{handler,default,logger_std_h,
                           #{config => #{file => "./log.log"}}}]'

    An example of how to replace the standard handler with a disk_log handler at @@ -253,7 +253,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.766319318 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net.html 2026-03-12 21:37:02.770319342 +0000 @@ -530,13 +530,13 @@

    Interface address filtering selector function/0.

    For each ifaddrs entry, return either true to keep the entry or false to discard the entry.

    For example, to get an interface list which only contains -non-loopback inet interfaces:

    net:getifaddrs(
    -    fun (#{ addr  := #{family := inet},
    -            flags := Flags}) ->
    -          not lists:member(loopback, Flags);
    -        (_) ->
    +non-loopback inet interfaces:

    net:getifaddrs(
    +    fun (#{ addr  := #{family := inet},
    +            flags := Flags}) ->
    +          not lists:member(loopback, Flags);
    +        (_) ->
               false
    -    end).
    +
    end).
    @@ -1375,7 +1375,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.802319531 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_adm.html 2026-03-12 21:37:02.806319556 +0000 @@ -450,8 +450,8 @@

    Returns the names and associated port numbers of the Erlang nodes that epmd -registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    -{ok,[{"arne",40262}]}
    +registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    +{ok,[{"arne",40262}]}
    @@ -627,7 +627,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.838319745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/net_kernel.html 2026-03-12 21:37:02.846319793 +0000 @@ -97,9 +97,9 @@ operational for distributed Erlang to work. The purpose of this process is to implement parts of the BIFs spawn/4 and spawn_link/4, and to provide monitoring of the network.

    An Erlang node is started using command-line flag -name or -sname:

    $ erl -sname foobar

    It is also possible to call net_kernel:start(foobar, #{}) -directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    -{ok,<0.64.0>}
    -(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is +directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    +{ok,<0.64.0>}
    +(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is foobar@Host, where Host is the short name of the host (not the fully qualified domain name). If started with flag -name, the node name is foobar@Host, where Host is the fully qualified domain name. For more @@ -679,13 +679,13 @@ delivered before a nodeup message due to a new connection to the same node. Prior to OTP 23.0, this was not guaranteed to be the case.

  • The format of the node status change messages depends on Options. If Options is the empty list or if net_kernel:monitor_nodes/1 is called, the format is as -follows:

    {nodeup, Node} | {nodedown, Node}
    -  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe +follows:

    {nodeup, Node} | {nodedown, Node}
    +  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe for status change messages for visible nodes. That is, only nodes that appear in the result of erlang:nodes/0.

    If Options equals anything other than the empty list, the format of the status -change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    -  Node = node()
    -  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. +change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    +  Node = node()
    +  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. If Options is a map, Info will also be a map. If Options is a list, Info will also be a list.

    When Options is a map, currently the following associations are allowed:

    • connection_id => boolean() - If the value of the association equals true, a connection_id => ConnectionId association will be included in the @@ -719,23 +719,23 @@ {node_type, visible} tuple will be included in the Info list.

    • nodedown_reason - The tuple {nodedown_reason, Reason} will be included in the Info list for nodedown messages.

      See the documentation of the nodedown_reason => boolean() association -above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
    +above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
     ok
    -(a@localhost)2> flush().
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067552,node_type => visible}}
    -Shell got {nodeup,c@localhost,
    -                  #{connection_id => 13892107,node_type => hidden}}
    -Shell got {nodedown,b@localhost,
    -                    #{connection_id => 3067552,node_type => visible,
    -                      nodedown_reason => connection_closed}}
    -Shell got {nodedown,c@localhost,
    -                    #{connection_id => 13892107,node_type => hidden,
    -                      nodedown_reason => net_tick_timeout}}
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067553,node_type => visible}}
    +(a@localhost)2> flush().
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067552,node_type => visible}}
    +Shell got {nodeup,c@localhost,
    +                  #{connection_id => 13892107,node_type => hidden}}
    +Shell got {nodedown,b@localhost,
    +                    #{connection_id => 3067552,node_type => visible,
    +                      nodedown_reason => connection_closed}}
    +Shell got {nodedown,c@localhost,
    +                    #{connection_id => 13892107,node_type => hidden,
    +                      nodedown_reason => net_tick_timeout}}
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067553,node_type => visible}}
     ok
    -(a@localhost)3>
    +
    (a@localhost)3>
    @@ -1025,7 +1025,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:02.918320219 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/notes.html 2026-03-12 21:37:02.926320267 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:37:02.966320504 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/os.html 2026-03-12 21:37:02.970320528 +0000 @@ -623,19 +623,19 @@

        Executes Command in a command shell of the target OS, captures the standard -output and standard error of the command, and returns this result as a string.

        Examples:

        LsOut = os:cmd("ls"), % on unix platform
        -DirOut = os:cmd("dir"), % on Win32 platform

        Notice that in some cases, standard output of a command when called from another +output and standard error of the command, and returns this result as a string.

        Examples:

        LsOut = os:cmd("ls"), % on unix platform
        +DirOut = os:cmd("dir"), % on Win32 platform

        Notice that in some cases, standard output of a command when called from another program can differ, compared with the standard output of the command when called directly from an OS command shell.

        The possible options are:

        • max_size - The maximum size of the data returned by the os:cmd/2 call. This option is a safety feature that should be used when the command executed -can return a very large, possibly infinite, result.

          Example:

          > os:cmd("cat /dev/zero", #{ max_size => 20 }).
          -[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
        • exception_on_failure - If set to true, os:cmd/2 will throw an error +can return a very large, possibly infinite, result.

          Example:

          > os:cmd("cat /dev/zero", #{ max_size => 20 }).
          +[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
        • exception_on_failure - If set to true, os:cmd/2 will throw an error exception if the command exits with a non-zero exit code. The exception reason looks like this: {command_failed, ResultBeforeFailure, ExitCode} where ResultBeforeFailure is the result written to stdout by the command before -the error happened and ExitCode is the exit code from the command.

          Example:

          > catch os:cmd("echo hello && exit 123", #{ exception_on_failure => true }).
          -{'EXIT',{{command_failed,"hello\n",123},
          -         [{os,cmd,2,[{file,"os.erl"},{line,579}]},
          +the error happened and ExitCode is the exit code from the command.

          Example:

          > catch os:cmd("echo hello && exit 123", #{ exception_on_failure => true }).
          +{'EXIT',{{command_failed,"hello\n",123},
          +         [{os,cmd,2,[{file,"os.erl"},{line,579}]},
           ...

        The command shell can be set using the kernel configuration parameter, by default the shell is detected upon system startup.

        @@ -928,7 +928,7 @@ resolution timestamp.

        This counter is read directly from the hardware or operating system with the same guarantees. This means that two consecutive calls to the function are not guaranteed to be monotonic, though it most likely will be. The performance -counter will be converted to the resolution passed as an argument.

        1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
        +counter will be converted to the resolution passed as an argument.

        1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
         176525861
         2> T2 - T1.
         10004
        @@ -1099,16 +1099,16 @@ allows you to log time stamps in high resolution and consistent with the time in the rest of the OS.

        Example of code formatting a string in format "DD Mon YYYY HH:MM:SS.mmmmmm", where DD is the day of month, Mon is the textual month name, YYYY is the year, -HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

        -module(print_time).
        --export([format_utc_timestamp/0]).
        -format_utc_timestamp() ->
        -    TS = {_,_,Micro} = os:timestamp(),
        -    {{Year,Month,Day},{Hour,Minute,Second}} =
        -calendar:now_to_universal_time(TS),
        -    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
        -    "Aug","Sep","Oct","Nov","Dec"}),
        -    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
        -    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

        This module can be used as follows:

        1> io:format("~s~n",[print_time:format_utc_timestamp()]).
        +HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

        -module(print_time).
        +-export([format_utc_timestamp/0]).
        +format_utc_timestamp() ->
        +    TS = {_,_,Micro} = os:timestamp(),
        +    {{Year,Month,Day},{Hour,Minute,Second}} =
        +calendar:now_to_universal_time(TS),
        +    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
        +    "Aug","Sep","Oct","Nov","Dec"}),
        +    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
        +    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

        This module can be used as follows:

        1> io:format("~s~n",[print_time:format_utc_timestamp()]).
         29 Apr 2009  9:55:30.051711

        OS system time can also be retrieved by system_time/0 and system_time/1.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:03.006320740 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/pg.html 2026-03-12 21:37:03.006320740 +0000 @@ -829,7 +829,7 @@

    Subscribes the caller to updates from the specified scope.

    Returns content of the entire scope and a reference to match the upcoming notifications.

    Whenever any group membership changes, an update message is sent to the -subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    +subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    @@ -1010,7 +1010,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:03.042320954 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/rpc.html 2026-03-12 21:37:03.050321001 +0000 @@ -1043,10 +1043,10 @@ return values, or {badrpc, Reason} for failing calls. Timeout is a time (integer) in milliseconds, or infinity.

    The following example is useful when new object code is to be loaded on all nodes in the network, and indicates some side effects that RPCs can produce:

    %% Find object code for module Mod
    -{Mod, Bin, File} = code:get_object_code(Mod),
    +{Mod, Bin, File} = code:get_object_code(Mod),
     
     %% and load it on all nodes including this one
    -{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
    +{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
     
     %% and then maybe check the ResL list.

    Note

    If you want the ability to distinguish between results, you may want to consider using the erpc:multicall() function from the @@ -1416,7 +1416,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:03.074321144 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/search.html 2026-03-12 21:37:03.074321144 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:03.106321334 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/seq_trace.html 2026-03-12 21:37:03.110321357 +0000 @@ -100,9 +100,9 @@ how it can be used, see section Sequential Tracing.

    seq_trace provides functions that control all aspects of sequential tracing. There are functions for activation, deactivation, inspection, and for collection of the trace output.

    Trace Messages Sent to the System Tracer

    The format of the messages is one of the following, depending on if flag -timestamp of the trace token is set to true or false:

    {seq_trace, Label, SeqTraceInfo, TimeStamp}

    or

    {seq_trace, Label, SeqTraceInfo}

    Where:

    Label = int()
    -TimeStamp = {Seconds, Milliseconds, Microseconds}
    -  Seconds = Milliseconds = Microseconds = int()

    SeqTraceInfo can have the following formats:

    • {send, Serial, From, To, Message} - Used when a process From with its +timestamp of the trace token is set to true or false:

      {seq_trace, Label, SeqTraceInfo, TimeStamp}

      or

      {seq_trace, Label, SeqTraceInfo}

      Where:

      Label = int()
      +TimeStamp = {Seconds, Milliseconds, Microseconds}
      +  Seconds = Milliseconds = Microseconds = int()

      SeqTraceInfo can have the following formats:

      • {send, Serial, From, To, Message} - Used when a process From with its trace token flag send set to true has sent information. To may be a process identifier, a registered name on a node represented as {NameAtom, NodeAtom}, or a node name represented as an atom. From may be a @@ -198,68 +198,68 @@ C-nodes built with Erl_Interface too. A C-node built with Erl_Interface only maintains one trace token, which means that the C-node appears as one process from the sequential tracing point of view.

        Example of Use

        This example gives a rough idea of how the new primitives can be used and what -kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        --compile(export_all).
        +kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        +-compile(export_all).
         
        -loop(Port) ->
        +loop(Port) ->
             receive
        -        {Port,Message} ->
        -            seq_trace:set_token(label,17),
        -            seq_trace:set_token('receive',true),
        -            seq_trace:set_token(print,true),
        -            seq_trace:print(17,"**** Trace Started ****"),
        -            call_server ! {self(),the_message};
        -        {ack,Ack} ->
        +        {Port,Message} ->
        +            seq_trace:set_token(label,17),
        +            seq_trace:set_token('receive',true),
        +            seq_trace:set_token(print,true),
        +            seq_trace:print(17,"**** Trace Started ****"),
        +            call_server ! {self(),the_message};
        +        {ack,Ack} ->
                     ok
             end,
        -    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
        +    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
             receive
        -        {PortController,Message} ->
        -            Ack = {received, Message},
        -            seq_trace:print(17,"We are here now"),
        -            PortController ! {ack,Ack}
        +        {PortController,Message} ->
        +            Ack = {received, Message},
        +            seq_trace:print(17,"We are here now"),
        +            PortController ! {ack,Ack}
             end,
        -    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
        +    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
         "**** Trace Started ****"
        -17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        -{<0.30.0>,the_message}
        -17:<0.31.0> Info {2,3} WITH
        +17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        +{<0.30.0>,the_message}
        +17:<0.31.0> Info {2,3} WITH
         "We are here now"
        -17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        -{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can -look like this:

        tracer() ->
        +17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        +{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can +look like this:

        tracer() ->
             receive
        -        {seq_trace,Label,TraceInfo} ->
        -           print_trace(Label,TraceInfo,false);
        -        {seq_trace,Label,TraceInfo,Ts} ->
        -           print_trace(Label,TraceInfo,Ts);
        +        {seq_trace,Label,TraceInfo} ->
        +           print_trace(Label,TraceInfo,false);
        +        {seq_trace,Label,TraceInfo,Ts} ->
        +           print_trace(Label,TraceInfo,Ts);
                 _Other -> ignore
             end,
        -    tracer().
        +    tracer().
         
        -print_trace(Label,TraceInfo,false) ->
        -    io:format("~p:",[Label]),
        -    print_trace(TraceInfo);
        -print_trace(Label,TraceInfo,Ts) ->
        -    io:format("~p ~p:",[Label,Ts]),
        -    print_trace(TraceInfo).
        -
        -print_trace({print,Serial,From,_,Info}) ->
        -    io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]);
        -print_trace({'receive',Serial,From,To,Message}) ->
        -    io:format("~p Received ~p FROM ~p WITH~n~p~n",
        -              [To,Serial,From,Message]);
        -print_trace({send,Serial,From,To,Message}) ->
        -    io:format("~p Sent ~p TO ~p WITH~n~p~n",
        -              [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that -process as the system tracer can look like this:

        start() ->
        -    Pid = spawn(?MODULE,tracer,[]),
        -    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        -    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        -    P = spawn(?MODULE, loop, [port]),
        -    register(call_server, spawn(?MODULE, loop, [])),
        -    start(),
        -    P ! {port,message}.
        +
        print_trace(Label,TraceInfo,false) -> + io:format("~p:",[Label]), + print_trace(TraceInfo); +print_trace(Label,TraceInfo,Ts) -> + io:format("~p ~p:",[Label,Ts]), + print_trace(TraceInfo). + +print_trace({print,Serial,From,_,Info}) -> + io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]); +print_trace({'receive',Serial,From,To,Message}) -> + io:format("~p Received ~p FROM ~p WITH~n~p~n", + [To,Serial,From,Message]); +print_trace({send,Serial,From,To,Message}) -> + io:format("~p Sent ~p TO ~p WITH~n~p~n", + [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that +process as the system tracer can look like this:

        start() ->
        +    Pid = spawn(?MODULE,tracer,[]),
        +    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        +    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        +    P = spawn(?MODULE, loop, [port]),
        +    register(call_server, spawn(?MODULE, loop, [])),
        +    start(),
        +    P ! {port,message}.
    @@ -848,11 +848,11 @@ tracing is disabled, otherwise Token should be an Erlang term returned from get_token/0 or set_token/1. set_token/1 can be used to temporarily exclude message passing from the trace by setting the -trace token to empty like this:

    OldToken = seq_trace:set_token([]), % set to empty and save
    +trace token to empty like this:

    OldToken = seq_trace:set_token([]), % set to empty and save
                                         % old value
     % do something that should not be part of the trace
    -io:format("Exclude the signalling caused by this~n"),
    -seq_trace:set_token(OldToken), % activate the trace token again
    +io:format("Exclude the signalling caused by this~n"),
    +seq_trace:set_token(OldToken), % activate the trace token again
     ...

    Returns the previous value of the trace token.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:03.198321878 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket.html 2026-03-12 21:37:03.206321926 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:03.254322210 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/socket_usage.html 2026-03-12 21:37:03.258322235 +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	2026-03-12 21:37:03.302322495 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/trace.html	2026-03-12 21:37:03.302322495 +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="0661991772-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="2506935813-4">],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    +1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
     1

    Note

    A match specification for send trace can use all guard and body functions except caller.

    Fails by raising an error exception with an error reason of:

    • badarg - If an argument is invalid.

    • system_limit - If a match specification passed as argument has excessive nesting which causes scheduler stack exhaustion for the scheduler that the @@ -1720,7 +1720,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/kernel-10.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 2026-03-12 21:37:03.334322685 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/wrap_log_reader.html 2026-03-12 21:37:03.338322708 +0000 @@ -509,7 +509,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.366322875 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/404.html 2026-03-12 21:37:03.366322875 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.386322993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/api-reference.html 2026-03-12 21:37:03.390323017 +0000 @@ -235,7 +235,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-05 20:52:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/content.opf 2042-04-07 10:10:26.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> megaco - 4.8.1 - urn:uuid:99ae78be-afb7-f819-2639-438ab58ad262 + urn:uuid:1858ba80-9228-0c13-5b23-9873fa2c0bd1 en - 2026-03-05T20:52:02Z + 2042-04-07T10:10:26Z /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 2026-03-05 20:52:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_debug.xhtml 2042-04-07 10:10:26.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 2026-03-05 20:52:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_encode.xhtml 2042-04-07 10:10:26.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 2026-03-05 20:52:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_examples.xhtml 2042-04-07 10:10:26.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 2026-03-05 20:52:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_performance.xhtml 2042-04-07 10:10:26.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 2026-03-05 20:52:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco_user.xhtml 2042-04-07 10:10:26.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 2026-03-05 20:52:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.epub/OEBPS/megaco.xhtml 2042-04-07 10:10:26.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 2026-03-12 21:37:03.630324439 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco.html 2026-03-12 21:37:03.634324463 +0000 @@ -3154,7 +3154,7 @@

    Utility function to produce a formated printout of the versions info generated by the versions1 and versions2 functions.

    The function print_version_info/0 uses the result of function version1/0 as -VersionInfo.

    Example:

               {ok, V} = megaco:versions1(), megaco:format_versions(V).
    +VersionInfo.

    Example:

               {ok, V} = megaco:versions1(), megaco:format_versions(V).
    @@ -4064,7 +4064,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.662324628 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_architecture.html 2026-03-12 21:37:03.666324653 +0000 @@ -326,7 +326,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.690324795 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_meas.html 2026-03-12 21:37:03.694324818 +0000 @@ -225,7 +225,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.722324985 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone1.html 2026-03-12 21:37:03.726325008 +0000 @@ -608,7 +608,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.754325174 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_mstone2.html 2026-03-12 21:37:03.754325174 +0000 @@ -226,7 +226,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.786325364 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_codec_transform.html 2026-03-12 21:37:03.786325364 +0000 @@ -226,7 +226,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.818325554 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_debug.html 2026-03-12 21:37:03.818325554 +0000 @@ -106,12 +106,12 @@ can be expected by the different codecs provided by the megaco application.

    The measurement is done by iterating over the decode/encode function for approx 2 seconds per message and counting the number of decodes/encodes.

    Is best run by modifying the meas.sh.skel skeleton script provided by the tool.

    To run it manually do the following:

            % erl -pa <path-megaco-ebin-dir> -pa <path-to-meas-module-dir>
    -        Erlang (BEAM) emulator version 5.6 [source]
    +        Erlang (BEAM) emulator version 5.6 [source]
     
    -        Eshell V12.2  (abort with ^G)
    -        1> megaco_codec_meas:start().
    +        Eshell V12.2  (abort with ^G)
    +        1> megaco_codec_meas:start().
             ...
    -        2> halt().

    or to make it even easier, assuming a measure shall be done on all the codecs + 2> halt().

    or to make it even easier, assuming a measure shall be done on all the codecs (as above):

            % erl -noshell -pa <path-megaco-ebin-dir> \\
                   -pa <path-to-meas-module-dir> \\
                   -s megaco_codec_meas -s init stop

    When run as above (this will take some time), the measurement process is done @@ -133,10 +133,10 @@ value.

    Both these tools use the message package (time_test.msgs) provided with the tool(s), although it can run on any message package as long as it has the same structure.

    Message package file

    This is simply an erlang compatible text-file with the following structure: -{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    -messages_list() = [{message_name(), message()}]
    -message_name() = atom()
    -message() = binary()

    The codec name is the name of the codec with which all messages in the +{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    +messages_list() = [{message_name(), message()}]
    +message_name() = atom()
    +message() = binary()

    The codec name is the name of the codec with which all messages in the message_list() has been encoded.

    This file can be exported to a file structure by calling the export_messages function. This can be usefull if a measurement shall be done with an external tool. Exporting the @@ -195,7 +195,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.842325696 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_digit_map.html 2026-03-12 21:37:03.846325719 +0000 @@ -467,7 +467,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.878325909 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_edist_compress.html 2026-03-12 21:37:03.878325909 +0000 @@ -246,7 +246,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.906326075 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encode.html 2026-03-12 21:37:03.910326098 +0000 @@ -110,75 +110,75 @@ format using long keywords and an indentation style like the text examples in the Megaco/H.248 specification).

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty, well -indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    -   Transaction = 9998 {
    -           Context = - {
    -                   ServiceChange = ROOT {
    -                           Services {
    +indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    +   Transaction = 9998 {
    +           Context = - {
    +                   ServiceChange = ROOT {
    +                           Services {
                                        Method = Restart,
                                        ServiceChangeAddress = 55555,
                                        Profile = ResGW/1,
                                        Reason = "901 Cold Boot"
    -                           }
    -                   }
    -           }
    -   }

    Then the compact version without indentation and with short keywords:

    
    +                           }
    +                   }
    +           }
    +   }

    Then the compact version without indentation and with short keywords:

    
        !/1 [124.124.124.222]
        T=9998{C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 Cold Boot"}}}}

    And the programmers view of the same message. First a list of ActionRequest records are constructed and then it is sent with one of the send functions in -the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    -  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    -                              serviceChangeAddress = {portNumber, 55555},
    +the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    +  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    +                              serviceChangeAddress = {portNumber, 55555},
                                   serviceChangeReason  = "901 Cold Boot",
    -                              serviceChangeProfile = Prof},
    -  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    -                                serviceChangeParms = Parm},
    -  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    -                              commandRequests = {serviceChangeReq, Req}}],
    -  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
    +                              serviceChangeProfile = Prof},
    +  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    +                                serviceChangeParms = Parm},
    +  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    +                              commandRequests = {serviceChangeReq, Req}}],
    +  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
        asn1_NOVALUE,
    -   {'Message',
    +   {'Message',
         1,
    -    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    -    {transactions,
    -     [
    -      {transactionRequest,
    -       {'TransactionRequest',
    +    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    +    {transactions,
    +     [
    +      {transactionRequest,
    +       {'TransactionRequest',
              9998,
    -         [{'ActionRequest',
    +         [{'ActionRequest',
                0,
                asn1_NOVALUE,
                asn1_NOVALUE,
    -           [
    -            {'CommandRequest',
    -             {serviceChangeReq,
    -              {'ServiceChangeRequest',
    -               [
    -                {megaco_term_id, false, ["root"]}],
    -                {'ServiceChangeParm',
    +           [
    +            {'CommandRequest',
    +             {serviceChangeReq,
    +              {'ServiceChangeRequest',
    +               [
    +                {megaco_term_id, false, ["root"]}],
    +                {'ServiceChangeParm',
                      restart,
    -                 {portNumber, 55555},
    +                 {portNumber, 55555},
                      asn1_NOVALUE,
    -                 {'ServiceChangeProfile', "resgw", version = 1},
    +                 {'ServiceChangeProfile', "resgw", version = 1},
                      "901 MG Cold Boot",
                      asn1_NOVALUE,
                      asn1_NOVALUE,
                      asn1_NOVALUE
    -                }
    -              }
    -             },
    +                }
    +              }
    +             },
                  asn1_NOVALUE,
                  asn1_NOVALUE
    -            }
    -           ]
    -          }
    -         ]
    -       }
    -      }
    -     ]
    -    }
    -   }
    -  }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes + } + ] + } + ] + } + } + ] + } + } + }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes both pretty as well as compact text.
    • megaco_compact_text_encoder - encodes messages into compact text format, decodes both pretty as well as compact text.
    • megaco_binary_encoder - encode/decode ASN.1 BER messages. This encoder implements the fastest of the BER encoders/decoders. Recommended binary codec.
    • megaco_ber_encoder - encode/decode ASN.1 BER messages.
    • megaco_per_encoder - encode/decode ASN.1 PER messages. N.B. that this format @@ -281,7 +281,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.950326336 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_encoder.html 2026-03-12 21:37:03.954326359 +0000 @@ -1363,7 +1363,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:03.978326502 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_examples.html 2026-03-12 21:37:03.982326526 +0000 @@ -111,10 +111,10 @@ erl -pa ../../../megaco/ebin -s megaco_filter -s megaco megaco_simple_mg:start().

    or simply 'gmake mg'.

    If you "only" want to start a single MG which tries to connect an MG on a host named "baidarka", you may use one of these functions (instead of the -megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    -      megaco_simple_mg:start_tcp_binary("baidarka", []).
    -      megaco_simple_mg:start_udp_text("baidarka", []).
    -      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be +megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    +      megaco_simple_mg:start_tcp_binary("baidarka", []).
    +      megaco_simple_mg:start_udp_text("baidarka", []).
    +      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be enabled and an interactive sequence chart tool to be started. This may be quite useful in order to visualize how your MG interacts with the Megaco/H.248 protocol stack.

    The event traces may alternatively be directed to a file for later analyze. By @@ -171,7 +171,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.002326644 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_flex_scanner.html 2026-03-12 21:37:04.006326668 +0000 @@ -416,7 +416,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.030326809 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_intro.html 2026-03-12 21:37:04.030326809 +0000 @@ -155,7 +155,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.054326953 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_mib.html 2026-03-12 21:37:04.058326976 +0000 @@ -153,7 +153,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.082327118 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_performance.html 2026-03-12 21:37:04.086327142 +0000 @@ -114,19 +114,19 @@ built-in functions.

    The actual encoded messages have been collected in one directory per encoding type, containing one file per encoded message.

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty -printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    -  Transaction = 9998 {
    -    Context = - {
    -      ServiceChange = ROOT {
    -        Services {
    +printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    +  Transaction = 9998 {
    +    Context = - {
    +      ServiceChange = ROOT {
    +        Services {
               Method = Restart,
               ServiceChangeAddress = 55555,
               Profile = ResGW/1,
               Reason = "901 MG Cold Boot"
    -        }
    -      }
    -    }
    -  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
    +        }
    +      }
    +    }
    +  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
       C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 MG Cold Boot"}}}}

    Setup

    The measurements has been performed on a Dell Precision 5550 Laptop with a Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz, with 40 GB memory and running Ubuntu 20.04 x86_64, kernel 5.4.0-91-generic. Software versions was open source OTP @@ -198,7 +198,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.110327284 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_run.html 2026-03-12 21:37:04.114327308 +0000 @@ -322,7 +322,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.142327474 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_sdp.html 2026-03-12 21:37:04.142327474 +0000 @@ -1199,7 +1199,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.170327639 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_tcp.html 2026-03-12 21:37:04.178327687 +0000 @@ -826,7 +826,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.206327854 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport.html 2026-03-12 21:37:04.202327829 +0000 @@ -299,7 +299,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.230327996 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_transport_mechanisms.html 2026-03-12 21:37:04.234328019 +0000 @@ -144,7 +144,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.262328185 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_udp.html 2026-03-12 21:37:04.262328185 +0000 @@ -862,7 +862,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.298328398 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/megaco_user.html 2026-03-12 21:37:04.306328446 +0000 @@ -96,17 +96,17 @@

    Callback module for users of the Megaco application

    This module defines the callback behaviour of Megaco users. A megaco_user compliant callback module must export the following functions:

    The semantics of them and their exact signatures are explained below.

    The user_args configuration parameter which may be used to extend the argument list of the callback functions. For example, the handle_connect function takes -by default two arguments:

    handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as +by default two arguments:

    handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as [SomePid,SomeTableRef], the callback function is expected to have these (in -this case two) extra arguments last in the argument list:

    handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. +this case two) extra arguments last in the argument list:

    handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. handle_unexpected_trans/4). The functions which takes this argument will be called if and only if one of the functions receive_message/5 or process_received_message/5 was called -with the Extra argument different than ignore_extra.

    DATA TYPES

    action_request() = #'ActionRequest'{}
    -action_reply() = #'ActionReply'{}
    -error_desc() = #'ErrorDescriptor'{}
    -segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" +with the Extra argument different than ignore_extra.

    DATA TYPES

    action_request() = #'ActionRequest'{}
    +action_reply() = #'ActionReply'{}
    +error_desc() = #'ErrorDescriptor'{}
    +segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" connection and may be reused after a reconnect (disconnect + connect).

    protocol_version() = integer()

    Is the actual protocol version. In most cases the protocol version is retrieved from the processed message, but there are exceptions:

    In these cases, the ProtocolVersion default version is obtained from the static @@ -1514,7 +1514,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.346328683 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/notes.html 2026-03-12 21:37:04.346328683 +0000 @@ -214,7 +214,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/megaco-4.8.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 2026-03-12 21:37:04.374328848 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/megaco-4.8.1/doc/html/search.html 2026-03-12 21:37:04.378328873 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:04.402329015 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/404.html 2026-03-12 21:37:04.402329015 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:04.426329157 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/api-reference.html 2026-03-12 21:37:04.430329180 +0000 @@ -136,7 +136,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-05 20:51:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/content.opf 2042-04-07 10:10:11.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> mnesia - 4.24.1 - urn:uuid:83322f72-f3d1-36eb-52f0-3822b206b772 + urn:uuid:0ac93db4-c0cf-457b-d858-b5361d703b10 en - 2026-03-05T20:51:49Z + 2042-04-07T10:10:11Z /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 2026-03-05 20:51:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_a.xhtml 2042-04-07 10:10:11.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 2026-03-05 20:51:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_b.xhtml 2042-04-07 10:10:11.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	2026-03-05 20:51:49.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_app_c.xhtml	2042-04-07 10:10:11.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	2026-03-05 20:51:49.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap2.xhtml	2042-04-07 10:10:11.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	2026-03-05 20:51:49.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap3.xhtml	2042-04-07 10:10:11.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 2026-03-05 20:51:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap4.xhtml 2042-04-07 10:10:11.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	2026-03-05 20:51:49.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap5.xhtml	2042-04-07 10:10:11.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 2026-03-05 20:51:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_chap7.xhtml 2042-04-07 10:10:11.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 2026-03-05 20:51:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia_registry.xhtml 2042-04-07 10:10:11.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 2026-03-05 20:51:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/mnesia.xhtml 2042-04-07 10:10:11.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 2026-03-05 20:51:49.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.epub/OEBPS/notes.xhtml 2042-04-07 10:10:11.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 2026-03-12 21:37:04.754331102 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia.html 2026-03-12 21:37:04.758331125 +0000 @@ -131,11 +131,11 @@ specifies the types of the SNMP keys.

        • attributes. The names of the attributes for the records that are inserted in the table.

        For information about the complete set of table properties and their details, see mnesia:create_table/2.

        This Reference Manual uses a table of persons to illustrate various examples. -The following record definition is assumed:

        -record(person, {name,
        +The following record definition is assumed:

        -record(person, {name,
                          age = 0,
                          address = unknown,
                          salary = 0,
        -                 children = []}),

        The first record attribute is the primary key, or key for short.

        The function descriptions are sorted in alphabetical order. It is recommended to + children = []}),

        The first record attribute is the primary key, or key for short.

        The function descriptions are sorted in alphabetical order. It is recommended to start to read about mnesia:create_table/2, mnesia:lock/2, and mnesia:activity/4 before you continue and learn about the rest.

        Writing or deleting in transaction-context creates a local copy of each modified record during the transaction. During iteration, that is, mnesia:foldl/4, @@ -2818,7 +2818,7 @@ -

        Change the storage type of a table.

        For example:

        mnesia:change_table_copy_type(person, node(), disc_copies)

        Transforms the person table from a RAM table into a disc-based table at +

        Change the storage type of a table.

        For example:

        mnesia:change_table_copy_type(person, node(), disc_copies)

        Transforms the person table from a RAM table into a disc-based table at Node.

        This function can also be used to change the storage type of the table named schema. The schema table can only have ram_copies or disc_copies as the storage type. If the storage type of the schema is ram_copies, no other table @@ -3069,22 +3069,22 @@ back end storage. Backend can currently be ets or dets. Properties is a list of options sent to the back end storage during table creation. Properties cannot contain properties already used by Mnesia, such as type -or named_table.

        For example:

        mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
        -       {storage_properties,
        -        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
      • {type, Type}, where Type must be either of the atoms set, ordered_set, +or named_table.

        For example:

        mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
        +       {storage_properties,
        +        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
      • {type, Type}, where Type must be either of the atoms set, ordered_set, or bag. Default is set. In a set, all records have unique keys. In a bag, several records can have the same key, but the record content is unique. If a non-unique record is stored, the old conflicting records are overwritten.

        Notice that currently ordered_set is not supported for disc_only_copies.

      • {local_content, Bool}, where Bool is true or false. Default is false.

      For example, the following call creates the person table (defined earlier) and -replicates it on two nodes:

      mnesia:create_table(person,
      -    [{ram_copies, [N1, N2]},
      -     {attributes, record_info(fields, person)}]).

      If it is required that Mnesia must build and maintain an extra index table on +replicates it on two nodes:

      mnesia:create_table(person,
      +    [{ram_copies, [N1, N2]},
      +     {attributes, record_info(fields, person)}]).

      If it is required that Mnesia must build and maintain an extra index table on attribute address of all the person records that are inserted in the table, -the following code would be issued:

      mnesia:create_table(person,
      -    [{ram_copies, [N1, N2]},
      -     {index, [address]},
      -     {attributes, record_info(fields, person)}]).

      The specification of index and attributes can be hard-coded as +the following code would be issued:

      mnesia:create_table(person,
      +    [{ram_copies, [N1, N2]},
      +     {index, [address]},
      +     {attributes, record_info(fields, person)}]).

      The specification of index and attributes can be hard-coded as {index, [2]} and {attributes, [name, age, address, salary, children]}, respectively.

      mnesia:create_table/2 writes records into the table schema. This function, and all other schema manipulation functions, are implemented with the normal @@ -5334,10 +5334,10 @@ argument. Default is read. The return value depends on MatchSpec.

      Notice that for best performance, select is to be used before any modifying operations are done on that table in the same transaction. That is, do not use write or delete before a select.

      In its simplest forms, the match_spec look as follows:

      • MatchSpec = [MatchFunction]
      • MatchFunction = {MatchHead, [Guard], [Result]}
      • MatchHead = tuple() | record()

      • Guard = {"Guardtest name", ...}
      • Result = "Term construct"

      For a complete description of select, see the ERTS -User's Guide and the ets manual page in STDLIB.

      For example, to find the names of all male persons older than 30 in table Tab:

      MatchHead = #href_anchor"ss">person{name='$1', sex=male, age='$2', _='_'},
      -Guard = {'>', '$2', 30},
      +User's Guide and the ets manual page in STDLIB.

      For example, to find the names of all male persons older than 30 in table Tab:

      MatchHead = #href_anchor"ss">person{name='$1', sex=male, age='$2', _='_'},
      +Guard = {'>', '$2', 30},
       Result = '$1',
      -mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
      +
      mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
      @@ -5632,9 +5632,9 @@ specified as a tuple of atoms describing the types. The only significant type is fix_string. This means that a string has a fixed size.

      For example, the following causes table person to be ordered as an SNMP table:

      mnesia:snmp_open_table(person, [{key, string}])

      Consider the following schema for a table of company employees. Each employee is identified by department number and name. The other table column stores the -telephone number:

      mnesia:create_table(employee,
      -    [{snmp, [{key, {integer, string}}]},
      -     {attributes, record_info(fields, employees)}]),

      The corresponding SNMP table would have three columns: department, name, and +telephone number:

      mnesia:create_table(employee,
      +    [{snmp, [{key, {integer, string}}]},
      +     {attributes, record_info(fields, employees)}]),

      The corresponding SNMP table would have three columns: department, name, and telno.

      An option is to have table columns that are not visible through the SNMP protocol. These columns must be the last columns of the table. In the previous example, the SNMP table could have columns department and name only. The @@ -6237,17 +6237,17 @@ transaction is terminated and the function transaction/1 returns the tuple {aborted, Reason}.

      If all is going well, {atomic, ResultOfFun} is returned, where ResultOfFun is the value of the last expression in Fun.

      A function that adds a family to the database can be written as follows if there -is a structure {family, Father, Mother, ChildrenList}:

      add_family({family, F, M, Children}) ->
      -    ChildOids = lists:map(fun oid/1, Children),
      -    Trans = fun() ->
      -        mnesia:write(F#person{children = ChildOids}),
      -        mnesia:write(M#person{children = ChildOids}),
      -        Write = fun(Child) -> mnesia:write(Child) end,
      -        lists:foreach(Write, Children)
      +is a structure {family, Father, Mother, ChildrenList}:

      add_family({family, F, M, Children}) ->
      +    ChildOids = lists:map(fun oid/1, Children),
      +    Trans = fun() ->
      +        mnesia:write(F#person{children = ChildOids}),
      +        mnesia:write(M#person{children = ChildOids}),
      +        Write = fun(Child) -> mnesia:write(Child) end,
      +        lists:foreach(Write, Children)
           end,
      -    mnesia:transaction(Trans).
      +    mnesia:transaction(Trans).
       
      -oid(Rec) -> {element(1, Rec), element(2, Rec)}.

      This code adds a set of people to the database. Running this code within one +oid(Rec) -> {element(1, Rec), element(2, Rec)}.

      This code adds a set of people to the database. Running this code within one transaction ensures that either the whole family is added to the database, or the whole transaction terminates. For example, if the last child is badly formatted, or the executing process terminates because of an 'EXIT' signal @@ -6255,17 +6255,17 @@ where half a family is added can never occur.

      It is also useful to update the database within a transaction if several processes concurrently update the same records. For example, the function raise(Name, Amount), which adds Amount to the salary field of a person, is -to be implemented as follows:

      raise(Name, Amount) ->
      -    mnesia:transaction(fun() ->
      -        case mnesia:wread({person, Name}) of
      -            [P] ->
      +to be implemented as follows:

      raise(Name, Amount) ->
      +    mnesia:transaction(fun() ->
      +        case mnesia:wread({person, Name}) of
      +            [P] ->
                       Salary = Amount + P#person.salary,
      -                P2 = P#person{salary = Salary},
      -                mnesia:write(P2);
      +                P2 = P#person{salary = Salary},
      +                mnesia:write(P2);
                   _ ->
      -                mnesia:abort("No such person")
      +                mnesia:abort("No such person")
               end
      -    end).

      When this function executes within a transaction, several processes running on + end).

      When this function executes within a transaction, several processes running on different nodes can concurrently execute the function raise/2 without interfering with each other.

      Since Mnesia detects deadlocks, a transaction can be restarted any number of times and therefore the Fun shall not have any side effects such as waiting @@ -6674,7 +6674,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:04.786331290 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_a.html 2026-03-12 21:37:04.790331315 +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 2026-03-12 21:37:04.826331527 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_b.html 2026-03-12 21:37:04.830331552 +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	2026-03-12 21:37:04.858331717 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_app_c.html	2026-03-12 21:37:04.862331742 +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	2026-03-12 21:37:04.890331907 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap1.html	2026-03-12 21:37:04.894331931 +0000
      @@ -166,7 +166,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:04.926332120 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap2.html 2026-03-12 21:37:04.930332145 +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	2026-03-12 21:37:04.962332334 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap3.html	2026-03-12 21:37:04.966332357 +0000
      @@ -127,18 +127,18 @@
       changes the format on all records in table Tab. It applies argument Fun to
       all records in the table. Fun must be a function that takes a record of the
       old type, and returns the record of the new type. The table key must not be
      -changed.

      Example:

      -record(old, {key, val}).
      --record(new, {key, val, extra}).
      +changed.

      Example:

      -record(old, {key, val}).
      +-record(new, {key, val, extra}).
       
       Transformer =
      -   fun(X) when record(X, old) ->
      -      #new{key = X#old.key,
      +   fun(X) when record(X, old) ->
      +      #new{key = X#old.key,
                  val = X#old.val,
      -           extra = 42}
      +           extra = 42}
          end,
      -{atomic, ok} = mnesia:transform_table(foo, Transformer,
      -                                      record_info(fields, new),
      -                                      new),

      Argument Fun can also be the atom ignore, which indicates that only the +{atomic, ok} = mnesia:transform_table(foo, Transformer, + record_info(fields, new), + new),

      Argument Fun can also be the atom ignore, which indicates that only the metadata about the table is updated. Use of ignore is not recommended (as it creates inconsistencies between the metadata and the actual data) but it is included as a possibility for the user do to an own (offline) transform.

    13. mnesia:change_table_copy_type(Tab, Node, ToType) @@ -172,29 +172,29 @@ when starting the Erlang shell or in the application script. Previously, the following example was used to create the directory for the Company database:

      % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
    14. If no command-line flag is entered, the Mnesia directory becomes the current working directory on the node where the Erlang shell is started.

    15. To start the Company database and get it running on the two specified nodes, -enter the following commands:

      1. On the node a@gin:
       gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
      1. On the node b@skeppet:
      skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
      1. On one of the two nodes:
      (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
      1. The function mnesia:start() is called on both nodes.
      2. To initialize the database, execute the following code on one of the two -nodes:
      dist_init() ->
      -    mnesia:create_table(employee,
      -                         [{ram_copies, [a@gin, b@skeppet]},
      -                          {attributes, record_info(fields,
      -                                                   employee)}]),
      -    mnesia:create_table(dept,
      -                         [{ram_copies, [a@gin, b@skeppet]},
      -                          {attributes, record_info(fields, dept)}]),
      -    mnesia:create_table(project,
      -                         [{ram_copies, [a@gin, b@skeppet]},
      -                          {attributes, record_info(fields, project)}]),
      -    mnesia:create_table(manager, [{type, bag},
      -                                  {ram_copies, [a@gin, b@skeppet]},
      -                                  {attributes, record_info(fields,
      -                                                           manager)}]),
      -    mnesia:create_table(at_dep,
      -                         [{ram_copies, [a@gin, b@skeppet]},
      -                          {attributes, record_info(fields, at_dep)}]),
      -    mnesia:create_table(in_proj,
      -                        [{type, bag},
      -                         {ram_copies, [a@gin, b@skeppet]},
      -                         {attributes, record_info(fields, in_proj)}]).

      As illustrated, the two directories reside on different nodes, because +enter the following commands:

      1. On the node a@gin:
       gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
      1. On the node b@skeppet:
      skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
      1. On one of the two nodes:
      (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
      1. The function mnesia:start() is called on both nodes.
      2. To initialize the database, execute the following code on one of the two +nodes:
      dist_init() ->
      +    mnesia:create_table(employee,
      +                         [{ram_copies, [a@gin, b@skeppet]},
      +                          {attributes, record_info(fields,
      +                                                   employee)}]),
      +    mnesia:create_table(dept,
      +                         [{ram_copies, [a@gin, b@skeppet]},
      +                          {attributes, record_info(fields, dept)}]),
      +    mnesia:create_table(project,
      +                         [{ram_copies, [a@gin, b@skeppet]},
      +                          {attributes, record_info(fields, project)}]),
      +    mnesia:create_table(manager, [{type, bag},
      +                                  {ram_copies, [a@gin, b@skeppet]},
      +                                  {attributes, record_info(fields,
      +                                                           manager)}]),
      +    mnesia:create_table(at_dep,
      +                         [{ram_copies, [a@gin, b@skeppet]},
      +                          {attributes, record_info(fields, at_dep)}]),
      +    mnesia:create_table(in_proj,
      +                        [{type, bag},
      +                         {ram_copies, [a@gin, b@skeppet]},
      +                         {attributes, record_info(fields, in_proj)}]).

      As illustrated, the two directories reside on different nodes, because /ldisc/scratch (the "local" disc) exists on the two different nodes.

      By executing these commands, two Erlang nodes are configured to run the Company database, and therefore, initialize the database. This is required only once when setting up. The next time the system is started, @@ -205,7 +205,7 @@ Code that manipulate Mnesia data behaves identically regardless of where the data resides.

      The function mnesia:stop() stops Mnesia on the node where the function is executed. The functions mnesia:start/0 and mnesia:stop/0 -work on the "local" Mnesia system. No functions start or stop a set of nodes.

      Startup Procedure

      Start Mnesia by calling the following function:

      mnesia:start().

      This function initiates the DBMS locally.

      The choice of configuration alters the location and load order of the tables. +work on the "local" Mnesia system. No functions start or stop a set of nodes.

      Startup Procedure

      Start Mnesia by calling the following function:

      mnesia:start().

      This function initiates the DBMS locally.

      The choice of configuration alters the location and load order of the tables. The alternatives are as follows:

      1. Tables that are only stored locally are initialized from the local Mnesia directory.
      2. Replicated tables that reside locally as well as somewhere else are either initiated from disc or by copying the entire table from the other node, @@ -228,9 +228,9 @@ from disc at a faster rate. The function forces tables to be loaded from disc regardless of the network situation.

        Thus, it can be assumed that if an application wants to use tables a and b, the application must perform some action similar to following before it can use -the tables:

        case mnesia:wait_for_tables([a, b], 20000) of
        -  {timeout, RemainingTabs} ->
        -    panic(RemainingTabs);
        +the tables:

        case mnesia:wait_for_tables([a, b], 20000) of
        +  {timeout, RemainingTabs} ->
        +    panic(RemainingTabs);
           ok ->
             synced
         end.

        Warning

        When tables are forcefully loaded from the local disc, all operations that @@ -250,13 +250,13 @@ key, whereas a table of type bag can have an arbitrary number of records per key. The key for each record is always the first attribute of the record.

        The following example illustrates the difference between type set and -bag:

         f() ->
        -    F = fun() ->
        -          mnesia:write({foo, 1, 2}),
        -          mnesia:write({foo, 1, 3}),
        -          mnesia:read({foo, 1})
        +bag:

         f() ->
        +    F = fun() ->
        +          mnesia:write({foo, 1, 2}),
        +          mnesia:write({foo, 1, 3}),
        +          mnesia:read({foo, 1})
                 end,
        -    mnesia:transaction(F).

        This transaction returns the list [{foo,1,3}] if table foo is of type + mnesia:transaction(F).

        This transaction returns the list [{foo,1,3}] if table foo is of type set. However, the list [{foo,1,2}, {foo,1,3}] is returned if the table is of type bag.

        Mnesia tables can never contain duplicates of the same record in the same table. Duplicate records have attributes with the same contents and key.

      3. {disc_copies, NodeList}, where NodeList is a list of the nodes where @@ -300,11 +300,11 @@ table. All records stored in the table must have this name as their first element. record_name defaults to the name of the table. For more information, see -Record Names versus Table Names.

      4. As an example, consider the following record definition:

        -record(funky, {x, y}).

        The following call would create a table that is replicated on two nodes, has an -extra index on attribute y, and is of type bag.

        mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
        -                            {type, bag}, {attributes, record_info(fields, funky)}]).

        Whereas a call to the following default code values would return a table with a +Record Names versus Table Names.

        As an example, consider the following record definition:

        -record(funky, {x, y}).

        The following call would create a table that is replicated on two nodes, has an +extra index on attribute y, and is of type bag.

        mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
        +                            {type, bag}, {attributes, record_info(fields, funky)}]).

        Whereas a call to the following default code values would return a table with a RAM copy on the local node, no extra indexes, and the attributes defaulted to -the list [key,val].

        mnesia:create_table(stuff, [])
        +the list [key,val].

        mnesia:create_table(stuff, [])
        @@ -356,7 +356,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:05.002332572 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap4.html 2026-03-12 21:37:05.006332595 +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	2026-03-12 21:37:05.046332832 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap5.html	2026-03-12 21:37:05.054332879 +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 2026-03-12 21:37:05.090333093 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap7.html 2026-03-12 21:37:05.090333093 +0000 @@ -161,26 +161,26 @@ for starting Mnesia:

        • An Erlang session must be started and a Mnesia directory must be specified for the database.
        • A database schema must be initiated, using the function mnesia:create_schema/1.

        The following example shows how these tasks are performed:

        Step 1: Start an Erlang session and specify a Mnesia directory for the -database:

        % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
        Erlang/OTP 27 [erts-15.1.2]
        +database:

        % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
        Erlang/OTP 27 [erts-15.1.2]
         
        -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        -(klacke@gin)1> mnesia:create_schema([node()]).
        +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
        +(klacke@gin)1> mnesia:create_schema([node()]).
         ok
        -(klacke@gin)2>
        +(klacke@gin)2>
         Ctrl+Z
        -[1]+  Stopped                 erl

        Step 2: You can inspect the Mnesia directory to see what files have been +[1]+ Stopped erl

        Step 2: You can inspect the Mnesia directory to see what files have been created:

        % ls -l /ldisc/scratch/klacke
         -rw-rw-r--   1 klacke   staff       247 Aug 12 15:06 FALLBACK.BUP

        The response shows that the file FALLBACK.BUP has been created. This is called a backup file, and it contains an initial schema. If more than one node in the function mnesia:create_schema/1 had been specified, identical backup files -would have been created on all nodes.

        Step 3: Start Mnesia:

        (klacke@gin)3> mnesia:start().
        +would have been created on all nodes.

        Step 3: Start Mnesia:

        (klacke@gin)3> mnesia:start().
         ok

        Step 4: You can see the following listing in the Mnesia directory:

        -rw-rw-r--   1 klacke   staff         86 May 26 19:03 LATEST.LOG
         -rw-rw-r--   1 klacke   staff      34507 May 26 19:03 schema.DAT

        The schema in the backup file FALLBACK.BUP has been used to generate the file schema.DAT. Since there are no other disc resident tables than the schema, no other data files were created. The file FALLBACK.BUP was removed after the successful "restoration". You also see some files that are for internal use by -Mnesia.

        Step 5: Create a table:

        (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
        -{atomic,ok}

        Step 6: You can see the following listing in the Mnesia directory:

        % ls -l /ldisc/scratch/klacke
        +Mnesia.

        Step 5: Create a table:

        (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
        +{atomic,ok}

        Step 6: You can see the following listing in the Mnesia directory:

        % ls -l /ldisc/scratch/klacke
         -rw-rw-r-- 1 klacke staff    86 May 26 19:07 LATEST.LOG
         -rw-rw-r-- 1 klacke staff    94 May 26 19:07 foo.DCD
         -rw-rw-r-- 1 klacke staff  6679 May 26 19:07 schema.DAT

        The file foo.DCD has been created. This file will eventually store all data @@ -212,11 +212,11 @@ the Mnesia data files. For example, dets contains the function dets:traverse/2, which can be used to view the contents of a Mnesia DAT file. However, this can only be done when Mnesia is not running. So, to view -the schema file, do as follows;

        {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false},
        -{keypos, 2}]),
        -F = fun(X) -> io:format("~p~n", [X]), continue end,
        -dets:traverse(N, F),
        -dets:close(N).

        Warning

        The DAT files must always be opened with option {repair, false}. This +the schema file, do as follows;

        {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false},
        +{keypos, 2}]),
        +F = fun(X) -> io:format("~p~n", [X]), continue end,
        +dets:traverse(N, F),
        +dets:close(N).

        Warning

        The DAT files must always be opened with option {repair, false}. This ensures that these files are not automatically repaired. Without this option, the database can become inconsistent, because Mnesia can believe that the files were properly closed. For information about configuration parameter @@ -420,38 +420,38 @@ located first in the backup.

        The schema itself is a table and is possibly included in the backup. Each node where the schema table resides is regarded as a db_node.

        The following example shows how mnesia:traverse_backup can be used to rename a -db_node in a backup file:

        change_node_name(Mod, From, To, Source, Target) ->
        +db_node in a backup file:

        change_node_name(Mod, From, To, Source, Target) ->
             Switch =
        -        fun(Node) when Node == From -> To;
        -           (Node) when Node == To -> throw({error, already_exists});
        -           (Node) -> Node
        +        fun(Node) when Node == From -> To;
        +           (Node) when Node == To -> throw({error, already_exists});
        +           (Node) -> Node
                 end,
             Convert =
        -        fun({schema, version, Version}, Acc) ->
        -                {[{schema, version, Version}], Acc};
        -           ({schema, cookie, Cookie}, Acc) ->
        -                {[{schema, cookie, Cookie}], Acc};
        -           ({schema, Tab, CreateList}, Acc) ->
        -                Keys = [ram_copies, disc_copies, disc_only_copies],
        +        fun({schema, version, Version}, Acc) ->
        +                {[{schema, version, Version}], Acc};
        +           ({schema, cookie, Cookie}, Acc) ->
        +                {[{schema, cookie, Cookie}], Acc};
        +           ({schema, Tab, CreateList}, Acc) ->
        +                Keys = [ram_copies, disc_copies, disc_only_copies],
                         OptSwitch =
        -                    fun({Key, Val}) ->
        -                            case lists:member(Key, Keys) of
        -                                true -> {Key, lists:map(Switch, Val)};
        -                                false-> {Key, Val}
        +                    fun({Key, Val}) ->
        +                            case lists:member(Key, Keys) of
        +                                true -> {Key, lists:map(Switch, Val)};
        +                                false-> {Key, Val}
                                     end
                             end,
        -                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
        -           (Other, Acc) ->
        -                {[Other], Acc}
        +                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
        +           (Other, Acc) ->
        +                {[Other], Acc}
                 end,
        -    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
        +    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
         
        -view(Source, Mod) ->
        -    View = fun(Item, Acc) ->
        -                   io:format("~p.~n",[Item]),
        -                   {[Item], Acc + 1}
        +view(Source, Mod) ->
        +    View = fun(Item, Acc) ->
        +                   io:format("~p.~n",[Item]),
        +                   {[Item], Acc + 1}
                    end,
        -    mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

        Restore

        Tables can be restored online from a backup without restarting Mnesia. A + mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

        Restore

        Tables can be restored online from a backup without restarting Mnesia. A restore is performed with the function mnesia:restore(Opaque, Args), where Args can contain the following tuples:

        • {module, Mod}. The backup module Mod is used to access the backup media. If @@ -578,7 +578,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:05.114333235 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_chap8.html 2026-03-12 21:37:05.118333258 +0000 @@ -150,7 +150,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:05.146333425 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_frag_hash.html 2026-03-12 21:37:05.146333425 +0000 @@ -378,7 +378,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:05.174333590 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_overview.html 2026-03-12 21:37:05.174333590 +0000 @@ -184,7 +184,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:05.198333733 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/mnesia_registry.html 2026-03-12 21:37:05.198333733 +0000 @@ -217,8 +217,8 @@

          Warning

          This function is deprecated. Do not use it.

          A wrapper function for mnesia:create_table/2, which creates a table (if there is no existing table) with an appropriate set of attributes. The attributes and TabDef are forwarded to mnesia:create_table/2. For example, if the table -is to reside as disc_only_copies on all nodes, a call looks as follows:

                    TabDef = [{{disc_only_copies, node()|nodes()]}],
          -          mnesia_registry:create_table(my_reg, TabDef)
          +is to reside as disc_only_copies on all nodes, a call looks as follows:

                    TabDef = [{{disc_only_copies, node()|nodes()]}],
          +          mnesia_registry:create_table(my_reg, TabDef)
        @@ -247,7 +247,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/mnesia-4.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 2026-03-12 21:37:05.238333969 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/notes.html 2026-03-12 21:37:05.242333994 +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-2026 Ericsson AB

            +

            Copyright © 1996-2042 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 2026-03-12 21:37:05.266334136 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/mnesia-4.24.1/doc/html/search.html 2026-03-12 21:37:05.266334136 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.294334302 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/404.html 2026-03-12 21:37:05.294334302 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.322334467 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/api-reference.html 2026-03-12 21:37:05.326334492 +0000 @@ -146,7 +146,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.350334634 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/cdv_cmd.html 2026-03-12 21:37:05.354334657 +0000 @@ -135,7 +135,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.386334847 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_ug.html 2026-03-12 21:37:05.382334824 +0000 @@ -240,7 +240,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.414335013 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/crashdump_viewer.html 2026-03-12 21:37:05.418335036 +0000 @@ -268,7 +268,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.442335178 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop.html 2026-03-12 21:37:05.446335203 +0000 @@ -400,7 +400,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.478335393 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/etop_ug.html 2026-03-12 21:37:05.478335393 +0000 @@ -202,7 +202,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.502335535 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/introduction_ug.html 2026-03-12 21:37:05.506335558 +0000 @@ -142,7 +142,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.538335747 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/notes.html 2026-03-12 21:37:05.542335772 +0000 @@ -323,7 +323,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-05 20:51:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub/OEBPS/content.opf 2042-04-07 10:10:21.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> observer - 2.18.1 - urn:uuid:cd374aad-03ab-2214-c839-d4128f878dda + urn:uuid:16d89fe7-9b57-ee83-b859-e4a87439b421 en - 2026-03-05T20:51:57Z + 2042-04-07T10:10:21Z /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 2026-03-05 20:51:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub/OEBPS/ttb_ug.xhtml 2042-04-07 10:10:21.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 2026-03-05 20:51:57.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.epub/OEBPS/ttb.xhtml 2042-04-07 10:10:21.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 2026-03-12 21:37:05.698336696 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer.html 2026-03-12 21:37:05.702336721 +0000 @@ -356,7 +356,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.730336886 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_app.html 2026-03-12 21:37:05.734336910 +0000 @@ -133,7 +133,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.766337099 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/observer_ug.html 2026-03-12 21:37:05.762337076 +0000 @@ -234,7 +234,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.790337242 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/search.html 2026-03-12 21:37:05.790337242 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.834337503 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb.html 2026-03-12 21:37:05.838337526 +0000 @@ -1895,13 +1895,13 @@ is "contaminated" with token seq_trace.

      If Flags = all, all possible flags are set.

      The possible values for SeqTraceFlag are available in seq_trace.

      For a description of the match_spec() syntax, see section Match Specifications in Erlang in ERTS, which explains the general match specification "language".

      Note

      The system tracer for sequential tracing is automatically initiated by ttb -when a trace port is started with ttb:tracer/0,1,2.

      An example of how to use function seq_trigger_ms/0,1 follows:

      (tiger@durin)5> ttb:tracer().
      -{ok,[tiger@durin]}
      -(tiger@durin)6> ttb:p(all,call).
      -{ok,{[all],[call]}}
      -(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
      -{ok,[{matched,1},{saved,1}]}
      -(tiger@durin)8>

      Whenever mod:func(...) is called after this, token seq_trace is set on the +when a trace port is started with ttb:tracer/0,1,2.

      An example of how to use function seq_trigger_ms/0,1 follows:

      (tiger@durin)5> ttb:tracer().
      +{ok,[tiger@durin]}
      +(tiger@durin)6> ttb:p(all,call).
      +{ok,{[all],[call]}}
      +(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
      +{ok,[{matched,1},{saved,1}]}
      +(tiger@durin)8>

      Whenever mod:func(...) is called after this, token seq_trace is set on the executing process.

      @@ -1940,14 +1940,14 @@

      This function is a shortcut allowing to start a trace with one command. Each tuple in Patterns is converted to a list, which in turn is passed to -ttb:tpl/2,3,4.

      The call:

      > ttb:start_trace([Node, OtherNode],
      -                  [{mod, foo, []}, {mod, bar, 2}],
      -                  {all, call},
      -                  [{file, File}, {handler,{fun myhandler/4, S}}]).

      is equivalent to:

      > ttb:start_trace([Node, OtherNode],
      -                  [{file, File}, {handler,{fun myhandler/4, S}}]),
      -ttb:tpl(mod, foo, []),
      -ttb:tpl(mod, bar, 2, []),
      -ttb:p(all, call).
      +ttb:tpl/2,3,4.

      The call:

      > ttb:start_trace([Node, OtherNode],
      +                  [{mod, foo, []}, {mod, bar, 2}],
      +                  {all, call},
      +                  [{file, File}, {handler,{fun myhandler/4, S}}]).

      is equivalent to:

      > ttb:start_trace([Node, OtherNode],
      +                  [{file, File}, {handler,{fun myhandler/4, S}}]),
      +ttb:tpl(mod, foo, []),
      +ttb:tpl(mod, bar, 2, []),
      +ttb:p(all, call).
      @@ -2519,7 +2519,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/observer-2.18.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 2026-03-12 21:37:05.886337811 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/observer-2.18.1/doc/html/ttb_ug.html 2026-03-12 21:37:05.894337857 +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 2026-03-12 21:37:05.918338001 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/404.html 2026-03-12 21:37:05.918338001 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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 2026-03-12 21:37:05.942338143 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/api-reference.html 2026-03-12 21:37:05.946338166 +0000 @@ -118,7 +118,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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 2026-03-12 21:37:05.970338308 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/databases.html 2026-03-12 21:37:05.974338333 +0000 @@ -195,7 +195,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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 2026-03-12 21:37:06.002338498 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/error_handling.html 2026-03-12 21:37:06.002338498 +0000 @@ -200,7 +200,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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 2026-03-12 21:37:06.038338712 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/getting_started.html 2026-03-12 21:37:06.042338735 +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="5785249557-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="6050538083-1">).
      +     {selected,["FIRSTNAME","NR"],
      +          [{"Jane",1},
      +           {"Monica",3},
      +           {"Rachel",5},
      +           {"Piper",6},
      +           {"Prue",7},
      +           {"Louise",8}]}

      Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on +the field FIRSTNAME.

       16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
      +      ORDER BY FIRSTNAME").
      +    {selected,["FIRSTNAME","NR"],
      +          [{"Jane",1},
      +           {"Louise",8},
      +           {"Monica",3},
      +           {"Piper",6},
      +           {"Prue",7},
      +           {"Rachel",5}]}

      Associate a result set that contains the fields FIRSTNAME and NRfor all female employees to the connection. The number of rows in the result set is -returned.

       17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
      -      {ok,6}

      A few more ways of retrieving parts of the result set when the driver supports +returned.

       17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
      +      {ok,6}

      A few more ways of retrieving parts of the result set when the driver supports scrollable cursors. Note that next will work even without support for scrollable -cursors.

       18 > odbc:select(Ref, {relative, 2}, 3).
      -    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
       19 > odbc:select(Ref, next, 2).
      -      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
       20 > odbc:select(Ref, {absolute, 1}, 2).
      -      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
       21 > odbc:select(Ref, next, 2).
      -    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
       22 > odbc:select(Ref, {absolute, 1}, 4).
      -      {selected,["FIRSTNAME","NR"],
      -                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

      Select, using a parameterized query.

       23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
      -      [{{sql_char, 1}, ["M"]}]).
      -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
      -                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

      Delete the table EMPLOYEE.

       24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
      -      {updated,undefined}

      Shut down the connection.

       25 > odbc:disconnect(Ref).
      +cursors.

       18 > odbc:select(Ref, {relative, 2}, 3).
      +    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
       19 > odbc:select(Ref, next, 2).
      +      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
       20 > odbc:select(Ref, {absolute, 1}, 2).
      +      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
       21 > odbc:select(Ref, next, 2).
      +    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
       22 > odbc:select(Ref, {absolute, 1}, 4).
      +      {selected,["FIRSTNAME","NR"],
      +                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

      Select, using a parameterized query.

       23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
      +      [{{sql_char, 1}, ["M"]}]).
      +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
      +                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

      Delete the table EMPLOYEE.

       24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
      +      {updated,undefined}

      Shut down the connection.

       25 > odbc:disconnect(Ref).
             ok

      Shut down the application.

       26 > odbc:stop().
           =INFO REPORT==== 7-Jan-2004::17:00:59 ===
           application: odbc
      @@ -238,7 +238,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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 2026-03-12 21:37:06.070338902 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/introduction.html 2026-03-12 21:37:06.070338902 +0000 @@ -154,7 +154,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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 2026-03-12 21:37:06.098339067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/notes.html 2026-03-12 21:37:06.102339091 +0000 @@ -256,7 +256,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/odbc-2.16/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 2026-03-05 20:51:58.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.epub/OEBPS/content.opf 2042-04-07 10:10:22.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> odbc - 2.16 - urn:uuid:72e1a7ef-77da-50d0-9832-f9b1a76cda12 + urn:uuid:f4b10231-e8b2-2f67-f300-d31e4f6c1969 en - 2026-03-05T20:51:58Z + 2042-04-07T10:10:22Z /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 2026-03-05 20:51:58.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.epub/OEBPS/getting_started.xhtml 2042-04-07 10:10:22.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	2026-03-12 21:37:06.218339778 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/odbc.html	2026-03-12 21:37:06.218339778 +0000
      @@ -1800,7 +1800,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 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 2026-03-12 21:37:06.242339921 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/odbc-2.16/doc/html/search.html 2026-03-12 21:37:06.246339945 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.266340063 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/404.html 2026-03-12 21:37:06.270340086 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.290340205 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/api-reference.html 2026-03-12 21:37:06.294340229 +0000 @@ -154,7 +154,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.322340394 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/cpu_sup.html 2026-03-12 21:37:06.326340419 +0000 @@ -604,7 +604,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.354340585 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/disksup.html 2026-03-12 21:37:06.358340608 +0000 @@ -528,7 +528,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.386340774 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/memsup.html 2026-03-12 21:37:06.386340774 +0000 @@ -652,7 +652,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.414340941 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/notes.html 2026-03-12 21:37:06.418340964 +0000 @@ -248,7 +248,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.442341106 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/nteventlog.html 2026-03-12 21:37:06.446341130 +0000 @@ -300,7 +300,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-05 20:51:51.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon.epub/OEBPS/content.opf 2042-04-07 10:10:14.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> os_mon - 2.11.1 - urn:uuid:6cc84565-a37b-2566-6b0e-5e40b11ea523 + urn:uuid:8db8a5c0-d257-8425-79bf-a4671934308a en - 2026-03-05T20:51:51Z + 2042-04-07T10:10:14Z /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 2026-03-12 21:37:06.538341675 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_mon_app.html 2026-03-12 21:37:06.538341675 +0000 @@ -145,7 +145,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.562341817 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/os_sup.html 2026-03-12 21:37:06.570341864 +0000 @@ -363,7 +363,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.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 2026-03-12 21:37:06.594342006 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/os_mon-2.11.1/doc/html/search.html 2026-03-12 21:37:06.594342006 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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 2026-03-12 21:37:06.618342150 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/404.html 2026-03-12 21:37:06.618342150 +0000 @@ -110,7 +110,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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 2026-03-12 21:37:06.642342292 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/api-reference.html 2026-03-12 21:37:06.646342315 +0000 @@ -127,7 +127,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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 2026-03-12 21:37:06.682342529 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/leex.html 2026-03-12 21:37:06.682342529 +0000 @@ -126,13 +126,13 @@ next token. Note that pushing back a newline will mean the line numbering will no longer be correct.

      Note

      Pushing back characters gives you unexpected possibilities to cause the scanner to loop!

      The following example would match a simple Erlang integer or float and return a -token which could be sent to the Erlang parser:

      D = [0-9]
      +token which could be sent to the Erlang parser:

      D = [0-9]
       
      -{D}+ :
      -  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
      +{D}+ :
      +  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
       
      -{D}+\.{D}+((E|e)(\+|\-)?{D}+)? :
      -  {token,{float,TokenLine,list_to_float(TokenChars)}}.

      The Erlang code in the Erlang code. section is written into the output file +{D}+\.{D}+((E|e)(\+|\-)?{D}+)? : + {token,{float,TokenLine,list_to_float(TokenChars)}}.

      The Erlang code in the Erlang code. section is written into the output file directly after the module declaration and predefined exports declaration, making it possible to add extra exports, define imports, and other attributes, which are visible in the whole file.

      Regular Expressions

      The regular expressions allowed here is a subset of the set found in egrep and @@ -678,7 +678,7 @@ the token. This is continued until a token has been scanned. Cont is initially [].

      It is not designed to be called directly by an application, but is used through the I/O system where it can typically be called in an -application by:

      io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
      +application by:

      io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
         -> TokenRet
      @@ -767,7 +767,7 @@ like Erlang where there is an explicit end token, '.'. If no end token is found then the whole file will be scanned and returned. If an error occurs then all tokens up to and including the next end token will be skipped.

      It is not designed to be called directly by an application, but used through the -I/O system where it can typically be called in an application by:

      io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
      +I/O system where it can typically be called in an application by:

      io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
         -> TokensRet
      @@ -943,7 +943,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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 2026-03-12 21:37:06.714342719 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/notes.html 2026-03-12 21:37:06.722342765 +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-2026 Ericsson AB

          +

          Copyright © 1996-2042 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 2026-03-05 20:51:20.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub/OEBPS/content.opf 2042-04-07 10:09:39.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> parsetools - 2.7 - urn:uuid:6f32b762-be2d-55eb-1925-e1395a2d281f + urn:uuid:0d3fead6-7fd2-3fb0-3d74-b00e3b28e208 en - 2026-03-05T20:51:20Z + 2042-04-07T10:09:39Z /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 2026-03-05 20:51:20.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub/OEBPS/leex.xhtml 2042-04-07 10:09:39.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 2026-03-05 20:51:20.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub/OEBPS/notes.xhtml 2042-04-07 10:09:39.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 2026-03-05 20:51:20.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/parsetools.epub/OEBPS/yecc.xhtml 2042-04-07 10:09:39.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 2026-03-12 21:37:06.854343549 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/search.html 2026-03-12 21:37:06.854343549 +0000 @@ -108,7 +108,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/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 2026-03-12 21:37:06.894343785 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/parsetools-2.7/doc/html/yecc.html 2026-03-12 21:37:06.890343762 +0000 @@ -115,8 +115,8 @@ distinguished from all the terminal and non-terminal categories of the syntax rules. The Endsymbol can be declared in the grammar file.

      The simplest case is to segment the input string into a list of identifiers (atoms) and use those atoms both as categories and values of the tokens. For -example, the input string aaa bbb 777, X may be scanned (tokenized) as:

      [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
      - {'$end', 1}].

      This assumes that this is the first line of the input text, and that '$end' is +example, the input string aaa bbb 777, X may be scanned (tokenized) as:

      [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
      + {'$end', 1}].

      This assumes that this is the first line of the input text, and that '$end' is the distinguished end_of_input symbol.

      The Erlang scanner in the io module can be used as a starting point when writing a new scanner. Study yeccscan.erl in order to see how a filter can be added on top of io:scan_erl_form/3 to provide a scanner for Yecc that @@ -174,8 +174,8 @@ element -> atom. element -> list.

      This grammar can be used to generate a parser which parses list expressions, such as (), (a), (peter charles), (a (b c) d (())), ... provided that your -scanner tokenizes, for example, the input (peter charles) as follows:

      [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
      - {'$end', 1}]

      When a grammar rule is used by the parser to parse (part of) the input string as +scanner tokenizes, for example, the input (peter charles) as follows:

      [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
      + {'$end', 1}]

      When a grammar rule is used by the parser to parse (part of) the input string as a grammatical phrase, the associated code is evaluated, and the value of the last expression becomes the value of the parsed phrase. This value may be used by the parser later to build structures that are values of higher phrases of @@ -187,8 +187,8 @@ element -> atom : '$1'. element -> list : '$1'.

    With this code added to the grammar rules, the parser produces the following value (structure) when parsing the input string (a b c).. This still assumes -that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    -                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', +that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    +                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', '$3', and so on. which refer to (are bound to) the values associated previously by the parser with the symbols of the right-hand side of the rule. When these symbols are terminal categories, the @@ -205,12 +205,12 @@ elements -> element elements : {cons, '$1', '$2'}. elements -> '$empty' : nil. element -> atom : '$1'. -element -> list : '$1'.

    Generating a Parser

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type +element -> list : '$1'.

    Generating a Parser

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type (for example too ambiguous). Shift/reduce conflicts are resolved in favor of shifting if there are no operator precedence declarations. Refer to the yacc documentation on the use of operator precedence.

    The output file contains Erlang source code for a parser module with module name equal to the Parserfile parameter. After compilation, the parser can be called -as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included +as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included when generating the parser instead of the default file lib/parsetools/include/yeccpre.hrl.

    With the standard prologue, this call will return either {ok, Result}, where Result is a structure that the Erlang code of the grammar file has built, or @@ -219,15 +219,15 @@ the screen. The user will have to do this either by printing the returned error messages, or by inserting tests and print instructions in the Erlang code associated with the syntax rules of the grammar file.

    It is also possible to make the parser ask for more input tokens when needed if -the following call format is used:

    myparser:parse_and_scan({Function, Args})
    -myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call +the following call format is used:

    myparser:parse_and_scan({Function, Args})
    +myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call apply(Function, Args) or apply({Mod, Tokenizer}, Args) is executed whenever a new token is needed. This, for example, makes it possible to parse from a file, token by token.

    The tokenizer used above has to be implemented so as to return one of the -following:

    {ok, Tokens, EndPosition}
    -{eof, EndPosition}
    -{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library +following:

    {ok, Tokens, EndPosition}
    +{eof, EndPosition}
    +{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library module.

    If {eof, EndPosition} is returned immediately, the call to parse_and_scan/1 returns {ok, eof}. If {eof, EndPosition} is returned before the parser expects end of input, parse_and_scan/1 will, of course, return an error @@ -271,36 +271,36 @@ Endsymbol '$end'. grammar -> declaration : '$1'. grammar -> rule : '$1'. -declaration -> symbol symbols dot: {'$1', '$2'}. -rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], - '$4'}. +declaration -> symbol symbols dot: {'$1', '$2'}. +rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], + '$4'}. head -> symbol : '$1'. -symbols -> symbol : ['$1']. -symbols -> symbol symbols : ['$1' | '$2']. -attached_code -> ':' tokens : {erlang_code, '$2'}. -attached_code -> '$empty' : {erlang_code, - [{atom, 0, '$undefined'}]}. -tokens -> token : ['$1']. -tokens -> token tokens : ['$1' | '$2']. -symbol -> var : value_of('$1'). -symbol -> atom : value_of('$1'). -symbol -> integer : value_of('$1'). -symbol -> reserved_word : value_of('$1'). +symbols -> symbol : ['$1']. +symbols -> symbol symbols : ['$1' | '$2']. +attached_code -> ':' tokens : {erlang_code, '$2'}. +attached_code -> '$empty' : {erlang_code, + [{atom, 0, '$undefined'}]}. +tokens -> token : ['$1']. +tokens -> token tokens : ['$1' | '$2']. +symbol -> var : value_of('$1'). +symbol -> atom : value_of('$1'). +symbol -> integer : value_of('$1'). +symbol -> reserved_word : value_of('$1'). token -> var : '$1'. token -> atom : '$1'. token -> float : '$1'. token -> integer : '$1'. token -> string : '$1'. token -> char : '$1'. -token -> reserved_symbol : {value_of('$1'), line_of('$1')}. -token -> reserved_word : {value_of('$1'), line_of('$1')}. -token -> '->' : {'->', line_of('$1')}. -token -> ':' : {':', line_of('$1')}. +token -> reserved_symbol : {value_of('$1'), line_of('$1')}. +token -> reserved_word : {value_of('$1'), line_of('$1')}. +token -> '->' : {'->', line_of('$1')}. +token -> ':' : {':', line_of('$1')}. Erlang code. -value_of(Token) -> - element(3, Token). -line_of(Token) -> - element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are +value_of(Token) -> + element(3, Token). +line_of(Token) -> + element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are meta symbols of the grammar notation, as well as terminal symbols of the Yecc grammar.

    5. The file erl_parse.yrl in the lib/stdlib/src directory contains the grammar for Erlang.

    Note

    Syntactic tests are used in the code associated with some rules, and an error @@ -806,7 +806,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.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 2026-03-12 21:37:06.910343880 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/404.html 2026-03-12 21:37:06.914343903 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.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 2026-03-12 21:37:06.938344045 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/api-reference.html 2026-03-12 21:37:06.942344070 +0000 @@ -118,7 +118,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.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 2026-03-12 21:37:06.978344283 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/notes.html 2026-03-12 21:37:06.978344283 +0000 @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/public_key-1.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 2026-03-05 20:51:54.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub/OEBPS/content.opf 2042-04-07 10:10:17.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> public_key - 1.18.3 - urn:uuid:d4b20b1d-70d8-04ed-ff57-0f4b6fe10337 + urn:uuid:9c810c5b-e051-5a99-be18-a6295ef09d94 en - 2026-03-05T20:51:54Z + 2042-04-07T10:10:17Z /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 2026-03-05 20:51:54.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 2042-04-07 10:10:17.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	2026-03-05 20:51:54.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.epub/OEBPS/public_key.xhtml	2042-04-07 10:10:17.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 2026-03-05 20:51:54.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 2042-04-07 10:10:17.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	2026-03-12 21:37:07.146345279 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key.html	2026-03-12 21:37:07.150345303 +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-2026 Ericsson AB

          +

          Copyright © 1996-2042 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 2026-03-12 21:37:07.178345469 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_app.html 2026-03-12 21:37:07.182345492 +0000 @@ -156,7 +156,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.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 2026-03-12 21:37:07.214345682 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/public_key_records.html 2026-03-12 21:37:07.218345705 +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	2026-03-12 21:37:07.246345872 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/search.html	2026-03-12 21:37:07.246345872 +0000
          @@ -108,7 +108,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/public_key-1.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 2026-03-12 21:37:07.282346084 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/public_key-1.18.3/doc/html/using_public_key.html 2026-03-12 21:37:07.290346132 +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	2026-03-12 21:37:07.318346299 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/404.html	2026-03-12 21:37:07.318346299 +0000
          @@ -110,7 +110,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.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 2026-03-12 21:37:07.342346441 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/api-reference.html 2026-03-12 21:37:07.342346441 +0000 @@ -118,7 +118,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.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 2026-03-12 21:37:07.374346630 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/notes.html 2026-03-12 21:37:07.374346630 +0000 @@ -282,7 +282,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.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 2026-03-05 20:51:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.epub/OEBPS/content.opf 2042-04-07 10:10:09.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> reltool - 1.0.2 - urn:uuid:e1ec0f13-bc68-87c0-8258-5124d56982bc + urn:uuid:2234ef5b-2cbf-f5c0-0cdf-ab78658bc4bb en - 2026-03-05T20:51:47Z + 2042-04-07T10:10:09Z /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 2026-03-05 20:51:47.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.epub/OEBPS/reltool_examples.xhtml 2042-04-07 10:10:09.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	2026-03-12 21:37:07.506347412 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool.html	2026-03-12 21:37:07.510347437 +0000
          @@ -2846,7 +2846,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.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 2026-03-12 21:37:07.550347673 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_examples.html 2026-03-12 21:37:07.554347698 +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	2026-03-12 21:37:07.586347887 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_intro.html	2026-03-12 21:37:07.590347911 +0000
          @@ -153,7 +153,7 @@
                     Erlang programming language
           
                 

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.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 2026-03-12 21:37:07.614348052 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/reltool_usage.html 2026-03-12 21:37:07.618348077 +0000 @@ -251,7 +251,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/reltool-1.0.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 2026-03-12 21:37:07.642348219 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/reltool-1.0.2/doc/html/search.html 2026-03-12 21:37:07.642348219 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:07.666348361 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/404.html 2026-03-12 21:37:07.670348384 +0000 @@ -110,7 +110,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:07.694348527 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/api-reference.html 2026-03-12 21:37:07.694348527 +0000 @@ -163,7 +163,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:07.746348836 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg.html 2026-03-12 21:37:07.750348859 +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 2026-03-12 21:37:07.798349143 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dbg_guide.html 2026-03-12 21:37:07.802349167 +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 2026-03-12 21:37:07.830349332 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dtrace.html 2026-03-12 21:37:07.834349357 +0000 @@ -156,7 +156,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:07.862349522 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/dyntrace.html 2026-03-12 21:37:07.870349570 +0000 @@ -822,14 +822,14 @@

    Restores the previous state of user tags and their spreading as it was before a call to spread_tag/1.

    Note that the restoring is not limited to the same process; one can utilize this to turn off spreding in one process and restore it in a -newly created process that is is actually going to send messages:

    f() ->
    -    TagData = dyntrace:spread_tag(false),
    -    spawn(fun() ->
    -             dyntrace:restore_tag(TagData),
    -             do_something()
    -          end),
    -    do_something_else(),
    -    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as +newly created process that is is actually going to send messages:

    f() ->
    +    TagData = dyntrace:spread_tag(false),
    +    spawn(fun() ->
    +             dyntrace:restore_tag(TagData),
    +             do_something()
    +          end),
    +    do_something_else(),
    +    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as Erlang programs tend to send and receive messages so that sometimes the user tag gets lost due to various things, like double receives or communication with a port (ports do not handle user tags, in the same way as they do not handle @@ -876,12 +876,12 @@ later call to restore_tag/1.

    The file module already spreads tags, so there is no need to manually call this function to get user tags spread to the efile driver through that module.

    The most use of this function would be if one, for example, uses the io module to communicate with an I/O-server for a regular file, such as in the following -example:

    f() ->
    -   {ok, F} = file:open("test.tst", [write]),
    -   Saved = dyntrace:spread_tag(true),
    -   io:format(F, "Hello world!", []),
    -   dyntrace:restore_tag(Saved),
    -   file:close(F).

    In this example, any user tag set in the calling process will be spread to the +example:

    f() ->
    +   {ok, F} = file:open("test.tst", [write]),
    +   Saved = dyntrace:spread_tag(true),
    +   io:format(F, "Hello world!", []),
    +   dyntrace:restore_tag(Saved),
    +   file:close(F).

    In this example, any user tag set in the calling process will be spread to the I/O-server when the io:format/3 call is done.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:07.902349760 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/instrument.html 2026-03-12 21:37:07.910349808 +0000 @@ -314,8 +314,8 @@ the one before it.

    The upper bound of the first interval is provided by the function that returned the histogram, and the last interval has no upper bound.

    For example, the histogram below has 40 (message) blocks between 128-256 bytes in size, 78 blocks between 256-512 bytes,2 blocks between 512-1024 bytes, and 2 -blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    +blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    @@ -455,30 +455,30 @@ block size histograms. Defaults to 128.

  • histogram_width - The number of intervals in the allocated block size histograms. Defaults to 18.

  • flags - Controls how to group the output, for example showing allocations on a per-process basis (when possible) rather than only a -NIF/driver-basis. Defaults to [].

  • Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok,{128,0,
    -     #{udp_inet =>
    -           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
    +NIF/driver-basis. Defaults to [].

    Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok,{128,0,
    +     #{udp_inet =>
    +           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
            system =>
    -           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    -             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    -             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    -             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    -             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    -             ... }
    +           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    +             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    +             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    +             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    +             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    +             ... }
            spawn_forker =>
    -           #{driver_select_data_state =>
    -                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    -       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
    +           #{driver_select_data_state =>
    +                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
            prim_file =>
    -           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    +             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            prim_buffer =>
    -           #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    +
    #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}, + binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    @@ -555,15 +555,15 @@ tied to any particular scheduler. Defaults to all schedulers and the global instance.

  • histogram_start - The upper bound of the first interval in the free block size histograms. Defaults to 512.

  • histogram_width - The number of intervals in the free block size -histograms. Defaults to 14.

  • Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    -{ok,{512,
    -     [{driver_alloc,false,262144,0,
    -                    [{driver_alloc,1,32784}],
    -                    {0,0,0,0,0,0,0,1}},
    -      {binary_alloc,false,32768,0,
    -                    [{binary_alloc,15,4304}],
    -                    {3,0,0,0,1,0,0,0}},
    -      {...}|...]}}
    +histograms. Defaults to 14.

    Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    +{ok,{512,
    +     [{driver_alloc,false,262144,0,
    +                    [{driver_alloc,1,32784}],
    +                    {0,0,0,0,0,0,0,1}},
    +      {binary_alloc,false,32768,0,
    +                    [{binary_alloc,15,4304}],
    +                    {3,0,0,0,1,0,0,0}},
    +      {...}|...]}}
    @@ -592,7 +592,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:07.946350020 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/lttng.html 2026-03-12 21:37:07.950350045 +0000 @@ -96,46 +96,46 @@ information on how to install LTTng on your system.

    After LTTng is properly installed on the system Erlang/OTP can be built with LTTng support.

    $ ./configure --with-dynamic-trace=lttng
     $ make

    Dyntrace Tracepoints

    All tracepoints are in the domain of org_erlang_dyntrace

    All Erlang types are the string equivalent in LTTng.

    process_spawn

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • parent : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and +{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and {tracer,dyntrace,[]} as tracer module.

    Example:

    process_link: { cpu_id = 3 }, { from = "<0.130.0>", to = "<0.131.0>", type = "link" }

    process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reason : string :: Exit reason. Ex. "normal"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

    process_register

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • name : string :: Registered name. Ex. "logger"
    • type : string :: "register" | "unregister"

    Example:

    process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

    process_scheduled

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • type : string :: +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

      process_register

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • name : string :: Registered name. Ex. "logger"
      • type : string :: "register" | "unregister"

      Example:

      process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

      process_scheduled

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • type : string :: "in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Available through erlang:trace/3 with trace flag running and -{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_open: { cpu_id = 5 }, { pid = "<0.131.0>", driver = "'/bin/sh -s unix:cmd'", port = "#Port<0.1887>" }

      port_exit

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • reason : string :: Exit reason. Ex. "normal"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_exit: { cpu_id = 5 }, { port = "#Port<0.1887>", reason = "normal" }

      port_link

      • to : string :: Process ID. Ex. "<0.131.0>"
      • from : string :: Process ID. Ex. "<0.131.0>"
      • type : string :: "link" | "unlink"

      Available through erlang:trace/3 with trace flag ports and -{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and +{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • entry : string :: Callback. Ex. "open"
      • type : string :: -"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Example:

      port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

      Available through erlang:trace/3 with trace flag running and +"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

    Example:

    port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

    Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

    function_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_send: { cpu_id = 3 }, { from = "#Port<0.1938>", to = "<0.160.0>", message = "{#Port<0.1938>,eof}" }

    message_receive

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message received. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag 'receive' and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_receive: { cpu_id = 7 }, { to = "<0.167.0>", message = "{<0.165.0>,ok}" }

    gc_minor_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

    gc_minor_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

    gc_major_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

    gc_major_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

    BEAM Tracepoints

    All tracepoints are in the domain of org_erlang_otp

    All Erlang types are the string equivalent in LTTng.

    driver_init

    • driver : string :: Driver name. Ex. "tcp_inet"
    • major : integer :: Major version. Ex. 3
    • minor : integer :: Minor version. Ex. 1
    • flags : integer :: Flags. Ex. 1

    Example:

    driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

    driver_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • port : string :: Port ID. Ex. "#Port<0.1031>"

    Example:

    driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

    driver_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

    driver_outputv

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

    driver_ready_input

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

    driver_ready_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

    driver_timeout

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

    driver_stop_select

    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

    driver_flush

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

    driver_stop

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

    driver_process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    driver_ready_async

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

    driver_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

    driver_control

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

    carrier_create

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144
    • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
    • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

      gc_minor_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

      gc_major_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • need : integer :: Heap need. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

      gc_major_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

      BEAM Tracepoints

      All tracepoints are in the domain of org_erlang_otp

      All Erlang types are the string equivalent in LTTng.

      driver_init

      • driver : string :: Driver name. Ex. "tcp_inet"
      • major : integer :: Major version. Ex. 3
      • minor : integer :: Minor version. Ex. 1
      • flags : integer :: Flags. Ex. 1

      Example:

      driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

      driver_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Example:

      driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

      driver_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

      driver_outputv

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

      driver_ready_input

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

      driver_ready_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

      driver_timeout

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

      driver_stop_select

      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

      driver_flush

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

      driver_stop

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

      driver_process_exit

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      driver_ready_async

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

      driver_call

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

      driver_control

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

      carrier_create

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_pool_put

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

      carrier_pool_get

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

      Example of process tracing

      An example of process tracing of os_mon and friends.

      Clean start of lttng in a bash shell.

      $ lttng create erlang-demo
      +instance. Ex. 285296

    Example:

    carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

    carrier_pool_put

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

    carrier_pool_get

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

    Example of process tracing

    An example of process tracing of os_mon and friends.

    Clean start of lttng in a bash shell.

    $ lttng create erlang-demo
     Spawning a session daemon
     Session erlang-demo created.
     Traces will be written in /home/egil/lttng-traces/erlang-demo-20160526-165920

    Start an Erlang node with lttng enabled.

    $ erl
     Erlang/OTP 19 [erts-8.0] [source-4d7b24d] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [lttng]
     
     Eshell V8.0  (abort with ^G)
    -1>

    Load the dyntrace module.

    1> l(dyntrace).
    -{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through +1>

    Load the dyntrace module.

    1> l(dyntrace).
    +{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through lttng list -u.

    Enable the process_register LTTng tracepoint for Erlang.

    $ lttng enable-event -u org_erlang_dyntrace:process_register
    -UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
    +UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
     0

    Start LTTng tracing.

    $ lttng start
     Tracing started for session erlang-demo

    Start the os_mon application in Erlang.

    3> application:ensure_all_started(os_mon).
     {ok,[sasl,os_mon]}

    Stop LTTng tracing and view the result.

    $ lttng stop
    @@ -210,7 +210,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:07.990350281 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/msacc.html 2026-03-12 21:37:07.990350281 +0000 @@ -96,9 +96,9 @@

    Convenience functions for microstate accounting

    This module implements some convenience functions for analyzing microstate accounting data. For details about how to use the basic API and what the different states represent, see -erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
    +erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
     ok
    -2> msacc:print().
    +2> msacc:print().
     Average thread real-time    : 1000513 us
     Accumulated system run-time :    2213 us
     Average scheduler run-time  :    1076 us
    @@ -106,11 +106,11 @@
             Thread      aux check_io emulator       gc    other     port    sleep
     
     Stats per thread:
    -     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    - scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    - scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
    +     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    + scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    + scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
     
     Stats per type:
              async    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    @@ -910,7 +910,7 @@
     this can be verbose. See the top of this reference manual for a brief
     description of what the fields mean.

    It is possible to print more specific types of statistics by first manipulating the DataOrStats using stats/2. For instance if you want to print the -percentage of run-time for each thread you can do:

    msacc:print(msacc:stats(runtime, msacc:stats())).

    If you want to only print run-time per thread type you can do:

    msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

    Options

    • system - Print percentage of time spent in each state out of system time +percentage of run-time for each thread you can do:

      msacc:print(msacc:stats(runtime, msacc:stats())).

      If you want to only print run-time per thread type you can do:

      msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

      Options

      • system - Print percentage of time spent in each state out of system time as well as thread time. Default: false.
      @@ -1201,7 +1201,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:08.022350471 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/notes.html 2026-03-12 21:37:08.030350519 +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-2026 Ericsson AB

          +

          Copyright © 1996-2042 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 2026-03-05 20:51:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/content.opf 2042-04-07 10:09:37.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> runtime_tools - 2.3 - urn:uuid:546945b2-70b2-5d36-660d-e91b23aa57a1 + urn:uuid:faf5e774-0f8c-c104-6695-734e3501e2a9 en - 2026-03-05T20:51:18Z + 2042-04-07T10:09:37Z /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 2026-03-05 20:51:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/dbg_guide.xhtml 2042-04-07 10:09:37.000000000 +0000 @@ -20,22 +20,22 @@

          The dbg module in Erlang provides a text-based interface for tracing function calls, processes, ports, and messages. It simplifies the use of the underlying trace:process/4, trace:port/4, and trace:function/4 BIFs (Built-In Functions). This guide will walk you through the basics of using dbg for your Erlang applications.

          This facility is useful for both quick debugging sessions in the shell and for more structured system testing, especially where other tools might have too much performance impact.

          Quick Start

          To trace a call to a function with minimal fuss, call dbg:c(Module, Name, Arguments). It starts a temporary trace receiver, enables all trace flags, and calls the designated function from a temporary process. For example, here is how to trace a call -to application:which_applications/0:

          1> dbg:c(application, which_applications, []).
          -(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
          -                                    [alias|
          -                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
          -                                   which_applications} (Timestamp: {1710,
          +to application:which_applications/0:

          1> dbg:c(application, which_applications, []).
          +(<0.92.0>) <0.45.0> ! {'$gen_call',{<0.92.0>,
          +                                    [alias|
          +                                     #Ref<0.0.11779.270031856.1478295555.230456>]},
          +                                   which_applications} (Timestamp: {1710,
                                                                               847802,
          -                                                                    479222})
          -(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
          -(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
          -(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
          -               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
          -                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
          +                                                                    479222})
          +(<0.92.0>) out {gen,do_call,4} (Timestamp: {1710,847802,479231})
          +(<0.92.0>) in {gen,do_call,4} (Timestamp: {1710,847802,479271})
          +(<0.92.0>) << {[alias|#Ref<0.0.11779.270031856.1478295555.230456>],
          +               [{stdlib,"ERTS  CXC 138 10","5.2.1"},
          +                {kernel,"ERTS  CXC 138 10","9.2.2"}]} (Timestamp: {1710,
                                                                              847802,
          -                                                                   479274})
          -[{stdlib,"ERTS  CXC 138 10","5.2.1"},
          - {kernel,"ERTS  CXC 138 10","9.2.2"}]

          In this example, four trace events are generated:

          • A send event (!) for the sending of a request from the current process + 479274}) +[{stdlib,"ERTS CXC 138 10","5.2.1"}, + {kernel,"ERTS CXC 138 10","9.2.2"}]

          In this example, four trace events are generated:

          • A send event (!) for the sending of a request from the current process to the application_controller process.
          • A schedule-out event (out) when the current process schedules out while waiting in a receive for the reply to arrive.
          • A schedule-in event (in) when the current process is scheduled in when reply has arrived.
          • A receive event (<<) when the current process retrieves the reply from @@ -44,8 +44,8 @@ tracer and set the trace flags of your choice on the processes you want to trace. This is useful, when there is a complex system of processes, ports or nodes interacting where dbg:c/3 is to blunt.

            Starting a Tracer (dbg:tracer/0,2)

            First, you need to start a tracer process that will receive and display trace -messages.

            1> dbg:tracer().  % Start the default trace message receiver
            -{ok,<0.90.0>}     % <0.90.0> is the PID of the tracer process

            This starts a server on the local node that will be the recipient of all trace +messages.

            1> dbg:tracer().  % Start the default trace message receiver
            +{ok,<0.90.0>}     % <0.90.0> is the PID of the tracer process

            This starts a server on the local node that will be the recipient of all trace messages. It uses a default handler that prints formatted trace messages to the Erlang shell.

            If you need a custom tracer other than the default, you can create a tracer using dbg:tracer(Type, Data):

            • Type = process: Data is {HandlerFun, InitialState}. HandlerFun is @@ -76,18 +76,18 @@ case of a single pid exactly 1). The specification of matched processes is {matched, Node, N}. If the remote processor call (using rpc) to a remote node fails, the rpc error message is returned as the fourth element in the -tuple and the number of matched processes is 0.

              Example: Trace messages and process events for a specific process

              1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
              +tuple and the number of matched processes is 0.

              Example: Trace messages and process events for a specific process

              1> Pid = spawn(fun() -> receive {From,Msg} -> From ! Msg end end).
               <0.90.0>
              -2> dbg:tracer().
              -{ok,<0.92.0>}
              -3> dbg:p(Pid, [m,procs]). % Trace messages and process events for Pid
              -{ok,[{matched,nonode@nohost,1}]}
              -4> Pid ! {self(),hello}.
              -(<0.90.0>) << {<0.88.0>,hello} % Received by Pid
              -{<0.88.0>,hello}
              -(<0.90.0>) <0.88.0> ! hello    % Sent by Pid
              -(<0.90.0>) exit normal         % Process event: Pid exited
              -5> flush().
              +2> dbg:tracer().
              +{ok,<0.92.0>}
              +3> dbg:p(Pid, [m,procs]). % Trace messages and process events for Pid
              +{ok,[{matched,nonode@nohost,1}]}
              +4> Pid ! {self(),hello}.
              +(<0.90.0>) << {<0.88.0>,hello} % Received by Pid
              +{<0.88.0>,hello}
              +(<0.90.0>) <0.88.0> ! hello    % Sent by Pid
              +(<0.90.0>) exit normal         % Process event: Pid exited
              +5> flush().
               Shell got hello
               ok

              Tracing Function Calls (dbg:tp/2,3,4, dbg:tpl/2,3,4)

              To trace function calls, you need to:

              1. Enable the c/call flag for the process(es) that will make the calls (using dbg:p/2).
              2. Set a trace pattern for the function(s) you want to trace using dbg:tp/2 @@ -102,16 +102,16 @@ values, and exceptions. [{'_',[],[{exception_trace}]}]
              3. c or caller_trace: Shows function names, parameters, and caller information. [{'_',[],[{message,{caller_line}}]}]
              4. cx or caller_exception_trace: Combines x and c. -[{'_',[],[{exception_trace},{message,{caller_line}}]}]

          Example using built-in aliases:

          1> dbg:tracer().
          -{ok,<0.90.0>}
          -2> dbg:p(all, c). % Short for dbg:p(all, call)
          -{ok,[{matched,nonode@nohost,49}]}
          -3> dbg:tp(lists, seq, cx). % cx: call and exception tracing with caller info
          -{ok,[{matched,nonode@nohost,2},{saved,cx}]}
          -4> lists:seq(1, 3).
          -(<0.88.0>) call lists:seq(1,3) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
          -[1,2,3]
          -(<0.88.0>) returned from lists:seq/2 -> [1,2,3]

          Note that the caller info is the function that called lists:seq with file and +[{'_',[],[{exception_trace},{message,{caller_line}}]}]

      Example using built-in aliases:

      1> dbg:tracer().
      +{ok,<0.90.0>}
      +2> dbg:p(all, c). % Short for dbg:p(all, call)
      +{ok,[{matched,nonode@nohost,49}]}
      +3> dbg:tp(lists, seq, cx). % cx: call and exception tracing with caller info
      +{ok,[{matched,nonode@nohost,2},{saved,cx}]}
      +4> lists:seq(1, 3).
      +(<0.88.0>) call lists:seq(1,3) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
      +[1,2,3]
      +(<0.88.0>) returned from lists:seq/2 -> [1,2,3]

      Note that the caller info is the function that called lists:seq with file and line number.

      Tracing Message Events (dbg:tpe/2)

      By default, if send or receive tracing is enabled for a process, all such events are traced. dbg:tpe(Event, MatchSpec) allows you to filter these events.

      • Event: send or 'receive'.
      • MatchSpec: A match specifications.
        • For send: Matches on [Receiver, Msg].
        • For 'receive': Matches on [Node, Sender, Msg].

      Managing Trace Patterns

      You can display, remove, save and load trace pattern matchspecifications, if @@ -135,10 +135,10 @@ enable it is by adding the following line to the source file: -include_lib("stdlib/include/ms_transform.hrl"). In the shell its already enabled.

      The head of the fun must be a single pattern that matches a list. That pattern -will be used to match the arguments for the call:

      1> dbg:fun2ms(fun([_,_]) -> true end). % Matches a function with two arguments
      -[{['_','_'],[],[true]}]
      -2> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
      -[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]

      The first match specification matches when a function having two +will be used to match the arguments for the call:

      1> dbg:fun2ms(fun([_,_]) -> true end). % Matches a function with two arguments
      +[{['_','_'],[],[true]}]
      +2> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
      +[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]

      The first match specification matches when a function having two arguments is called. The second matches when a function, taking one atom as an argument, is called.

      Trace Sessions

      To avoid interference between different tracing activities, you can create isolated dbg sessions.

      First you create a session with dbg:session_create(Name) @@ -147,37 +147,37 @@ This function runs dbg commands within Fun using the specified session.

      Any dbg function that is called with in the provided fun will use the session/0 provided instead of the default dbg session. This means that the tracing will be isolated -from other tracing users on the system.

      When you no longer need the session, use dbg:session_destroy(Session).

      Example:

      1> S = dbg:session_create(my_session).
      +from other tracing users on the system.

      When you no longer need the session, use dbg:session_destroy(Session).

      Example:

      1> S = dbg:session_create(my_session).
       <0.91.0>
      -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
      -{ok,[{matched,nonode@nohost,2},{saved,x}]}
      -3> lists:seq(1, 10).
      -(<0.89.0>) call lists:seq(1,10)
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
      -[1,2,3,4,5,6,7,8,9,10]
      -4> dbg:session_destroy(S).
      +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
      +{ok,[{matched,nonode@nohost,2},{saved,x}]}
      +3> lists:seq(1, 10).
      +(<0.89.0>) call lists:seq(1,10)
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
      +[1,2,3,4,5,6,7,8,9,10]
      +4> dbg:session_destroy(S).
       ok

      The state of the session/0 is preserved in between dbg:session/2 calls, so -you can call dbg:session/2 multiple times when debugging you application.

      Example:

      1> S = dbg:session_create(my_session).
      +you can call dbg:session/2 multiple times when debugging you application.

      Example:

      1> S = dbg:session_create(my_session).
       <0.91.0>
       %% Setup the initial traces
      -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
      -{ok,[{matched,nonode@nohost,2},{saved,x}]}
      -3> lists:seq(1, 3).
      -(<0.89.0>) call lists:seq(1,3)
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      -[1,2,3]
      +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
      +{ok,[{matched,nonode@nohost,2},{saved,x}]}
      +3> lists:seq(1, 3).
      +(<0.89.0>) call lists:seq(1,3)
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      +[1,2,3]
       %% Add an additional trace pattern
      -4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
      +4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
       ok
      -5> lists:seq(1, 3).
      -(<0.89.0>) call lists:seq(1,3)
      -(<0.89.0>) call lists:seq_loop(3,3,[])
      -(<0.89.0>) call lists:seq_loop(1,1,[2,3])
      -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      -[1,2,3]
      -6> dbg:session_destroy(S).
      +5> lists:seq(1, 3).
      +(<0.89.0>) call lists:seq(1,3)
      +(<0.89.0>) call lists:seq_loop(3,3,[])
      +(<0.89.0>) call lists:seq_loop(1,1,[2,3])
      +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
      +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
      +[1,2,3]
      +6> dbg:session_destroy(S).
       ok

      Trace on Remote Nodes

      The dbg server keeps a list of nodes where tracing should be performed. Whenever a dbg:tp/2 call or a dbg:p/2 call is made, it is executed for all nodes in this list including the local node (except @@ -254,17 +254,17 @@ ignored.

      Example: Using an IP trace port and connecting to it from another node As an example, one can let trace messages be sent over the network to another Erlang node (preferably not distributed), where the formatting occurs.

      On the node stack there exists an Erlang node ant@stack. In the -shell, type the following:

      ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
      +shell, type the following:

      ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
       <0.17.0>
      -ant@stack> dbg:p(self(), send).
      -{ok,1}

      All trace messages are now sent to the trace port driver, which in turn listens +ant@stack> dbg:p(self(), send). +{ok,1}

      All trace messages are now sent to the trace port driver, which in turn listens for connections on the TCP/IP port 4711. If we want to see the messages on -another node, preferably on another host, we do like this:

      1> dbg:trace_client(ip, {"stack", 4711}).
      +another node, preferably on another host, we do like this:

      1> dbg:trace_client(ip, {"stack", 4711}).
       <0.42.0>

      If we now send a message from the shell on the node ant@stack, where all sends /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-05 20:51:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/dbg.xhtml 2042-04-07 10:09:37.000000000 +0000 @@ -1809,40 +1809,40 @@ as the argument of the function call; it cannot be held in a variable which in turn is passed to the function. Furthermore, the parse transform module ms_transform must be enabled. The easiest way to -enable it is by adding the following line to the source file:

      -include_lib("stdlib/include/ms_transform.hrl").

      Failing to include ms_transform.hrl in the source will result in a runtime +enable it is by adding the following line to the source file:

      -include_lib("stdlib/include/ms_transform.hrl").

      Failing to include ms_transform.hrl in the source will result in a runtime error, not a compile-time error.

      This function can also be invoked directly from the Erlang shell, as shown in the examples that follow.

      The head of the fun must be a single pattern that matches a list. That pattern -will be used to match the arguments for the call:

      Examples:

      1> dbg:fun2ms(fun([_,_]) -> true end).
      -[{['_','_'],[],[true]}]
      -2> dbg:fun2ms(fun(Args) when length(Args) > 6 -> true end).
      -[{'$1',[{'>',{length,'$1'},6}],[true]}]

      The first match specification matches when a function having two +will be used to match the arguments for the call:

      Examples:

      1> dbg:fun2ms(fun([_,_]) -> true end).
      +[{['_','_'],[],[true]}]
      +2> dbg:fun2ms(fun(Args) when length(Args) > 6 -> true end).
      +[{'$1',[{'>',{length,'$1'},6}],[true]}]

      The first match specification matches when a function having two arguments is called. The second matches when a function with more than -6 arguments is called.

      Examples:

      1> dbg:fun2ms(fun(42) -> true end).
      +6 arguments is called.

      Examples:

      1> dbg:fun2ms(fun(42) -> true end).
       Error: dbg:fun2ms requires fun with single variable or list parameter
      -{error,transform_error}
      -2> dbg:fun2ms(fun([<<H,T/binary>>]) -> true end).
      +{error,transform_error}
      +2> dbg:fun2ms(fun([<<H,T/binary>>]) -> true end).
       Error: fun head contains bit syntax matching of variable 'H', which cannot be translated into match_spec
      -{error,transform_error}

      The preceding two examples show what happens when a fun cannot be +{error,transform_error}

      The preceding two examples show what happens when a fun cannot be translated into a match specification. In the first example, the fun head connot possibly match a list. In the second example, an attempt is made to take apart a binary using the bit syntax, which is currently not -supported in match specifications.

      However, note that literal binaries can be matched:

      1> dbg:fun2ms(fun([<<"abc">>]) -> true end).
      -[{[<<"abc">>],[],[true]}]

      Match specifications support a large subset of the +supported in match specifications.

      However, note that literal binaries can be matched:

      1> dbg:fun2ms(fun([<<"abc">>]) -> true end).
      +[{[<<"abc">>],[],[true]}]

      Match specifications support a large subset of the guard expressions supported -by Erlang, but not all. For example, updating a map is currently not supported:

      1> dbg:fun2ms(fun([M]) when map_size(M#{a => b}) > 2 -> true end).
      -Error: the language element map (in guard) cannot be translated into match_spec
      -{error,transform_error}

      However, creating a map in a guard is allowed:

      1> dbg:fun2ms(fun([M]) when map_size(#{a => b}) > 2 -> true end).
      -[{['$1'],[{'>',{map_size,#{a => b}},2}],[true]}]

      Variables from the environment can be imported, so this works:

      1> X = 3.
      +by Erlang, but not all. For example, updating a map is currently not supported:

      1> dbg:fun2ms(fun([M]) when map_size(M#{a => b}) > 2 -> true end).
      +Error: the language element map (in guard) cannot be translated into match_spec
      +{error,transform_error}

      However, creating a map in a guard is allowed:

      1> dbg:fun2ms(fun([M]) when map_size(#{a => b}) > 2 -> true end).
      +[{['$1'],[{'>',{map_size,#{a => b}},2}],[true]}]

      Variables from the environment can be imported, so this works:

      1> X = 3.
       3
      -2> dbg:fun2ms(fun([M,N]) when N > X  -> return_trace() end).
      -[{['$1','$2'],[{'>','$2',{const,3}}],[{return_trace}]}]

      The imported variables will be replaced by const expressions, which +2> dbg:fun2ms(fun([M,N]) when N > X -> return_trace() end). +[{['$1','$2'],[{'>','$2',{const,3}}],[{return_trace}]}]

      The imported variables will be replaced by const expressions, which is consistent with the static scoping for Erlang funs.

      In the body of the fun, only guard expressions and calls to the special functions for tracing -are allowed.

      Examples:

      1> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
      -[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]
      -2> dbg:fun2ms(fun(_) -> erlang:garbage_collect() end).
      -Error: fun containing the remote function call 'erlang:garbage_collect/0' (called in body) cannot be translated into match_spec
      -{error,transform_error}

      Warning

      If the parse transform is not applied to a module which calls dbg:fun2ms/1, +are allowed.

      Examples:

      1> dbg:fun2ms(fun([A]) when is_atom(A) -> return_trace() end).
      +[{['$1'],[{is_atom,'$1'}],[{return_trace}]}]
      +2> dbg:fun2ms(fun(_) -> erlang:garbage_collect() end).
      +Error: fun containing the remote function call 'erlang:garbage_collect/0' (called in body) cannot be translated into match_spec
      +{error,transform_error}

      Warning

      If the parse transform is not applied to a module which calls dbg:fun2ms/1, the call will fail in runtime with a badarg exception.

      More information is available in the documentation for module ms_transform in STDLIB.

      @@ -2050,16 +2050,16 @@ names, parameters, return values, and exceptions raised from functions

    • caller_trace, c - sets a trace that displays function names, parameters, and information about which function called it

    • caller_exception_trace, cx - combines exception_trace and -caller_trace

    Here is an example that shows how to use a built-in match specification:

    1> dbg:tracer().
    -{ok,<0.90.0>}
    -2> dbg:tp(lists, seq, 2, cx).
    -{ok,[{matched,nonode@nohost,1},{saved,cx}]}
    -3> dbg:p(self(), call).
    -{ok,[{matched,nonode@nohost,1}]}
    -4> lists:seq(1, 5).
    -(<0.88.0>) call lists:seq(1,5) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    -[1,2,3,4,5]
    -(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5]
    +caller_trace

    Here is an example that shows how to use a built-in match specification:

    1> dbg:tracer().
    +{ok,<0.90.0>}
    +2> dbg:tp(lists, seq, 2, cx).
    +{ok,[{matched,nonode@nohost,1},{saved,cx}]}
    +3> dbg:p(self(), call).
    +{ok,[{matched,nonode@nohost,1}]}
    +4> lists:seq(1, 5).
    +(<0.88.0>) call lists:seq(1,5) ({erl_eval,do_apply,7,{"erl_eval.erl",904}})
    +[1,2,3,4,5]
    +(<0.88.0>) returned from lists:seq/2 -> [1,2,3,4,5]
    @@ -2257,37 +2257,37 @@ is provided.

    Any dbg function that is called with in the provided fun will use the session/0 provided instead of the default dbg session. This means that the tracing will be isolated -from other tracing users on the system.

    The function returns the term that the fun returns.

    Example:

    1> S = dbg:session_create(my_session).
    +from other tracing users on the system.

    The function returns the term that the fun returns.

    Example:

    1> S = dbg:session_create(my_session).
     <0.91.0>
    -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
    -{ok,[{matched,nonode@nohost,2},{saved,x}]}
    -3> lists:seq(1, 10).
    -(<0.89.0>) call lists:seq(1,10)
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
    -[1,2,3,4,5,6,7,8,9,10]
    -4> dbg:session_destroy(S).
    +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(all,c), dbg:tp(lists,seq,x) end).
    +{ok,[{matched,nonode@nohost,2},{saved,x}]}
    +3> lists:seq(1, 10).
    +(<0.89.0>) call lists:seq(1,10)
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3,4,5,6,7,8,9,10]
    +[1,2,3,4,5,6,7,8,9,10]
    +4> dbg:session_destroy(S).
     ok

    The state of the session/0 is preserved in between session/2 calls, so -you can call session/2 multiple when debugging you application.

    Example:

    1> S = dbg:session_create(my_session).
    +you can call session/2 multiple when debugging you application.

    Example:

    1> S = dbg:session_create(my_session).
     <0.91.0>
     %% Setup the initial traces
    -2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
    -{ok,[{matched,nonode@nohost,2},{saved,x}]}
    -3> lists:seq(1, 3).
    -(<0.89.0>) call lists:seq(1,3)
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    -[1,2,3]
    +2> dbg:session(S, fun() -> dbg:tracer(), dbg:p(self(),c), dbg:tp(lists,seq,x) end).
    +{ok,[{matched,nonode@nohost,2},{saved,x}]}
    +3> lists:seq(1, 3).
    +(<0.89.0>) call lists:seq(1,3)
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    +[1,2,3]
     %% Add an additional trace pattern
    -4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
    +4> dbg:session(S, fun() -> dbg:tpl(lists,seq_loop,x) end).
     ok
    -5> lists:seq(1, 3).
    -(<0.89.0>) call lists:seq(1,3)
    -(<0.89.0>) call lists:seq_loop(3,3,[])
    -(<0.89.0>) call lists:seq_loop(1,1,[2,3])
    -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    -(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    -(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    -[1,2,3]
    -6> dbg:session_destroy(S).
    +5> lists:seq(1, 3).
    +(<0.89.0>) call lists:seq(1,3)
    +(<0.89.0>) call lists:seq_loop(3,3,[])
    +(<0.89.0>) call lists:seq_loop(1,1,[2,3])
    +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    +(<0.89.0>) returned from lists:seq_loop/3 -> [1,2,3]
    +(<0.89.0>) returned from lists:seq/2 -> [1,2,3]
    +[1,2,3]
    +6> dbg:session_destroy(S).
     ok

    Note

    The session functionality is experimental in Erlang/OTP 27 and may change in future releases without notice.

    @@ -2461,11 +2461,11 @@ and will stand as an "alias" for the given expression.

    If the match specification is invalid, an {error, Errors} tuple is returned. Errors is as a list of tuples {error, string()}, where the string is a textual explanation of the compilation error. For -example:

    1> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]).
    -{error,
    - [{error,"Special form 'message' called with wrong number of
    -          arguments in {message,two,arguments}."},
    -  {error,"Function noexist/1 does_not_exist."}]}
    +example:

    1> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]).
    +{error,
    + [{error,"Special form 'message' called with wrong number of
    +          arguments in {message,two,arguments}."},
    +  {error,"Function noexist/1 does_not_exist."}]}
    @@ -2716,17 +2716,17 @@ host Hostname, from where it reads trace messages until the TCP/IP connection is closed. If no Hostname is specified, the local host is assumed.

    As an example, one can let trace messages be sent over the network to another Erlang node (preferably not distributed), where the formatting occurs.

    On the node stack there exists an Erlang node ant@stack. In the -shell, type the following:

    ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
    +shell, type the following:

    ant@stack> dbg:tracer(port, dbg:trace_port(ip, 4711)).
     <0.17.0>
    -ant@stack> dbg:p(self(), send).
    -{ok,1}

    All trace messages are now sent to the trace port driver, which in turn listens +ant@stack> dbg:p(self(), send). +{ok,1}

    All trace messages are now sent to the trace port driver, which in turn listens for connections on the TCP/IP port 4711. If we want to see the messages on -another node, preferably on another host, we do like this:

    1> dbg:trace_client(ip, {"stack", 4711}).
    +another node, preferably on another host, we do like this:

    1> dbg:trace_client(ip, {"stack", 4711}).
     <0.42.0>

    If we now send a message from the shell on the node ant@stack, where all sends -from the shell are traced:

    ant@stack> self() ! hello.
    +from the shell are traced:

    ant@stack> self() ! hello.
     hello

    The following will appear at the console on the node that started the trace -client:

    (<0.23.0>) <0.23.0> ! hello
    -(<0.23.0>) <0.22.0> ! {shell_rep,<0.23.0>,{value,hello,[],[]}}

    The last line is generated due to internal message passing in the Erlang shell. +client:

    (<0.23.0>) <0.23.0> ! hello
    +(<0.23.0>) <0.22.0> ! {shell_rep,<0.23.0>,{value,hello,[],[]}}

    The last line is generated due to internal message passing in the Erlang shell. The pids will vary.

    @@ -2810,7 +2810,7 @@ /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-05 20:51:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/dyntrace.xhtml 2042-04-07 10:09:37.000000000 +0000 @@ -735,14 +735,14 @@

    Restores the previous state of user tags and their spreading as it was before a call to spread_tag/1.

    Note that the restoring is not limited to the same process; one can utilize this to turn off spreding in one process and restore it in a -newly created process that is is actually going to send messages:

    f() ->
    -    TagData = dyntrace:spread_tag(false),
    -    spawn(fun() ->
    -             dyntrace:restore_tag(TagData),
    -             do_something()
    -          end),
    -    do_something_else(),
    -    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as +newly created process that is is actually going to send messages:

    f() ->
    +    TagData = dyntrace:spread_tag(false),
    +    spawn(fun() ->
    +             dyntrace:restore_tag(TagData),
    +             do_something()
    +          end),
    +    do_something_else(),
    +    dyntrace:restore_tag(TagData).

    Correctly handling user tags and their spreading might take some effort, as Erlang programs tend to send and receive messages so that sometimes the user tag gets lost due to various things, like double receives or communication with a port (ports do not handle user tags, in the same way as they do not handle @@ -789,12 +789,12 @@ later call to restore_tag/1.

    The file module already spreads tags, so there is no need to manually call this function to get user tags spread to the efile driver through that module.

    The most use of this function would be if one, for example, uses the io module to communicate with an I/O-server for a regular file, such as in the following -example:

    f() ->
    -   {ok, F} = file:open("test.tst", [write]),
    -   Saved = dyntrace:spread_tag(true),
    -   io:format(F, "Hello world!", []),
    -   dyntrace:restore_tag(Saved),
    -   file:close(F).

    In this example, any user tag set in the calling process will be spread to the +example:

    f() ->
    +   {ok, F} = file:open("test.tst", [write]),
    +   Saved = dyntrace:spread_tag(true),
    +   io:format(F, "Hello world!", []),
    +   dyntrace:restore_tag(Saved),
    +   file:close(F).

    In this example, any user tag set in the calling process will be spread to the I/O-server when the io:format/3 call is done.

    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-05 20:51:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/instrument.xhtml 2042-04-07 10:09:37.000000000 +0000 @@ -232,8 +232,8 @@ the one before it.

    The upper bound of the first interval is provided by the function that returned the histogram, and the last interval has no upper bound.

    For example, the histogram below has 40 (message) blocks between 128-256 bytes in size, 78 blocks between 256-512 bytes,2 blocks between 512-1024 bytes, and 2 -blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    +blocks between 1-2KB.

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
    @@ -368,30 +368,30 @@ block size histograms. Defaults to 128.

  • histogram_width - The number of intervals in the allocated block size histograms. Defaults to 18.

  • flags - Controls how to group the output, for example showing allocations on a per-process basis (when possible) rather than only a -NIF/driver-basis. Defaults to [].

  • Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    -{ok,{128,0,
    -     #{udp_inet =>
    -           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
    +NIF/driver-basis. Defaults to [].

    Example:

    > instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
    +{ok,{128,0,
    +     #{udp_inet =>
    +           #{driver_event_state => {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}},
            system =>
    -           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    -             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    -             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    -             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    -             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    -             ... }
    +           #{heap => {0,0,0,0,20,4,2,2,2,3,0,1,0,0,1},
    +             db_term => {271,3,1,52,80,1,0,0,0,0,0,0,0,0,0},
    +             code => {0,0,0,5,3,6,11,22,19,20,10,2,1,0,0},
    +             binary => {18,0,0,0,7,0,0,1,0,0,0,0,0,0,0},
    +             message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0},
    +             ... }
            spawn_forker =>
    -           #{driver_select_data_state =>
    -                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    -       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
    +           #{driver_select_data_state =>
    +                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +       ram_file_drv => #{drv_binary => {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}},
            prim_file =>
    -           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
    +           #{process_specific_data => {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             nif_trap_export_entry => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             monitor_extended => {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    +             drv_binary => {0,0,0,0,0,0,1,0,3,5,0,0,0,1,0},
    +             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}},
            prim_buffer =>
    -           #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
    -             binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    +
    #{nif_internal => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}, + binary => {0,4,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}}
    @@ -468,15 +468,15 @@ tied to any particular scheduler. Defaults to all schedulers and the global instance.

  • histogram_start - The upper bound of the first interval in the free block size histograms. Defaults to 512.

  • histogram_width - The number of intervals in the free block size -histograms. Defaults to 14.

  • Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    -{ok,{512,
    -     [{driver_alloc,false,262144,0,
    -                    [{driver_alloc,1,32784}],
    -                    {0,0,0,0,0,0,0,1}},
    -      {binary_alloc,false,32768,0,
    -                    [{binary_alloc,15,4304}],
    -                    {3,0,0,0,1,0,0,0}},
    -      {...}|...]}}
    +histograms. Defaults to 14.

    Example:

    > instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
    +{ok,{512,
    +     [{driver_alloc,false,262144,0,
    +                    [{driver_alloc,1,32784}],
    +                    {0,0,0,0,0,0,0,1}},
    +      {binary_alloc,false,32768,0,
    +                    [{binary_alloc,15,4304}],
    +                    {3,0,0,0,1,0,0,0}},
    +      {...}|...]}}
    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-05 20:51:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/lttng.xhtml 2042-04-07 10:09:37.000000000 +0000 @@ -24,46 +24,46 @@ information on how to install LTTng on your system.

    After LTTng is properly installed on the system Erlang/OTP can be built with LTTng support.

    $ ./configure --with-dynamic-trace=lttng
     $ make

    Dyntrace Tracepoints

    All tracepoints are in the domain of org_erlang_dyntrace

    All Erlang types are the string equivalent in LTTng.

    process_spawn

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • parent : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and +{tracer,dyntrace,[]} as tracer module.

    Example:

    process_spawn: { cpu_id = 3 }, { pid = "<0.131.0>", parent = "<0.130.0>", entry = "erlang:apply/2" }

    process_link

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • type : string :: "link" | "unlink"

    Available through erlang:trace/3 with trace flag procs and {tracer,dyntrace,[]} as tracer module.

    Example:

    process_link: { cpu_id = 3 }, { from = "<0.130.0>", to = "<0.131.0>", type = "link" }

    process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reason : string :: Exit reason. Ex. "normal"

    Available through erlang:trace/3 with trace flag procs and -{tracer,dyntrace,[]} as tracer module.

    Example:

    process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

    process_register

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • name : string :: Registered name. Ex. "logger"
    • type : string :: "register" | "unregister"

    Example:

    process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

    process_scheduled

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • type : string :: +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_exit: { cpu_id = 3 }, { pid = "<0.130.0>", reason = "normal" }

      process_register

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • name : string :: Registered name. Ex. "logger"
      • type : string :: "register" | "unregister"

      Example:

      process_register: { cpu_id = 0 }, { pid = "<0.128.0>", name = "dyntrace_lttng_SUITE" type = "register" }

      process_scheduled

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • entry : string :: Code Location. Ex. "lists:sort/1"
      • type : string :: "in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Available through erlang:trace/3 with trace flag running and -{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and +{tracer,dyntrace,[]} as tracer module.

      Example:

      process_scheduled: { cpu_id = 0 }, { pid = "<0.136.0>", entry = "erlang:apply/2", type = "in" }

      port_open

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_open: { cpu_id = 5 }, { pid = "<0.131.0>", driver = "'/bin/sh -s unix:cmd'", port = "#Port<0.1887>" }

      port_exit

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • reason : string :: Exit reason. Ex. "normal"

      Available through erlang:trace/3 with trace flag ports and {tracer,dyntrace,[]} as tracer module.

      Example:

      port_exit: { cpu_id = 5 }, { port = "#Port<0.1887>", reason = "normal" }

      port_link

      • to : string :: Process ID. Ex. "<0.131.0>"
      • from : string :: Process ID. Ex. "<0.131.0>"
      • type : string :: "link" | "unlink"

      Available through erlang:trace/3 with trace flag ports and -{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and +{tracer,dyntrace,[]} as tracer module.

      Example:

      port_link: { cpu_id = 5 }, { from = "#Port<0.1887>", to = "<0.131.0>", type = "unlink" }

      port_scheduled

      Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • entry : string :: Callback. Ex. "open"
      • type : string :: -"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

      Example:

      port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

      Available through erlang:trace/3 with trace flag running and +"in" | "out" | "in_exiting" | "out_exiting" | "out_exited"

    Example:

    port_scheduled: { cpu_id = 5 }, { pid = "#Port<0.1905>", entry = "close", type = "out" }

    Available through erlang:trace/3 with trace flag running and {tracer,dyntrace,[]} as tracer module.

    function_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and -{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_call: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:'-t_call/1-fun-1-'/0", depth = 0 }

    function_return

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • depth : integer :: Stack depth. Ex. 0

    Available through erlang:trace/3 with trace flag call or return_to and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_return: { cpu_id = 5 }, { pid = "<0.145.0>", entry = "dyntrace_lttng_SUITE:waiter/0", depth = 0 }

    function_exception

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • entry : string :: Code Location. Ex. "lists:sort/1"
    • class : string :: Error reason. Ex. "error"

    Available through erlang:trace/3 with trace flag call and +{tracer,dyntrace,[]} as tracer module.

    Example:

    function_exception: { cpu_id = 5 }, { pid = "<0.144.0>", entry = "t:call_exc/1", class = "error" }

    message_send

    • from : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message sent. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag send and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_send: { cpu_id = 3 }, { from = "#Port<0.1938>", to = "<0.160.0>", message = "{#Port<0.1938>,eof}" }

    message_receive

    • to : string :: Process ID or Port ID. Ex. "<0.131.0>"
    • message : string :: Message received. Ex. "{<0.162.0>,ok}"

    Available through erlang:trace/3 with trace flag 'receive' and {tracer,dyntrace,[]} as tracer module.

    Example:

    message_receive: { cpu_id = 7 }, { to = "<0.167.0>", message = "{<0.165.0>,ok}" }

    gc_minor_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

    gc_minor_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

    gc_major_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • need : integer :: Heap need. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

    gc_major_end

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • reclaimed : integer :: Heap reclaimed. Ex. 2
    • heap : integer :: Young heap word size. Ex. 233
    • old_heap : integer :: Old heap word size. Ex. 233

    Available through erlang:trace/3 with trace flag garbage_collection and -{tracer,dyntrace,[]} as tracer module.

    Example:

    gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

    BEAM Tracepoints

    All tracepoints are in the domain of org_erlang_otp

    All Erlang types are the string equivalent in LTTng.

    driver_init

    • driver : string :: Driver name. Ex. "tcp_inet"
    • major : integer :: Major version. Ex. 3
    • minor : integer :: Minor version. Ex. 1
    • flags : integer :: Flags. Ex. 1

    Example:

    driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

    driver_start

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • port : string :: Port ID. Ex. "#Port<0.1031>"

    Example:

    driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

    driver_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

    driver_outputv

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

    driver_ready_input

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

    driver_ready_output

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

    driver_timeout

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

    driver_stop_select

    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

    driver_flush

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

    driver_stop

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

    driver_process_exit

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    driver_ready_async

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"

    Example:

    driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

    driver_call

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

    driver_control

    • pid : string :: Process ID. Ex. "<0.131.0>"
    • port : string :: Port ID. Ex. "#Port<0.1031>"
    • driver : string :: Driver name. Ex. "tcp_inet"
    • command : integer :: Command integer. Ex. 1
    • bytes : integer :: Size of data returned. Ex. 82

    Example:

    driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

    carrier_create

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144
    • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
    • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 0, heap = 610, old_heap = 0 }

      gc_minor_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_minor_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 120, heap = 1598, old_heap = 1598 }

      gc_major_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • need : integer :: Heap need. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_start: { cpu_id = 0 }, { pid = "<0.172.0>", need = 8, heap = 2586, old_heap = 1598 }

      gc_major_end

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • reclaimed : integer :: Heap reclaimed. Ex. 2
      • heap : integer :: Young heap word size. Ex. 233
      • old_heap : integer :: Old heap word size. Ex. 233

      Available through erlang:trace/3 with trace flag garbage_collection and +{tracer,dyntrace,[]} as tracer module.

      Example:

      gc_major_end: { cpu_id = 0 }, { pid = "<0.172.0>", reclaimed = 240, heap = 4185, old_heap = 0 }

      BEAM Tracepoints

      All tracepoints are in the domain of org_erlang_otp

      All Erlang types are the string equivalent in LTTng.

      driver_init

      • driver : string :: Driver name. Ex. "tcp_inet"
      • major : integer :: Major version. Ex. 3
      • minor : integer :: Minor version. Ex. 1
      • flags : integer :: Flags. Ex. 1

      Example:

      driver_init: { cpu_id = 2 }, { driver = "caller_drv", major = 3, minor = 3, flags = 1 }

      driver_start

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • port : string :: Port ID. Ex. "#Port<0.1031>"

      Example:

      driver_start: { cpu_id = 2 }, { pid = "<0.198.0>", driver = "caller_drv", port = "#Port<0.3676>" }

      driver_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_output: { cpu_id = 2 }, { pid = "<0.198.0>", port = "#Port<0.3677>", driver = "/bin/sh -s unix:cmd", bytes = 36 }

      driver_outputv

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_outputv: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet", bytes = 3 }

      driver_ready_input

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_input: { cpu_id = 5 }, { pid = "<0.189.0>", port = "#Port<0.3637>", driver = "inet_gethost 4 " }

      driver_ready_output

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_output: { cpu_id = 5 }, { pid = "<0.194.0>", port = "#Port<0.3663>", driver = "tcp_inet" }

      driver_timeout

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_timeout: { cpu_id = 5 }, { pid = "<0.196.0>", port = "#Port<0.3664>", driver = "tcp_inet" }

      driver_stop_select

      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop_select: { cpu_id = 5 }, { driver = "unknown" }

      driver_flush

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_flush: { cpu_id = 7 }, { pid = "<0.204.0>", port = "#Port<0.3686>", driver = "tcp_inet" }

      driver_stop

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_stop: { cpu_id = 5 }, { pid = "[]", port = "#Port<0.3673>", driver = "tcp_inet" }

      driver_process_exit

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      driver_ready_async

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"

      Example:

      driver_ready_async: { cpu_id = 3 }, { pid = "<0.181.0>", port = "#Port<0.3622>", driver = "tcp_inet" }

      driver_call

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_call: { cpu_id = 2 }, { pid = "<0.202.0>", port = "#Port<0.3676>", driver = "caller_drv", command = 0, bytes = 2 }

      driver_control

      • pid : string :: Process ID. Ex. "<0.131.0>"
      • port : string :: Port ID. Ex. "#Port<0.1031>"
      • driver : string :: Driver name. Ex. "tcp_inet"
      • command : integer :: Command integer. Ex. 1
      • bytes : integer :: Size of data returned. Ex. 82

      Example:

      driver_control: { cpu_id = 3 }, { pid = "<0.32767.8191>", port = "#Port<0.0>", driver = "forker", command = 83, bytes = 32 }

      carrier_create

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in +instance. Ex. 285296

      Example:

      carrier_create: { cpu_id = 2 }, { type = "ets_alloc", instance = 7, size = 2097152, mbc_carriers = 4, mbc_carriers_size = 3440640, mbc_blocks = 526, mbc_blocks_size = 1278576, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_destroy

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144
      • mbc_carriers : integer :: Number of multiblock carriers in instance. Ex. 3
      • mbc_carriers_size : integer :: Total size of multiblock blocks carriers in instance. Ex. 1343488
      • mbc_blocks : integer :: Number of multiblock blocks in instance. Ex. 122
      • mbc_blocks_size : integer :: Total size of all multiblock blocks in instance. Ex. 285296
      • sbc_carriers : integer :: Number of singleblock carriers in instance. Ex. 1
      • sbc_carriers_size : integer :: Total size of singleblock blocks carriers in instance. Ex. 1343488
      • sbc_blocks : integer :: Number of singleblocks in instance. Ex. 1
      • sbc_blocks_size : integer :: Total size of all singleblock blocks in -instance. Ex. 285296

      Example:

      carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

      carrier_pool_put

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

      carrier_pool_get

      • type : string :: Carrier type. Ex. "ets_alloc"
      • instance : integer :: Allocator instance. Ex. 1
      • size : integer :: Carrier size. Ex. 262144

      Example:

      carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

      Example of process tracing

      An example of process tracing of os_mon and friends.

      Clean start of lttng in a bash shell.

      $ lttng create erlang-demo
      +instance. Ex. 285296

    Example:

    carrier_destroy: { cpu_id = 6 }, { type = "ets_alloc", instance = 7, size = 262144, mbc_carriers = 3, mbc_carriers_size = 3178496, mbc_blocks = 925, mbc_blocks_size = 2305336, sbc_carriers = 0, sbc_carriers_size = 0, sbc_blocks = 0, sbc_blocks_size = 0 }

    carrier_pool_put

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_put: { cpu_id = 3 }, { type = "ets_alloc", instance = 5, size = 1048576 }

    carrier_pool_get

    • type : string :: Carrier type. Ex. "ets_alloc"
    • instance : integer :: Allocator instance. Ex. 1
    • size : integer :: Carrier size. Ex. 262144

    Example:

    carrier_pool_get: { cpu_id = 7 }, { type = "ets_alloc", instance = 4, size = 3208 }

    Example of process tracing

    An example of process tracing of os_mon and friends.

    Clean start of lttng in a bash shell.

    $ lttng create erlang-demo
     Spawning a session daemon
     Session erlang-demo created.
     Traces will be written in /home/egil/lttng-traces/erlang-demo-20160526-165920

    Start an Erlang node with lttng enabled.

    $ erl
     Erlang/OTP 19 [erts-8.0] [source-4d7b24d] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [lttng]
     
     Eshell V8.0  (abort with ^G)
    -1>

    Load the dyntrace module.

    1> l(dyntrace).
    -{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through +1>

    Load the dyntrace module.

    1> l(dyntrace).
    +{module,dyntrace}

    All tracepoints via dyntrace are now visible and can be listed through lttng list -u.

    Enable the process_register LTTng tracepoint for Erlang.

    $ lttng enable-event -u org_erlang_dyntrace:process_register
    -UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
    +UST event org_erlang_dyntrace:process_register created in channel channel0

    Enable process tracing for new processes and use dyntrace as tracer backend.

    2> erlang:trace(new,true,[procs,{tracer,dyntrace,[]}]).
     0

    Start LTTng tracing.

    $ lttng start
     Tracing started for session erlang-demo

    Start the os_mon application in Erlang.

    3> application:ensure_all_started(os_mon).
     {ok,[sasl,os_mon]}

    Stop LTTng tracing and view the result.

    $ lttng stop
    /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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	2026-03-05 20:51:18.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/msacc.xhtml	2042-04-07 10:09:37.000000000 +0000
    @@ -25,9 +25,9 @@
     

    Convenience functions for microstate accounting

    This module implements some convenience functions for analyzing microstate accounting data. For details about how to use the basic API and what the different states represent, see -erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
    +erlang:statistics(microstate_accounting).

    Basic Scenario

    1> msacc:start(1000).
     ok
    -2> msacc:print().
    +2> msacc:print().
     Average thread real-time    : 1000513 us
     Accumulated system run-time :    2213 us
     Average scheduler run-time  :    1076 us
    @@ -35,11 +35,11 @@
             Thread      aux check_io emulator       gc    other     port    sleep
     
     Stats per thread:
    -     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    -       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    - scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    - scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
    +     async( 0)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +     async( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    +       aux( 1)    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%   99.99%
    + scheduler( 1)    0.00%    0.03%    0.13%    0.00%    0.01%    0.00%   99.82%
    + scheduler( 2)    0.00%    0.00%    0.00%    0.00%    0.03%    0.00%   99.97%
     
     Stats per type:
              async    0.00%    0.00%    0.00%    0.00%    0.00%    0.00%  100.00%
    @@ -823,7 +823,7 @@
     this can be verbose. See the top of this reference manual for a brief
     description of what the fields mean.

    It is possible to print more specific types of statistics by first manipulating the DataOrStats using stats/2. For instance if you want to print the -percentage of run-time for each thread you can do:

    msacc:print(msacc:stats(runtime, msacc:stats())).

    If you want to only print run-time per thread type you can do:

    msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

    Options

    • system - Print percentage of time spent in each state out of system time +percentage of run-time for each thread you can do:

      msacc:print(msacc:stats(runtime, msacc:stats())).

      If you want to only print run-time per thread type you can do:

      msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).

      Options

      • system - Print percentage of time spent in each state out of system time as well as thread time. Default: false.
      /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-05 20:51:18.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/notes.xhtml 2042-04-07 10:09:37.000000000 +0000 @@ -17,9 +17,9 @@

      Runtime_Tools Release Notes

      -

      This document describes the changes made to the Runtime_Tools application.

      Runtime_Tools 2.3

      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	2026-03-05 20:51:18.000000000 +0000
          +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools.epub/OEBPS/scheduler.xhtml	2042-04-07 10:09:37.000000000 +0000
          @@ -491,7 +491,7 @@
           scheduler_wall_time.

          Calculate scheduler utilizations for the time interval from when Sample was taken and "now". The same as calling scheduler:utilization(Sample, scheduler:sample_all()).

          Note

          This function is not recommended as it's so easy to get invalid results -without noticing. In particular do not do this:

          scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

          The above example takes two samples in rapid succession and calculates the +without noticing. In particular do not do this:

          scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

          The above example takes two samples in rapid succession and calculates the scheduler utilization between them. The resulting values will probably be more misleading than informative.

          Instead use scheduler:utilization/2 and call get_sample/0 to get samples with some time in between.

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:08.250351822 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/runtime_tools_app.html 2026-03-12 21:37:08.254351846 +0000 @@ -133,7 +133,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:08.286352036 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/scheduler.html 2026-03-12 21:37:08.294352084 +0000 @@ -578,7 +578,7 @@ scheduler_wall_time.

          Calculate scheduler utilizations for the time interval from when Sample was taken and "now". The same as calling scheduler:utilization(Sample, scheduler:sample_all()).

          Note

          This function is not recommended as it's so easy to get invalid results -without noticing. In particular do not do this:

          scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

          The above example takes two samples in rapid succession and calculates the +without noticing. In particular do not do this:

          scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!

          The above example takes two samples in rapid succession and calculates the scheduler utilization between them. The resulting values will probably be more misleading than informative.

          Instead use scheduler:utilization/2 and call get_sample/0 to get samples with some time in between.

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

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:08.318352226 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/search.html 2026-03-12 21:37:08.318352226 +0000 @@ -108,7 +108,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:08.350352416 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/system_information.html 2026-03-12 21:37:08.354352438 +0000 @@ -263,7 +263,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/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 2026-03-12 21:37:08.378352581 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/runtime_tools-2.3/doc/html/systemtap.html 2026-03-12 21:37:08.378352581 +0000 @@ -157,7 +157,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.406352747 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/404.html 2026-03-12 21:37:08.406352747 +0000 @@ -110,7 +110,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.434352914 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/alarm_handler.html 2026-03-12 21:37:08.438352937 +0000 @@ -377,7 +377,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.466353103 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/api-reference.html 2026-03-12 21:37:08.466353103 +0000 @@ -145,7 +145,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.490353245 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/appup.html 2026-03-12 21:37:08.494353268 +0000 @@ -95,9 +95,9 @@ Application is the application name. The file is to be located in the ebin directory for the application.

          The .appup file contains one single Erlang term, which defines the instructions used to upgrade or downgrade the application. The file has the -following syntax:

          {Vsn,
          -  [{UpFromVsn, Instructions}, ...],
          -  [{DownToVsn, Instructions}, ...]}.
          • Vsn = string() - Current application version.

          • UpFromVsn = string() | binary() - An earlier application version to +following syntax:

            {Vsn,
            +  [{UpFromVsn, Instructions}, ...],
            +  [{DownToVsn, Instructions}, ...]}.
            • Vsn = string() - Current application version.

            • UpFromVsn = string() | binary() - An earlier application version to upgrade from. If it is a string, it is interpreted as a specific version number. If it is a binary, it is interpreted as a regular expression that can match multiple version numbers.

            • DownToVsn = string() | binary() - An earlier application version to @@ -160,21 +160,21 @@ version. For static modules, the new version is loaded before the process is asked to change code, both in the case of upgrading and downgrading. Callback modules are dynamic.

            update with argument supervisor is used when changing the start -specification of a supervisor.

            {load_module, Mod}
            -{load_module, Mod, DepMods}
            -{load_module, Mod, PrePurge, PostPurge, DepMods}
            -  Mod = atom()
            +specification of a supervisor.

            {load_module, Mod}
            +{load_module, Mod, DepMods}
            +{load_module, Mod, PrePurge, PostPurge, DepMods}
            +  Mod = atom()
               PrePurge = PostPurge = soft_purge | brutal_purge
            -  DepMods = [Mod]

            Simple code replacement of the module Mod.

            For a description of PrePurge and PostPurge, see update above.

            DepMods defaults to [] and defines which other modules Mod is dependent + DepMods = [Mod]

            Simple code replacement of the module Mod.

            For a description of PrePurge and PostPurge, see update above.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions for loading these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

            {add_module, Mod}
            -{add_module, Mod, DepMods}
            -  Mod = atom()
            -  DepMods = [Mod]

            Loads a new module Mod.

            DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

            {add_module, Mod}
            +{add_module, Mod, DepMods}
            +  Mod = atom()
            +  DepMods = [Mod]

            Loads a new module Mod.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the -instruction for loading Mod when upgrading, and conversely when downgrading.

            {delete_module, Mod}
            -{delete_module, Mod, DepMods}
            -  Mod = atom()

            Deletes a module Mod using the low-level instructions remove and purge.

            DepMods defaults to [] and defines which other modules Mod is dependent +instruction for loading Mod when upgrading, and conversely when downgrading.

            {delete_module, Mod}
            +{delete_module, Mod, DepMods}
            +  Mod = atom()

            Deletes a module Mod using the low-level instructions remove and purge.

            DepMods defaults to [] and defines which other modules Mod is dependent on. In the relup file, instructions related to these modules come before the instruction for removing Mod when upgrading, and conversely when downgrading.

            {add_application, Application}
             {add_application, Application, Type}
            @@ -195,9 +195,9 @@
             load it rather than start it, depending on the application's start type:
             If Type = load, the application is only loaded. If Type = none, the
             application is not loaded and not started, although the code for its modules is
            -loaded.

            Low-Level Instructions

            {load_object_code, {App, Vsn, [Mod]}}
            -  App = Mod = atom()
            -  Vsn = string()

            Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the +loaded.

            Low-Level Instructions

            {load_object_code, {App, Vsn, [Mod]}}
            +  App = Mod = atom()
            +  Vsn = string()

            Reads each Mod from directory App-Vsn/ebin as a binary. It does not load the modules. The instruction is to be placed first in the script to read all new code from the file to make the suspend-load-resume cycle less time-consuming.

            point_of_no_return

            If a crash occurs after this instruction, the system cannot recover and is restarted from the old release version. The instruction must only occur once in @@ -211,38 +211,38 @@ PrePurge = PostPurge = soft_purge | brutal_purge

            Makes the current version of Mod old. PrePurge is ignored. For a description of PostPurge, see the high-level instruction update earlier.

            {purge, [Mod]}
               Mod = atom()

            Purges each module Mod, that is, removes the old code. Notice that any process -executing purged code is killed.

            {suspend, [Mod | {Mod, Timeout}]}
            -  Mod = atom()
            -  Timeout = int()>0 | default | infinity

            Tries to suspend all processes using a module Mod. If a process does not +executing purged code is killed.

            {suspend, [Mod | {Mod, Timeout}]}
            +  Mod = atom()
            +  Timeout = int()>0 | default | infinity

            Tries to suspend all processes using a module Mod. If a process does not respond, it is ignored. This can cause the process to die, either because it crashes when it spontaneously switches to new code, or as a result of a purge operation. If no Timeout is specified or default is specified, the default value for sys:suspend is used.

            {resume, [Mod]}
            -  Mod = atom()

            Resumes all suspended processes using a module Mod.

            {code_change, [{Mod, Extra}]}
            -{code_change, Mode, [{Mod, Extra}]}
            -  Mod = atom()
            +  Mod = atom()

            Resumes all suspended processes using a module Mod.

            {code_change, [{Mod, Extra}]}
            +{code_change, Mode, [{Mod, Extra}]}
            +  Mod = atom()
               Mode = up | down
            -  Extra = term()

            Mode defaults to up and specifies if it is an upgrade or downgrade. This + Extra = term()

          Mode defaults to up and specifies if it is an upgrade or downgrade. This instruction sends a code_change system message to all processes using a module Mod by calling function sys:change_code, passing term Extra as argument.

          {stop, [Mod]}
             Mod = atom()

          Stops all processes using a module Mod by calling supervisor:terminate_child/2. This instruction is useful when the simplest way -to change code is to stop and restart the processes that run the code.

          {start, [Mod]}
          -  Mod = atom()

          Starts all stopped processes using a module Mod by calling -supervisor:restart_child/2.

          {sync_nodes, Id, [Node]}
          -{sync_nodes, Id, {M, F, A}}
          -  Id = term()
          -  Node = node()
          -  M = F = atom()
          -  A = [term()]

          apply(M, F, A) must return a list of nodes.

          This instruction synchronizes the release installation with other nodes. Each +to change code is to stop and restart the processes that run the code.

          {start, [Mod]}
          +  Mod = atom()

          Starts all stopped processes using a module Mod by calling +supervisor:restart_child/2.

          {sync_nodes, Id, [Node]}
          +{sync_nodes, Id, {M, F, A}}
          +  Id = term()
          +  Node = node()
          +  M = F = atom()
          +  A = [term()]

          apply(M, F, A) must return a list of nodes.

          This instruction synchronizes the release installation with other nodes. Each Node must evaluate this command with the same Id. The local node waits for all other nodes to evaluate the instruction before execution continues. If a node goes down, it is considered to be an unrecoverable error, and the local node is restarted from the old release. There is no time-out for this -instruction, which means that it can hang forever.

          {apply, {M, F, A}}
          -  M = F = atom()
          -  A = [term()]

          Evaluates apply(M, F, A).

          If the instruction appears before instruction point_of_no_return, a failure is +instruction, which means that it can hang forever.

          {apply, {M, F, A}}
          +  M = F = atom()
          +  A = [term()]

          Evaluates apply(M, F, A).

          If the instruction appears before instruction point_of_no_return, a failure is caught. release_handler:install_release/1 then returns {error,{'EXIT',Reason}}, unless {error,Error} is thrown or returned. Then it returns {error,Error}.

          If the instruction appears after instruction point_of_no_return and the @@ -323,7 +323,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.526353458 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/error_logging.html 2026-03-12 21:37:08.526353458 +0000 @@ -206,42 +206,42 @@ 2 error <0.15.0> 1996-10-16 16:17:04 1 progress <0.14.0> 1996-10-16 16:17:09 ok

        Show Reports

        Use function rb:show(Number) to show details of a specific -report:

        7> rb:show(4).
        +report:

        7> rb:show(4).
         
         PROGRESS REPORT  <0.20.0>                                   1996-10-16 16:16:36
         ===============================================================================
        -supervisor                                                     {local,sasl_sup}
        +supervisor                                                     {local,sasl_sup}
         started
        -[{pid,<0.24.0>},
        -{name,release_handler},
        -{mfa,{release_handler,start_link,[]}},
        -{restart_type,permanent},
        -{shutdown,2000},
        -{child_type,worker}]
        +[{pid,<0.24.0>},
        +{name,release_handler},
        +{mfa,{release_handler,start_link,[]}},
        +{restart_type,permanent},
        +{shutdown,2000},
        +{child_type,worker}]
         
         ok
        -8> rb:show(9).
        +8> rb:show(9).
         
         CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
         ===============================================================================
         Crashing process
         pid                                                                 <0.24.0>
         registered_name                                              release_handler
        -error_info                             {undef,{release_handler,mbj_func,[]}}
        +error_info                             {undef,{release_handler,mbj_func,[]}}
         initial_call
        -{gen,init_it,
        -[gen_server,
        +{gen,init_it,
        +[gen_server,
         <0.20.0>,
         <0.20.0>,
        -{erlang,register},
        +{erlang,register},
         release_handler,
         release_handler,
        -[],
        -[]]}
        -ancestors                                                [sasl_sup,<0.18.0>]
        -messages                                                                  []
        -links                                                    [<0.23.0>,<0.20.0>]
        -dictionary                                                                []
        +[],
        +[]]}
        +ancestors                                                [sasl_sup,<0.18.0>]
        +messages                                                                  []
        +links                                                    [<0.23.0>,<0.20.0>]
        +dictionary                                                                []
         trap_exit                                                              false
         status                                                               running
         heap_size                                                                610
        @@ -372,7 +372,7 @@
                   Erlang programming language
         
               

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.566353696 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/notes.html 2026-03-12 21:37:08.566353696 +0000 @@ -396,7 +396,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.598353885 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rb.html 2026-03-12 21:37:08.602353908 +0000 @@ -1078,7 +1078,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.626354050 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/rel.html 2026-03-12 21:37:08.630354075 +0000 @@ -92,11 +92,11 @@

        Release resource file

        Description

        The release resource file specifies which applications are included in a release (system) based on Erlang/OTP.

        This file is used by the functions in systools when generating start scripts (.script, .boot) and release upgrade files (relup).

        File Syntax

        The release resource file is to be called Name.rel.

        The .rel file contains one single Erlang term, which is called a release -specification. The file has the following syntax:

        {release, {RelName,Vsn}, {erts, EVsn},
        -  [{Application, AppVsn} |
        -   {Application, AppVsn, Type} |
        -   {Application, AppVsn, IncApps} |
        -   {Application, AppVsn, Type, IncApps}]}.
        • RelName = string() - Release name.

        • Vsn = string() - Release version.

        • EVsn = string() - ERTS version the release is intended for.

        • Application = atom() - Name of an application included in the release.

        • AppVsn = string() - Version of an application included in the release.

        • Type = permanent | transient | temporary | load | none - Start type of +specification. The file has the following syntax:

          {release, {RelName,Vsn}, {erts, EVsn},
          +  [{Application, AppVsn} |
          +   {Application, AppVsn, Type} |
          +   {Application, AppVsn, IncApps} |
          +   {Application, AppVsn, Type, IncApps}]}.
          • RelName = string() - Release name.

          • Vsn = string() - Release version.

          • EVsn = string() - ERTS version the release is intended for.

          • Application = atom() - Name of an application included in the release.

          • AppVsn = string() - Version of an application included in the release.

          • Type = permanent | transient | temporary | load | none - Start type of an application included in the release.

            If Type = permanent | transient | temporary, the application is loaded and started in the corresponding way, see application.

            If Type = load, the application is only loaded.

            If Type = none, the application is not loaded and not started, although the code for its modules is loaded.

            Defaults to permanent

          • IncApps = [atom()] - A list of applications that are included by an @@ -155,7 +155,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.670354312 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/release_handler.html 2026-03-12 21:37:08.674354336 +0000 @@ -1030,8 +1030,8 @@ create_RELEASES/4 or set_unpacked/2.

            Example:

            In the current version CurVsn of a release, the application directory of myapp is $ROOT/lib/myapp-1.0. A new version NewVsn is unpacked outside the release handler and the release handler is informed about this with a call -as follows:

            release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
            -=> {ok,NewVsn}

            If NewVsn is installed with option {update_paths,true}, then +as follows:

            release_handler:set_unpacked(RelFile, [{myapp,"1.0","/home/user"},...]).
            +=> {ok,NewVsn}

            If NewVsn is installed with option {update_paths,true}, then code:lib_dir(myapp) returns /home/user/myapp-1.0.

          Note

          Installing a new release can be time consuming if there are many processes in the system. The reason is that each process must be checked for references to old code before a module can be purged. This check can lead to garbage @@ -1332,7 +1332,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.698354477 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/relup.html 2026-03-12 21:37:08.702354502 +0000 @@ -95,9 +95,9 @@ file (.rel), application resource files (.app), and application upgrade files (.appup) as input.

          File Syntax

          In a target system, the release upgrade file is to be located in directory $ROOT/releases/Vsn.

          The relup file contains one single Erlang term, which defines the instructions -used to upgrade the release. The file has the following syntax:

          {Vsn,
          -  [{UpFromVsn, Descr, Instructions}, ...],
          -  [{DownToVsn, Descr, Instructions}, ...]}.
          • Vsn = string() - Current release version.

          • UpFromVsn = string() - Earlier version of the release to upgrade from.

          • Descr = term() - A user-defined parameter passed from the function +used to upgrade the release. The file has the following syntax:

            {Vsn,
            +  [{UpFromVsn, Descr, Instructions}, ...],
            +  [{DownToVsn, Descr, Instructions}, ...]}.
            • Vsn = string() - Current release version.

            • UpFromVsn = string() - Earlier version of the release to upgrade from.

            • Descr = term() - A user-defined parameter passed from the function systools:make_relup/3,4. It is used in the return value of release_handler:install_release/1,2.

            • Instructions - A list of low-level release upgrade instructions, see @@ -157,7 +157,7 @@ Erlang programming language

              -

              Copyright © 1996-2026 Ericsson AB

              +

              Copyright © 1996-2042 Ericsson AB

              /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-05 20:51:04.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/appup.xhtml 2042-04-07 10:09:21.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 2026-03-05 20:51:04.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/content.opf 2042-04-07 10:09:21.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> sasl - 4.3 - urn:uuid:9ce87093-21d5-1a12-1c0e-e002080979b5 + urn:uuid:f4b145fc-610d-ad5d-a491-3544d6ff5d2f en - 2026-03-05T20:51:04Z + 2042-04-07T10:09:21Z /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 2026-03-05 20:51:04.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/error_logging.xhtml 2042-04-07 10:09:21.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	2026-03-05 20:51:04.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/release_handler.xhtml	2042-04-07 10:09:21.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 2026-03-05 20:51:04.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/relup.xhtml 2042-04-07 10:09:21.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 2026-03-05 20:51:04.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/rel.xhtml 2042-04-07 10:09:21.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 2026-03-05 20:51:04.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl.epub/OEBPS/script.xhtml 2042-04-07 10:09:21.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 2026-03-12 21:37:08.882355568 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_app.html 2026-03-12 21:37:08.882355568 +0000 @@ -197,7 +197,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.906355711 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/sasl_intro.html 2026-03-12 21:37:08.910355735 +0000 @@ -145,7 +145,7 @@ Erlang programming language

                -

                Copyright © 1996-2026 Ericsson AB

                +

                Copyright © 1996-2042 Ericsson AB

                /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.938355900 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/script.html 2026-03-12 21:37:08.942355924 +0000 @@ -94,20 +94,20 @@ to start.

                Command erl -boot Name starts the system with a boot file called Name.boot, which is generated from the Name.script file, using systools:script2boot/1.

                The .script file is generated by systools from a .rel file and from .app files.

                File Syntax

                The boot script is stored in a file with extension .script. The file has the -following syntax:

                {script, {Name, Vsn},
                - [
                -  {progress, loading},
                -  {preLoaded, [Mod1, Mod2, ...]},
                -  {path, [Dir1,"$ROOT/Dir",...]}.
                -  {primLoad, [Mod1, Mod2, ...]},
                +following syntax:

                {script, {Name, Vsn},
                + [
                +  {progress, loading},
                +  {preLoaded, [Mod1, Mod2, ...]},
                +  {path, [Dir1,"$ROOT/Dir",...]}.
                +  {primLoad, [Mod1, Mod2, ...]},
                   ...
                -  {kernel_load_completed},
                -  {progress, loaded},
                -  {kernelProcess, Name, {Mod, Func, Args}},
                +  {kernel_load_completed},
                +  {progress, loaded},
                +  {kernelProcess, Name, {Mod, Func, Args}},
                   ...
                -  {apply, {Mod, Func, Args}},
                +  {apply, {Mod, Func, Args}},
                   ...
                -  {progress, started}]}.
                • Name = string() - Defines the system name.

                • Vsn = string() - Defines the system version.

                • {progress, Term} - Sets the "progress" of the initialization program. + {progress, started}]}.

                • Name = string() - Defines the system name.

                • Vsn = string() - Defines the system version.

                • {progress, Term} - Sets the "progress" of the initialization program. The init:get_status/0 function returns the current value of the progress, which is {InternalStatus,Term}.

                • {path, [Dir]} - Dir is a string. This argument sets the load path of the system to [Dir]. The load path used to load modules is obtained from the @@ -181,7 +181,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:08.966356066 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/search.html 2026-03-12 21:37:08.966356066 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/sasl-4.3/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 2026-03-12 21:37:09.002356279 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/sasl-4.3/doc/html/systools.html 2026-03-12 21:37:09.002356279 +0000 @@ -631,7 +631,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.022356398 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/404.html 2026-03-12 21:37:09.026356422 +0000 @@ -110,7 +110,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.046356541 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/api-reference.html 2026-03-12 21:37:09.054356587 +0000 @@ -415,7 +415,7 @@ Erlang programming language

                  -

                  Copyright © 1996-2026 Ericsson AB

                  +

                  Copyright © 1996-2042 Ericsson AB

                  /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.086356777 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/notes.html 2026-03-12 21:37:09.090356802 +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-2026 Ericsson AB

                      +

                      Copyright © 1996-2042 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 2026-03-12 21:37:09.114356944 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/search.html 2026-03-12 21:37:09.114356944 +0000 @@ -108,7 +108,7 @@ Erlang programming language

                      -

                      Copyright © 1996-2026 Ericsson AB

                      +

                      Copyright © 1996-2042 Ericsson AB

                      /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/content.opf 2042-04-07 10:09:53.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> snmp - 5.19.1 - urn:uuid:fe18ac02-90ec-9b1f-6014-2e9b07b40adc + urn:uuid:0bad1dcb-662a-b7de-2177-32a0f9f84893 en - 2026-03-05T20:51:32Z + 2042-04-07T10:09:53Z /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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/notes.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_advanced_agent.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_agent_config_files.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_agent_funct_descr.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_app_b.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_app.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmpa.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmpc_cmd.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_config.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_generic.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_impl_example_agent.xhtml 2042-04-07 10:09:53.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	2026-03-05 20:51:32.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_index.xhtml	2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_instr_functions.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_manager_config_files.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_mib_compiler.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmpm.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp_pdus.xhtml 2042-04-07 10:09:53.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 2026-03-05 20:51:32.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.epub/OEBPS/snmp.xhtml 2042-04-07 10:09:53.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 2026-03-12 21:37:09.602359836 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp.html 2026-03-12 21:37:09.610359884 +0000 @@ -3301,8 +3301,8 @@

    Utility function(s) to produce a formatted printout of the versions info -generated by the versions1 function

    This is the same as doing, e.g.:

               {ok, V} = snmp:versions1(),
    -           snmp:print_versions(V).
    +generated by the versions1 function

    This is the same as doing, e.g.:

               {ok, V} = snmp:versions1(),
    +           snmp:print_versions(V).
    @@ -3500,17 +3500,17 @@

    This function is used to set up trace on function(s) for the given module or modules.

    The example below sets up trace on the exported functions (default) of module snmp_generic and all functions of module snmp_generic_mnesia. With return -values (which is default) and timestamps in both cases (which is also default):

    	  snmp:enable_trace(),
    -	  snmp:set_trace([snmp_generic,
    -                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
    +values (which is default) and timestamps in both cases (which is also default):

    	  snmp:enable_trace(),
    +	  snmp:set_trace([snmp_generic,
    +                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
     	  .
     	  .
     	  .
    -          snmp:set_trace(snmp_generic, disable),
    +          snmp:set_trace(snmp_generic, disable),
     	  .
     	  .
     	  .
    -	  snmp:disable_trace(),
    +
    snmp:disable_trace(),
    @@ -3904,7 +3904,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.642360073 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_advanced_agent.html 2026-03-12 21:37:09.646360096 +0000 @@ -221,48 +221,48 @@ empName DisplayString, empTelNo DisplayString, empStatus RowStatus - }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two -elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify + }

    The corresponding Mnesia table is specified as follows:

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, [key, telno, row_status]}]).

    Note

    In the Mnesia tables, the two key columns are stored as a tuple with two +elements. Therefore, the arity of the table is 3.

    Instrumentation Functions

    The MIB table shown in the previous section can be compiled as follows:

    1> snmpc:compile("EmpMIB", [{db, mnesia}]).

    This is all that has to be done! Now the manager can read, add, and modify rows. Also, you can use the ordinary Mnesia API to access the table from your programs. The only explicit action is to create the Mnesia table, an action the user has to perform in order to create the required table schemas.

    Adding Own Actions

    It is often necessary to take some specific action when a table is modified. This is accomplished with an instrumentation function. It executes some specific code when the table is set, and passes all other requests down to the -pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    -    notify_internal_resources(RowIndex, Cols),
    -    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. +pre-defined function.

    The following example illustrates this idea:

    emp_table(set, RowIndex, Cols) ->
    +    notify_internal_resources(RowIndex, Cols),
    +    snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +    snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).

    The default instrumentation functions are defined in the module snmp_generic. Refer to the Reference Manual, section SNMP, module snmp_generic for details.

    Extending the Mnesia Table

    A table may contain columns that are used internally, but should not be visible to a manager. These internal columns must be the last columns in the table. The set operation will not work with this arrangement, because there are columns that the agent does not know about. This situation is handled by adding values for the internal columns in the set function.

    To illustrate this, suppose we extend our Mnesia empTable with one internal column. We create it as before, but with an arity of 4, by adding another -attribute.

    mnesia:create_table([{name, employees},
    -                     {snmp, [{key, {integer, string}}]},
    -                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which +attribute.

    mnesia:create_table([{name, employees},
    +                     {snmp, [{key, {integer, string}}]},
    +                     {attributes, {key, telno, row_status, internal_col}}]).

    The last column is the internal column. When performing a set operation, which creates a row, we must give a value to the internal column. The instrumentation -functions will now look as follows:

    -define(createAndGo, 4).
    --define(createAndWait, 5).
    +functions will now look as follows:

    -define(createAndGo, 4).
    +-define(createAndWait, 5).
     
    -emp_table(set, RowIndex, Cols) ->
    -  notify_internal_resources(RowIndex, Cols),
    +emp_table(set, RowIndex, Cols) ->
    +  notify_internal_resources(RowIndex, Cols),
       NewCols =
    -    case is_row_created(empTable, Cols) of
    -      true -> Cols ++ [{4, "internal"}]; % add internal column
    +    case is_row_created(empTable, Cols) of
    +      true -> Cols ++ [{4, "internal"}]; % add internal column
           false -> Cols                      % keep original cols
       end,
    -  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    -emp_table(Op, RowIndex, Cols) ->
    -  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    -
    -is_row_created(Name, Cols) ->
    -  case snmp_generic:get_status_col(Name, Cols) of
    -    {ok, ?createAndGo} -> true;
    -    {ok, ?createAndWait} -> true;
    +  snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia});
    +emp_table(Op, RowIndex, Cols) ->
    +  snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}).
    +
    +is_row_created(Name, Cols) ->
    +  case snmp_generic:get_status_col(Name, Cols) of
    +    {ok, ?createAndGo} -> true;
    +    {ok, ?createAndWait} -> true;
         _ -> false
       end.

    If a row is created, we always set the internal column to "internal".

    Deviations from the Standard

    In some aspects the agent does not implement SNMP fully. Here are the differences:

    • The default functions and snmp_generic cannot handle an object of type @@ -326,7 +326,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.678360286 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_config_files.html 2026-03-12 21:37:09.678360286 +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 2026-03-12 21:37:09.710360476 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_funct_descr.html 2026-03-12 21:37:09.718360523 +0000 @@ -236,7 +236,7 @@ MIBs are always available in all contexts.

      The ASN.1 code, the Erlang source code, and the generated .hrl files for them are provided in the distribution and are placed in the directories mibs, src, and include, respectively, in the snmp application.

      The .hrl files are generated with snmpc:mib_to_hrl/1. Include these files in -your code as in the following example:

      -include_lib("snmp/include/SNMPv2-MIB.hrl").

      The initial values for the managed objects defined in these tables, are read at +your code as in the following example:

      -include_lib("snmp/include/SNMPv2-MIB.hrl").

      The initial values for the managed objects defined in these tables, are read at start-up from a set of configuration files. These are described in Configuration Files.

      STANDARD-MIB and SNMPv2-MIB

      These MIBs contain the snmp- and system groups from MIB-II which is defined in RFC1213 (STANDARD-MIB) or RFC1907 (SNMPv2-MIB). They are implemented in the @@ -349,9 +349,9 @@ objects in this MIB are now obsolete.

      Notifications

      Notifications are defined in SMIv1 with the TRAP-TYPE macro in the definition of an MIB (see RFC1215). The corresponding macro in SMIv2 is NOTIFICATION-TYPE. When an application decides to send a notification, it calls one of the -following functions:

      snmpa:send_notification(Agent, Notification, Receiver
      -                       [, NotifyName, ContextName, Varbinds])
      -snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

      providing the registered name or process identifier of the agent where the MIB, +following functions:

      snmpa:send_notification(Agent, Notification, Receiver
      +                       [, NotifyName, ContextName, Varbinds])
      +snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])

      providing the registered name or process identifier of the agent where the MIB, which defines the notification is loaded and the symbolic name of the notification.

      If the send_notification/3,4 function is used, all management targets are selected, as defined in RFC2273. The Receiver parameter defines where the @@ -472,7 +472,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.746360690 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_agent_netif.html 2026-03-12 21:37:09.750360713 +0000 @@ -202,7 +202,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.782360903 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app.html 2026-03-12 21:37:09.782360903 +0000 @@ -92,51 +92,51 @@

      Description

      This chapter describes the snmp application in OTP. The SNMP application provides the following services:

      • a multilingual extensible SNMP agent
      • a SNMP manager
      • a MIB compiler

      Configuration

      The following configuration parameters are defined for the SNMP application. Refer to application(3) for more information about configuration parameters.

      The snmp part of the config file specifying the configuration parameters is -basically the following tuple:

            {snmp, snmp_components_config()}

      A minimal config file for starting a node with both a manager and an agent:

            [{snmp,
      -        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
      -                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
      -         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
      -                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
      -        ]
      +basically the following tuple:

            {snmp, snmp_components_config()}

      A minimal config file for starting a node with both a manager and an agent:

            [{snmp,
      +        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
      +                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
      +         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
      +                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
      +        ]
              }
             ].

      Each snmp component has its own set of configuration parameters, even though -some of the types are common to both components.

            snmp_components_config() -> [snmp_component_config()]
      -      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
      -      agent_options() = [agent_option()]
      -      agent_option() = {restart_type,     restart_type()}     |
      -                       {agent_type,       agent_type()}       |
      -                       {agent_verbosity,  verbosity()}        |
      -                       {discovery,        agent_discovery()}  |
      -                       {versions,         versions()}         |
      -                       {gb_max_vbs,       gb_max_vbs()}       |
      -                       {priority,         priority()}         |
      -                       {multi_threaded,   multi_threaded()}   |
      -                       {db_dir,           db_dir()}           |
      -                       {db_init_error,    db_init_error()}    |
      -                       {local_db,         local_db()}         |
      -                       {net_if,           agent_net_if()}     |
      -                       {mibs,             mibs()}             |
      -                       {mib_storage,      mib_storage()}      |
      -                       {mib_server,       mib_server()}       |
      -                       {audit_trail_log,  audit_trail_log()}  |
      -                       {error_report_mod, error_report_mod()} |
      -                       {note_store,       note_store()}       |
      -                       {symbolic_store,   symbolic_store()}   |
      -                       {target_cache,     target_cache()}     |
      -                       {config,           agent_config()}
      -      manager_options() = [manager_option()]
      -      manager_option() = {restart_type,             restart_type()}    |
      -                         {net_if,                   manager_net_if()}  |
      -                         {server,                   server()}          |
      -                         {note_store,               note_store()}      |
      -                         {config,                   manager_config()}  |
      -                         {inform_request_behaviour, manager_irb()}     |
      -                         {mibs,                     manager_mibs()}    |
      -                         {priority,                 priority()}        |
      -                         {audit_trail_log,          audit_trail_log()} |
      -                         {versions,                 versions()}        |
      -                         {def_user_mod,             def_user_module()  |
      -                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, +some of the types are common to both components.

              snmp_components_config() -> [snmp_component_config()]
        +      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
        +      agent_options() = [agent_option()]
        +      agent_option() = {restart_type,     restart_type()}     |
        +                       {agent_type,       agent_type()}       |
        +                       {agent_verbosity,  verbosity()}        |
        +                       {discovery,        agent_discovery()}  |
        +                       {versions,         versions()}         |
        +                       {gb_max_vbs,       gb_max_vbs()}       |
        +                       {priority,         priority()}         |
        +                       {multi_threaded,   multi_threaded()}   |
        +                       {db_dir,           db_dir()}           |
        +                       {db_init_error,    db_init_error()}    |
        +                       {local_db,         local_db()}         |
        +                       {net_if,           agent_net_if()}     |
        +                       {mibs,             mibs()}             |
        +                       {mib_storage,      mib_storage()}      |
        +                       {mib_server,       mib_server()}       |
        +                       {audit_trail_log,  audit_trail_log()}  |
        +                       {error_report_mod, error_report_mod()} |
        +                       {note_store,       note_store()}       |
        +                       {symbolic_store,   symbolic_store()}   |
        +                       {target_cache,     target_cache()}     |
        +                       {config,           agent_config()}
        +      manager_options() = [manager_option()]
        +      manager_option() = {restart_type,             restart_type()}    |
        +                         {net_if,                   manager_net_if()}  |
        +                         {server,                   server()}          |
        +                         {note_store,               note_store()}      |
        +                         {config,                   manager_config()}  |
        +                         {inform_request_behaviour, manager_irb()}     |
        +                         {mibs,                     manager_mibs()}    |
        +                         {priority,                 priority()}        |
        +                         {audit_trail_log,          audit_trail_log()} |
        +                         {versions,                 versions()}        |
        +                         {def_user_mod,             def_user_module()  |
        +                         {def_user_data,            def_user_data()}

        Agent specific config options and types:

        • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

          Default is master.

        • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

          The terminating options effects discovery initiated by a manager.

          The originating options effects discovery initiated by this agent.

          For defaults see the options in agent_discovery_opt().

        • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

          These are options effecting discovery terminating in this agent (i.e. @@ -363,7 +363,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.810361069 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_a.html 2026-03-12 21:37:09.814361093 +0000 @@ -142,7 +142,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.838361234 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_b.html 2026-03-12 21:37:09.838361234 +0000 @@ -538,23 +538,23 @@ immediately removed." - SYNTAX INTEGER { + SYNTAX INTEGER { -- the following two values are states: -- these values may be read or written - active(1), - notInService(2), + active(1), + notInService(2), -- the following value is a state: -- this value may be read, but not written - notReady(3), + notReady(3), -- the following three values are -- actions: these values may be written, -- but are never read - createAndGo(4), - createAndWait(5), - destroy(6) - }
      + createAndGo(4), + createAndWait(5), + destroy(6) + } @@ -606,7 +606,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.862361378 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_app_c.html 2026-03-12 21:37:09.866361401 +0000 @@ -143,7 +143,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.890361543 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_audit_trail_log.html 2026-03-12 21:37:09.894361567 +0000 @@ -155,7 +155,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.922361732 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_community_mib.html 2026-03-12 21:37:09.922361732 +0000 @@ -584,7 +584,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.962361970 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_config.html 2026-03-12 21:37:09.966361993 +0000 @@ -103,41 +103,41 @@ more information).
    • the database directory stores the internal database files.

    The agent and manager uses (application) configuration parameters to find out where these directories are located. The parameters should be defined in an Erlang system configuration file. The following configuration parameters are -defined for the SNMP application:

          agent_options() = [agent_option()]
    -      agent_option() = {restart_type,     restart_type()}     |
    -                       {agent_type,       agent_type()}       |
    -                       {agent_verbosity,  verbosity()}        |
    -                       {versions,         versions()}         |
    -                       {discovery,        agent_discovery()}  |
    -                       {gb_max_vbs,       gb_max_vbs()}       |
    -                       {priority,         priority()}         |
    -                       {multi_threaded,   multi_threaded()}   |
    -                       {db_dir,           db_dir()}           |
    -                       {db_init_error,    db_init_error()}    |
    -                       {local_db,         local_db()}         |
    -                       {net_if,           agent_net_if()}     |
    -                       {mibs,             mibs()}             |
    -                       {mib_storage,      mib_storage()}      |
    -                       {mib_server,       mib_server()}       |
    -                       {audit_trail_log,  audit_trail_log()}  |
    -                       {error_report_mod, error_report_mod()} |
    -                       {note_store,       note_store()}       |
    -                       {symbolic_store,   symbolic_store()}   |
    -                       {target_cache,     target_cache()}     |
    -                       {config,           agent_config()}
    -      manager_options() = [manager_option()]
    -      manager_option() = {restart_type,             restart_type()}    |
    -                         {net_if,                   manager_net_if()}  |
    -                         {server,                   server()}          |
    -                         {note_store,               note_store()}      |
    -                         {config,                   manager_config()}  |
    -                         {inform_request_behaviour, manager_irb()}     |
    -                         {mibs,                     manager_mibs()}    |
    -                         {priority,                 priority()}        |
    -                         {audit_trail_log,          audit_trail_log()} |
    -                         {versions,                 versions()}        |
    -                         {def_user_mod,             def_user_module()  |
    -                         {def_user_data,            def_user_data()}

    Agent specific config options and types:

    • agent_type() = master | sub <optional> - If master, +defined for the SNMP application:

            agent_options() = [agent_option()]
      +      agent_option() = {restart_type,     restart_type()}     |
      +                       {agent_type,       agent_type()}       |
      +                       {agent_verbosity,  verbosity()}        |
      +                       {versions,         versions()}         |
      +                       {discovery,        agent_discovery()}  |
      +                       {gb_max_vbs,       gb_max_vbs()}       |
      +                       {priority,         priority()}         |
      +                       {multi_threaded,   multi_threaded()}   |
      +                       {db_dir,           db_dir()}           |
      +                       {db_init_error,    db_init_error()}    |
      +                       {local_db,         local_db()}         |
      +                       {net_if,           agent_net_if()}     |
      +                       {mibs,             mibs()}             |
      +                       {mib_storage,      mib_storage()}      |
      +                       {mib_server,       mib_server()}       |
      +                       {audit_trail_log,  audit_trail_log()}  |
      +                       {error_report_mod, error_report_mod()} |
      +                       {note_store,       note_store()}       |
      +                       {symbolic_store,   symbolic_store()}   |
      +                       {target_cache,     target_cache()}     |
      +                       {config,           agent_config()}
      +      manager_options() = [manager_option()]
      +      manager_option() = {restart_type,             restart_type()}    |
      +                         {net_if,                   manager_net_if()}  |
      +                         {server,                   server()}          |
      +                         {note_store,               note_store()}      |
      +                         {config,                   manager_config()}  |
      +                         {inform_request_behaviour, manager_irb()}     |
      +                         {mibs,                     manager_mibs()}    |
      +                         {priority,                 priority()}        |
      +                         {audit_trail_log,          audit_trail_log()} |
      +                         {versions,                 versions()}        |
      +                         {def_user_mod,             def_user_module()  |
      +                         {def_user_data,            def_user_data()}

      Agent specific config options and types:

      • agent_type() = master | sub <optional> - If master, one master agent is started. Otherwise, no agents are started.

        Default is master.

      • agent_discovery() = [agent_discovery_opt()] <optional> - agent_discovery_opt() = {terminating, agent_terminating_discovery_opts()} | {originating, agent_originating_discovery_opts()}

        The terminating options effects discovery initiated by a manager.

        The originating options effects discovery initiated by this agent.

        For defaults see the options in agent_discovery_opt().

      • agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional> - agent_terminating_discovery_opt() = {enable, boolean()} | {stage2, discovery | plain} | {trigger_username, string()}

        These are options effecting discovery terminating in this agent (i.e. @@ -496,34 +496,34 @@ configuration parameters. The verbosity itself has several _levels: silence | info | log | debug | trace. For the lowest verbosity silence, nothing is printed. The higher the verbosity, the -more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
        +more is printed. Default value is always silence.

        3> snmpa:verbosity(master_agent, log).
         ok
        -5> snmpa:verbosity(net_if, log).
        +5> snmpa:verbosity(net_if, log).
         ok
         6>
         %% Example of output from the agent when a get-next-request arrives:
         ** SNMP NET-IF LOG:
        -   got packet from {147,12,12,12}:5000
        +   got packet from {147,12,12,12}:5000
         
         ** SNMP NET-IF MPD LOG:
            v1, community: all-rights
         
         ** SNMP NET-IF LOG:
        -   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
        +   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
                                                   62612569,noError,0,
        -                                          [{varbind,[1,1],'NULL','NULL',1}]}
        +                                          [{varbind,[1,1],'NULL','NULL',1}]}
         
         ** SNMP MASTER-AGENT LOG:
        -   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
        +   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
         
         ** SNMP MASTER-AGENT LOG:
        -   returned: {value,"Erlang SNMP agent"}
        +   returned: {value,"Erlang SNMP agent"}
         
         ** SNMP NET-IF LOG:
        -   reply pdu: {pdu,'get-response',62612569,noError,0,
        -                   [{varbind,[1,3,6,1,2,1,1,1,0],
        +   reply pdu: {pdu,'get-response',62612569,noError,0,
        +                   [{varbind,[1,3,6,1,2,1,1,1,0],
                                      'OCTET STRING',
        -                             "Erlang SNMP agent",1}]}
        +                             "Erlang SNMP agent",1}]}
         
         ** SNMP NET-IF INFO: time in agent: 19711 mysec

        Other useful function(s) for debugging the agent are:

        • snmpa:info/0,1 - info is used to retrieve a list of miscellaneous agent information.

        • snmpa:which_aliasnames/0 - @@ -591,7 +591,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:09.990362136 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_def_instr_functions.html 2026-03-12 21:37:09.994362160 +0000 @@ -243,7 +243,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.022362326 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_framework_mib.html 2026-03-12 21:37:10.030362372 +0000 @@ -576,7 +576,7 @@ Erlang programming language

          -

          Copyright © 1996-2026 Ericsson AB

          +

          Copyright © 1996-2042 Ericsson AB

          /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.066362587 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_generic.html 2026-03-12 21:37:10.074362633 +0000 @@ -105,9 +105,9 @@ | MIB | +---------------+ | - Association file (associates a MIB object with + Association file (associates a MIB object with | snmp_generic:table_funct - | snmp_generic:variable_func) + | snmp_generic:variable_func) +--------------------------------------+ | snmp_generic | Support for get-next, | | RowStatus operations @@ -115,7 +115,7 @@ | snmpa_local_db | Mnesia | Database +--------------+-------+---------------+ | dets | ets | -| (persistent) | | +| (persistent) | | +--------------+-------+

        Each function takes the argument NameDb, which is a tuple {Name, Db}, to identify which database the functions should use. Name is the symbolic name of the managed object as defined in the MIB, and Db is either volatile, @@ -127,35 +127,35 @@ this. Specifically, if variables are stored in Mnesia, the table snmp_variables must be created by the programmer. The record definition for this table is defined in the file snmp/include/snmp_types.hrl.

        If an instrumentation function in the association file for a variable myVar -does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in -Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(new, NameDb).
        +does not have a name when compiling an MIB, the compiler generates an entry.

        {myVar, {snmp_generic, variable_func, [{myVar, Db]}}.

        And for a table:

        {myTable, {snmp_generic, table_func, [{myTable, Db]}}.

        Example

        The following example shows an implementation of a table which is stored in +Mnesia, but with some checks performed at set-request operations.

        myTable_func(new, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(new, NameDb).
         
        -myTable_func(delete, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(delete, NameDb).
        +myTable_func(delete, NameDb) ->   % pass unchanged
        +  snmp_generic:table_func(delete, NameDb).
         
         %% change row
        -myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(is_set_ok, RowIndex,
        -                               Cols, NameDb) of
        -    {noError, 0} ->
        -      myApplication:is_set_ok(RowIndex, Cols);
        +myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(is_set_ok, RowIndex,
        +                               Cols, NameDb) of
        +    {noError, 0} ->
        +      myApplication:is_set_ok(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(set, RowIndex, Cols, NameDb) ->
        -  case snmp_generic:table_func(set, RowIndex, Cols,
        -                               NameDb),
        -    {noError, 0} ->
        +myTable_func(set, RowIndex, Cols, NameDb) ->
        +  case snmp_generic:table_func(set, RowIndex, Cols,
        +                               NameDb),
        +    {noError, 0} ->
               % Now the row is updated, tell the application
        -      myApplication:update(RowIndex, Cols);
        +      myApplication:update(RowIndex, Cols);
             Err ->
               Err
           end;
         
        -myTable_func(Op, RowIndex, Cols, NameDb) ->   % pass unchanged
        -  snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        +
        myTable_func(Op, RowIndex, Cols, NameDb) -> % pass unchanged + snmp_generic:table_func(Op, RowIndex, Cols, NameDb).

        The .funcs file would look like:

        {myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
        @@ -958,7 +958,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.110362848 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_agent.html 2026-03-12 21:37:10.118362894 +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	2026-03-12 21:37:10.142363037 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_impl_example_manager.html	2026-03-12 21:37:10.142363037 +0000
        @@ -146,7 +146,7 @@
                   Erlang programming language
         
               

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.170363202 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_index.html 2026-03-12 21:37:10.174363227 +0000 @@ -100,13 +100,13 @@ actual implementation of the table. The SNMP ordering, that is implementation of GET NEXT, is implemented in this module.

        For example, suppose there is an SNMP table, which is best implemented in Erlang as one process per SNMP table row. Suppose further that the INDEX in the SNMP -table is an OCTET STRING. The index structure would be created as follows:

        snmp_index:new(string)

        For each new process we create, we insert an item in an snmp_index structure:

        new_process(Name, SnmpIndex) ->
        -  Pid = start_process(),
        +table is an OCTET STRING. The index structure would be created as follows:

        snmp_index:new(string)

        For each new process we create, we insert an item in an snmp_index structure:

        new_process(Name, SnmpIndex) ->
        +  Pid = start_process(),
           NewSnmpIndex =
        -    snmp_index:insert(SnmpIndex, Name, Pid),
        +    snmp_index:insert(SnmpIndex, Name, Pid),
           <...>

        With this structure, we can now map an OBJECT IDENTIFIER in e.g. a GET NEXT -request, to the correct process:

        get_next_pid(Oid, SnmpIndex) ->
        -  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
        +request, to the correct process:

        get_next_pid(Oid, SnmpIndex) ->
        +  {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
           Pid.

        Warnings

        Warning

        All API functions that update the index return a NewIndex term. This is for backward compatibility with a previous implementation that used a B+ tree written purely in Erlang for the index. The NewIndex return value @@ -754,7 +754,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.202363392 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_instr_functions.html 2026-03-12 21:37:10.202363392 +0000 @@ -105,8 +105,8 @@ operation is translated into a series of calls to get-next.

        Instrumentation Functions

        The following sections describe how the instrumentation functions should be defined in Erlang for the different operations. In the following, RowIndex is a list of key values for the table, and Column is a column number.

        These functions are described in detail in -Definition of Instrumentation Functions.

        New / Delete Operations

        For scalar variables:

        variable_access(new [, ExtraArg1, ...])
        -variable_access(delete [, ExtraArg1, ...])

        For tables:

        table_access(new [, ExtraArg1, ...])
        +Definition of Instrumentation Functions.

        New / Delete Operations

        For scalar variables:

        variable_access(new [, ExtraArg1, ...])
        +variable_access(delete [, ExtraArg1, ...])

        For tables:

        table_access(new [, ExtraArg1, ...])
         table_access(delete [, ExtraArg1, ...])

        These functions are called for each object in an MIB when the MIB is unloaded or loaded, respectively.

        Get Operation

        For scalar variables:

        variable_access(get [, ExtraArg1, ...])

        For tables:

        table_access(get,RowIndex,Cols [,ExtraArg1, ...])

        Cols is a list of Column. The agent will sort incoming variables so that all operations on one row (same index) will be supplied at the same time. The reason @@ -136,9 +136,9 @@ value 1, and [3, 5] is the list of requested columns. The function should now return the lexicographically next elements:

        [{[3, 1, 2], d}, {[5, 1, 2], f}]

        This is illustrated in the following table:

        GetNext from [3,1,1] and [5,1,1].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry.3.2.1,
                  myTable.myTableEntry.5.2.1 }

        This is transformed into one call to my_table:

        my_table(get_next, [2, 1], [3, 5])

        The function should now return:

        [{[4, 1, 1], b}, endOfTable]

        This is illustrated in the following table:

        GetNext from [3,2,1] and [5,2,1].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry.3.1.2,
        -         myTable.myTableEntry.4.1.2 }

        This will be transform into one call to my_table:

        my_table(get_next, [1, 2], [3, 4])

        The function should now return:

        [{[3, 2, 1], g}, {[5, 1, 1], c}]

        This is illustrated in the following table:

        GetNext from [3,1,2] and [4,1,2].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry,
        -         myTable.myTableEntry.1.3.2 }

        This will be transform into two calls to my_table:

        my_table(get_next, [], [0]) and
        -my_table(get_next, [3, 2], [1])

        The function should now return:

        [{[3, 1, 1], a}] and
        +         myTable.myTableEntry.4.1.2 }

        This will be transform into one call to my_table:

        my_table(get_next, [1, 2], [3, 4])

        The function should now return:

        [{[3, 2, 1], g}, {[5, 1, 1], c}]

        This is illustrated in the following table:

        GetNext from [3,1,2] and [4,1,2].

        The manager now issues the following getNext request:

        getNext{ myTable.myTableEntry,
        +         myTable.myTableEntry.1.3.2 }

        This will be transform into two calls to my_table:

        my_table(get_next, [], [0]) and
        +my_table(get_next, [3, 2], [1])

        The function should now return:

        [{[3, 1, 1], a}] and
         [{[3, 1, 1], a}]

        In both cases, the first accessible element in the table should be returned. As the key columns are not accessible, this means that the third column is the first row.

        Note

        Normally, the functions described above behave exactly as shown, but they are @@ -149,17 +149,17 @@ variables for a device, ipAdr and name with object identifiers 1.1.23.4 and 1.1.7 respectively. To access these variables, one could implement the two Erlang functions ip_access and name_access, which will be in the MIB. The -functions could be specified in a text file as follows:

        {ipAdr, {my_module, ip_access, []}}.
        +functions could be specified in a text file as follows:

        {ipAdr, {my_module, ip_access, []}}.
         % Or using the oid syntax for 'name'
        -{[1,1,7], {my_module, name_access, []}}.

        The ExtraArgument parameter is the empty list. For example, when the agent +{[1,1,7], {my_module, name_access, []}}.

        The ExtraArgument parameter is the empty list. For example, when the agent receives a get-request for the ipAdr variable, a call will be made to ip_access(get). The value returned by this function is the answer to the get-request.

        If ip_access and name_access are implemented similarly, we could write a -generic_access function using the ListOfExtraArguments:

        {ipAdr, {my_module, generic_access, ['IPADR']}}.
        +generic_access function using the ListOfExtraArguments:

        {ipAdr, {my_module, generic_access, ['IPADR']}}.
         % The mnemonic 'name' is more convenient than 1.1.7
        -{name, {my_module, generic_access, ['NAME']}}.

        When the agent receives the same get-request as above, a call will be made to -generic_access(get,'IPADR').

        Yet another possibility, closer to the hardware, could be:

        {ipAdr, {my_module, generic_access, [16#2543]}}.
        -{name, {my_module, generic_access, [16#A2B3]}}.

        Default Instrumentation

        When the MIB definition work is finished, there are two major issues left.

        • Implementing the MIB
        • Implementing a Manager Application.

        Implementing an MIB can be a tedious task. Most probably, there is a need to +{name, {my_module, generic_access, ['NAME']}}.

        When the agent receives the same get-request as above, a call will be made to +generic_access(get,'IPADR').

        Yet another possibility, closer to the hardware, could be:

        {ipAdr, {my_module, generic_access, [16#2543]}}.
        +{name, {my_module, generic_access, [16#A2B3]}}.

        Default Instrumentation

        When the MIB definition work is finished, there are two major issues left.

        • Implementing the MIB
        • Implementing a Manager Application.

        Implementing an MIB can be a tedious task. Most probably, there is a need to test the agent before all tables and variables are implemented. In this case, the default instrumentation functions are useful. The toolkit can generate default instrumentation functions for variables as well as for tables. @@ -248,7 +248,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.234363582 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_intro.html 2026-03-12 21:37:10.230363559 +0000 @@ -192,7 +192,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.258363725 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_config_files.html 2026-03-12 21:37:10.258363725 +0000 @@ -107,32 +107,32 @@ every transport.

      • engine_id - The SnmpEngineID as defined in SNMP-FRAMEWORK-MIB. Mandatory.

      • max_message_size - The snmpEngineMaxMessageSize as defined in SNMP-FRAMEWORK-MIB. Mandatory.

    • Value is the value for the variable.

    The legacy and intermediate variables address and domain are still supported -so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    -                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    -{engine_id,        "mgrEngine"}.
    -{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific +so old configurations will work.

    The following example shows a manager.conf file:

    {transports,       [{transportDomainUdpIpv4, {{141,213,11,24}, 5000}},
    +                    {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, 5000}}]}.
    +{engine_id,        "mgrEngine"}.
    +{max_message_size, 484}.

    The value of engine_id is a string, which should have a very specific structure. See RFC 2271/2571 for details.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir    = "/tmp",
     Port          = 5000,
    -Addr4         = {141,213,11,24},
    -Addr6         = {0,0,0,0,0,0,0,1},
    -Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    -                 {transportDomainUdpIpv6, {Addr6, Port}}],
    +Addr4         = {141,213,11,24},
    +Addr6         = {0,0,0,0,0,0,0,1},
    +Transports    = [{transportDomainUdpIpv4, {Addr4, Port}},
    +                 {transportDomainUdpIpv6, {Addr6, Port}}],
     EngineID      = "mgrEngine",
     MMS           = 484,
    -ManagerConfig = [snmpm_conf:manager_entry(transports,       Transports),
    -                 snmpm_conf:manager_entry(engine_id,        EngineID),
    -                 snmpm_conf:manager_entry(max_message_size, MMS)],
    -snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    Users

    For each manager user, the manager needs some information. This information is +ManagerConfig = [snmpm_conf:manager_entry(transports, Transports), + snmpm_conf:manager_entry(engine_id, EngineID), + snmpm_conf:manager_entry(max_message_size, MMS)], +snmpm_conf:write_manager_config(ManagerDir, ManagerConfig),

    Users

    For each manager user, the manager needs some information. This information is either added in the users.conf config file or by calling the register_user function in run-time.

    Each row defines a manager user of the manager.

    Each entry is a tuple of size four:

    {UserId, UserMod, UserData, DefaultAgentConfig}.

    • UserId is any term (used to uniquely identify the user).
    • UserMod is the user callback module (atom).
    • UserData is any term (passed on to the user when calling the UserMod.
    • DefaultAgentConfig is a list of default agent config's. These values are used as default values when this user registers agents.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir         = "/tmp",
    -UserID             = make_ref(),
    +UserID             = make_ref(),
     UserMod            = my_manager_callback_mod,
    -UserData           = self(),
    -DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}],
    -UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData,
    -                                      DefaultAgentConfig)],
    -snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    Agents

    The information needed to handle agents should be stored in a file called +UserData = self(), +DefaultAgentConfig = [{version, v1}, {timeout, 2500}, {max_message_size, 484}], +UsersConfig = [snmpm_conf:users_entry(UserID, UserMod, UserData, + DefaultAgentConfig)], +snmpm_conf:write_users_config(ManagerDir, UsersConfig),

    Agents

    The information needed to handle agents should be stored in a file called agents.conf. It is also possible to add agents in run-time by calling the register_agent.

    Each entry is a tuple:

    {UserId, TargetName, Comm, Domain, Addr, EngineID, Timeout, MaxMessageSize, Version, SecModel, SecName, SecLevel}.

    • UserId is the identity of the manager user responsible for this agent (term).
    • TargetName is a unique non-empty string.
    • Comm is the community string (string).
    • Domain is the transport domain, either transportDomainUdpIpv4 or @@ -144,23 +144,23 @@ (integer).
    • Version is the version (v1 | v2 | v3).

    • SecModel is the security model (any | v1 | v2c | usm).

    • SecName is the security name (string).
    • SecLevel is security level (noAuthNoPriv | authNoPriv | authPriv).

    Legacy configurations using tuples without Domain element, as well as with all TDomain, Ip and Port elements still work.

    And this is a code (snippet) example of how to generate this file in runtime:

    ManagerDir   = "/tmp",
     UserID       = ...
    -AgentsConfig = [snmpm_conf:agents_entry(UserID,
    +AgentsConfig = [snmpm_conf:agents_entry(UserID,
                                             "target 1",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{1,2,3,4},161},
    +					transportDomainUdpIpv4, {{1,2,3,4},161},
     					"agent Engine 1"
     					1500,
     					484.
    -					v1, v1, "sec name 1", noAuthNoPriv),
    -		snmpm_conf:agents_entry(UserID,
    +					v1, v1, "sec name 1", noAuthNoPriv),
    +		snmpm_conf:agents_entry(UserID,
                                             "target 2",
     					"FOOBAR",
    -					transportDomainUdpIpv4, {{5,6,7,8},161},
    +					transportDomainUdpIpv4, {{5,6,7,8},161},
     					"agent Engine 2"
     					1500,
     					1000.
    -					v1, v1, "sec name 2", noAuthNoPriv)],
    -snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called + v1, v1, "sec name 2", noAuthNoPriv)], +snmpm_conf:write_agents_config(ManagerDir, UsersConfig),

    Security data for USM

    The information about Security data for USM should be stored in a file called usm.conf, which must be present if the manager wishes to use SNMPv3 when communicating with agents. It is also possible to add usm data in run-time by calling the register_usm_user.

    The corresponding table is usmUserTable in the SNMP-USER-BASED-SM-MIB @@ -173,13 +173,13 @@ usmAesCfb128Protocol.

  • PrivKey is a list (of integer). This is the User's secret localized encryption key. It is not visible in the MIB. The length of this key needs to be 16 if usmDESPrivProtocol or usmAesCfb128Protocol is used.

  • ManagerDir = "/tmp",
    -UsmConfig  = [snmpm_conf:usm_entry("engine",
    +UsmConfig  = [snmpm_conf:usm_entry("engine",
                                        "user 1",
     	                           usmNoAuthProtocol,
    -	 			   [],
    +	 			   [],
     	 			   usmNoPrivProtocol,
    -	 			   [])],
    -snmpm_conf:write_usm_config(ManagerDir, UsmConfig),
    + [])], +snmpm_conf:write_usm_config(ManagerDir, UsmConfig), @@ -231,7 +231,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.282363867 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_funct_descr.html 2026-03-12 21:37:10.282363867 +0000 @@ -160,7 +160,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.310364032 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_manager_netif.html 2026-03-12 21:37:10.314364057 +0000 @@ -190,7 +190,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.338364199 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_mib_compiler.html 2026-03-12 21:37:10.342364222 +0000 @@ -99,16 +99,16 @@ association file, it gives a warning message and uses default instrumentation functions. (See Default Instrumentation for more details).

    The MIB compiler is started with a call to snmpc:compile(<mibname>). For -example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the +example:

    snmpc:compile("RFC1213-MIB").

    The output is a new file which is called <mibname>.bin.

    The MIB compiler understands both SMIv1 and SMIv2 MIBs. It uses the MODULE-IDENTITY statement to determinate if the MIB is written in SMI version 1 or 2.

    Importing MIBs

    The compiler handles the IMPORT statement. It is important to import the compiled file and not the ASN.1 (source) file. A MIB must be recompiled to make changes visible to other MIBs importing it.

    The compiled files of the imported MIBs must be present in the current directory, or a directory in the current path. The path is supplied with the -{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    -       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" -like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    -       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP +{i, Path} option, for example:

    snmpc:compile("MY-MIB",
    +       [{i, ["friend_mibs/", "../standard_mibs/"]}]).

    It is also possible to import MIBs from OTP applications in an "include_lib" +like fashion with the il option. Example:

    snmpc:compile("MY-MIB",
    +       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).

    finds the latest version of the snmp and myapp applications in the OTP system and uses the expanded paths as include paths.

    Note that an SMIv2 MIB can import an SMIv1 MIB and vice versa.

    The following MIBs are built-ins of the Erlang SNMP compiler: SNMPv2-SMI, RFC-1215, RFC-1212, SNMPv2-TC, SNMPv2-CONF, and RFC1155-SMI. They cannot therefore be compiled separately.

    MIB Consistency Checking

    When an MIB is compiled, the compiler detects if several managed objects use the @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.370364389 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_notification_mib.html 2026-03-12 21:37:10.374364411 +0000 @@ -451,7 +451,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.418364672 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_pdus.html 2026-03-12 21:37:10.418364672 +0000 @@ -99,8 +99,8 @@ Erlang record representations and vice versa. The record definitions can be found in the file snmp/include/snmp_types.hrl. If snmpv3 is used, the module that includes snmp_types.hrl must define the constant SNMP_USE_V3 before the -header file is included. Example:

    -define(SNMP_USE_V3, true).
    --include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if +header file is included. Example:

    -define(SNMP_USE_V3, true).
    +-include_lib("snmp/include/snmp_types.hrl").

    Encoding and decoding must be done explicitly when writing your own Net if process.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.446364839 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_standard_mib.html 2026-03-12 21:37:10.446364839 +0000 @@ -391,7 +391,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.482365052 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_target_mib.html 2026-03-12 21:37:10.486365076 +0000 @@ -770,7 +770,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.510365218 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_user_based_sm_mib.html 2026-03-12 21:37:10.514365241 +0000 @@ -727,7 +727,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.542365408 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmp_view_based_acm_mib.html 2026-03-12 21:37:10.546365431 +0000 @@ -1053,7 +1053,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.610365810 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa.html 2026-03-12 21:37:10.610365810 +0000 @@ -3300,8 +3300,8 @@

    Load a single Mib into an agent. The MibName is the name of the Mib, -including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    +including the path to where the compiled mib is found. For example:

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mib(snmp_master_agent, Dir ++ "MY-MIB").
    @@ -3417,8 +3417,8 @@

    Load Mibs into an agent. If the agent cannot load all MIBs (the default value of the Force argument is false), it will indicate where loading was aborted. The MibName is the name of the Mib, including the path to where the compiled -mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even +mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).

    If Force = true then the agent will continue attempting to load each mib even after failing to load a previous mib. Use with care.

    @@ -4444,8 +4444,8 @@ -

    Accepted type specifications are:

    -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
    --spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
    +

    Accepted type specifications are:

    -spec register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}.
    +-spec register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}.
    @@ -4518,8 +4518,8 @@

    Registers a sub-agent under a sub-tree of another agent.

    It is easy to make mistakes when registering sub-agents and this activity should be done carefully. For example, a strange behaviour would result from the -following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    -snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since +following configuration:

    snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
    +snmp_agent:register_subagent(SA1,[1,2,3], SA2).

    SA2 will not get requests starting with object identifier [1,2,3] since SA1 does not.

    @@ -4964,20 +4964,20 @@ Addresses and if there are no targets for which an Inform-Request is sent, Addresses is the empty list [].

    The receiver will first be sent the snmp_targets message, and then for each address in Addresses list, one of the two snmp_notification messages.

  • {Mod, Func, Args} - The info will be delivered via the function call:

    Mod:Func([Msg | Args])

    where Msg has the same content and purpose as the messages descrived above.

  • Address is a management target address and Addresses is a list of management -target addresses. They are defined as followes:

            Addresses  = [address()]
    -        Address    = address()
    -        address()  = v1_address() | v3_address()
    -        v1_address() = {TDomain, TAddress}
    -        v3_address() = {{TDomain, TAddress}, V3MsgData}
    -        TDomain    = tdoamin()
    -        TAddress   = taddress()
    -        tdomain()  = The oid of snmpUDPDomain
    +target addresses. They are defined as followes:

            Addresses  = [address()]
    +        Address    = address()
    +        address()  = v1_address() | v3_address()
    +        v1_address() = {TDomain, TAddress}
    +        v3_address() = {{TDomain, TAddress}, V3MsgData}
    +        TDomain    = tdoamin()
    +        TAddress   = taddress()
    +        tdomain()  = The oid of snmpUDPDomain
                          This is the only supported transport domain.
    -        taddress() = [A1, A2, A3, A4, P1, P3]
    +        taddress() = [A1, A2, A3, A4, P1, P3]
                          The 4 first bytes makes up the IP-address and the last 2,
                          the UDP-port number.
    -        V3MsgData  = v3_msg_data()
    -        v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information + V3MsgData = v3_msg_data() + v3_msg_data() = term()

    If Receiver is a notification_delivery_info/0 record, then the information about the notification delivery will be delivered to the receiver via the callback functions defined by the snmpa_notification_delivery_info_receiver behaviour according to the content of the notification_delivery_info/0 @@ -6012,7 +6012,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.662366119 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_conf.html 2026-03-12 21:37:10.670366167 +0000 @@ -3772,7 +3772,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.698366333 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_discovery_handler.html 2026-03-12 21:37:10.698366333 +0000 @@ -209,7 +209,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.726366498 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error.html 2026-03-12 21:37:10.730366523 +0000 @@ -234,7 +234,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.754366665 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_io.html 2026-03-12 21:37:10.754366665 +0000 @@ -234,7 +234,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.782366830 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_logger.html 2026-03-12 21:37:10.778366807 +0000 @@ -235,7 +235,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.810366997 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_error_report.html 2026-03-12 21:37:10.810366997 +0000 @@ -230,7 +230,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.842367186 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_local_db.html 2026-03-12 21:37:10.842367186 +0000 @@ -692,7 +692,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.870367352 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_data.html 2026-03-12 21:37:10.878367399 +0000 @@ -1089,7 +1089,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.906367566 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mib_storage.html 2026-03-12 21:37:10.914367613 +0000 @@ -812,7 +812,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.942367778 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_mpd.html 2026-03-12 21:37:10.946367803 +0000 @@ -976,7 +976,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:10.978367993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface.html 2026-03-12 21:37:10.982368016 +0000 @@ -457,7 +457,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.006368158 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_network_interface_filter.html 2026-03-12 21:37:11.010368182 +0000 @@ -469,7 +469,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.038368347 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_delivery_info_receiver.html 2026-03-12 21:37:11.038368347 +0000 @@ -389,7 +389,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.058368466 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_notification_filter.html 2026-03-12 21:37:11.062368489 +0000 @@ -294,7 +294,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.086368633 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpa_supervisor.html 2026-03-12 21:37:11.090368656 +0000 @@ -337,7 +337,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.126368869 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc.html 2026-03-12 21:37:11.126368869 +0000 @@ -379,7 +379,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.154369035 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpc_cmd.html 2026-03-12 21:37:11.158369058 +0000 @@ -89,7 +89,7 @@ -

    SNMP MIB compiler frontend

    Synopsis

    snmpc [options] file.mib | file.bin

    Description

    The snmpc program provides a way to run the SNMP MIB compiler of the Erlang +

    SNMP MIB compiler frontend

    Synopsis

    snmpc [options] file.mib | file.bin

    Description

    The snmpc program provides a way to run the SNMP MIB compiler of the Erlang system.

    snmpc compiles an SNMP MIB file. See compile/1,2 for more information.

    It can also be used to generate a header file (.hrl) with definitions of Erlang constants for the objects in the MIB. See mib_to_hrl/1.

    Compiler options

    The following options are supported (note that most of these relate to the @@ -156,7 +156,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.214369391 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm.html 2026-03-12 21:37:11.218369415 +0000 @@ -1973,8 +1973,8 @@

    Load a Mib into the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:load_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:load_mib(Dir ++ "MY-MIB").
    @@ -3554,8 +3554,8 @@

    Unload a Mib from the manager. The MibName is the name of the Mib, including -the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    -          snmpm:unload_mib(Dir ++ "MY-MIB").
    +the path to where the compiled mib is found. For example,

              Dir = code:priv_dir(my_app) ++ "/mibs/",
    +          snmpm:unload_mib(Dir ++ "MY-MIB").
    @@ -4023,7 +4023,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.250369605 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_conf.html 2026-03-12 21:37:11.254369627 +0000 @@ -1333,7 +1333,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.282369794 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_mpd.html 2026-03-12 21:37:11.282369794 +0000 @@ -612,7 +612,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.314369984 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface.html 2026-03-12 21:37:11.318370007 +0000 @@ -539,7 +539,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.350370197 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_network_interface_filter.html 2026-03-12 21:37:11.350370197 +0000 @@ -461,7 +461,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/snmp-5.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 2026-03-12 21:37:11.382370386 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/snmp-5.19.1/doc/html/snmpm_user.html 2026-03-12 21:37:11.374370340 +0000 @@ -684,7 +684,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:11.402370505 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/404.html 2026-03-12 21:37:11.402370505 +0000 @@ -110,7 +110,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:11.422370624 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/api-reference.html 2026-03-12 21:37:11.426370647 +0000 @@ -210,7 +210,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:11.458370837 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configurations.html 2026-03-12 21:37:11.454370814 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:11.494371051 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/configure_algos.html 2026-03-12 21:37:11.498371074 +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	2026-03-12 21:37:11.526371241 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/hardening.html	2026-03-12 21:37:11.530371264 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:11.562371453 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/introduction.html 2026-03-12 21:37:11.562371453 +0000 @@ -189,7 +189,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:11.614371762 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/notes.html 2026-03-12 21:37:11.622371810 +0000 @@ -738,7 +738,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:11.650371975 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/search.html 2026-03-12 21:37:11.650371975 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-05 20:52:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/configurations.xhtml 2042-04-07 10:10:30.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 2026-03-05 20:52:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/configure_algos.xhtml 2042-04-07 10:10:30.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	2026-03-05 20:52:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/content.opf	2042-04-07 10:10:30.000000000 +0000
    @@ -4,10 +4,10 @@
              version="3.0">
       
         ssh - 5.3.3
    -    urn:uuid:de2bd9b5-b208-1289-d321-8d8bf11286f8
    +    urn:uuid:59dc15b2-b535-d8fa-7d17-e34bc1dcb1d5
         en
     
    -    2026-03-05T20:52:05Z
    +    2042-04-07T10:10:29Z
     
       
       
    /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	2026-03-05 20:52:05.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/hardening.xhtml	2042-04-07 10:10:30.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 2026-03-05 20:52:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/ssh_agent.xhtml 2042-04-07 10:10:30.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 2026-03-05 20:52:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/ssh.xhtml 2042-04-07 10:10:30.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 2026-03-05 20:52:05.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.epub/OEBPS/using_ssh.xhtml 2042-04-07 10:10:30.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	2026-03-12 21:37:11.886373374 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh.html	2026-03-12 21:37:11.890373398 +0000
    @@ -2266,14 +2266,14 @@
     
     

    List of algorithms to use in the algorithm negotiation. The default algs_list/0 can be obtained from default_algorithms/0.

    If an alg_entry() is missing in the algs_list(), the default value is used for -that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    -	  [{public_key,['ssh-rsa','ssh-dss']},
    -	  {cipher,[{client2server,['aes128-ctr']},
    -          {server2client,['aes128-cbc','3des-cbc']}]},
    -	  {mac,['hmac-sha2-256','hmac-sha1']},
    -	  {compression,[none,zlib]}
    -	  ]
    -	  }

    The example specifies different algorithms in the two directions (client2server +that entry.

    Here is an example of this option:

    	  {preferred_algorithms,
    +	  [{public_key,['ssh-rsa','ssh-dss']},
    +	  {cipher,[{client2server,['aes128-ctr']},
    +          {server2client,['aes128-cbc','3des-cbc']}]},
    +	  {mac,['hmac-sha2-256','hmac-sha1']},
    +	  {compression,[none,zlib]}
    +	  ]
    +	  }

    The example specifies different algorithms in the two directions (client2server and server2client), for cipher but specifies the same algorithms for mac and compression in both directions. The kex (key exchange) is implicit but public_key is set explicitly.

    For background and more examples see the @@ -5516,21 +5516,21 @@

    hostkey_fingerprint([DigestType], HostKey) -> [string()]hostkey_fingerprint(DigestType, HostKey) -> string()

    Calculates a ssh fingerprint from a public host key as openssh does.

    The algorithm in hostkey_fingerprint/1 is md5 to be compatible with older ssh-keygen commands. The string from the second variant is -prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
    +prepended by the algorithm name in uppercase as in newer ssh-keygen commands.

    Examples:

     2> ssh:hostkey_fingerprint(Key).
      "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 3> ssh:hostkey_fingerprint(md5,Key).
    + 3> ssh:hostkey_fingerprint(md5,Key).
      "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
     
    - 4> ssh:hostkey_fingerprint(sha,Key).
    + 4> ssh:hostkey_fingerprint(sha,Key).
      "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"
     
    - 5> ssh:hostkey_fingerprint(sha256,Key).
    + 5> ssh:hostkey_fingerprint(sha256,Key).
      "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"
     
    - 6> ssh:hostkey_fingerprint([sha,sha256],Key).
    - ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY",
    -  "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    +
    6> ssh:hostkey_fingerprint([sha,sha256],Key). + ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY", + "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
    @@ -6113,7 +6113,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:11.930373636 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_agent.html 2026-03-12 21:37:11.930373636 +0000 @@ -100,11 +100,11 @@ authentication.

    Ssh_agent implements the ssh_client_key_api, to allow it to be used by setting the option key_cb when starting a client (with for example ssh:connect, -ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, +ssh:shell ).

          {key_cb, {ssh_agent, []}}

    The agent communication is established through a UNIX domain socket. By default, the socket path will be fetched from the SSH_AUTH_SOCK environment variable, which is the default socket path in the agent implementation of OpenSSH.

    In order to set a different socket path the socket_path -option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be +option can be set.

          {key_cb, {ssh_agent, [{socket_path, SocketPath}]}}

    Note

    The functions are Callbacks for the SSH app. They are not intended to be called from the user's code!

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:11.962373824 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_app.html 2026-03-12 21:37:11.958373801 +0000 @@ -229,7 +229,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:11.994374014 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_channel.html 2026-03-12 21:37:11.998374038 +0000 @@ -951,7 +951,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:37:12.030374228 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_client_key_api.html 2026-03-12 21:37:12.034374251 +0000 @@ -506,7 +506,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:12.070374465 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_connection.html 2026-03-12 21:37:12.074374489 +0000 @@ -1982,7 +1982,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:12.110374701 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_file.html 2026-03-12 21:37:12.118374750 +0000 @@ -981,7 +981,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:12.150374939 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_channel.html 2026-03-12 21:37:12.154374962 +0000 @@ -352,7 +352,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:12.178375105 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_server_key_api.html 2026-03-12 21:37:12.182375129 +0000 @@ -296,7 +296,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:12.222375366 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftp.html 2026-03-12 21:37:12.230375414 +0000 @@ -2889,7 +2889,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:12.262375603 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/ssh_sftpd.html 2026-03-12 21:37:12.262375603 +0000 @@ -217,7 +217,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:12.286375746 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/terminology.html 2026-03-12 21:37:12.290375768 +0000 @@ -188,7 +188,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssh-5.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 2026-03-12 21:37:12.326375982 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssh-5.3.3/doc/html/using_ssh.html 2026-03-12 21:37:12.330376006 +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	2026-03-12 21:37:12.358376171 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/404.html	2026-03-12 21:37:12.362376196 +0000
    @@ -110,7 +110,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.386376338 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/api-reference.html 2026-03-12 21:37:12.386376338 +0000 @@ -146,7 +146,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.442376669 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/notes.html 2026-03-12 21:37:12.446376694 +0000 @@ -936,7 +936,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:12.474376859 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/search.html 2026-03-12 21:37:12.474376859 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-05 20:51:56.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/content.opf 2042-04-07 10:10:19.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> ssl - 11.4.1 - urn:uuid:4f3aff19-a149-7f05-a6e3-24f34cb07f48 + urn:uuid:d867b366-9a1e-c9da-e59f-6f1b5e9ba6c1 en - 2026-03-05T20:51:56Z + 2042-04-07T10:10:19Z /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 2026-03-05 20:51:56.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/ssl_distribution.xhtml 2042-04-07 10:10:19.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 2026-03-05 20:51:56.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/ssl.xhtml 2042-04-07 10:10:19.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 2026-03-05 20:51:56.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.epub/OEBPS/using_ssl.xhtml 2042-04-07 10:10:19.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	2026-03-12 21:37:12.686378116 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl.html	2026-03-12 21:37:12.694378164 +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 2026-03-12 21:37:12.730378376 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_app.html 2026-03-12 21:37:12.734378401 +0000 @@ -203,7 +203,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.754378519 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache.html 2026-03-12 21:37:12.762378566 +0000 @@ -334,7 +334,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.786378708 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_crl_cache_api.html 2026-03-12 21:37:12.794378756 +0000 @@ -485,7 +485,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.818378898 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_distribution.html 2026-03-12 21:37:12.822378923 +0000 @@ -105,14 +105,14 @@ applications. Such a script is located in the bin directory of the Erlang distribution. The source for the script is found under the Erlang installation top directory under releases/<OTP version>/start_clean.rel.

        Do the following:

        • Copy that script to another location (and preferably another name).
        • Add the applications Crypto, Public Key, and SSL with their current version -numbers after the STDLIB application.

        The following shows an example .rel file with TLS added:

              {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
        -      [{kernel,"2.15"},
        -      {stdlib,"1.18"},
        -      {crypto, "2.0.3"},
        -      {public_key, "0.12"},
        -      {asn1, "4.0"},
        -      {ssl, "5.0"}
        -      ]}.

        The version numbers differ in your system. Whenever one of the applications +numbers after the STDLIB application.

      The following shows an example .rel file with TLS added:

            {release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
      +      [{kernel,"2.15"},
      +      {stdlib,"1.18"},
      +      {crypto, "2.0.3"},
      +      {public_key, "0.12"},
      +      {asn1, "4.0"},
      +      {ssl, "5.0"}
      +      ]}.

      The version numbers differ in your system. Whenever one of the applications included in the script is upgraded, change the script.

      Do the following:

      • Build the boot script.

        Assuming the .rel file is stored in a file start_ssl.rel in the current directory, a boot script can be built as follows:

         1> systools:make_script("start_ssl",[]).

      There is now a start_ssl.boot file in the current directory.

      Do the following:

      • Test the boot script. To do this, start Erlang with the -boot command-line parameter specifying this boot script (with its full path, but without the @@ -147,10 +147,10 @@ so beware!

        For TLS to work, at least a public key and a certificate must be specified for the server side and the client needs to specify CAs that it trusts (client certification is optional and requires more configuration).

        In the following example (to keep it simple), the PEM file "/home/me/ssl/erlserver.pem" -contains both the server certificate and its private key .

        Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

        [{server,
        -  [{certfile, "/home/me/ssl/erlserver.pem"}]},
        - {client,
        -  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

        And then start the node like this (line breaks in the command are for +contains both the server certificate and its private key .

        Create a file named for example "/home/me/ssl/ssl_test@myhost.conf":

        [{server,
        +  [{certfile, "/home/me/ssl/erlserver.pem"}]},
        + {client,
        +  [{cacertfile, "/home/me/ssl/client_trusted.pem"}]}].

        And then start the node like this (line breaks in the command are for readability, and shall not be there when typed):

        $ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls
           -ssl_dist_optfile "/home/me/ssl/ssl_test@myhost.conf"
           -sname ssl_test

        The options in the {server, Opts} tuple are used when calling @@ -168,25 +168,25 @@ present any certificate.

        A node started in this way is fully functional, using TLS as the distribution protocol.

        verify_fun Configuration Example

        The verify_fun option creates a reference to the implementing function since the configuration is evaluated as an Erlang term. In -an example file for use with -ssl_dist_optfile:

        [{server,[{fail_if_no_peer_cert,true},
        -          {certfile,"/home/me/ssl/cert.pem"},
        -          {keyfile,"/home/me/ssl/privkey.pem"},
        -          {cacertfile,"/home/me/ssl/ca_cert.pem"},
        -          {verify,verify_peer},
        -          {verify_fun,{fun mydist:verify/3,"any initial value"}}]},
        - {client,[{certfile,"/home/me/ssl/cert.pem"},
        -          {keyfile,"/home/me/ssl/privkey.pem"},
        -          {cacertfile,"/home/me/ssl/ca_cert.pem"},
        -          {verify,verify_peer},
        -          {verify_fun,{fun mydist:verify/3,"any initial value"}}]}].
        -

        mydist:verify/3 will be called with:

        • OtpCert, the other party's certificate PKIX Certificates
        • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
        • Init will be "any initial value"

        A pattern for verify/3 will look like:

        verify(OtpCert, _SslStatus, Init) ->
        -    IsOk = is_ok(OtpCert, Init),
        +an example file for use with -ssl_dist_optfile:

        [{server,[{fail_if_no_peer_cert,true},
        +          {certfile,"/home/me/ssl/cert.pem"},
        +          {keyfile,"/home/me/ssl/privkey.pem"},
        +          {cacertfile,"/home/me/ssl/ca_cert.pem"},
        +          {verify,verify_peer},
        +          {verify_fun,{fun mydist:verify/3,"any initial value"}}]},
        + {client,[{certfile,"/home/me/ssl/cert.pem"},
        +          {keyfile,"/home/me/ssl/privkey.pem"},
        +          {cacertfile,"/home/me/ssl/ca_cert.pem"},
        +          {verify,verify_peer},
        +          {verify_fun,{fun mydist:verify/3,"any initial value"}}]}].
        +

        mydist:verify/3 will be called with:

        • OtpCert, the other party's certificate PKIX Certificates
        • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
        • Init will be "any initial value"

        A pattern for verify/3 will look like:

        verify(OtpCert, _SslStatus, Init) ->
        +    IsOk = is_ok(OtpCert, Init),
             NewInitValue = "some new value",
             case IsOk of
                true ->
        -           {valid, NewInitValue};
        +           {valid, NewInitValue};
                false ->
        -           {failure, NewInitValue}
        +           {failure, NewInitValue}
             end.

        verify_fun can accept a verify/4 function, which will receive:

        • OtpCert, the other party's certificate PKIX Certificates
        • DerCert, the other party's original DER Encoded certificate
        • SslStatus, OTP's verification outcome, such as valid or a tuple {bad_cert, unknown_ca}
        • Init will be "any initial value"

        The verify/4 can use the DerCert for atypical workarounds such as handling decoding errors and directly verifying signatures.

        For more details see {verify_fun, Verify} in common_option_cert

        Note

        The legacy command line format for verify_fun cannot be used in a -ssl_dist_optfile file as described below in @@ -226,19 +226,19 @@ -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true" $ export ERL_FLAGS $ erl -sname ssl_test -Erlang (BEAM) emulator version 5.0 [source] +Erlang (BEAM) emulator version 5.0 [source] -Eshell V5.0 (abort with ^G) -(ssl_test@myhost)1> init:get_arguments(). -[{root,["/usr/local/erlang"]}, - {progname,["erl "]}, - {sname,["ssl_test"]}, - {boot,["/home/me/ssl/start_ssl"]}, - {proto_dist,["inet_tls"]}, - {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, - {ssl_dist_opt,["server_secure_renegotiate","true", - "client_secure_renegotiate","true"] - {home,["/home/me"]}]

        The init:get_arguments() call verifies that the correct arguments are supplied +Eshell V5.0 (abort with ^G) +(ssl_test@myhost)1> init:get_arguments(). +[{root,["/usr/local/erlang"]}, + {progname,["erl "]}, + {sname,["ssl_test"]}, + {boot,["/home/me/ssl/start_ssl"]}, + {proto_dist,["inet_tls"]}, + {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]}, + {ssl_dist_opt,["server_secure_renegotiate","true", + "client_secure_renegotiate","true"] + {home,["/home/me"]}]

  • The init:get_arguments() call verifies that the correct arguments are supplied to the emulator.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.846379065 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_protocol.html 2026-03-12 21:37:12.846379065 +0000 @@ -202,7 +202,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.870379206 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/ssl_session_cache_api.html 2026-03-12 21:37:12.874379231 +0000 @@ -688,7 +688,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.910379444 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/standards_compliance.html 2026-03-12 21:37:12.914379467 +0000 @@ -153,7 +153,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/ssl-11.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 2026-03-12 21:37:12.954379704 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/ssl-11.4.1/doc/html/using_ssl.html 2026-03-12 21:37:12.962379752 +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	2026-03-12 21:37:12.990379919 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/404.html	2026-03-12 21:37:12.994379942 +0000
    @@ -110,7 +110,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.026380132 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/api-reference.html 2026-03-12 21:37:13.034380179 +0000 @@ -766,7 +766,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.070380393 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/argparse.html 2026-03-12 21:37:13.074380415 +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 2026-03-12 21:37:13.114380653 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/array.html 2026-03-12 21:37:13.114380653 +0000 @@ -101,14 +101,14 @@ reset/2). If you need to differentiate between unset and set entries, ensure that the default value cannot be confused with the values of set entries.

    The array never shrinks automatically. If an index I has been used to set an entry successfully, all indices in the range [0,I] stay accessible unless the -array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    -10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow -automatically:

    A1 = array:set(17, true, array:new()).
    -18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if -the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    -[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses -beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    -{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    +array size is explicitly changed by calling resize/2.

    Examples:

    Create a fixed-size array with entries 0-9 set to undefined:

    A0 = array:new(10).
    +10 = array:size(A0).

    Create an extendible array and set entry 17 to true, causing the array to grow +automatically:

    A1 = array:set(17, true, array:new()).
    +18 = array:size(A1).

    Read back a stored value:

    true = array:get(17, A1).

    Accessing an unset entry returns default value:

    undefined = array:get(3, A1)

    Accessing an entry beyond the last set entry also returns the default value, if +the array does not have fixed size:

    undefined = array:get(18, A1).

    "Sparse" functions ignore default-valued entries:

    A2 = array:set(4, false, A1).
    +[{4, false}, {17, true}] = array:sparse_to_orddict(A2).

    An extendible array can be made fixed-size later:

    A3 = array:fix(A2).

    A fixed-size array does not grow automatically and does not allow accesses +beyond the last set entry:

    {'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
    +{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
    @@ -1149,7 +1149,7 @@ array size; this also implies {fixed, true}. If N is not a non-negative integer, the call fails with reason badarg.

  • fixed or {fixed, true} - Creates a fixed-size array. See also fix/1.

  • {fixed, false} - Creates an extendible (non-fixed-size) array.

  • {default, Value} - Sets the default value for the array to Value.

  • Options are processed in the order they occur in the list, that is, later options have higher precedence.

    The default value is used as the value of uninitialized entries, and cannot be -changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    +changed once the array has been created.

    Examples:

    array:new(100)

    creates a fixed-size array of size 100.

    array:new({default,0})

    creates an empty, extendible array whose default value is 0.

    array:new([{size,10},{fixed,false},{default,-1}])

    creates an extendible array with initial size 10 whose default value is -1.

    See also fix/1, from_list/2, get/2, new/0, new/2, set/3.

    @@ -1182,7 +1182,7 @@ Options override parameter Size.

    If Options is a list, this is equivalent to new([{size, Size} | Options]), otherwise it is equivalent to new([{size, Size} | [Options]]). However, using this function -directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

    +directly is more efficient.

    Example:

    array:new(100, {default,0})

    creates a fixed-size array of size 100, whose default value is 0.

    See also new/1.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.142380819 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/assert_hrl.html 2026-03-12 21:37:13.146380843 +0000 @@ -90,7 +90,7 @@

    Assert macros.

    Description

    The include file assert.hrl provides macros for inserting assertions in your -program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an +program code.

    Include the following directive in the module from which the function is called:

    -include_lib("stdlib/include/assert.hrl").

    When an assertion succeeds, the assert macro yields the atom ok. When an assertion fails, an exception of type error is generated. The associated error term has the form {Macro, Info}. Macro is the macro name, for example, assertEqual. Info is a list of tagged values, such as @@ -112,7 +112,7 @@ use ASSERT/NOASSERT to control only the assert macros.

    Macros

    • assert(BoolExpr)

    • assert(BoolExpr, Comment) - Tests that BoolExpr completes normally returning true.

    • assertNot(BoolExpr)

    • assertNot(BoolExpr, Comment) - Tests that BoolExpr completes normally returning false.

    • assertMatch(GuardedPattern, Expr)

    • assertMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes -normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr +normally yielding a value that matches GuardedPattern, for example:

      ?assertMatch({bork, _}, f())

      Notice that a guard when ... can be included:

      ?assertMatch({bork, X} when X > 0, f())
    • assertNotMatch(GuardedPattern, Expr)

    • assertNotMatch(GuardedPattern, Expr, Comment) - Tests that Expr completes normally yielding a value that does not match GuardedPattern.

      As in assertMatch, GuardedPattern can have a when part.

    • assertEqual(ExpectedValue, Expr)

    • assertEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is exactly equal to ExpectedValue.

    • assertNotEqual(ExpectedValue, Expr)

    • assertNotEqual(ExpectedValue, Expr, Comment) - Tests that Expr completes normally yielding a value that is not exactly equal to @@ -169,7 +169,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.182381056 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/base64.html 2026-03-12 21:37:13.182381056 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:13.226381317 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/beam_lib.html 2026-03-12 21:37:13.226381317 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:13.270381578 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/binary.html 2026-03-12 21:37:13.274381602 +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	2026-03-12 21:37:13.318381862 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/c.html	2026-03-12 21:37:13.318381862 +0000
    @@ -1717,7 +1717,7 @@
           
     
     

    Compiles and then loads the code for a file on all nodes. Options defaults to -[]. Compilation is equivalent to:

    compile:file(File, Options ++ [report_errors, report_warnings])
    +[]. Compilation is equivalent to:

    compile:file(File, Options ++ [report_errors, report_warnings])
    @@ -2064,7 +2064,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.358382100 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/calendar.html 2026-03-12 21:37:13.362382123 +0000 @@ -1903,13 +1903,13 @@

    Converts an RFC 3339 timestamp into system time. The data format of RFC 3339 timestamps is described by RFC 3339. Starting from OTP 25.1, the minutes part of the time zone is optional.

    Valid option:

    • {unit, Unit} - The time unit of the return value. The default is -second.
    1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
    +second.
    1> calendar:rfc3339_to_system_time("2018-02-01T16:17:58+01:00").
     1517498278
    -2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
    -   [{unit, nanosecond}]).
    +2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z",
    +   [{unit, nanosecond}]).
     1517498282088000000
    -3> calendar:rfc3339_to_system_time(<<"2018-02-01 15:18:02.088Z">>,
    -   [{unit, nanosecond}]).
    +3> calendar:rfc3339_to_system_time(<<"2018-02-01 15:18:02.088Z">>,
    +   [{unit, nanosecond}]).
     1517498282088000000
    @@ -2081,20 +2081,20 @@ second digits is three, six, or nine depending on what time unit is chosen. For native three fractional digits are included. Notice that trailing zeros are not removed from the fraction.

  • {return, Return} - The desired encoding type for the output, -whether a string or a binary is desired. Defaults to string.

  • 1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
    +whether a string or a binary is desired. Defaults to string.

    1> calendar:system_time_to_rfc3339(erlang:system_time(second)).
     "2018-04-23T14:56:28+02:00"
    -2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, "-02:00"}]).
    +2> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, "-02:00"}]).
     "2018-04-23T10:56:52-02:00"
    -3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    -   [{offset, -7200}]).
    +3> calendar:system_time_to_rfc3339(erlang:system_time(second),
    +   [{offset, -7200}]).
     "2018-04-23T10:57:05-02:00"
    -4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
    +4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    +   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]).
     "2018-04-23 12:57:20.482Z"
    -5> calendar:system_time_to_rfc3339(erlang:system_time(millisecond),
    -   [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}, {return, binary}]).
    -<<"2018-04-23 12:57:20.482Z">>
    +5>
    calendar:system_time_to_rfc3339(erlang:system_time(millisecond), + [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}, {return, binary}]). +<<"2018-04-23 12:57:20.482Z">>
    @@ -2389,7 +2389,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.402382360 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/custom_shell.html 2026-03-12 21:37:13.402382360 +0000 @@ -104,20 +104,20 @@ started by default in -noshell mode, so we don't have to do anything special here. To start the custom shell we then call shell:start_interactive/1.

    #!/usr/bin/env escript
     %% pshell.es
    --export([start/0]).
    -main(_Args) ->
    -    shell:start_interactive({?MODULE, start, []}),
    -    timer:sleep(infinity). %% Make sure the escript does not exit
    +-export([start/0]).
    +main(_Args) ->
    +    shell:start_interactive({?MODULE, start, []}),
    +    timer:sleep(infinity). %% Make sure the escript does not exit
     
    --spec start() -> pid().
    -start() ->
    -    spawn(fun() ->
    -                  io:format(~"Starting process inspection shell~n"),
    -                  loop()
    -          end).
    +-spec start() -> pid().
    +start() ->
    +    spawn(fun() ->
    +                  io:format(~"Starting process inspection shell~n"),
    +                  loop()
    +          end).
     
    -loop() ->
    -    receive _M -> loop() end.

    If we run the above we will get this:

    $ ./pshell.es
    +loop() ->
    +    receive _M -> loop() end.

    If we run the above we will get this:

    $ ./pshell.es
     Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Starting process inspection shell
    @@ -128,32 +128,32 @@
     io:standard_io/0 as this shell will be line based. However, for a more complex
     shell it is better to send get_until I/O requests
     as commands read that way can span multiple lines. So we expand our loop/0 with
    -a io:get_line/1 and pass the results to our parser.

    loop() ->
    -    case io:get_line("> ") of
    +a io:get_line/1 and pass the results to our parser.

    loop() ->
    +    case io:get_line("> ") of
             eof -> ok;
    -        {error, Reason} -> exit(Reason);
    -        Data -> eval(string:trim(Data))
    +        {error, Reason} -> exit(Reason);
    +        Data -> eval(string:trim(Data))
         end,
    -    loop().
    +    loop().
     
    -eval("list") ->
    +eval("list") ->
         Format = " ~.10ts | ~.10ts | ~.10ts~n",
    -    io:format(Format,["Pid", "Name", "MsgQ Len"]),
    -    [begin
    -         [{registered_name,Name},{message_queue_len,Len}]
    -             = erlang:process_info(Pid, [registered_name, message_queue_len]),
    -         io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)])
    -     end || Pid <- processes()];
    -eval(Unknown) ->
    -    io:format("Unknown command: '~ts'~n",[Unknown]).
    -
    -to_list(Pid) when is_pid(Pid) ->
    -    pid_to_list(Pid);
    -to_list(Atom) when is_atom(Atom) ->
    -    atom_to_list(Atom);
    -to_list(Int) when is_integer(Int) ->
    -    integer_to_list(Int);
    -to_list(List) when is_list(List) ->
    +    io:format(Format,["Pid", "Name", "MsgQ Len"]),
    +    [begin
    +         [{registered_name,Name},{message_queue_len,Len}]
    +             = erlang:process_info(Pid, [registered_name, message_queue_len]),
    +         io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)])
    +     end || Pid <- processes()];
    +eval(Unknown) ->
    +    io:format("Unknown command: '~ts'~n",[Unknown]).
    +
    +to_list(Pid) when is_pid(Pid) ->
    +    pid_to_list(Pid);
    +to_list(Atom) when is_atom(Atom) ->
    +    atom_to_list(Atom);
    +to_list(Int) when is_integer(Int) ->
    +    integer_to_list(Int);
    +to_list(List) when is_list(List) ->
         List.

    If we run the above we will get this:

    $ ./pshell.es
     Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
    @@ -173,56 +173,56 @@
      <0.11.0>   | erl_prim_l | 0         
      <0.43.0>   | logger     | 0         
      <0.45.0>   | applicatio | 0
    -...

    With this all in place we can now easily add inspect, suspend and resume as well.

    eval("inspect " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +...

    With this all in place we can now easily add inspect, suspend and resume as well.

    eval("inspect " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] =
    -                erlang:process_info(Pid, [registered_name, memory, messages, status]),
    -            io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n",
    -                      [Pid, to_list(Name), Status, Memory, Messages])
    +            [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] =
    +                erlang:process_info(Pid, [registered_name, memory, messages, status]),
    +            io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n",
    +                      [Pid, to_list(Name), Status, Memory, Messages])
         end;
    -eval("suspend " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +eval("suspend " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            erlang:suspend_process(Pid),
    -            io:format("Suspeneded ~ts~n")
    +            erlang:suspend_process(Pid),
    +            io:format("Suspeneded ~ts~n")
         end;
    -eval("resume " ++ PidStr) ->
    -    case parse_pid(PidStr) of
    +eval("resume " ++ PidStr) ->
    +    case parse_pid(PidStr) of
             invalid -> ok;
             Pid ->
    -            erlang:resumne_process(Pid),
    -            io:format("Resumed ~ts~n")
    +            erlang:resumne_process(Pid),
    +            io:format("Resumed ~ts~n")
         end;

    Adding autocompletion

    Wouldn't it be great if we could add some simple auto-completion for our shell? We can do that by setting a edlin_expand fun for our shell. This is done by calling io:setopts([{expand_fun, Fun}]). The fun that we provide is will receive the reversed current line from edlin and is expected to return possible expansions. Let's start by adding a simple fun to -expand our commands.

    -spec start() -> pid().
    -start() ->
    -    spawn(fun() ->
    -                  io:setopts([{expand_fun, fun expand_fun/1}]),
    -                  io:format(~"Starting process inspection shell~n"),
    -                  loop()
    -          end).
    +expand our commands.

    -spec start() -> pid().
    +start() ->
    +    spawn(fun() ->
    +                  io:setopts([{expand_fun, fun expand_fun/1}]),
    +                  io:format(~"Starting process inspection shell~n"),
    +                  loop()
    +          end).
     
    --spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} |
    -          {no, nil(), nil()}.
    -expand_fun("") -> %% If line is empty, we list all available commands
    -    {yes, "", ["list", "inspect", "suspend", "resume"]};
    -expand_fun(Curr) ->
    -    expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]).
    -
    -expand_fun(_Curr, []) ->
    -    {no, "", []};
    -expand_fun(Curr, [Cmd | T]) ->
    -    case lists:prefix(Curr, Cmd) of
    +-spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} |
    +          {no, nil(), nil()}.
    +expand_fun("") -> %% If line is empty, we list all available commands
    +    {yes, "", ["list", "inspect", "suspend", "resume"]};
    +expand_fun(Curr) ->
    +    expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]).
    +
    +expand_fun(_Curr, []) ->
    +    {no, "", []};
    +expand_fun(Curr, [Cmd | T]) ->
    +    case lists:prefix(Curr, Cmd) of
             true ->
                 %% If Curr is a prefix of Cmd we subtract Curr from Cmd to get the
                 %% characters we need to complete with.
    -            {yes, lists:reverse(lists:reverse(Cmd) -- lists:reverse(Curr)), []};
    +            {yes, lists:reverse(lists:reverse(Cmd) -- lists:reverse(Curr)), []};
             false ->
    -            expand_fun(Curr, T)
    +            expand_fun(Curr, T)
         end.

    With the above code we will get expansions of our commands if we hit <TAB> in the shell. Its possible to make very complex completion algorithms, for example the Erlang shell has completions based on the function specifications of your code. It is important though that @@ -279,7 +279,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.446382621 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dets.html 2026-03-12 21:37:13.450382645 +0000 @@ -1873,14 +1873,14 @@

    Returns a list of all objects with key Key stored in table Name, for -example:

    2> dets:open_file(abc, [{type, bag}]).
    -{ok,abc}
    -3> dets:insert(abc, {1,2,3}).
    +example:

    2> dets:open_file(abc, [{type, bag}]).
    +{ok,abc}
    +3> dets:insert(abc, {1,2,3}).
     ok
    -4> dets:insert(abc, {1,3,4}).
    +4> dets:insert(abc, {1,3,4}).
     ok
    -5> dets:lookup(abc, 1).
    -[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list +5> dets:lookup(abc, 1). +[{1,2,3},{1,3,4}]

    If the table type is set, the function returns either the empty list or a list with one object, as there cannot be more than one object with a given key. If the table type is bag or duplicate_bag, the function returns a list of arbitrary length.

    Notice that the order of objects returned is unspecified. In particular, the @@ -2737,11 +2737,11 @@ specification is specified explicitly. This is how to state match specifications that cannot easily be expressed within the syntax provided by qlc.

    The following example uses an explicit match specification to traverse the -table:

    1> dets:open_file(t, []),
    -ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    -MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    -QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using -function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
    +table:

    1> dets:open_file(t, []),
    +ok = dets:insert(t, [{1,a},{2,b},{3,c},{4,d}]),
    +MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end),
    +QH1 = dets:table(t, [{traverse, {select, MS}}]).

    An example with implicit match specification:

    2> QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]).

    The latter example is equivalent to the former, which can be verified using +function qlc:info/1:

    3> qlc:info(QH1) =:= qlc:info(QH2).
     true

    qlc:info/1 returns information about a query handle. In this case identical information is returned for the two query handles.

    @@ -2815,7 +2815,7 @@

    Applies Fun to each object stored in table Name in some unspecified order. Different actions are taken depending on the return value of Fun. The following Fun return values are allowed:

    • continue - Continue to perform the traversal. For example, the following -function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The +function can be used to print the contents of a table:

      fun(X) -> io:format("~p~n", [X]), continue end.
    • {continue, Val} - Continue the traversal and accumulate Val. The following function is supplied to collect all objects of a table in a list:

      fun(X) -> {continue, X} end.
    • {done, Value} - Terminate the traversal and return [Value | Acc].

    Any other value OtherValue returned by Fun terminates the traversal and is returned immediately.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.486382858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/dict.html 2026-03-12 21:37:13.490382881 +0000 @@ -97,13 +97,13 @@ difference is that while this module considers two keys as different if they do not match (=:=), orddict considers two keys as different if and only if they do not compare equal (==).

    Notes

    Functions append and append_list are included so that keyed values can be -stored in a list accumulator, for example:

    > D0 = dict:new(),
    -  D1 = dict:store(files, [], D0),
    -  D2 = dict:append(files, f1, D1),
    -  D3 = dict:append(files, f2, D2),
    -  D4 = dict:append(files, f3, D3),
    -  dict:fetch(files, D4).
    -[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to +stored in a list accumulator, for example:

    > D0 = dict:new(),
    +  D1 = dict:store(files, [], D0),
    +  D2 = dict:append(files, f1, D1),
    +  D3 = dict:append(files, f2, D2),
    +  D4 = dict:append(files, f3, D3),
    +  dict:fetch(files, D4).
    +[f1,f2,f3]

    This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result.

    Function fetch is to be used if the key is known to be in the dictionary, otherwise function find.

    See Also

    gb_trees, orddict

    @@ -858,10 +858,10 @@ the Key-Value pairs from both dictionaries are included in the new dictionary. If a key occurs in both dictionaries, Fun is called with the key and both values to return a new value. merge can be defined as follows, but is -faster:

    merge(Fun, D1, D2) ->
    -    fold(fun (K, V1, D) ->
    -                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    -         end, D2, D1).
    +faster:

    merge(Fun, D1, D2) ->
    +    fold(fun (K, V1, D) ->
    +                 update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D)
    +         end, D2, D1).
    @@ -1074,8 +1074,8 @@

    Updates a value in a dictionary by calling Fun on the value to get a new value. If Key is not present in the dictionary, Initial is stored as the -first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    -    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    +first value. For example, append/3 can be defined as:

    append(Key, Val, D) ->
    +    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).
    @@ -1106,8 +1106,8 @@

    Adds Increment to the value associated with Key and stores this value. If Key is not present in the dictionary, Increment is stored as the first -value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    -    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    +value.

    This can be defined as follows, but is faster:

    update_counter(Key, Incr, D) ->
    +    update(Key, fun (Old) -> Old + Incr end, Incr, D).
    @@ -1136,7 +1136,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.534383142 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph.html 2026-03-12 21:37:13.534383142 +0000 @@ -1801,7 +1801,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.566383332 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/digraph_utils.html 2026-03-12 21:37:13.574383380 +0000 @@ -1003,7 +1003,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.594383499 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin.html 2026-03-12 21:37:13.598383521 +0000 @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.622383665 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/edlin_expand.html 2026-03-12 21:37:13.626383688 +0000 @@ -301,7 +301,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.662383901 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/epp.html 2026-03-12 21:37:13.666383925 +0000 @@ -99,7 +99,7 @@ expression coding\s*[:=]\s*([-a-zA-Z0-9])+ selects the encoding. If the matching string is not a valid encoding, it is ignored. The valid encodings are Latin-1 and UTF-8, where the case of the characters can be chosen freely.

    Examples:

    %% coding: utf-8
    %% For this file we have chosen encoding = Latin-1
    %% -*- coding: latin-1 -*-

    Error Information

    ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    See Also

    erl_parse

    +modules. The format is as follows:

    {ErrorLine, Module, ErrorDescriptor}

    A string describing the error is obtained with the following call:

    Module:format_error(ErrorDescriptor)

    See Also

    erl_parse

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.694384091 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_anno.html 2026-03-12 21:37:13.698384115 +0000 @@ -1268,7 +1268,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.730384305 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_error.html 2026-03-12 21:37:13.730384305 +0000 @@ -276,7 +276,7 @@

    A fun used to format function arguments for BIF and function calls. By default -the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    +the following fun will be used:

    fun(Term, I) -> io_lib:print(Term, I, 80, 30) end
    @@ -397,23 +397,23 @@ caused the error starting at 1.

  • general - An error that is not associated with any argument caused the error.

  • reason - If the Reason should be printed differently than the default way.

  • If the text returned includes new-lines, format_exception/4 will indent the -text correctly.

    Example:

    -module(my_error_module).
    --export([atom_to_string/1, format_error/2]).
    +text correctly.

    Example:

    -module(my_error_module).
    +-export([atom_to_string/1, format_error/2]).
     
    -atom_to_string(Arg) when is_atom(Arg) ->
    -  atom_to_list(Arg);
    -atom_to_string(Arg) ->
    -  erlang:error(badarg,[Arg],
    -               [{error_info,#{ module => ?MODULE,
    -                               cause => #{ 1 => "should be an atom" }}}]).
    -
    -format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    -  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    -  ErrorMap = maps:get(cause, ErrorInfo),
    -  ErrorMap#{ general => "optional general information",
    -             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    -{ok,my_error_module}
    -2> my_error_module:atom_to_string(1).
    +atom_to_string(Arg) when is_atom(Arg) ->
    +  atom_to_list(Arg);
    +atom_to_string(Arg) ->
    +  erlang:error(badarg,[Arg],
    +               [{error_info,#{ module => ?MODULE,
    +                               cause => #{ 1 => "should be an atom" }}}]).
    +
    +format_error(Reason, [{_M,_F,_As,Info}|_]) ->
    +  ErrorInfo = proplists:get_value(error_info, Info, #{}),
    +  ErrorMap = maps:get(cause, ErrorInfo),
    +  ErrorMap#{ general => "optional general information",
    +             reason => io_lib:format("~p: ~p",[?MODULE, Reason]) }.
    1> c(my_error_module).
    +{ok,my_error_module}
    +2> my_error_module:atom_to_string(1).
     ** exception error: my_error_module: badarg
          in function  my_error_module:atom_to_string/1
             called as my_error_module:atom_to_string(1)
    @@ -501,18 +501,18 @@
     
     

    Format the error reason and stack back-trace caught using try ... catch in the same style as the shell formats them.

    Example:

    try
    -    do_something()
    +    do_something()
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    If error_info is provided with the exception, format_exception will use that information to provide additional information about the exception.

    Example:

    try
    -  erlang:raise(badarg,[],[{error_info,#{}}])
    +  erlang:raise(badarg,[],[{error_info,#{}}])
     catch
         C:R:Stk ->
    -        Message = erl_error:format_exception(C, R, Stk),
    -        io:format(LogFile, "~ts\n", [Message])
    +        Message = erl_error:format_exception(C, R, Stk),
    +        io:format(LogFile, "~ts\n", [Message])
     end

    See erlang:error/3 for details on how to raise an exception with error_info included.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.762384495 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_eval.html 2026-03-12 21:37:13.766384518 +0000 @@ -100,13 +100,13 @@ LocalFunctionHandler can be used to define a function that is called when there is a call to a local function. The argument can have the following formats:

    • {value,Func} - This defines a local function handler that is called -with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list +with:

      Func(Name, Arguments)

      Name is the name of the local function (an atom) and Arguments is a list of the evaluated arguments. The function handler returns the value of the local function. In this case, the current bindings cannot be accessed. To signal an error, the function handler calls exit/1 with a -suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of +suitable exit value.

    • {eval,Func} - This defines a local function handler that is called with:

      Func(Name, Arguments, Bindings)

      Name is the name of the local function (an atom), Arguments is a list of the unevaluated arguments, and Bindings are the current variable bindings. -The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated +The function handler returns:

      {value,Value,NewBindings}

      Value is the value of the local function and NewBindings are the updated variable bindings. In this case, the function handler must itself evaluate all the function arguments and manage the bindings. To signal an error, the function handler calls exit/1 with a suitable exit value.

    • none - There is no local function handler.

    Non-Local Function Handler

    The optional argument NonLocalFunctionHandler can be used to define a function @@ -114,7 +114,7 @@ expressions.

  • An operator Op/A is called (this is handled as a call to function erlang:Op/A).
  • Exceptions are calls to erlang:apply/2,3; neither of the function handlers are called for such calls. The argument can have the following formats:

    • {value,Func} - This defines a non-local function handler. The function -may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec +may be called with two arguments:

      Func(FuncSpec, Arguments)

      or three arguments:

      Func(Anno, FuncSpec, Arguments)

      Anno is the erl_anno:anno() of the node, FuncSpec is the name of the function of the form {Module,Function} or a fun, and Arguments is a list of the evaluated arguments. The function handler returns the value of the function. To signal an error, the function handler @@ -1378,7 +1378,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.794384684 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_expand_records.html 2026-03-12 21:37:13.798384708 +0000 @@ -195,7 +195,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.826384874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_features.html 2026-03-12 21:37:13.830384897 +0000 @@ -557,7 +557,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.854385039 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_id_trans.html 2026-03-12 21:37:13.858385064 +0000 @@ -244,7 +244,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.886385229 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_internal.html 2026-03-12 21:37:13.886385229 +0000 @@ -545,7 +545,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.914385395 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_lint.html 2026-03-12 21:37:13.922385443 +0000 @@ -98,7 +98,7 @@ appropriate option, described below.

      The functions in this module are invoked automatically by the Erlang compiler. There is no reason to invoke these functions separately unless you have written your own Erlang compiler.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      epp, erl_parse

      +modules. The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      epp, erl_parse

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

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:13.974385751 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_parse.html 2026-03-12 21:37:13.982385798 +0000 @@ -97,7 +97,7 @@ form of either forms (that is, top-level constructs), expressions, or terms.

      The Abstract Format is described in the ERTS User's Guide. Notice that a token list must end with the dot token to be acceptable to the parse functions (see the erl_scan) module.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O modules. -The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      erl_anno, erl_scan, io, section The Abstract Format +The format is as follows:

      {ErrorLine, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      See Also

      erl_anno, erl_scan, io, section The Abstract Format in the ERTS User's Guide.

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

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.014385987 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_pp.html 2026-03-12 21:37:14.018386012 +0000 @@ -958,7 +958,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.050386202 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_scan.html 2026-03-12 21:37:14.054386225 +0000 @@ -95,7 +95,7 @@

      The Erlang token scanner.

      This module contains functions for tokenizing (scanning) characters into Erlang tokens.

      Error Information

      ErrorInfo is the standard ErrorInfo structure that is returned from all I/O -modules. The format is as follows:

      {ErrorLocation, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      Notes

      The continuation of the first call to the re-entrant input functions must be +modules. The format is as follows:

      {ErrorLocation, Module, ErrorDescriptor}

      A string describing the error is obtained with the following call:

      Module:format_error(ErrorDescriptor)

      Notes

      The continuation of the first call to the re-entrant input functions must be []. For a complete description of how the re-entrant input scheme works, see Armstrong, Virding and Williams: 'Concurrent Programming in Erlang', Chapter 13.

      See Also

      erl_anno, erl_parse, io

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

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.086386415 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/erl_tar.html 2026-03-12 21:37:14.090386438 +0000 @@ -1238,14 +1238,14 @@ Notice that there is only an arity-2 read function, not an arity-1 function.

    • (position,{UserData,Position}) - Sets the position of UserData as defined for files in file:position/2

    Example:

    The following is a complete Fun parameter for reading and writing on files using the file module:

    ExampleFun =
    -   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    -      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    -      (read2, {Fd,Size}) -> file:read(Fd, Size);
    -      (close, Fd) -> file:close(Fd)
    -   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    -{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
    +   fun(write, {Fd,Data}) ->  file:write(Fd, Data);
    +      (position, {Fd,Pos}) -> file:position(Fd, Pos);
    +      (read2, {Fd,Size}) -> file:read(Fd, Size);
    +      (close, Fd) -> file:close(Fd)
    +   end

    Here Fd was specified to function init/3 as:

    {ok,Fd} = file:open(Name, ...).
    +{ok,TarDesc} = erl_tar:init(Fd, [write], ExampleFun),

    TarDesc is then used:

    erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
     ...,
    -erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would +erl_tar:close(TarDesc)

    When the erl_tar core wants to, for example, write a piece of Data, it would call ExampleFun(write, {UserData,Data}).

    Note

    This example with the file module operations is not necessary to use directly, as that is what function open/2 in principle does.

    Warning

    The TarDescriptor term is not a file descriptor. You are advised not to rely on the specific contents of this term, as it can change in future Erlang/OTP @@ -1434,7 +1434,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.118386605 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/escript.html 2026-03-12 21:37:14.122386627 +0000 @@ -487,67 +487,67 @@ number of schedulers with +S3. We also extract the different sections from the newly created script:

    > Source = "%% Demo\nmain(_Args) ->\n    io:format(\"~p\",[erlang:system_info(schedulers)]).\n".
     "%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedulers)).\n"
    -> io:format("~s\n", [Source]).
    +> io:format("~s\n", [Source]).
     %% Demo
    -main(_Args) ->
    -    io:format(erlang:system_info(schedulers)).
    +main(_Args) ->
    +    io:format(erlang:system_info(schedulers)).
     
     ok
    -> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    -                                      {source, list_to_binary(Source)}]).
    -{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    -> file:write_file("demo.escript", Bin).
    +> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "+S3"},
    +                                      {source, list_to_binary(Source)}]).
    +{ok,<<"#!/usr/bin/env escript\n%% This is an -*- erlang -*- file\n%%!+S3"...>>}
    +> file:write_file("demo.escript", Bin).
     ok
    -> os:cmd("escript demo.escript").
    +> os:cmd("escript demo.escript").
     "3"
    -> escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    -     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    -                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    -ok
    -> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    -{ok,demo,
    -    <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    -      79,0,0,0,9,4,100,...>>}
    -> escript:create("demo.beam", [{beam, BeamCode}]).
    -ok
    -> escript:extract("demo.beam", []).
    -{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    -     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    -             111,109,0,0,0,83,0,0,0,9,...>>}]}
    -> os:cmd("escript demo.beam").
    +> escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,default}, {emu_args,"+S3"},
    +     {source,<<"%% Demo\nmain(_Args) ->\n    io:format(erlang:system_info(schedu"...>>}]}

    An escript without header can be created as follows:

    > file:write_file("demo.erl",
    +                  ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
    +ok
    +> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
    +{ok,demo,
    +    <<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
    +      79,0,0,0,9,4,100,...>>}
    +> escript:create("demo.beam", [{beam, BeamCode}]).
    +ok
    +> escript:extract("demo.beam", []).
    +{ok,[{shebang,undefined}, {comment,undefined}, {emu_args,undefined},
    +     {beam,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
    +             111,109,0,0,0,83,0,0,0,9,...>>}]}
    +> os:cmd("escript demo.beam").
     "true"

    Here we create an archive script containing both Erlang code and Beam code, then we iterate over all files in the archive and collect their contents and some -information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    -{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    -> escript:create("demo.escript",
    -                 [shebang,
    -                  {archive, [{"demo.erl", SourceCode},
    -                             {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    -{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}]}
    -> file:write_file("demo.zip", ArchiveBin).
    -ok
    -> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    -{ok,[{"demo.beam",
    -      {file_info,748,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    -        83,0,0,...>>},
    -     {"demo.erl",
    -      {file_info,118,regular,read_write,
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 {{2010,3,2},{0,59,22}},
    -                 54,1,0,0,0,0,0},
    -      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    +information about them:

    > {ok, SourceCode} = file:read_file("demo.erl").
    +{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
    +> escript:create("demo.escript",
    +                 [shebang,
    +                  {archive, [{"demo.erl", SourceCode},
    +                             {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
    +{ok,[{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}]}
    +> file:write_file("demo.zip", ArchiveBin).
    +ok
    +> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
    +{ok,[{"demo.beam",
    +      {file_info,748,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
    +      <<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
    +        83,0,0,...>>},
    +     {"demo.erl",
    +      {file_info,118,regular,read_write,
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 {{2010,3,2},{0,59,22}},
    +                 54,1,0,0,0,0,0},
    +      <<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
    @@ -580,16 +580,16 @@ extracted value is set to the atom default. If a section is missing, the extracted value is set to the atom undefined.

    Option compile_source only affects the result if the escript contains source code. In this case the Erlang code is automatically compiled and -{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    -                 [shebang, {archive, [{"demo.erl", SourceCode},
    -                                      {"demo.beam", BeamCode}], []}]).
    -ok
    -> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    -     {archive, ArchiveBin}]} =
    -              escript:extract("demo.escript", []).
    -{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    -                152,61,93,107,0,0,0,118,0,...>>}
    -     {emu_args,undefined}]}
    +{source, BeamCode} is returned instead of {source, SourceCode}.

    Example:

    > escript:create("demo.escript",
    +                 [shebang, {archive, [{"demo.erl", SourceCode},
    +                                      {"demo.beam", BeamCode}], []}]).
    +ok
    +> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined},
    +     {archive, ArchiveBin}]} =
    +              escript:extract("demo.escript", []).
    +{ok,[{{archive,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
    +                152,61,93,107,0,0,0,118,0,...>>}
    +     {emu_args,undefined}]}
    @@ -647,7 +647,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.186387007 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ets.html 2026-03-12 21:37:14.190387032 +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="0910501086-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="0070048944-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	2026-03-12 21:37:14.226387245 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/file_sorter.html	2026-03-12 21:37:14.230387268 +0000
    @@ -160,35 +160,35 @@
     argument {value, Value}. This makes it easy to initiate the sequence of output
     functions with a value calculated by the input functions.

    As an example, consider sorting the terms on a disk log file. A function that reads chunks from the disk log and returns a list of binaries is used as input. -The results are collected in a list of terms.

    sort(Log) ->
    -    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    -    Input = input(Log, start),
    -    Output = output([]),
    -    Reply = file_sorter:sort(Input, Output, {format,term}),
    -    ok = disk_log:close(Log),
    +The results are collected in a list of terms.

    sort(Log) ->
    +    {ok, _} = disk_log:open([{name,Log}, {mode,read_only}]),
    +    Input = input(Log, start),
    +    Output = output([]),
    +    Reply = file_sorter:sort(Input, Output, {format,term}),
    +    ok = disk_log:close(Log),
         Reply.
     
    -input(Log, Cont) ->
    -    fun(close) ->
    +input(Log, Cont) ->
    +    fun(close) ->
                 ok;
    -       (read) ->
    -            case disk_log:chunk(Log, Cont) of
    -                {error, Reason} ->
    -                    {error, Reason};
    -                {Cont2, Terms} ->
    -                    {Terms, input(Log, Cont2)};
    -                {Cont2, Terms, _Badbytes} ->
    -                    {Terms, input(Log, Cont2)};
    +       (read) ->
    +            case disk_log:chunk(Log, Cont) of
    +                {error, Reason} ->
    +                    {error, Reason};
    +                {Cont2, Terms} ->
    +                    {Terms, input(Log, Cont2)};
    +                {Cont2, Terms, _Badbytes} ->
    +                    {Terms, input(Log, Cont2)};
                     eof ->
                         end_of_input
                 end
         end.
     
    -output(L) ->
    -    fun(close) ->
    -            lists:append(lists:reverse(L));
    -       (Terms) ->
    -            output([Terms | L])
    +output(L) ->
    +    fun(close) ->
    +            lists:append(lists:reverse(L));
    +       (Terms) ->
    +            output([Terms | L])
         end.

    For more examples of functions as input and output, see the end of the file_sorter module; the term format is implemented with functions.

    The possible values of Reason returned when an error occurs are:

    • bad_object, {bad_object, FileName} - Applying the format function failed for some binary, or the key(s) could not be extracted from some term.
    • {bad_term, FileName} - io:read/2 failed to read some term.
    • {file_error, FileName, file:posix()} - For an explanation of @@ -1879,7 +1879,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.262387457 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filelib.html 2026-03-12 21:37:14.262387457 +0000 @@ -995,15 +995,15 @@

      Sanitizes the relative path by eliminating ".." and "." components to protect against directory traversal attacks.

      Either returns the sanitized path name, or the atom unsafe if the path is unsafe. -The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
      +The path is considered unsafe in the following circumstances:

      • The path is not relative.
      • A ".." component would climb up above the root of the relative path.
      • A symbolic link in the path points above the root of the relative path.

      Examples:

      1> {ok, Cwd} = file:get_cwd().
       ...
      -2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
      +2> filelib:safe_relative_path("dir/sub_dir/..", Cwd).
       "dir"
      -3> filelib:safe_relative_path("dir/..", Cwd).
      -[]
      -4> filelib:safe_relative_path("dir/../..", Cwd).
      +3> filelib:safe_relative_path("dir/..", Cwd).
      +[]
      +4> filelib:safe_relative_path("dir/../..", Cwd).
       unsafe
      -5> filelib:safe_relative_path("/abs/path", Cwd).
      +5> filelib:safe_relative_path("/abs/path", Cwd).
       unsafe
    @@ -1103,7 +1103,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.294387647 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/filename.html 2026-03-12 21:37:14.294387647 +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	2026-03-12 21:37:14.338387909 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_sets.html	2026-03-12 21:37:14.342387932 +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	2026-03-12 21:37:14.382388170 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gb_trees.html	2026-03-12 21:37:14.386388193 +0000
    @@ -1562,7 +1562,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.434388478 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_event.html 2026-03-12 21:37:14.438388501 +0000 @@ -1262,15 +1262,15 @@ but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so event handler modules need not export it. + end, Status).

    Note

    This callback is optional, so event handler modules need not export it. If a handler does not export this function, the gen_event module uses the handler state directly for the purposes described below.

    If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return the fact that @@ -2951,7 +2951,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.490388810 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_fsm.html 2026-03-12 21:37:14.494388833 +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	2026-03-12 21:37:14.550389164 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_server.html	2026-03-12 21:37:14.554389189 +0000
    @@ -1360,15 +1360,15 @@
     but it may transform some values.

    Two possible use cases for this callback is to remove sensitive information from the state to prevent it from being printed in log files, or to compact large irrelevant status items -that would only clutter the logs.

    Example:

    format_status(Status) ->
    -  maps:map(
    -    fun(state,State) ->
    -            maps:remove(private_key, State);
    -       (message,{password, _Pass}) ->
    -            {password, removed};
    -       (_,Value) ->
    +that would only clutter the logs.

    Example:

    format_status(Status) ->
    +  maps:map(
    +    fun(state,State) ->
    +            maps:remove(private_key, State);
    +       (message,{password, _Pass}) ->
    +            {password, removed};
    +       (_,Value) ->
                 Value
    -    end, Status).

    Note

    This callback is optional, so callback modules need not export it. The + end, Status).

    Note

    This callback is optional, so callback modules need not export it. The gen_server module provides a default implementation of this function that returns the callback module state.

    If this callback is exported but fails, to hide possibly sensitive data, @@ -3059,7 +3059,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.618389568 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/gen_statem.html 2026-03-12 21:37:14.618389568 +0000 @@ -141,7 +141,7 @@ depending on callback mode Release upgrade/downgrade -(code change) +(code change) -----> Module:code_change/4

    State callback

    The state callback for a specific state in a gen_statem is the callback function that is called for all events in this state. It is selected depending on which callback mode @@ -249,97 +249,97 @@ on --> off : push\n* Reply 'off'

    Not shown in the state diagram:

    • The API function push() generates an event push of type call.
    • The API function get_count() generates an event get_count of type call that is handled in all states by replying with the current count value.
    • Unknown events are ignored and discarded.
    • There is boilerplate code for start, stop, terminate, code change, -init, to set the callback mode to state_functions, etc...

    Pushbutton Code

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    --behaviour(gen_statem).
    +init, to set the callback mode to state_functions, etc...

    Pushbutton Code

    The following is the complete callback module file pushbutton.erl:

    -module(pushbutton).
    +-behaviour(gen_statem).
     
    --export([start/0,push/0,get_count/0,stop/0]).
    --export([terminate/3,code_change/4,init/1,callback_mode/0]).
    --export([on/3,off/3]).
    +-export([start/0,push/0,get_count/0,stop/0]).
    +-export([terminate/3,code_change/4,init/1,callback_mode/0]).
    +-export([on/3,off/3]).
     
    -name() -> pushbutton_statem. % The registered server name
    +name() -> pushbutton_statem. % The registered server name
     
     %% API.  This example uses a registered name name()
     %% and does not link to the caller.
    -start() ->
    -    gen_statem:start({local,name()}, ?MODULE, [], []).
    -push() ->
    -    gen_statem:call(name(), push).
    -get_count() ->
    -    gen_statem:call(name(), get_count).
    -stop() ->
    -    gen_statem:stop(name()).
    +start() ->
    +    gen_statem:start({local,name()}, ?MODULE, [], []).
    +push() ->
    +    gen_statem:call(name(), push).
    +get_count() ->
    +    gen_statem:call(name(), get_count).
    +stop() ->
    +    gen_statem:stop(name()).
     
     %% Mandatory callback functions
    -terminate(_Reason, _State, _Data) ->
    +terminate(_Reason, _State, _Data) ->
         void.
    -code_change(_Vsn, State, Data, _Extra) ->
    -    {ok,State,Data}.
    -init([]) ->
    +code_change(_Vsn, State, Data, _Extra) ->
    +    {ok,State,Data}.
    +init([]) ->
         %% Set the initial state + data.  Data is used only as a counter.
         State = off, Data = 0,
    -    {ok,State,Data}.
    -callback_mode() -> state_functions.
    +    {ok,State,Data}.
    +callback_mode() -> state_functions.
     
     %%% state callback(s)
     
    -off({call,From}, push, Data) ->
    +off({call,From}, push, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -off(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +off(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
    -on({call,From}, push, Data) ->
    +on({call,From}, push, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    -on(EventType, EventContent, Data) ->
    -    handle_event(EventType, EventContent, Data).
    +    {next_state,off,Data,[{reply,From,off}]};
    +on(EventType, EventContent, Data) ->
    +    handle_event(EventType, EventContent, Data).
     
     %% Handle events common to all states
    -handle_event({call,From}, get_count, Data) ->
    +handle_event({call,From}, get_count, Data) ->
         %% Reply with the current count
    -    {keep_state,Data,[{reply,From,Data}]};
    -handle_event(_, _, Data) ->
    +    {keep_state,Data,[{reply,From,Data}]};
    +handle_event(_, _, Data) ->
         %% Ignore all other events
    -    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    -{ok,<0.36.0>}
    -2> pushbutton:get_count().
    +    {keep_state,Data}.

    The following is a shell session when running it:

    1> pushbutton:start().
    +{ok,<0.36.0>}
    +2> pushbutton:get_count().
     0
    -3> pushbutton:push().
    +3> pushbutton:push().
     on
    -4> pushbutton:get_count().
    +4> pushbutton:get_count().
     1
    -5> pushbutton:push().
    +5> pushbutton:push().
     off
    -6> pushbutton:get_count().
    +6> pushbutton:get_count().
     1
    -7> pushbutton:stop().
    +7> pushbutton:stop().
     ok
    -8> pushbutton:push().
    +8> pushbutton:push().
     ** exception exit: {noproc,{gen_statem,call,[pushbutton_statem,push,infinity]}}
          in function  gen:do_for_proc/2 (gen.erl, line 261)
          in call from gen_statem:call/3 (gen_statem.erl, line 386)

    To compare styles, here follows the same example using callback mode handle_event_function, or rather, the code to replace after function init/1 -of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
    +of the pushbutton.erl example file above:

    callback_mode() -> handle_event_function.
     
     %%% state callback(s)
     
    -handle_event({call,From}, push, off, Data) ->
    +handle_event({call,From}, push, off, Data) ->
         %% Go to 'on', increment count and reply
         %% that the resulting status is 'on'
    -    {next_state,on,Data+1,[{reply,From,on}]};
    -handle_event({call,From}, push, on, Data) ->
    +    {next_state,on,Data+1,[{reply,From,on}]};
    +handle_event({call,From}, push, on, Data) ->
         %% Go to 'off' and reply that the resulting status is 'off'
    -    {next_state,off,Data,[{reply,From,off}]};
    +    {next_state,off,Data,[{reply,From,off}]};
     %%
     %% Event handling common to all states
    -handle_event({call,From}, get_count, State, Data) ->
    +handle_event({call,From}, get_count, State, Data) ->
         %% Reply with the current count
    -    {next_state,State,Data,[{reply,From,Data}]};
    -handle_event(_, _, State, Data) ->
    +    {next_state,State,Data,[{reply,From,Data}]};
    +handle_event(_, _, State, Data) ->
         %% Ignore all other events
    -    {next_state,State,Data}.

    Note

    API changes

    • This behavior appeared in Erlang/OTP 19.0 as experimental.
    • In OTP 19.1 a backwards incompatible change of the return tuple from + {next_state,State,Data}.

    Note

    API changes

    • This behavior appeared in Erlang/OTP 19.0 as experimental.
    • In OTP 19.1 a backwards incompatible change of the return tuple from Module:init/1 was made, the mandatory callback function Module:callback_mode/0 was introduced, @@ -3112,15 +3112,15 @@ containing the same keys as the input map, but it may transform some values.

      One use case for this function is to return compact alternative state representations to avoid having large state terms printed in log files. -Another is to hide sensitive data from being written to the error log.

      Example:

      format_status(Status) ->
      -  maps:map(
      -    fun(state,State) ->
      -            maps:remove(private_key, State);
      -       (message,{password, _Pass}) ->
      -            {password, removed};
      -       (_,Value) ->
      +Another is to hide sensitive data from being written to the error log.

      Example:

      format_status(Status) ->
      +  maps:map(
      +    fun(state,State) ->
      +            maps:remove(private_key, State);
      +       (message,{password, _Pass}) ->
      +            {password, removed};
      +       (_,Value) ->
                   Value
      -    end, Status).

      Note

      This callback is optional, so a callback module does not need + end, Status).

      Note

      This callback is optional, so a callback module does not need to export it. The gen_statem module provides a default implementation of this function that returns {State, Data}.

      If this callback is exported but fails, to hide possibly sensitive data, the default function will instead return {State, Info}, @@ -3294,8 +3294,8 @@ to initialize the implementation state and server data.

      Args is the Args argument provided to that start function.

      Note

      Note that if the gen_statem is started through proc_lib and enter_loop/4,5,6, this callback will never be called. Since this callback is not optional -it can in that case be implemented as:

      -spec init(_) -> no_return().
      -init(Args) -> erlang:error(not_implemented, [Args]).
      +it can in that case be implemented as:

      -spec init(_) -> no_return().
      +init(Args) -> erlang:error(not_implemented, [Args]).
    @@ -4728,7 +4728,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.650389758 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/introduction.html 2026-03-12 21:37:14.654389781 +0000 @@ -142,7 +142,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.702390066 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io.html 2026-03-12 21:37:14.706390090 +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	2026-03-12 21:37:14.750390351 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_lib.html	2026-03-12 21:37:14.758390398 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:14.794390611 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/io_protocol.html 2026-03-12 21:37:14.798390636 +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	2026-03-12 21:37:14.842390896 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/json.html	2026-03-12 21:37:14.838390872 +0000
    @@ -964,8 +964,8 @@
     
           
     
    -

    Parses a JSON value from Binary.

    Supports basic data mapping:

    JSONErlang
    Numberinteger() | float()
    Booleantrue | false
    Nullnull
    Stringbinary()
    Object#{binary() => _}

    Errors

    • error(unexpected_end) if Binary contains incomplete JSON value
    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape

    Example

    > json:decode(<<"{\"foo\": 1}">>).
    -#{<<"foo">> => 1}
    +

    Parses a JSON value from Binary.

    Supports basic data mapping:

    JSONErlang
    Numberinteger() | float()
    Booleantrue | false
    Nullnull
    Stringbinary()
    Object#{binary() => _}

    Errors

    • error(unexpected_end) if Binary contains incomplete JSON value
    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape

    Example

    > json:decode(<<"{\"foo\": 1}">>).
    +#{<<"foo">> => 1}
    @@ -999,9 +999,9 @@ can be customized with the callbacks specified in Decoders. The callbacks will use the Acc value as the initial accumulator.

    Any leftover, unparsed data in Binary will be returned.

    Default callbacks

    All callbacks are optional. If not provided, they will fall back to -implementations used by the decode/1 function:

    • for array_start: fun(_) -> [] end
    • for array_push: fun(Elem, Acc) -> [Elem | Acc] end

    • for array_finish: fun(Acc, OldAcc) -> {lists:reverse(Acc), OldAcc} end
    • for object_start: fun(_) -> [] end
    • for object_push: fun(Key, Value, Acc) -> [{Key, Value} | Acc] end

    • for object_finish: fun(Acc, OldAcc) -> {maps:from_list(Acc), OldAcc} end
    • for float: fun erlang:binary_to_float/1
    • for integer: fun erlang:binary_to_integer/1
    • for string: fun (Value) -> Value end
    • for null: the atom null

    Errors

    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape
    • error(unexpected_end) if Binary contains incomplete JSON value

    Example

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    -> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    -{#{foo => 1},ok,<<>>}
    +implementations used by the decode/1 function:

    • for array_start: fun(_) -> [] end
    • for array_push: fun(Elem, Acc) -> [Elem | Acc] end

    • for array_finish: fun(Acc, OldAcc) -> {lists:reverse(Acc), OldAcc} end
    • for object_start: fun(_) -> [] end
    • for object_push: fun(Key, Value, Acc) -> [{Key, Value} | Acc] end

    • for object_finish: fun(Acc, OldAcc) -> {maps:from_list(Acc), OldAcc} end
    • for float: fun erlang:binary_to_float/1
    • for integer: fun erlang:binary_to_integer/1
    • for string: fun (Value) -> Value end
    • for null: the atom null

    Errors

    • error({invalid_byte, Byte}) if Binary contains unexpected byte or invalid UTF-8 byte
    • error({unexpected_sequence, Bytes}) if Binary contains invalid UTF-8 escape
    • error(unexpected_end) if Binary contains incomplete JSON value

    Example

    Decoding object keys as atoms:

    > Push = fun(Key, Value, Acc) -> [{binary_to_existing_atom(Key), Value} | Acc] end.
    +> json:decode(<<"{\"foo\": 1}">>, ok, #{object_push => Push}).
    +{#{foo => 1},ok,<<>>}
    @@ -1034,11 +1034,11 @@

    Continue parsing a stream of bytes of a JSON value.

    Similar to decode_start/3, if the function returns {continue, State} and -there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    -> json:decode_continue(<<"1}">>, State).
    -{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    -> json:decode_continue(end_of_input, State).
    -{123,ok,<<>>}
    +there is no more data, use end_of_input instead of a binary.

    > {continue, State} = json:decode_start(<<"{\"foo\":">>, ok, #{}).
    +> json:decode_continue(<<"1}">>, State).
    +{#{foo => 1},ok,<<>>}
    > {continue, State} = json:decode_start(<<"123">>, ok, #{}).
    +> json:decode_continue(end_of_input, State).
    +{123,ok,<<>>}
    @@ -1102,8 +1102,8 @@ -

    Generates JSON corresponding to Term.

    Supports basic data mapping:

    ErlangJSON
    integer() | float()Number
    true | falseBoolean
    nullNull
    binary()String
    atom()String
    list()Array
    #{binary() => _}Object
    #{atom() => _}Object
    #{integer() => _}Object

    This is equivalent to encode(Term, fun json:encode_value/2).

    Examples

    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
    -<<"{\"foo\":\"bar\"}">>
    +

    Generates JSON corresponding to Term.

    Supports basic data mapping:

    ErlangJSON
    integer() | float()Number
    true | falseBoolean
    nullNull
    binary()String
    atom()String
    list()Array
    #{binary() => _}Object
    #{atom() => _}Object
    #{integer() => _}Object

    This is equivalent to encode(Term, fun json:encode_value/2).

    Examples

    > iolist_to_binary(json:encode(#{foo => <<"bar">>})).
    +<<"{\"foo\":\"bar\"}">>
    @@ -1138,11 +1138,11 @@ to be encoded and is expected to return the corresponding encoded JSON as iodata.

    Various encode_* functions in this module can be used to help in constructing such callbacks.

    Examples

    An encoder that uses a heuristic to differentiate object-like -lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    -> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    -> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    -> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
    -<<"{\"a\":[],\"b\":1}">>
    +lists of key-value pairs from plain lists:

    > encoder([{_, _} | _] = Value, Encode) -> json:encode_key_value_list(Value, Encode);
    +> encoder(Other, Encode) -> json:encode_value(Other, Encode).
    +> custom_encode(Value) -> json:encode(Value, fun(Value, Encode) -> encoder(Value, Encode) end).
    +> iolist_to_binary(custom_encode([{a, []}, {b, 1}])).
    +<<"{\"a\":[],\"b\":1}">>
    @@ -1509,11 +1509,11 @@ -

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    -{
    +

    Generates formatted JSON corresponding to Term.

    Similiar to encode/1 but with added whitespaces for formatting.

    > io:put_chars(json:format(#{foo => <<"bar">>, baz => 52})).
    +{
       "baz": 52,
       "foo": "bar"
    -}
    +}
     ok
    @@ -1578,20 +1578,20 @@

    Generates formatted JSON corresponding to Term.

    Similar to encode/2, can be customised with the Encoder callback and Options.

    Options can include 'indent' to specify number of spaces per level and 'max' which loosely limits the width of lists.

    The Encoder will get a 'State' argument which contains the 'Options' maps merged with other data when recursing through 'Term'.

    format_value/3 or various encode_* functions in this module can be used -to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    -    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    -    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    -> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
    +to help in constructing such callbacks.

    > formatter({posix_time, SysTimeSecs}, Encode, State) ->
    +    TimeStr = calendar:system_time_to_rfc3339(SysTimeSecs, [{offset, "Z"}]),
    +    json:format_value(unicode:characters_to_binary(TimeStr), Encode, State);
    +> formatter(Other, Encode, State) -> json:format_value(Other, Encode, State).
     >
    -> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    -> Options = #{indent => 4}.
    -> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
    +> Fun = fun(Value, Encode, State) -> formatter(Value, Encode, State) end.
    +> Options = #{indent => 4}.
    +> Term = #{id => 1, time => {posix_time, erlang:system_time(seconds)}}.
     >
    -> io:put_chars(json:format(Term, Fun, Options)).
    -{
    +> io:put_chars(json:format(Term, Fun, Options)).
    +{
         "id": 1,
         "time": "2024-05-23T16:07:48Z"
    -}
    +}
     ok
    @@ -1715,7 +1715,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:14.918391347 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/lists.html 2026-03-12 21:37:14.922391370 +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 2026-03-12 21:37:14.954391559 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/log_mf_h.html 2026-03-12 21:37:14.958391584 +0000 @@ -418,7 +418,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.002391845 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/maps.html 2026-03-12 21:37:15.010391891 +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	2026-03-12 21:37:15.050392128 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/math.html	2026-03-12 21:37:15.054392153 +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 2026-03-12 21:37:15.090392366 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ms_transform.html 2026-03-12 21:37:15.094392389 +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	2026-03-12 21:37:15.186392935 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/notes.html	2026-03-12 21:37:15.186392935 +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="9623683928-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="9509931713-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-2026 Ericsson AB

      +

      Copyright © 1996-2042 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 2026-03-12 21:37:15.242393266 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/orddict.html 2026-03-12 21:37:15.238393244 +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 2026-03-12 21:37:15.278393481 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/ordsets.html 2026-03-12 21:37:15.286393527 +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	2026-03-12 21:37:15.330393788 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/peer.html	2026-03-12 21:37:15.334393813 +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 2026-03-12 21:37:15.366394002 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/pool.html 2026-03-12 21:37:15.366394002 +0000 @@ -474,7 +474,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.406394240 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proc_lib.html 2026-03-12 21:37:15.410394263 +0000 @@ -944,21 +944,21 @@ failed. When doing so the start function can return before the failing process has exited, which may block VM resources required for a new start attempt to succeed. Use init_fail/2,3 for that purpose.

    The following example illustrates how this function and proc_lib:start_link/3 -are used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +are used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} ->
    -            exit(Reason)
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} ->
    +            exit(Reason)
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -1031,21 +1031,21 @@ started process, the start function returns an error tuple when the started process exits, or when the start function time-out (if used) has passed, see start/3,4,5.

    The following example illustrates how this function and proc_lib:start_link/3 -can be used:

    -module(my_proc).
    --export([start_link/0]).
    --export([init/1]).
    +can be used:

    -module(my_proc).
    +-export([start_link/0]).
    +-export([init/1]).
     
    -start_link() ->
    -    proc_lib:start_link(my_proc, init, [self()]).
    +start_link() ->
    +    proc_lib:start_link(my_proc, init, [self()]).
     
    -init(Parent) ->
    -    case do_initialization() of
    +init(Parent) ->
    +    case do_initialization() of
             ok ->
    -            proc_lib:init_ack(Parent, {ok, self()});
    -        {error, Reason} = Error ->
    -            proc_lib:init_fail(Parent, Error, {exit, normal})
    +            proc_lib:init_ack(Parent, {ok, self()});
    +        {error, Reason} = Error ->
    +            proc_lib:init_fail(Parent, Error, {exit, normal})
         end,
    -    loop().
    +    loop().
     
     ...
    @@ -1979,7 +1979,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.446394476 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/proplists.html 2026-03-12 21:37:15.454394524 +0000 @@ -497,7 +497,7 @@

    Similar to get_all_values/2, but each value is wrapped in a list unless it is already itself a list. The resulting list of lists is concatenated. This is -often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    +often useful for "incremental" options.

    Example:

    append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

    returns:

    [1,2,3,4]
    @@ -591,10 +591,10 @@ first entry in ListIn with the same key as Property, and E and Property have equivalent normal forms, then E is replaced with the terms in Expansion, and any following entries with the same key are deleted from -ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    -expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} -shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when +ListIn.

    For example, the following expressions all return [fie, bar, baz, fum]:

    expand([{foo, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
    +expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

    However, no expansion is done in the following call because {foo, false} +shadows foo:

    expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

    Notice that if the original property term is to be preserved in the result when expanded, it must be included in the expansion list. The inserted terms are not expanded recursively. If Expansions contains more than one property with the same key, only the first occurrence is used.

    See also normalize/2.

    @@ -999,7 +999,7 @@

    Partitions List into a list of sublists and a remainder.

    Lists contains one sublist for each key in Keys, in the corresponding order. The relative order of the elements in each sublist is preserved from the original List. Rest contains the elements in List that are not associated with any of the -specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    +specified keys, also with their original relative order preserved.

    Example:

    split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

    returns:

    {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
    @@ -1122,7 +1122,7 @@ an association of the form Key => Value. Anything else will be silently ignored.

    If the same key appears in List multiple times, the value of the one appearing nearest to the head of List will be in the result map, that is the value that -would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    +would be returned by a call to get_value(Key, List).

    Example:

    to_map([a, {b, 1}, {c, 2}, {c, 3}])

    returns:

    #{a => true, b => 1, c => 2}
    @@ -1218,7 +1218,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.506394832 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/qlc.html 2026-03-12 21:37:15.514394880 +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="4667180912-44">}]).
    +    qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun},
    +                   {lookup_fun, LookupFun},{key_equality,&#href_anchor"p" data-group-id="3885834377-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	2026-03-12 21:37:15.558395140 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/queue.html	2026-03-12 21:37:15.562395163 +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	2026-03-12 21:37:15.606395424 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/rand.html	2026-03-12 21:37:15.610395449 +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-2026 Ericsson AB

    +

    Copyright © 1996-2042 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 2026-03-12 21:37:15.638395614 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/random.html 2026-03-12 21:37:15.638395614 +0000 @@ -431,9 +431,9 @@

    Seeds random number generation with integer values in the process dictionary and -returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    -            erlang:monotonic_time(),
    -            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, +returns the old state.

    The following is an easy way of obtaining a unique value to seed with:

    random:seed(erlang:phash2([node()]),
    +            erlang:monotonic_time(),
    +            erlang:unique_integer())

    For details, see erlang:phash2/1, erlang:node/0, erlang:monotonic_time/0, and erlang:unique_integer/0.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.702395993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re.html 2026-03-12 21:37:15.698395970 +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 2026-03-12 21:37:15.734396183 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/re_incompat.html 2026-03-12 21:37:15.734396183 +0000 @@ -182,7 +182,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.758396325 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/search.html 2026-03-12 21:37:15.762396350 +0000 @@ -108,7 +108,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.806396610 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sets.html 2026-03-12 21:37:15.806396610 +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	2026-03-12 21:37:15.846396848 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell.html	2026-03-12 21:37:15.850396871 +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	2026-03-12 21:37:15.882397061 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_default.html	2026-03-12 21:37:15.882397061 +0000
    @@ -94,10 +94,10 @@
     
         

    Customizing the Erlang environment.

    The functions in this module are called when no module name is specified in a -shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
    +shell command.

    Consider the following shell dialog:

    1> lists:reverse("abc").
     "cba"
    -2> c(foo).
    -{ok, foo}

    In command one, module lists is called. In command two, no module name is +2> c(foo). +{ok, foo}

    In command one, module lists is called. In command two, no module name is specified. The shell searches module user_default followed by module shell_default for function c/1.

    shell_default is intended for "system wide" customizations to the shell. user_default is intended for "local" or individual user customizations.

    Hint

    To add your own commands to the shell, create a module called user_default and @@ -196,7 +196,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.914397250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/shell_docs.html 2026-03-12 21:37:15.914397250 +0000 @@ -1261,7 +1261,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:15.946397440 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/slave.html 2026-03-12 21:37:15.954397488 +0000 @@ -340,7 +340,7 @@ at a master node. A pseudo server is an intermediary that only has the same registered name as the real server.

    For example, if you have started a slave node N and want to execute pxw graphics code on this node, you can start server pxw_server as a pseudo server -at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
    +at the slave node. This is illustrated as follows:

    rpc:call(N, slave, pseudo, [node(), [pxw_server]]).
    @@ -494,9 +494,9 @@ passed to the new node and can be used for a variety of purposes; see erl(1).

    As an example, suppose that you want to start a slave node at host H with node name Name@H and want the slave node to have the following properties:

    • Directory Dir is to be added to the code path.
    • The Mnesia directory is to be set to M.
    • The Unix DISPLAY environment variable is to be set to the display of the -master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
    +master node.

    The following code is executed to achieve this:

    E = " -env DISPLAY " ++ net_adm:localhost() ++ ":0 ",
     Arg = "-mnesia_dir " ++ M ++ " -pa " ++ Dir ++ E,
    -slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, +slave:start(H, Name, Arg).

    The function returns {ok, Node}, where Node is the name of the new node, otherwise {error, Reason}, where Reason can be one of:

    • timeout - The master node failed to get in contact with the slave node. This can occur in a number of circumstances:

      • Erlang/OTP is not installed on the remote host.
      • The file system on the other host has a different structure to the the master.
      • The Erlang nodes have different cookies.
    • no_rsh - No remote shell program was found on the computer. Note that @@ -675,7 +675,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:16.034397961 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sofs.html 2026-03-12 21:37:16.038397986 +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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/argparse.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/array.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/assert_hrl.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/base64.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/beam_lib.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/binary.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/calendar.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/content.opf 2042-04-07 10:09:19.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> stdlib - 7.1 - urn:uuid:aca3f938-7aa4-126b-cb33-7156a21ff58d + urn:uuid:7566f9db-0f5b-4776-710c-5c13e3adfc5f en - 2026-03-05T20:51:02Z + 2042-04-07T10:09:19Z /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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/custom_shell.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/c.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/dets.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/dict.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/epp.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_error.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_eval.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_lint.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_parse.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_scan.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/erl_tar.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/escript.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/ets.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/filelib.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/filename.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/file_sorter.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gb_sets.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gen_event.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gen_fsm.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gen_server.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/gen_statem.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/io_lib.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/io_protocol.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/io.xhtml	2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/json.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/lists.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/maps.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/math.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/ms_transform.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/notes.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/orddict.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/ordsets.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/peer.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/proc_lib.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/proplists.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/qlc.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/queue.xhtml	2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/random.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/rand.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/re.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/sets.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/shell_default.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/shell.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/slave.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/sofs.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/stdlib_app.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/string.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/supervisor.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/terminal_interface.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/timer.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/unicode_usage.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/unicode.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/uri_string_usage.xhtml 2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/uri_string.xhtml 2042-04-07 10:09:19.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	2026-03-05 20:51:02.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/zip.xhtml	2042-04-07 10:09:19.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 2026-03-05 20:51:02.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib.epub/OEBPS/zstd.xhtml 2042-04-07 10:09:19.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	2026-03-12 21:37:17.274405312 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/stdlib_app.html	2026-03-12 21:37:17.278405336 +0000
    @@ -113,13 +113,13 @@
     prompt function takes the main prompt as its only parameter.

  • shell_saved_results = integer() >= 0 - Can be used to determine how many results are saved by the Erlang shell.

  • shell_session_slogan = string() | fun() -> string()) - The slogan printed when starting an Erlang shell. Example:

    $ erl -stdlib shell_session_slogan '"Test slogan"'
    -Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
    +Erlang/OTP 26 [DEVELOPMENT] [erts-13.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
     
     Test slogan
     1>
  • shell_slogan = string() | fun(() -> string()) - The slogan printed when starting the Erlang shell subsystem. Example:

    $ erl -stdlib shell_slogan '"Test slogan"'
     Test slogan
    -Eshell V13.0.2  (abort with ^G)
    +Eshell V13.0.2  (abort with ^G)
     1>

    The default is the return value of erlang:system_info(system_version).

  • shell_strings = boolean() - Can be used to determine how the Erlang shell outputs lists of integers.

  • shell_hints = boolean() - Can be used to enable/disable @@ -166,7 +166,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.334405667 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/string.html 2026-03-12 21:37:17.338405692 +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	2026-03-12 21:37:17.386405976 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor.html	2026-03-12 21:37:17.390405999 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:37:17.418406166 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/supervisor_bridge.html 2026-03-12 21:37:17.422406189 +0000 @@ -378,7 +378,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.466406451 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/sys.html 2026-03-12 21:37:17.470406474 +0000 @@ -2276,7 +2276,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.498406640 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/terminal_interface.html 2026-03-12 21:37:17.502406664 +0000 @@ -104,18 +104,18 @@ ║ │ │ ║ ║ │ │ ║ ║ │ │ ║ -╚═══════╧═══════╧═══════╝

    We will use the alternate screen buffer for our game so first we need to set that up:

    #href_anchor"nf">main(_Args) ->
    +╚═══════╧═══════╧═══════╝

    We will use the alternate screen buffer for our game so first we need to set that up:

    #href_anchor"nf">main(_Args) ->
         
    -    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    -    io:put_chars("\e[?25l"), %% Hide the cursor
    -    draw_board(),
    -    timer:sleep(5000),
    -    io:put_chars("\e[?25h"), %% Show the cursor
    -    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    -    ok.

    We then use the box drawing parts of Unicode to draw our board:

    draw_board() ->
    -    io:put_chars("\e[5;0H"), %% Move cursor to top left
    -    io:put_chars(
    -      ["     ╔═══════╤═══════╤═══════╗\r\n",
    +    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    +    io:put_chars("\e[?25l"), %% Hide the cursor
    +    draw_board(),
    +    timer:sleep(5000),
    +    io:put_chars("\e[?25h"), %% Show the cursor
    +    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    +    ok.

    We then use the box drawing parts of Unicode to draw our board:

    draw_board() ->
    +    io:put_chars("\e[5;0H"), %% Move cursor to top left
    +    io:put_chars(
    +      ["     ╔═══════╤═══════╤═══════╗\r\n",
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║     Place an X by pressing Enter\r\n",
            "     ║       │       │       ║\r\n",
    @@ -127,51 +127,51 @@
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║\r\n",
            "     ║       │       │       ║\r\n",
    -       "     ╚═══════╧═══════╧═══════╝\r\n"]),
    +       "     ╚═══════╧═══════╧═══════╝\r\n"]),
         ok.

    Let us add some interactivity to our game! To do that we need to change the shell from running in cooked to raw mode. This is done by calling shell:start_interactive({noshell, raw}). We can then use io:get_chars/2 to read key strokes from the user. The key strokes will be returned as ANSI escape codes, -so we will have need to handle the codes for up, down, left, right and enter.

    It could look something like this:

    main(_Args) ->
    -    ok = shell:start_interactive({noshell, raw}),
    +so we will have need to handle the codes for up, down, left, right and enter.

    It could look something like this:

    main(_Args) ->
    +    ok = shell:start_interactive({noshell, raw}),
         
    -    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    -    io:put_chars("\e[?25l"), %% Hide the cursor
    -    draw_board(),
    -    loop(0),
    -    io:put_chars("\e[?25h"), %% Show the cursor
    -    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
    +    io:put_chars("\e[?1049h"), %% Enable alternate screen buffer
    +    io:put_chars("\e[?25l"), %% Hide the cursor
    +    draw_board(),
    +    loop(0),
    +    io:put_chars("\e[?25h"), %% Show the cursor
    +    io:put_chars("\e[?1049l"), %% Disable alternate screen buffer
         ok.
     
    -loop(Pos) ->
    -    io:put_chars(draw_selection(Pos)),
    +loop(Pos) ->
    +    io:put_chars(draw_selection(Pos)),
         %% Read at most 1024 characters from stdin.
    -    Chars = io:get_chars("", 1024),
    -    case handle_input(Chars, Pos) of
    +    Chars = io:get_chars("", 1024),
    +    case handle_input(Chars, Pos) of
             stop -> stop;
             NewPos ->
    -            io:put_chars(clear_selection(Pos)),
    -            loop(NewPos)
    +            io:put_chars(clear_selection(Pos)),
    +            loop(NewPos)
         end.
     
    -handle_input("\e[A" ++ Rest, Pos) ->
    +handle_input("\e[A" ++ Rest, Pos) ->
         %% Up key
    -    handle_input(Rest, max(0, Pos - 3));
    -handle_input("\e[B" ++ Rest, Pos) ->
    +    handle_input(Rest, max(0, Pos - 3));
    +handle_input("\e[B" ++ Rest, Pos) ->
         %% Down key
    -    handle_input(Rest, min(8, Pos + 3));
    -handle_input("\e[C" ++ Rest, Pos) ->
    +    handle_input(Rest, min(8, Pos + 3));
    +handle_input("\e[C" ++ Rest, Pos) ->
         %% right key
    -    handle_input(Rest, min(8, Pos + 1));
    -handle_input("\e[D" ++ Rest, Pos) ->
    +    handle_input(Rest, min(8, Pos + 1));
    +handle_input("\e[D" ++ Rest, Pos) ->
         %% left key
    -    handle_input(Rest, max(0, Pos - 1));
    -handle_input("q" ++ _, _State) ->
    +    handle_input(Rest, max(0, Pos - 1));
    +handle_input("q" ++ _, _State) ->
         stop;
    -handle_input([_ | T], State) ->
    -    handle_input(T, State);
    -handle_input([], State) ->
    +handle_input([_ | T], State) ->
    +    handle_input(T, State);
    +handle_input([], State) ->
         State.

    Note that when using io:get_chars/2 with the shell set in {noshell, raw} mode it will return as soon as any data is available. The number of characters is the maximum number that will be returned. We use 1024 here to make sure that @@ -181,24 +181,24 @@ %% \b = Move cursor left %% \e[C = Move cursor right %% \n = Move cursor down -clear_selection(Pos) -> - [set_position(Pos), +clear_selection(Pos) -> + [set_position(Pos), " ","\b\b\b\b\b\b\b\n", " \e[C\e[C\e[C\e[C\e[C ", - "\b\b\b\b\b\b\b\n"," "]. + "\b\b\b\b\b\b\b\n"," "]. -draw_selection(Pos) -> - [set_position(Pos), +draw_selection(Pos) -> + [set_position(Pos), "┌─────┐","\b\b\b\b\b\b\b\n", "│\e[C\e[C\e[C\e[C\e[C│", - "\b\b\b\b\b\b\b\n","└─────┘"]. + "\b\b\b\b\b\b\b\n","└─────┘"]. %% Set the cursor position to be at the top %% left of the field of the given position -set_position(Pos) -> - Row = 6 + (Pos div 3) * 4, - Col = 7 + (Pos rem 3) * 8, - io_lib:format("\e[~p;~pH",[Row, Col]).

    Now we have a program where we can move the marker around the board. +set_position(Pos) -> + Row = 6 + (Pos div 3) * 4, + Col = 7 + (Pos rem 3) * 8, + io_lib:format("\e[~p;~pH",[Row, Col]).

    Now we have a program where we can move the marker around the board. To complete the game we need to add some state so that we know which squares are marked and whos turn it is. You can find the final solution in tic-tac-toe.es.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.542406901 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/timer.html 2026-03-12 21:37:17.546406924 +0000 @@ -105,15 +105,15 @@ the Timer Module section in the Efficiency Guide.

    For more information on timers in Erlang in general, see the Timers section of the Time and Time Correction in Erlang -ERTS User's guide.

    Examples

    Example 1

    The following example shows how to print "Hello World!" in 5 seconds:

    1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
    -{ok,TRef}
    +ERTS User's guide.

    Examples

    Example 1

    The following example shows how to print "Hello World!" in 5 seconds:

    1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
    +{ok,TRef}
     Hello World!

    Example 2

    The following example shows a process performing a certain action, and if this -action is not completed within a certain limit, the process is killed:

    Pid = spawn(mod, fun, [foo, bar]),
    +action is not completed within a certain limit, the process is killed:

    Pid = spawn(mod, fun, [foo, bar]),
     %% If pid is not finished in 10 seconds, kill him
    -{ok, R} = timer:kill_after(timer:seconds(10), Pid),
    +{ok, R} = timer:kill_after(timer:seconds(10), Pid),
     ...
     %% We change our mind...
    -timer:cancel(R),
    +timer:cancel(R),
     ...

    Notes

    A timer can always be removed by calling cancel/1.

    An interval timer, that is, a timer created by evaluating any of the functions apply_interval/2, apply_interval/3, apply_interval/4, apply_repeatedly/2, apply_repeatedly/3, apply_repeatedly/4, @@ -134,20 +134,20 @@ process which set the timer about its completion, by sending it a done message.

    Using self/0 inside the timed function, the code below does not work as intended. The task gets done, but the done message gets sent to the wrong -process and is lost.

    1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
    -{ok,TRef}
    +process and is lost.

    1> timer:apply_after(1000, fun() -> do_something(), self() ! done end).
    +{ok,TRef}
     2> receive done -> done after 5000 -> timeout end.
     %% ... 5s pass...
     timeout

    The code below calls self/0 in the process which sets the timer and assigns it to a variable, which is then used in the function to send the done message to, -and so works as intended.

    1> Target = self()
    +and so works as intended.

    1> Target = self()
     <0.82.0>
    -2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
    -{ok,TRef}
    +2> timer:apply_after(1000, fun() -> do_something(), Target ! done end).
    +{ok,TRef}
     3> receive done -> done after 5000 -> timeout end.
     %% ... 1s passes...
    -done

    Another option is to pass the message target as a parameter to the function.

    1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
    -{ok,TRef}
    +done

    Another option is to pass the message target as a parameter to the function.

    1> timer:apply_after(1000, fun(Target) -> do_something(), Target ! done end, [self()]).
    +{ok,TRef}
     2> receive done -> done after 5000 -> timeout end.
     %% ... 1s passes...
     done
    @@ -1594,7 +1594,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.582407137 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode.html 2026-03-12 21:37:17.582407137 +0000 @@ -1036,13 +1036,13 @@ the first part of a (so far) valid UTF character.

    If one UTF character is split over two consecutive binaries in the Data, the conversion succeeds. This means that a character can be decoded from a range of binaries as long as the whole range is specified as input without errors -occurring.

    Example:

    decode_data(Data) ->
    -   case unicode:characters_to_list(Data,unicode) of
    -      {incomplete,Encoded, Rest} ->
    -            More = get_some_more_data(),
    -            Encoded ++ decode_data([Rest, More]);
    -      {error,Encoded,Rest} ->
    -            handle_error(Encoded,Rest);
    +occurring.

    Example:

    decode_data(Data) ->
    +   case unicode:characters_to_list(Data,unicode) of
    +      {incomplete,Encoded, Rest} ->
    +            More = get_some_more_data(),
    +            Encoded ++ decode_data([Rest, More]);
    +      {error,Encoded,Rest} ->
    +            handle_error(Encoded,Rest);
           List ->
                 List
        end.

    However, bit strings that are not whole bytes are not allowed, so a UTF @@ -1077,8 +1077,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    -<<"abc..åäö"/utf8>>
    +of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfc_binary([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    +<<"abc..åäö"/utf8>>
    @@ -1109,7 +1109,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
    +of canonical equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfc_list([<<"abc..a">>,[778],$a,[776],$o,[776]]).
     "abc..åäö"
    @@ -1141,8 +1141,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfd_binary("abc..åäö").
    -<<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
    +of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfd_binary("abc..åäö").
    +<<97,98,99,46,46,97,204,138,97,204,136,111,204,136>>
    @@ -1173,8 +1173,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfd_list("abc..åäö").
    -[97,98,99,46,46,97,778,97,776,111,776]
    +of canonical equivalent Decomposed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfd_list("abc..åäö").
    +[97,98,99,46,46,97,778,97,776,111,776]
    @@ -1205,8 +1205,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    -<<"abc..åäö32"/utf8>>
    +of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    4> unicode:characters_to_nfkc_binary([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    +<<"abc..åäö32"/utf8>>
    @@ -1237,7 +1237,7 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form -of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
    +of compatibly equivalent Composed characters according to the Unicode standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    3> unicode:characters_to_nfkc_list([<<"abc..a">>,[778],$a,[776],$o,[776],[65299,65298]]).
     "abc..åäö32"
    @@ -1270,8 +1270,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
    -<<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
    +standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is an utf8 encoded binary.

    2> unicode:characters_to_nfkd_binary(["abc..åäö",[65299,65298]]).
    +<<97,98,99,46,46,97,204,138,97,204,136,111,204,136,51,50>>
    @@ -1303,8 +1303,8 @@

    Converts a possibly deep list of characters and binaries into a Normalized Form of compatibly equivalent Decomposed characters according to the Unicode -standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
    -[97,98,99,46,46,97,778,97,776,111,776,51,50]
    +standard.

    Any binaries in the input must be encoded with utf8 encoding.

    The result is a list of characters.

    1> unicode:characters_to_nfkd_list(["abc..åäö",[65299,65298]]).
    +[97,98,99,46,46,97,778,97,776,111,776,51,50]
    @@ -1365,7 +1365,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.622407374 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/unicode_usage.html 2026-03-12 21:37:17.622407374 +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	2026-03-12 21:37:17.662407612 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string.html	2026-03-12 21:37:17.662407612 +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	2026-03-12 21:37:17.690407778 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/uri_string_usage.html	2026-03-12 21:37:17.690407778 +0000
    @@ -126,19 +126,19 @@
     to explain this by an example.

    Let's say that we would like to create the following URI and send it over the network: http://cities/örebro?foo bar. This is not a valid URI as it contains characters that are not allowed in a URI such as "ö" and the space. We can -verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    -  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails +verify this by parsing the URI:

      1> uri_string:parse("http://cities/örebro?foo bar").
    +  {error,invalid_uri,":"}

    The URI parser tries all possible combinations to interpret the input and fails at the last attempt when it encounters the colon character ":". Note, that the inital fault occurs when the parser attempts to interpret the character "ö" and after a failure back-tracks to the point where it has another possible parsing alternative.

    The proper way to solve this problem is to use uri_string:recompose/1 with a -uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    -  query => "foo bar"}).
    +uri_map() as input:

      2> uri_string:recompose(#{scheme => "http", host => "cities", path => "/örebro",
    +  query => "foo bar"}).
       "http://cities/%C3%B6rebro?foo%20bar"

    The result is a valid URI where all the special characters are encoded as defined by the standard. Applying uri_string:parse/1 and -uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    -  #{host => "cities",path => "/örebro",query => "foo bar",
    -  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    Percent-encoding

    As you have seen in the previous chapter, a standard URI can only contain a +uri_string:percent_decode/1 on the URI returns the original input:

      3> uri_string:percent_decode(uri_string:parse("http://cities/%C3%B6rebro?foo%20bar")).
    +  #{host => "cities",path => "/örebro",query => "foo bar",
    +  scheme => "http"}

    This symmetric property is heavily used in our property test suite.

    Percent-encoding

    As you have seen in the previous chapter, a standard URI can only contain a strict subset of the US ASCII character set, moreover the allowed set of characters is not the same in the different URI components. Percent-encoding is a mechanism to represent a data octet in a component when that octet's @@ -155,27 +155,27 @@ question the library provides a utility function, uri_string:allowed_characters/0, that lists the allowed set of characters in each major URI component, and also in the -most important standard character sets.

        1> uri_string:allowed_characters().
    -    [{scheme,
    -     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    -    {userinfo,
    -     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {host,
    -     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {ipv4,".0123456789"},
    -    {ipv6,".0123456789:ABCDEFabcdef"},
    -    {regname,
    -     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {path,
    -     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {query,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {fragment,
    -     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    -    {reserved,"!#$&'()*+,/:;=?@[]"},
    -    {unreserved,
    -     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be -percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
    +most important standard character sets.

        1> uri_string:allowed_characters().
    +    [{scheme,
    +     "+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},
    +    {userinfo,
    +     "!$%&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {host,
    +     "!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {ipv4,".0123456789"},
    +    {ipv6,".0123456789:ABCDEFabcdef"},
    +    {regname,
    +     "!$%&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {path,
    +     "!$%&'()*+,-./0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {query,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {fragment,
    +     "!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"},
    +    {reserved,"!#$&'()*+,/:;=?@[]"},
    +    {unreserved,
    +     "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"}]

    If a URI component has a character that is not allowed, it will be +percent-encoded when the URI is produced:

        2> uri_string:recompose(#{scheme => "https", host => "local#host", path => ""}).
         "https://local%23host"

    Consuming a URI containing percent-encoded triplets can take many steps. The following example shows how to handle an input URI that is not normalized and contains multiple percent-encoded triplets. First, the input @@ -187,32 +187,32 @@ You can try to normalize the input with uri_string:normalize/1. The normalize operation decodes those percent-encoded triplets that correspond to a character in the unreserved set. Normalization is a safe, idempotent operation that -converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
    +converts a URI into its canonical form:

        4> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20").
         "http://local%23host/%F6re%26bro%20"
    -    5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]).
    -    #{host => "local%23host",path => "/%F6re%26bro%20",
    -      scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this + 5> uri_string:normalize("http://%6C%6Fcal%23host/%F6re%26bro%20", [return_map]). + #{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}

    There are still a few percent-encoded triplets left in the output. At this point, when the URI is already parsed, it is safe to apply application specific decoding on the remaining character triplets. Erlang/OTP provides a function, uri_string:percent_decode/1 for raw percent decoding that you can use on the -host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
    +host and path components, or on the whole map:

        6> uri_string:percent_decode("local%23host").
         "local#host"
    -    7> uri_string:percent_decode("/%F6re%26bro%20").
    -    {error,invalid_utf8,<<"/öre&bro ">>}
    -    8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20",
    -    scheme => "http"}).
    -    {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character + 7> uri_string:percent_decode("/%F6re%26bro%20"). + {error,invalid_utf8,<<"/öre&bro ">>} + 8> uri_string:percent_decode(#{host => "local%23host",path => "/%F6re%26bro%20", + scheme => "http"}). + {error,{invalid,{path,{invalid_utf8,<<"/öre&bro ">>}}}}

    The host was successfully decoded but the path contains at least one character with non-UTF-8 encoding. In order to be able to decode this, you have to make assumptions about the encoding used in these triplets. The most obvious choice is latin-1, so you can try uri_string:transcode/2, to transcode the path to -UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
    +UTF-8 and run the percent-decode operation on the transcoded string:

        9> uri_string:transcode("/%F6re%26bro%20", [{in_encoding, latin1}]).
         "/%C3%B6re%26bro%20"
    -    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
    +    10> uri_string:percent_decode("/%C3%B6re%26bro%20").
         "/öre&bro "

    It is important to emphasize that it is not safe to apply -uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
    +uri_string:percent_decode/1 directly on an input URI:

        11> uri_string:percent_decode("http://%6C%6Fcal%23host/%C3%B6re%26bro%20").
         "http://local#host/öre&bro "
    -    12> uri_string:parse("http://local#host/öre&bro ").
    -    {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens + 12> uri_string:parse("http://local#host/öre&bro "). + {error,invalid_uri,":"}

    Note

    Percent-encoding is implemented in uri_string:recompose/1 and it happens when converting a uri_map() into a uri_string(). Applying any percent-encoding directly on an input URI would not be safe just as in the case of @@ -297,7 +297,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.718407943 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/win32reg.html 2026-03-12 21:37:17.718407943 +0000 @@ -877,7 +877,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.762408204 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zip.html 2026-03-12 21:37:17.766408229 +0000 @@ -772,29 +772,29 @@ archive. The iteration can be ended prematurely in a controlled manner by throwing an exception.

    Example:

    > Name = "dummy.zip".
     "dummy.zip"
    -> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]).
    -{ok,{"dummy.zip",
    -     <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}).
    -{ok,[{"bar",<<"BAR">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}},
    -     {"foo",<<"FOO">>,
    -      {file_info,3,regular,read_write,
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 {{2010,3,1},{19,2,10}},
    -                 54,1,0,0,0,0,0}}]}
    -> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]).
    -{ok,{"dummy.zip",
    -     <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0,
    -       0,0,3,0,0,...>>}}
    -> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}).
    -<<"FOO">>
    +> {ok, {Name, Bin}} = zip:create(Name, [{"foo", <<"FOO">>}, {"bar", <<"BAR">>}], [memory]). +{ok,{"dummy.zip", + <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0, + 0,0,3,0,0,...>>}} +> {ok, FileSpec} = zip:foldl(fun(N, I, B, Acc) -> [{N, B(), I()} | Acc] end, [], {Name, Bin}). +{ok,[{"bar",<<"BAR">>, + {file_info,3,regular,read_write, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + 54,1,0,0,0,0,0}}, + {"foo",<<"FOO">>, + {file_info,3,regular,read_write, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + {{2010,3,1},{19,2,10}}, + 54,1,0,0,0,0,0}}]} +> {ok, {Name, Bin}} = zip:create(Name, lists:reverse(FileSpec), [memory]). +{ok,{"dummy.zip", + <<80,75,3,4,20,0,0,0,0,0,74,152,97,60,171,39,212,26,3,0, + 0,0,3,0,0,...>>}} +> catch zip:foldl(fun("foo", _, B, _) -> throw(B()); (_,_,_,Acc) -> Acc end, [], {Name, Bin}). +<<"FOO">>
    @@ -1642,7 +1642,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/stdlib-7.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 2026-03-12 21:37:17.802408442 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/stdlib-7.1/doc/html/zstd.html 2026-03-12 21:37:17.802408442 +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	2026-03-12 21:37:17.826408583 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/404.html	2026-03-12 21:37:17.830408608 +0000
    @@ -106,7 +106,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:17.858408773 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/api-reference.html 2026-03-12 21:37:17.854408750 +0000 @@ -186,7 +186,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:17.878408892 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/chapter.html 2026-03-12 21:37:17.878408892 +0000 @@ -140,7 +140,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:17.910409081 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/epp_dodger.html 2026-03-12 21:37:17.906409059 +0000 @@ -856,7 +856,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:17.934409224 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_comment_scan.html 2026-03-12 21:37:17.938409248 +0000 @@ -414,7 +414,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:17.970409438 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_prettypr.html 2026-03-12 21:37:17.970409438 +0000 @@ -978,7 +978,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:17.998409603 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_recomment.html 2026-03-12 21:37:18.002409628 +0000 @@ -356,7 +356,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:18.110410268 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax.html 2026-03-12 21:37:18.110410268 +0000 @@ -6931,10 +6931,10 @@

    Returns the associated post-comments of a node.

    This is a possibly empty list of abstract comments, in top-down textual order. When the code is formatted, post-comments are typically -displayed to the right of and/or below the node. For example:

    {foo, X, Y}     % Post-comment of tuple

    If possible, the comment should be moved past any following separator characters +displayed to the right of and/or below the node. For example:

    {foo, X, Y}     % Post-comment of tuple

    If possible, the comment should be moved past any following separator characters on the same line, rather than placing the separators on the following line. -For example:

    foo([X | Xs], Y) ->
    -    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
    +For example:

    foo([X | Xs], Y) ->
    +    foo(Xs, bar(X));     % Post-comment of 'bar(X)' node
      ...

    (where the comment is moved past the rightmost ")" and the ";").

    See also: comment/2, get_attrs/1, get_precomments/1, set_postcomments/2.

    @@ -6967,10 +6967,10 @@

    Returns the associated pre-comments of a node.

    This is a possibly empty list of abstract comments, in top-down textual order. When the code is formatted, pre-comments are typically displayed directly above the node. For example:

    % Pre-comment of function
    -foo(X) -> {bar, X}.

    If possible, the comment should be moved before any preceding separator -characters on the same line. For example:

    foo([X | Xs]) ->
    +foo(X) -> {bar, X}.

    If possible, the comment should be moved before any preceding separator +characters on the same line. For example:

    foo([X | Xs]) ->
         % Pre-comment of 'bar(X)' node
    -    [bar(X) | foo(Xs)];
    +    [bar(X) | foo(Xs)];
     ...

    (where the comment is moved before the "[").

    See also: comment/2, get_attrs/1, get_postcomments/1, set_precomments/2.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:18.158410553 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/erl_syntax_lib.html 2026-03-12 21:37:18.162410576 +0000 @@ -2467,7 +2467,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:18.202410813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl.html 2026-03-12 21:37:18.206410837 +0000 @@ -97,30 +97,30 @@ making it easy both to build new ASTs from scratch and to match and decompose existing ASTs. For details that are outside the scope of Merl itself, see the documentation of erl_syntax.

    Quick start

    To enable the full power of Merl, your module needs to include the Merl header -file:

    -include_lib("syntax_tools/include/merl.hrl").

    Then, you can use the ?Q(Text) macros in your code to create ASTs or match on -existing ASTs. For example:

    Tuple = ?Q("{foo, 42}"),
    -?Q("{foo, _@Number}") = Tuple,
    -Call = ?Q("foo:bar(_@Number)")

    Calling merl:print(Call) will then print the following code:

    foo:bar(42)

    The ?Q macros turn the quoted code fragments into ASTs, and lifts +file:

    -include_lib("syntax_tools/include/merl.hrl").

    Then, you can use the ?Q(Text) macros in your code to create ASTs or match on +existing ASTs. For example:

    Tuple = ?Q("{foo, 42}"),
    +?Q("{foo, _@Number}") = Tuple,
    +Call = ?Q("foo:bar(_@Number)")

    Calling merl:print(Call) will then print the following code:

    foo:bar(42)

    The ?Q macros turn the quoted code fragments into ASTs, and lifts metavariables such as _@Tuple and _@Number to the level of your Erlang code, so you can use the corresponding Erlang variables Tuple and Number directly. This is the most straightforward way to use Merl, and in many cases it's all you need.

    You can even write case switches using ?Q macros as patterns. For example:

    case AST of
    -    ?Q("{foo, _@Foo}") -> handle(Foo);
    -    ?Q("{bar, _@Bar}") when erl_syntax:is_integer(Bar) -> handle(Bar);
    -    _ -> handle_default()
    +    ?Q("{foo, _@Foo}") -> handle(Foo);
    +    ?Q("{bar, _@Bar}") when erl_syntax:is_integer(Bar) -> handle(Bar);
    +    _ -> handle_default()
     end

    These case switches only allow ?Q(...) or _ as clause patterns, and the guards may contain any expressions, not just Erlang guard expressions.

    If the macro MERL_NO_TRANSFORM is defined before the merl.hrl header file is included, the parse transform used by Merl will be disabled, and in that case, the match expressions ?Q(...) = ..., case switches using ?Q(...) patterns, and automatic metavariables like _@Tuple cannot be used in your code, but the Merl macros and functions still work. To do metavariable substitution, you need -to use the ?Q(Text, Map) macro. For example:

    Tuple = ?Q("{foo, _@bar, _@baz}", [{bar, Bar}, {baz,Baz}])

    The text given to a ?Q(Text) macro can be either a single string or a list of +to use the ?Q(Text, Map) macro. For example:

    Tuple = ?Q("{foo, _@bar, _@baz}", [{bar, Bar}, {baz,Baz}])

    The text given to a ?Q(Text) macro can be either a single string or a list of strings. The latter is useful when you need to split a long expression over -multiple lines. For example:

    ?Q(["case _@Expr of",
    +multiple lines. For example:

    ?Q(["case _@Expr of",
         "  {foo, X} -> f(X);",
         "  {bar, X} -> g(X)",
         "  _ -> h(X)"
    -"end"])

    If there is a syntax error somewhere in the text (like the missing semicolon in +"end"])

    If there is a syntax error somewhere in the text (like the missing semicolon in the second clause above) this allows Merl to generate an error message pointing to the exact line in your source code. (Just remember to comma-separate the strings in the list, otherwise Erlang will concatenate the string fragments as @@ -137,59 +137,59 @@ uppercase character, as in _@Foo or _@_@Foo, it will become a variable on the Erlang level, and can be used to easily deconstruct and construct syntax trees:

    case Input of
    -    ?Q("{foo, _@Number}") -> ?Q("foo:bar(_@Number)");
    +    ?Q("{foo, _@Number}") -> ?Q("foo:bar(_@Number)");
         ...

    We refer to these as "automatic metavariables". If in addition the name ends with @, as in _@Foo@, the value of the variable as an Erlang term will be automatically converted to the corresponding abstract syntax tree when used to -construct a larger tree. For example, in:

    Bar = {bar, 42},
    -Foo = ?Q("{foo, _@Bar@}")

    (where Bar is just some term, not a syntax tree) the result Foo will be a +construct a larger tree. For example, in:

    Bar = {bar, 42},
    +Foo = ?Q("{foo, _@Bar@}")

    (where Bar is just some term, not a syntax tree) the result Foo will be a syntax tree representing {foo, {bar, 42}}. This avoids the need for temporary -variables in order to inject data, as in

    TmpBar = erl_syntax:abstract(Bar),
    -Foo = ?Q("{foo, _@TmpBar}")

    If the context requires an integer rather than a variable, an atom, or a string, +variables in order to inject data, as in

    TmpBar = erl_syntax:abstract(Bar),
    +Foo = ?Q("{foo, _@TmpBar}")

    If the context requires an integer rather than a variable, an atom, or a string, you cannot use the uppercase convention to mark an automatic metavariable. Instead, if the integer (without the 909-prefix and lift/glob markers) ends in a 9, the integer will become an Erlang-level variable prefixed with Q, and if it ends with 99 it will also be automatically abstracted. For example, the following will increment the arity of the exported function f:

    case Form of
    -    ?Q("-export([f/90919]).") ->
    -        Q2 = erl_syntax:concrete(Q1) + 1,
    -        ?Q("-export([f/909299]).");
    +    ?Q("-export([f/90919]).") ->
    +        Q2 = erl_syntax:concrete(Q1) + 1,
    +        ?Q("-export([f/909299]).");
         ...

    When to use the various forms of metavariables

    Merl can only parse a fragment of text if it follows the basic syntactical rules of Erlang. In most places, a normal Erlang variable can be used as metavariable, -for example:

    ?Q("f(_@Arg)") = Expr

    but if you want to match on something like the name of a function, you have to -use an atom as metavariable:

    ?Q("'@Name'() -> _@@_." = Function

    (note the anonymous glob variable _@@_ to ignore the function body).

    In some contexts, only a string or an integer is allowed. For example, the +for example:

    ?Q("f(_@Arg)") = Expr

    but if you want to match on something like the name of a function, you have to +use an atom as metavariable:

    ?Q("'@Name'() -> _@@_." = Function

    (note the anonymous glob variable _@@_ to ignore the function body).

    In some contexts, only a string or an integer is allowed. For example, the directive -file(Name, Line) requires that Name is a string literal and -Line an integer literal:

    ?Q("-file(\"'@File\", 9090).") = ?Q("-file(\"foo.erl\", 42).")).

    This will extract the string literal "foo.erl" into the variable Foo. Note +Line an integer literal:

    ?Q("-file(\"'@File\", 9090).") = ?Q("-file(\"foo.erl\", 42).")).

    This will extract the string literal "foo.erl" into the variable Foo. Note the use of the anonymous variable 9090 to ignore the line number. To match and also bind a metavariable that must be an integer literal, we can use the convention of ending the integer with a 9, turning it into a Q-prefixed variable on the Erlang level (see the previous section).

    Globs

    Whenever you want to match out a number of elements in a sequence (zero or more) -rather than a fixed set of elements, you need to use a glob. For example:

    ?Q("{_@@Elements}") = ?Q({a, b, c})

    will bind Elements to the list of individual syntax trees representing the atoms +rather than a fixed set of elements, you need to use a glob. For example:

    ?Q("{_@@Elements}") = ?Q({a, b, c})

    will bind Elements to the list of individual syntax trees representing the atoms a, b, and c. This can also be used with static prefix and suffix elements -in the sequence. For example:

    ?Q("{a, b, _@@Elements}") = ?Q({a, b, c, d})

    will bind Elements to the list of the c and d subtrees, and

    ?Q("{_@@Elements, c, d}") = ?Q({a, b, c, d})

    will bind Elements to the list of the a and b subtrees. You can even use -plain metavariables in the prefix or suffix:

    ?Q("{_@First, _@@Rest}") = ?Q({a, b, c})

    or

    ?Q("{_@@_, _@Last}") = ?Q({a, b, c})

    (ignoring all but the last element). However, you cannot have two globs as part +in the sequence. For example:

    ?Q("{a, b, _@@Elements}") = ?Q({a, b, c, d})

    will bind Elements to the list of the c and d subtrees, and

    ?Q("{_@@Elements, c, d}") = ?Q({a, b, c, d})

    will bind Elements to the list of the a and b subtrees. You can even use +plain metavariables in the prefix or suffix:

    ?Q("{_@First, _@@Rest}") = ?Q({a, b, c})

    or

    ?Q("{_@@_, _@Last}") = ?Q({a, b, c})

    (ignoring all but the last element). However, you cannot have two globs as part of the same sequence.

    Lifted metavariables

    In some cases, the Erlang syntax rules make it impossible to place a -metavariable directly where you would like it. For example, you cannot write:

    ?Q("-export([_@@Name]).")

    to match out all name/arity pairs in the export list, or to insert a list of +metavariable directly where you would like it. For example, you cannot write:

    ?Q("-export([_@@Name]).")

    to match out all name/arity pairs in the export list, or to insert a list of exports in a declaration, because the Erlang parser only allows elements on the form A/I (where A is an atom and I an integer) in the export list. A variable like the above is not allowed, but neither is a single atom or integer, so '@@Name' or 909919 would not work either.

    What you have to do in such cases is to write your metavariable in a syntactically valid position, and use lifting markers to denote where it should -really apply, as in:

    ?Q("-export(['@_@Name'/0]).")

    This causes the variable to be lifted (after parsing) to the next higher level +really apply, as in:

    ?Q("-export(['@_@Name'/0]).")

    This causes the variable to be lifted (after parsing) to the next higher level in the syntax tree, replacing that entire subtree. In this case, the '@_@Name'/0 will be replaced with '@@Name', and the /0 part was just used as dummy notation and will be discarded.

    You may even need to apply lifting more than once. To match the entire export -list as a single syntax tree, you can write:

    ?Q("-export(['@__Name'/0]).")

    using two underscores, but with no glob marker this time. This will make the +list as a single syntax tree, you can write:

    ?Q("-export(['@__Name'/0]).")

    using two underscores, but with no glob marker this time. This will make the entire ['@__Name'/0] part be replaced with '@Name'.

    Sometimes, the tree structure of a code fragment is not very obvious, and parts of the structure may be invisible when printed as source code. For instance, a -simple function definition like the following:

    zero() -> 0.

    consists of the name (the atom zero), and a list of clauses containing the +simple function definition like the following:

    zero() -> 0.

    consists of the name (the atom zero), and a list of clauses containing the single clause () -> 0. The clause consists of an argument list (empty), a guard (empty), and a body (which is always a list of expressions) containing the single expression 0. This means that to match out the name and the list of clauses of any function, you'll need to use a pattern like ?Q("'@Name'() -> _@_@Body."), using a dummy clause whose body is a glob lifted one level.

    To visualize the structure of a syntax tree, you can use the function -merl:show(T), which prints a summary. For example, entering

    merl:show(merl:quote("inc(X, Y) when Y > 0 -> X + Y."))

    in the Erlang shell will print the following (where the + signs separate +merl:show(T), which prints a summary. For example, entering

    merl:show(merl:quote("inc(X, Y) when Y > 0 -> X + Y."))

    in the Erlang shell will print the following (where the + signs separate groups of subtrees on the same level):

    function: inc(X, Y) when ... -> X + Y.
       atom: inc
       +
    @@ -1723,7 +1723,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:18.230410978 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/merl_transform.html 2026-03-12 21:37:18.230410978 +0000 @@ -121,7 +121,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:18.262411168 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/notes.html 2026-03-12 21:37:18.266411193 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:37:18.294411358 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/prettypr.html 2026-03-12 21:37:18.298411382 +0000 @@ -1135,7 +1135,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.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 2026-03-12 21:37:18.326411547 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/syntax_tools-4.0.1/doc/html/search.html 2026-03-12 21:37:18.326411547 +0000 @@ -104,7 +104,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.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 2026-03-12 21:37:18.346411666 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/404.html 2026-03-12 21:37:18.350411691 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.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 2026-03-12 21:37:18.370411808 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/api-reference.html 2026-03-12 21:37:18.374411833 +0000 @@ -127,7 +127,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.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 2026-03-12 21:37:18.394411951 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/getting_started.html 2026-03-12 21:37:18.394411951 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:37:18.414412070 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/introduction.html 2026-03-12 21:37:18.418412093 +0000 @@ -154,7 +154,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:37:18.442412235 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/notes.html 2026-03-12 21:37:18.446412260 +0000 @@ -148,7 +148,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.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 2026-03-12 21:37:18.466412377 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/search.html 2026-03-12 21:37:18.470412402 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tftp-1.2.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 2026-03-05 20:52:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub/OEBPS/content.opf 2042-04-07 10:10:33.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> tftp - 1.2.3 - urn:uuid:1c59c05c-28cc-0216-dcda-6b47a35be5c1 + urn:uuid:9640c3f6-a8d6-88bb-4323-c99f4aabeb18 en - 2026-03-05T20:52:08Z + 2042-04-07T10:10:33Z /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 2026-03-05 20:52:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub/OEBPS/getting_started.xhtml 2042-04-07 10:10:33.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 2026-03-05 20:52:08.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.epub/OEBPS/tftp.xhtml 2042-04-07 10:10:33.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 2026-03-12 21:37:18.578413042 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp.html 2026-03-12 21:37:18.586413090 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:37:18.614413255 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tftp-1.2.3/doc/html/tftp_logger.html 2026-03-12 21:37:18.614413255 +0000 @@ -276,7 +276,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:18.638413398 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/404.html 2026-03-12 21:37:18.638413398 +0000 @@ -110,7 +110,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:18.662413540 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/api-reference.html 2026-03-12 21:37:18.662413540 +0000 @@ -193,7 +193,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:18.706413801 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover.html 2026-03-12 21:37:18.710413824 +0000 @@ -1520,7 +1520,7 @@ call is equivalent to analyse('_', coverage, Arg).

        Otherwise Arg is assumed to be a module name, and this call is equivalent to analyse(Arg, coverage, function).

        Note

        To analyze a module whose name overlaps with one the values in analysis() or level(), the module -name has to be in a list. For example, to analyze a module named calls:

        cover:analyse([calls]).
        +name has to be in a list. For example, to analyze a module named calls:

        cover:analyse([calls]).
        @@ -1562,7 +1562,7 @@ analyse(Arg1, Arg2, function).

        If Arg2 is one of the values in level(), Arg1 is assumed to be a module and this call is equivalent to analyse(Arg1, coverage, Arg2).

        Note

        To analyze a module whose name overlaps with one of the values in analysis(), the module name needs to be in a -list. For example, to analyze a module named calls:

        cover:analyse([calls], function).
        +list. For example, to analyze a module named calls:

        cover:analyse([calls], function).
        @@ -1671,7 +1671,7 @@ options, this call is equivalent to analyse_to_file('_', Arg).

        Otherwise Arg is assumed to be a module, and this call is equivalent to analyse_to_file(Arg, []).

        Note

        To analyze a module of the name html (which overlaps with an option in analyse_option()), it is necessary to -use cover:analyse_to_file/2:

        cover:analyse_to_file([html], []).
        +use cover:analyse_to_file/2:

        cover:analyse_to_file([html], []).
        @@ -2664,7 +2664,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:18.746414038 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cover_chapter.html 2026-03-12 21:37:18.754414084 +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	2026-03-12 21:37:18.790414299 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof.html	2026-03-12 21:37:18.790414299 +0000
        @@ -555,7 +555,7 @@
         
               
         
        -

        Collects and analyses all call counters for module Module.

        This function returns:

        {Module, ModuleCount, FuncAnalysisList}

        where FuncAnalysisList is a list of tuples, one for each function:

        {{Module, FunctionName, Arity}, FuncCallCount}

        If call counters are still running while analyse/0,1,2 is executing, the result +

        Collects and analyses all call counters for module Module.

        This function returns:

        {Module, ModuleCount, FuncAnalysisList}

        where FuncAnalysisList is a list of tuples, one for each function:

        {{Module, FunctionName, Arity}, FuncCallCount}

        If call counters are still running while analyse/0,1,2 is executing, the result could be inconsistent. This happens if the process executing analyse/0,1,2 is scheduled out so some other process can increment the counters that are being analysed. Calling pause() before analysing takes care of @@ -1076,7 +1076,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:18.818414464 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/cprof_chapter.html 2026-03-12 21:37:18.826414511 +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 2026-03-12 21:37:18.862414726 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/eprof.html 2026-03-12 21:37:18.866414749 +0000 @@ -976,7 +976,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:18.890414891 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang-el.html 2026-03-12 21:37:18.898414939 +0000 @@ -133,23 +133,23 @@ with almost the same argument as the preceding.

      Edit - Alignment

      • C-c C-a (align-current) - aligns comments, arrows, assignments, and type annotations around the cursor.
      Example:
       
      -sum(L) -> sum(L, 0).
      -sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
      -sum([], Sum) -> Sum.   % base case
      +sum(L) -> sum(L, 0).
      +sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
      +sum([], Sum) -> Sum.   % base case
       
      --record { two :: int(), % hello
      -          three = hello :: string(),    % there
      -          four = 42 :: int() }.
      +-record { two :: int(), % hello
      +          three = hello :: string(),    % there
      +          four = 42 :: int() }.
       
       becomes:
       
      -sum(L) -> sum(L, 0).
      -sum([H|T], Sum) -> sum(T, Sum + H); % recurse
      -sum([], Sum)    -> Sum.             % base case
      +sum(L) -> sum(L, 0).
      +sum([H|T], Sum) -> sum(T, Sum + H); % recurse
      +sum([], Sum)    -> Sum.             % base case
       
      --record { two           :: int(),    % hello
      -          three = hello :: string(), % there
      -          four  = 42    :: int() }.

      Syntax highlighting

      The syntax highlighting can be activated from the Erlang menu. There are four +-record { two :: int(), % hello + three = hello :: string(), % there + four = 42 :: int() }.

    Syntax highlighting

    The syntax highlighting can be activated from the Erlang menu. There are four different alternatives:

    • Off: Normal black and white display.
    • Level 1: Function headers, reserved words, comments, strings, quoted atoms, and character constants will be colored.
    • Level 2: The above, attributes, Erlang bif:s, guards, and words in comments enclosed in single quotes will be colored.
    • Level 3: The above, variables, records, and macros will be colored. (This @@ -230,7 +230,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:18.922415080 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/erlang_mode_chapter.html 2026-03-12 21:37:18.922415080 +0000 @@ -224,7 +224,7 @@ Erlang programming language

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:18.966415341 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof.html 2026-03-12 21:37:18.966415341 +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	2026-03-12 21:37:18.998415531 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/fprof_chapter.html	2026-03-12 21:37:19.002415555 +0000
    @@ -122,10 +122,10 @@
     The tracing has to be stopped at a suitable later time using
     fprof:trace(stop).

    Immediate profiling

    It is also possible to trace immediately into the profiling process that creates the raw profile data, that is to short circuit the tracing and profiling steps -so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    -fprof:trace([start, {tracer, Tracer}]),
    +so that the filesystem is not used for tracing.

    Do something like this:

    {ok, Tracer} = fprof:profile(start),
    +fprof:trace([start, {tracer, Tracer}]),
     %% Run code to profile
    -fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime +fprof:trace(stop);

    This puts less load on the filesystem, but much more load on the Erlang runtime system.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:19.038415769 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt.html 2026-03-12 21:37:19.034415745 +0000 @@ -1816,7 +1816,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:19.066415935 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/lcnt_chapter.html 2026-03-12 21:37:19.070415958 +0000 @@ -173,20 +173,20 @@ <nonode@nohost.189.0> 5354 0.5230 118 <nonode@nohost.121.0> 5845 0.9239 115 <nonode@nohost.104.0> 5140 0.7782 108 -ok

    Example with Mnesia Transaction Benchmark

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
    +ok

    Example with Mnesia Transaction Benchmark

    From the Erlang shell:

    Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [lock-counting]
     
    -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    -1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    -    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    -    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
    +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
    +1> Conf = [{db_nodes, [node()]}, {driver_nodes, [node()]}, {replica_nodes, [node()]},
    +    {n_drivers_per_node, 10}, {n_branches, 1000}, {n_accounts_per_branch, 10},
    +    {replica_type, ram_copies}, {stop_after, 60000}, {reuse_history_id, true}], ok.
     ok
    -2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
    +2> mnesia_tpcb:init([{use_running_mnesia, false}|Conf]).
         .
         .
         .
     ignore

    Initial configuring of the benchmark is done. It is time to profile the actual -Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    -    true}|Conf]), Tps/60 end).
    +Mnesia benchmark:

    3> lcnt:apply(fun() -> {ok,{time, Tps,_,_,_,_}} = mnesia_tpcb:run([{use_running_mnesia,
    +    true}|Conf]), Tps/60 end).
           .
           .
           .
    @@ -278,63 +278,63 @@
     However, one should also look for high lock acquisition frequencies (#tries)
     since locks generate overhead and because high frequency could become
     problematic if they begin to have conflicts even if it is not shown in a
    -particular test.

    The Big Bang Benchmark

    -module(big).
    --export([bang/1]).
    +particular test.

    The Big Bang Benchmark

    -module(big).
    +-export([bang/1]).
     
    -pinger([], [], true) ->
    +pinger([], [], true) ->
         receive
    -	{procs, Procs, ReportTo} ->
    -	    pinger(Procs, [], ReportTo)
    +	{procs, Procs, ReportTo} ->
    +	    pinger(Procs, [], ReportTo)
         end;
    -pinger([], [], false) ->
    -    receive {ping, From} -> From ! {pong, self()} end,
    -    pinger([],[],false);
    -pinger([], [], ReportTo) ->
    -    ReportTo ! {done, self()},
    -    pinger([],[],false);
    -pinger([], [Po|Pos] = Pongers, ReportTo) ->
    +pinger([], [], false) ->
    +    receive {ping, From} -> From ! {pong, self()} end,
    +    pinger([],[],false);
    +pinger([], [], ReportTo) ->
    +    ReportTo ! {done, self()},
    +    pinger([],[],false);
    +pinger([], [Po|Pos] = Pongers, ReportTo) ->
         receive
    -	{ping, From} ->
    -	    From ! {pong, self()},
    -	    pinger([], Pongers, ReportTo);
    -	{pong, Po} ->
    -	    pinger([], Pos, ReportTo)
    +	{ping, From} ->
    +	    From ! {pong, self()},
    +	    pinger([], Pongers, ReportTo);
    +	{pong, Po} ->
    +	    pinger([], Pos, ReportTo)
         end;
    -pinger([Pi|Pis], Pongers, ReportTo) ->
    -    receive {ping, From} -> From ! {pong, self()}
    +pinger([Pi|Pis], Pongers, ReportTo) ->
    +    receive {ping, From} -> From ! {pong, self()}
         after 0 -> ok
         end,
    -    Pi ! {ping, self()},
    -    pinger(Pis, [Pi|Pongers], ReportTo).
    +    Pi ! {ping, self()},
    +    pinger(Pis, [Pi|Pongers], ReportTo).
     
    -spawn_procs(N) when N =< 0 ->
    -    [];
    -spawn_procs(N) ->
    -    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
    +spawn_procs(N) when N =< 0 ->
    +    [];
    +spawn_procs(N) ->
    +    [spawn_link(fun () -> pinger([],[],true) end) | spawn_procs(N-1)].
     
    -send_procs([], Msg) ->
    +send_procs([], Msg) ->
         Msg;
    -send_procs([P|Ps], Msg) ->
    +send_procs([P|Ps], Msg) ->
         P ! Msg,
    -    send_procs(Ps, Msg).
    +    send_procs(Ps, Msg).
     
    -receive_msgs([]) ->
    +receive_msgs([]) ->
         ok;
    -receive_msgs([M|Ms]) ->
    +receive_msgs([M|Ms]) ->
         receive
     	M ->
    -	    receive_msgs(Ms)
    +	    receive_msgs(Ms)
         end.
     
    -bang(N) when integer(N) ->
    -    Procs = spawn_procs(N),
    -    RMsgs = lists:map(fun (P) -> {done, P} end, Procs),
    -    Start = now(),
    -    send_procs(Procs, {procs, Procs, self()}),
    -    receive_msgs(RMsgs),
    -    Stop = now(),
    -    lists:foreach(fun (P) -> exit(P, normal) end, Procs),
    -    timer:now_diff(Stop, Start).

    See Also

    LCNT Reference Manual

    +
    bang(N) when integer(N) -> + Procs = spawn_procs(N), + RMsgs = lists:map(fun (P) -> {done, P} end, Procs), + Start = now(), + send_procs(Procs, {procs, Procs, self()}), + receive_msgs(RMsgs), + Stop = now(), + lists:foreach(fun (P) -> exit(P, normal) end, Procs), + timer:now_diff(Stop, Start).

    See Also

    LCNT Reference Manual

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:19.098416124 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/make.html 2026-03-12 21:37:19.098416124 +0000 @@ -101,8 +101,8 @@ the first match is used. For example, the following Emakefile means that file1 should be compiled with the options [debug_info,{i,"../foo"}], while all other files in the current directory should be compiled with only the -debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    -{'*',[debug_info]}.

    See Also

    The Compiler Application

    +debug_info flag.

    {'file1',[debug_info,{i,"../foo"}]}.
    +{'*',[debug_info]}.

    See Also

    The Compiler Application

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:19.134416337 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/notes.html 2026-03-12 21:37:19.142416385 +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-2026 Ericsson AB

        +

        Copyright © 1996-2042 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 2026-03-12 21:37:19.166416527 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/search.html 2026-03-12 21:37:19.166416527 +0000 @@ -108,7 +108,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:19.198416716 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tags.html 2026-03-12 21:37:19.202416741 +0000 @@ -751,7 +751,7 @@ Erlang programming language

        -

        Copyright © 1996-2026 Ericsson AB

        +

        Copyright © 1996-2042 Ericsson AB

        /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/content.opf 2042-04-07 10:09:32.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> tools - 4.1.3 - urn:uuid:d96dec5c-37cb-57ec-a4f8-b163ac219568 + urn:uuid:9ab82ca5-04e1-79e2-f6ef-f971357035f3 en - 2026-03-05T20:51:14Z + 2042-04-07T10:09:32Z /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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/cover_chapter.xhtml 2042-04-07 10:09:32.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	2026-03-05 20:51:14.000000000 +0000
        +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/cover.xhtml	2042-04-07 10:09:32.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/cprof_chapter.xhtml 2042-04-07 10:09:32.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/cprof.xhtml 2042-04-07 10:09:32.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/erlang-el.xhtml 2042-04-07 10:09:32.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/fprof_chapter.xhtml 2042-04-07 10:09:32.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/fprof.xhtml 2042-04-07 10:09:32.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	2026-03-05 20:51:14.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/lcnt_chapter.xhtml	2042-04-07 10:09:32.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/make.xhtml 2042-04-07 10:09:32.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/notes.xhtml 2042-04-07 10:09:32.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 2026-03-05 20:51:14.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/tprof.xhtml 2042-04-07 10:09:32.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	2026-03-05 20:51:14.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tools.epub/OEBPS/xref_chapter.xhtml	2042-04-07 10:09:32.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 2026-03-12 21:37:19.530418684 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/tprof.html 2026-03-12 21:37:19.534418709 +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	2026-03-12 21:37:19.590419041 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref.html	2026-03-12 21:37:19.594419064 +0000
      @@ -3681,7 +3681,7 @@
                 Erlang programming language
       
             

      -

      Copyright © 1996-2026 Ericsson AB

      +

      Copyright © 1996-2042 Ericsson AB

      /usr/share/doc/packages/erlang-doc/lib/tools-4.1.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 2026-03-12 21:37:19.630419278 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/tools-4.1.3/doc/html/xref_chapter.html 2026-03-12 21:37:19.634419302 +0000 @@ -98,25 +98,25 @@ system and for doing some simple graph analyses on selected calls.

      The following sections show some features of Xref, beginning with a module check and a predefined analysis. Then follow examples that can be skipped on the first reading; not all of the concepts used are explained, and it is assumed that the -reference manual has been at least skimmed.

      Module Check

      Assume we want to check the following module:

      -module(my_module).
      +reference manual has been at least skimmed.

      Module Check

      Assume we want to check the following module:

      -module(my_module).
       
      --export([t/1]).
      +-export([t/1]).
       
      -t(A) ->
      -  my_module:t2(A).
      +t(A) ->
      +  my_module:t2(A).
       
      -t2(_) ->
      +t2(_) ->
         true.

      Cross reference data are read from BEAM files, so the first step when checking -an edited module is to compile it:

      1> c(my_module, debug_info).
      +an edited module is to compile it:

      1> c(my_module, debug_info).
       ./my_module.erl:10: Warning: function t2/1 is unused
      -{ok, my_module}

      The debug_info option ensures that the BEAM file contains debug information, +{ok, my_module}

      The debug_info option ensures that the BEAM file contains debug information, which makes it possible to find unused local functions.

      The module can now be checked for calls to deprecated functions, calls to undefined functions, and for unused local -functions:

      2> xref:m(my_module)
      -[{deprecated,[]},
      - {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
      - {unused,[{my_module,t2,1}]}]

      m/1 is also suitable for checking that the BEAM file of a module that is about +functions:

      2> xref:m(my_module)
      +[{deprecated,[]},
      + {undefined,[{{my_module,t,1},{my_module,t2,1}}]},
      + {unused,[{my_module,t2,1}]}]

      m/1 is also suitable for checking that the BEAM file of a module that is about to be loaded into a running a system does not call any undefined functions. In either case, the code path of the code server (see the module code) is used for finding modules that export externally called functions not exported by the @@ -125,28 +125,28 @@ this example an xref server will be used, which makes it possible to analyze applications and releases, and also to select the library path explicitly.

      Each Xref server is referred to by a unique name. The name is given when -creating the server:

      1> xref:start(s).
      -{ok,<0.27.0>}

      Next the system to be analyzed is added to the Xref server. Here the system will +creating the server:

      1> xref:start(s).
      +{ok,<0.27.0>}

      Next the system to be analyzed is added to the Xref server. Here the system will be OTP, so no library path will be needed. Otherwise, when analyzing a system that uses OTP, the OTP modules are typically made library modules by setting the library path to the default OTP code path (or to code_path, see the reference manual). By default, the names of read BEAM files and warnings are output when adding analyzed modules, but these messages -can be avoided by setting default values of some options:

      2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
      +can be avoided by setting default values of some options:

      2> xref:set_default(s, [{verbose,false}, {warnings,false}]).
       ok
      -3> xref:add_release(s, code:lib_dir(), {name, otp}).
      -{ok,otp}

      add_release/3 assumes that all subdirectories of the library directory +3> xref:add_release(s, code:lib_dir(), {name, otp}). +{ok,otp}

      add_release/3 assumes that all subdirectories of the library directory returned by code:lib_dir() contain applications; -the effect is that of reading all BEAM files for the application.

      It is now easy to check the release for calls to undefined functions:

      4> xref:analyze(s, undefined_function_calls).
      -{ok, [...]}

      We can now continue with further analyses, or we can delete the Xref server:

      5> xref:stop(s).

      The check for calls to undefined functions is an example of a predefined +the effect is that of reading all BEAM files for the application.

      It is now easy to check the release for calls to undefined functions:

      4> xref:analyze(s, undefined_function_calls).
      +{ok, [...]}

      We can now continue with further analyses, or we can delete the Xref server:

      5> xref:stop(s).

      The check for calls to undefined functions is an example of a predefined analysis, probably the most useful one. Other examples are the analyses that find unused local functions, or functions that call some given functions. See the analyze/2,3 functions for a complete list of predefined analyses.

      Each predefined analysis is a shorthand for a query, a sentence of a tiny language providing cross reference data as values of predefined variables. The check for calls to -undefined functions can thus be stated as a query:

      4> xref:q(s, "(XC - UC) || (XU - X - B)").
      -{ok,[...]}

      The query asks for the restriction of external calls except the unresolved calls +undefined functions can thus be stated as a query:

      4> xref:q(s, "(XC - UC) || (XU - X - B)").
      +{ok,[...]}

      The query asks for the restriction of external calls except the unresolved calls to calls to functions that are externally used but neither exported nor built-in functions (the || operator restricts the used functions while the | operator restricts the calling functions). The - operator returns the difference of two @@ -170,8 +170,8 @@ provided with a simple language. Below are some expressions of the language with comments, focusing on elements of the language rather than providing useful examples. The analyzed system is assumed to be OTP, so in order to run the -queries, first evaluate these calls:

      xref:start(s).
      -xref:add_release(s, code:root_dir()).
      • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

      • xref:q(s, "xref : Mod * X"). - All exported functions of the xref +queries, first evaluate these calls:

        xref:start(s).
        +xref:add_release(s, code:root_dir()).
        • xref:q(s, "(Fun) xref : Mod"). - All functions of the xref module.

        • xref:q(s, "xref : Mod * X"). - All exported functions of the xref module. The first operand of the intersection operator * is implicitly converted to the more special type of the second operand.

        • xref:q(s, "(Mod) tools"). - All modules of the Tools application.

        • xref:q(s, '"xref_.*" : Mod'). - All modules with a name beginning with xref_.

        • xref:q(s, "# E | X "). - Number of calls from exported functions.

        • xref:q(s, "XC || L "). - All external calls to local functions.

        • xref:q(s, "XC * LC"). - All calls that have both an external and a local @@ -208,18 +208,18 @@ a module M1 is said to call a module M2 if there is some function in M1 that calls some function in M2. It would be nice if we could use the much smaller module graph, since it is available also in the light weight -modulesmode of Xref servers.

          t(S) ->
          -  {ok, _} = xref:q(S, "Eplus := closure E"),
          -  {ok, Ms} = xref:q(S, "AM"),
          -  Fun = fun(M, N) ->
          -      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
          -      {ok, N0} = xref:q(S, lists:flatten(Q)),
          +modulesmode of Xref servers.

          t(S) ->
          +  {ok, _} = xref:q(S, "Eplus := closure E"),
          +  {ok, Ms} = xref:q(S, "AM"),
          +  Fun = fun(M, N) ->
          +      Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]),
          +      {ok, N0} = xref:q(S, lists:flatten(Q)),
                 N + N0
               end,
          -  Sum = lists:foldl(Fun, 0, Ms),
          -  ok = xref:forget(S, 'Eplus'),
          -  {ok, Tot} = xref:q(S, "# (closure ME | AM)"),
          -  100 * ((Tot - Sum) / Tot).

          Comments on the code:

          • We want to find the reduction of the closure of the function graph to modules. + Sum = lists:foldl(Fun, 0, Ms), + ok = xref:forget(S, 'Eplus'), + {ok, Tot} = xref:q(S, "# (closure ME | AM)"), + 100 * ((Tot - Sum) / Tot).

          Comments on the code:

          • We want to find the reduction of the closure of the function graph to modules. The direct expression for doing that would be (Mod) (closure E | AM), but then we would have to represent all of the transitive closure of E in memory. Instead the number of indirectly used modules is found for each analyzed @@ -295,7 +295,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:19.658419443 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/404.html 2026-03-12 21:37:19.662419468 +0000 @@ -110,7 +110,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:19.830420464 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/api-reference.html 2026-03-12 21:37:19.830420464 +0000 @@ -2351,7 +2351,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:19.862420653 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/chapter.html 2026-03-12 21:37:19.862420653 +0000 @@ -113,13 +113,13 @@ is the object reference. Optional arguments are last and expressed as tagged tuples in any order.

            For example the wxWindow C++ class is implemented in the wxWindow erlang module and the member wxWindow::CenterOnParent is thus -wxWindow:centerOnParent. The following C++ code:

              wxWindow MyWin = new wxWindow();
            -  MyWin.CenterOnParent(wxVERTICAL);
            +wxWindow:centerOnParent. The following C++ code:

              wxWindow MyWin = new wxWindow();
            +  MyWin.CenterOnParent(wxVERTICAL);
               ...
            -  delete MyWin;

            would in erlang look like:

              MyWin = wxWindow:new(),
            -  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
            +  delete MyWin;

            would in erlang look like:

              MyWin = wxWindow:new(),
            +  wxWindow:centerOnParent(MyWin, [{dir,?wxVERTICAL}]),
               ...
            -  wxWindow:destroy(MyWin),

            When you are reading wxWidgets documentation or the examples, you will notice + wxWindow:destroy(MyWin),

            When you are reading wxWidgets documentation or the examples, you will notice that some of the most basic classes are missing in wx, they are directly mapped to corresponding erlang terms:

            • wxPoint is represented by {Xcoord,Ycoord}

            • wxSize is represented by {Width,Height}

            • wxRect is represented by {Xcoord,Ycoord,Width,Height}

            • wxColour is represented by {Red,Green,Blue[,Alpha]}

            • wxString is represented by unicode:charlist()

            • wxGBPosition is represented by {Row,Column}

            • wxGBSpan is represented by {RowSpan,ColumnSPan}

            • wxGridCellCoords is represented by {Row,Column}

            In the places where the erlang API differs from the original one it should be @@ -141,14 +141,14 @@ from several processes in your application, you must share the environment. You can get the active environment with wx:get_env/0 and set it in the new processes with wx:set_env/1. Two processes or applications which have both -called wx:new() will not be able use each others objects.

              wx:new(),
            -  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
            -  Env = wx:get_env(),
            -  spawn(fun() ->
            -           wx:set_env(Env),
            +called wx:new() will not be able use each others objects.

              wx:new(),
            +  MyWin = wxFrame:new(wx:null(), 42, "Example", []),
            +  Env = wx:get_env(),
            +  spawn(fun() ->
            +           wx:set_env(Env),
                        %% Here you can do wx calls from your helper process.
                        ...
            -        end),
            +        end),
               ...

            When wx:destroy/0 is invoked or when all processes in the application have died, the memory is deleted and all windows created by that application are closed.

            The wx application never cleans or garbage collects memory as long as the user @@ -243,7 +243,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:20.146422336 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/gl.html 2026-03-12 21:37:20.154422384 +0000 @@ -41014,7 +41014,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:20.206422692 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/glu.html 2026-03-12 21:37:20.210422715 +0000 @@ -1786,7 +1786,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:20.250422953 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/notes.html 2026-03-12 21:37:20.250422953 +0000 @@ -204,7 +204,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/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 2026-03-12 21:37:20.270423072 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/search.html 2026-03-12 21:37:20.270423072 +0000 @@ -108,7 +108,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-05 20:51:45.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub/OEBPS/chapter.xhtml 2042-04-07 10:10:07.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 2026-03-05 20:51:45.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub/OEBPS/content.opf 2042-04-07 10:10:07.000000000 +0000 @@ -4,10 +4,10 @@ version="3.0"> wx - 2.5.2 - urn:uuid:ff231dab-b2be-966e-bc96-c48b074f9545 + urn:uuid:744166f2-0a48-6055-1810-965a8cdbb910 en - 2026-03-05T20:51:45Z + 2042-04-07T10:10:07Z /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 2026-03-05 20:51:45.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.epub/OEBPS/wx_object.xhtml 2042-04-07 10:10:07.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 2026-03-12 21:37:20.950427103 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx.html 2026-03-12 21:37:20.954427126 +0000 @@ -1428,7 +1428,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:20.982427292 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorEntry.html 2026-03-12 21:37:20.986427315 +0000 @@ -525,7 +525,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.014427482 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAcceleratorTable.html 2026-03-12 21:37:21.018427505 +0000 @@ -398,7 +398,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.042427647 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxActivateEvent.html 2026-03-12 21:37:21.046427672 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.070427813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxArtProvider.html 2026-03-12 21:37:21.074427838 +0000 @@ -385,7 +385,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.106428028 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiDockArt.html 2026-03-12 21:37:21.110428051 +0000 @@ -438,7 +438,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.146428264 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManager.html 2026-03-12 21:37:21.150428289 +0000 @@ -1426,7 +1426,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.178428454 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiManagerEvent.html 2026-03-12 21:37:21.182428478 +0000 @@ -779,7 +779,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.214428668 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebook.html 2026-03-12 21:37:21.218428691 +0000 @@ -1382,7 +1382,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.246428858 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiNotebookEvent.html 2026-03-12 21:37:21.246428858 +0000 @@ -518,7 +518,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.294429141 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiPaneInfo.html 2026-03-12 21:37:21.294429141 +0000 @@ -4062,7 +4062,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.322429308 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiSimpleTabArt.html 2026-03-12 21:37:21.322429308 +0000 @@ -281,7 +281,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.350429473 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxAuiTabArt.html 2026-03-12 21:37:21.354429498 +0000 @@ -434,7 +434,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.390429710 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmap.html 2026-03-12 21:37:21.394429735 +0000 @@ -1344,7 +1344,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.422429900 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapButton.html 2026-03-12 21:37:21.426429925 +0000 @@ -504,7 +504,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.450430067 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBitmapDataObject.html 2026-03-12 21:37:21.454430090 +0000 @@ -399,7 +399,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.482430256 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlBase.html 2026-03-12 21:37:21.490430304 +0000 @@ -923,7 +923,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.518430469 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBookCtrlEvent.html 2026-03-12 21:37:21.522430494 +0000 @@ -442,7 +442,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.546430636 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBoxSizer.html 2026-03-12 21:37:21.546430636 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.574430802 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBrush.html 2026-03-12 21:37:21.574430802 +0000 @@ -713,7 +713,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.602430967 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedDC.html 2026-03-12 21:37:21.606430992 +0000 @@ -536,7 +536,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.638431181 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxBufferedPaintDC.html 2026-03-12 21:37:21.638431181 +0000 @@ -373,7 +373,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.670431371 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxButton.html 2026-03-12 21:37:21.670431371 +0000 @@ -882,7 +882,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.702431561 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarCtrl.html 2026-03-12 21:37:21.710431607 +0000 @@ -1355,7 +1355,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.738431774 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarDateAttr.html 2026-03-12 21:37:21.746431821 +0000 @@ -1011,7 +1011,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.770431964 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCalendarEvent.html 2026-03-12 21:37:21.774431987 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.806432176 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCaret.html 2026-03-12 21:37:21.810432201 +0000 @@ -951,7 +951,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.838432366 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckBox.html 2026-03-12 21:37:21.846432413 +0000 @@ -730,7 +730,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.870432556 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCheckListBox.html 2026-03-12 21:37:21.878432603 +0000 @@ -481,7 +481,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.902432745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChildFocusEvent.html 2026-03-12 21:37:21.902432745 +0000 @@ -318,7 +318,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.930432912 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoice.html 2026-03-12 21:37:21.934432935 +0000 @@ -615,7 +615,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:21.966433125 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxChoicebook.html 2026-03-12 21:37:21.974433172 +0000 @@ -1323,7 +1323,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.002433339 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClientDC.html 2026-03-12 21:37:22.006433362 +0000 @@ -288,7 +288,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.034433529 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboard.html 2026-03-12 21:37:22.034433529 +0000 @@ -766,7 +766,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.066433718 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxClipboardTextEvent.html 2026-03-12 21:37:22.070433741 +0000 @@ -265,7 +265,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.098433908 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCloseEvent.html 2026-03-12 21:37:22.098433908 +0000 @@ -521,7 +521,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.126434074 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourData.html 2026-03-12 21:37:22.130434098 +0000 @@ -513,7 +513,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.158434264 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourDialog.html 2026-03-12 21:37:22.158434264 +0000 @@ -482,7 +482,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.186434429 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerCtrl.html 2026-03-12 21:37:22.194434477 +0000 @@ -536,7 +536,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.222434643 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxColourPickerEvent.html 2026-03-12 21:37:22.218434619 +0000 @@ -315,7 +315,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.266434904 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxComboBox.html 2026-03-12 21:37:22.266434904 +0000 @@ -1255,7 +1255,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.294435069 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCommandEvent.html 2026-03-12 21:37:22.302435117 +0000 @@ -651,7 +651,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.330435283 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxContextMenuEvent.html 2026-03-12 21:37:22.334435307 +0000 @@ -364,7 +364,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.362435473 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControl.html 2026-03-12 21:37:22.362435473 +0000 @@ -287,7 +287,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.394435663 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxControlWithItems.html 2026-03-12 21:37:22.398435686 +0000 @@ -1138,7 +1138,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.426435852 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxCursor.html 2026-03-12 21:37:22.430435875 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.486436207 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDC.html 2026-03-12 21:37:22.482436184 +0000 @@ -4021,7 +4021,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.518436397 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDCOverlay.html 2026-03-12 21:37:22.522436422 +0000 @@ -364,7 +364,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.546436564 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDataObject.html 2026-03-12 21:37:22.550436587 +0000 @@ -223,7 +223,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.574436730 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDateEvent.html 2026-03-12 21:37:22.578436753 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.602436895 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDatePickerCtrl.html 2026-03-12 21:37:22.606436920 +0000 @@ -545,7 +545,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.634437085 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDialog.html 2026-03-12 21:37:22.642437133 +0000 @@ -914,7 +914,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.670437299 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirDialog.html 2026-03-12 21:37:22.674437322 +0000 @@ -494,7 +494,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.702437489 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDirPickerCtrl.html 2026-03-12 21:37:22.710437536 +0000 @@ -544,7 +544,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.738437701 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplay.html 2026-03-12 21:37:22.742437726 +0000 @@ -670,7 +670,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.766437868 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDisplayChangedEvent.html 2026-03-12 21:37:22.766437868 +0000 @@ -258,7 +258,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.798438058 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxDropFilesEvent.html 2026-03-12 21:37:22.802438081 +0000 @@ -395,7 +395,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.826438223 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEraseEvent.html 2026-03-12 21:37:22.830438247 +0000 @@ -317,7 +317,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.854438389 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvent.html 2026-03-12 21:37:22.858438412 +0000 @@ -564,7 +564,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.886438579 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxEvtHandler.html 2026-03-12 21:37:22.890438602 +0000 @@ -631,7 +631,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.914438745 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDataObject.html 2026-03-12 21:37:22.914438745 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.942438910 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDialog.html 2026-03-12 21:37:22.946438935 +0000 @@ -901,7 +901,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:22.970439077 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFileDirPickerEvent.html 2026-03-12 21:37:22.974439100 +0000 @@ -315,7 +315,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.002439267 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFilePickerCtrl.html 2026-03-12 21:37:23.002439267 +0000 @@ -547,7 +547,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.026439408 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceData.html 2026-03-12 21:37:23.034439457 +0000 @@ -549,7 +549,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.054439575 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFindReplaceDialog.html 2026-03-12 21:37:23.058439598 +0000 @@ -493,7 +493,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.090439788 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFlexGridSizer.html 2026-03-12 21:37:23.094439812 +0000 @@ -816,7 +816,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.118439955 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFocusEvent.html 2026-03-12 21:37:23.122439977 +0000 @@ -323,7 +323,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.162440215 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFont.html 2026-03-12 21:37:23.158440192 +0000 @@ -1176,7 +1176,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.190440382 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontData.html 2026-03-12 21:37:23.190440382 +0000 @@ -814,7 +814,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.222440571 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontDialog.html 2026-03-12 21:37:23.218440547 +0000 @@ -401,7 +401,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.250440736 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerCtrl.html 2026-03-12 21:37:23.254440761 +0000 @@ -616,7 +616,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.282440926 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFontPickerEvent.html 2026-03-12 21:37:23.286440951 +0000 @@ -314,7 +314,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.318441140 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxFrame.html 2026-03-12 21:37:23.326441188 +0000 @@ -1237,7 +1237,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.350441330 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGBSizerItem.html 2026-03-12 21:37:23.350441330 +0000 @@ -189,7 +189,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.374441472 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGCDC.html 2026-03-12 21:37:23.378441495 +0000 @@ -409,7 +409,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.402441638 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLCanvas.html 2026-03-12 21:37:23.406441662 +0000 @@ -509,7 +509,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.430441803 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGLContext.html 2026-03-12 21:37:23.434441828 +0000 @@ -422,7 +422,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.462441993 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGauge.html 2026-03-12 21:37:23.466442018 +0000 @@ -697,7 +697,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.498442207 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGenericDirCtrl.html 2026-03-12 21:37:23.502442230 +0000 @@ -1065,7 +1065,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.530442397 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsBrush.html 2026-03-12 21:37:23.530442397 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.566442610 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsContext.html 2026-03-12 21:37:23.570442634 +0000 @@ -2184,7 +2184,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.594442776 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsFont.html 2026-03-12 21:37:23.598442799 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.622442941 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsGradientStops.html 2026-03-12 21:37:23.622442941 +0000 @@ -589,7 +589,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.650443108 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsMatrix.html 2026-03-12 21:37:23.654443131 +0000 @@ -681,7 +681,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.674443250 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsObject.html 2026-03-12 21:37:23.678443274 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.706443439 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPath.html 2026-03-12 21:37:23.706443439 +0000 @@ -1139,7 +1139,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.726443558 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsPen.html 2026-03-12 21:37:23.730443583 +0000 @@ -187,7 +187,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.758443748 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGraphicsRenderer.html 2026-03-12 21:37:23.762443772 +0000 @@ -674,7 +674,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.838444223 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGrid.html 2026-03-12 21:37:23.838444223 +0000 @@ -8414,7 +8414,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.878444460 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridBagSizer.html 2026-03-12 21:37:23.886444506 +0000 @@ -1129,7 +1129,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.918444696 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellAttr.html 2026-03-12 21:37:23.922444721 +0000 @@ -1060,7 +1060,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.950444886 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolEditor.html 2026-03-12 21:37:23.954444911 +0000 @@ -401,7 +401,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:23.978445053 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellBoolRenderer.html 2026-03-12 21:37:23.982445076 +0000 @@ -279,7 +279,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.010445242 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellChoiceEditor.html 2026-03-12 21:37:24.006445219 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.038445409 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellEditor.html 2026-03-12 21:37:24.042445432 +0000 @@ -568,7 +568,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.066445574 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatEditor.html 2026-03-12 21:37:24.070445598 +0000 @@ -359,7 +359,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.102445788 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellFloatRenderer.html 2026-03-12 21:37:24.102445788 +0000 @@ -511,7 +511,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.130445953 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberEditor.html 2026-03-12 21:37:24.134445978 +0000 @@ -395,7 +395,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.158446120 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellNumberRenderer.html 2026-03-12 21:37:24.158446120 +0000 @@ -279,7 +279,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.186446286 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellRenderer.html 2026-03-12 21:37:24.190446309 +0000 @@ -304,7 +304,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.218446476 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellStringRenderer.html 2026-03-12 21:37:24.222446499 +0000 @@ -280,7 +280,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.250446665 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridCellTextEditor.html 2026-03-12 21:37:24.254446689 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.282446855 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridEvent.html 2026-03-12 21:37:24.290446901 +0000 @@ -602,7 +602,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.318447068 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxGridSizer.html 2026-03-12 21:37:24.326447116 +0000 @@ -708,7 +708,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.358447305 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHelpEvent.html 2026-03-12 21:37:24.354447282 +0000 @@ -436,7 +436,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.386447472 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlEasyPrinting.html 2026-03-12 21:37:24.390447495 +0000 @@ -925,7 +925,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.418447661 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlLinkEvent.html 2026-03-12 21:37:24.418447661 +0000 @@ -316,7 +316,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.454447874 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxHtmlWindow.html 2026-03-12 21:37:24.458447897 +0000 @@ -1314,7 +1314,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.486448064 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIcon.html 2026-03-12 21:37:24.486448064 +0000 @@ -411,7 +411,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.510448206 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconBundle.html 2026-03-12 21:37:24.518448254 +0000 @@ -565,7 +565,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.542448395 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIconizeEvent.html 2026-03-12 21:37:24.546448420 +0000 @@ -313,7 +313,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.570448562 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxIdleEvent.html 2026-03-12 21:37:24.574448585 +0000 @@ -500,7 +500,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.622448870 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImage.html 2026-03-12 21:37:24.626448893 +0000 @@ -3824,7 +3824,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.662449108 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxImageList.html 2026-03-12 21:37:24.666449131 +0000 @@ -938,7 +938,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.690449273 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxInitDialogEvent.html 2026-03-12 21:37:24.694449297 +0000 @@ -257,7 +257,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.726449487 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxJoystickEvent.html 2026-03-12 21:37:24.730449511 +0000 @@ -820,7 +820,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.758449677 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxKeyEvent.html 2026-03-12 21:37:24.766449723 +0000 @@ -894,7 +894,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.794449890 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLayoutAlgorithm.html 2026-03-12 21:37:24.794449890 +0000 @@ -564,7 +564,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.834450127 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListBox.html 2026-03-12 21:37:24.826450080 +0000 @@ -780,7 +780,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.878450388 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListCtrl.html 2026-03-12 21:37:24.882450411 +0000 @@ -3215,7 +3215,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.918450625 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListEvent.html 2026-03-12 21:37:24.918450625 +0000 @@ -796,7 +796,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.950450815 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItem.html 2026-03-12 21:37:24.954450838 +0000 @@ -1237,7 +1237,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:24.982451005 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListItemAttr.html 2026-03-12 21:37:24.986451028 +0000 @@ -660,7 +660,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.014451194 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListView.html 2026-03-12 21:37:25.022451242 +0000 @@ -554,7 +554,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.054451432 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxListbook.html 2026-03-12 21:37:25.058451455 +0000 @@ -1322,7 +1322,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.086451621 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLocale.html 2026-03-12 21:37:25.090451645 +0000 @@ -1336,7 +1336,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.118451811 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxLogNull.html 2026-03-12 21:37:25.122451834 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.154452024 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIChildFrame.html 2026-03-12 21:37:25.150452001 +0000 @@ -619,7 +619,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.186452214 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIClientWindow.html 2026-03-12 21:37:25.186452214 +0000 @@ -370,7 +370,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.218452403 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMDIParentFrame.html 2026-03-12 21:37:25.222452426 +0000 @@ -787,7 +787,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.250452593 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMask.html 2026-03-12 21:37:25.254452616 +0000 @@ -439,7 +439,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.278452759 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMaximizeEvent.html 2026-03-12 21:37:25.282452783 +0000 @@ -260,7 +260,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.306452924 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMemoryDC.html 2026-03-12 21:37:25.306452924 +0000 @@ -412,7 +412,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.358453233 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenu.html 2026-03-12 21:37:25.362453257 +0000 @@ -2209,7 +2209,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.398453470 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuBar.html 2026-03-12 21:37:25.398453470 +0000 @@ -1423,7 +1423,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.422453612 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuEvent.html 2026-03-12 21:37:25.426453637 +0000 @@ -403,7 +403,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.462453850 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMenuItem.html 2026-03-12 21:37:25.466453873 +0000 @@ -1390,7 +1390,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.494454040 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMessageDialog.html 2026-03-12 21:37:25.498454062 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.526454229 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMiniFrame.html 2026-03-12 21:37:25.530454252 +0000 @@ -457,7 +457,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.554454395 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMirrorDC.html 2026-03-12 21:37:25.558454418 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.586454585 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureChangedEvent.html 2026-03-12 21:37:25.586454585 +0000 @@ -316,7 +316,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.610454727 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseCaptureLostEvent.html 2026-03-12 21:37:25.614454750 +0000 @@ -262,7 +262,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.650454965 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMouseEvent.html 2026-03-12 21:37:25.654454987 +0000 @@ -2041,7 +2041,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.682455154 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMoveEvent.html 2026-03-12 21:37:25.686455177 +0000 @@ -356,7 +356,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.710455319 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxMultiChoiceDialog.html 2026-03-12 21:37:25.714455344 +0000 @@ -406,7 +406,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.742455510 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNavigationKeyEvent.html 2026-03-12 21:37:25.746455534 +0000 @@ -589,7 +589,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.778455723 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotebook.html 2026-03-12 21:37:25.782455746 +0000 @@ -808,7 +808,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.814455936 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotificationMessage.html 2026-03-12 21:37:25.818455961 +0000 @@ -896,7 +896,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.846456126 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxNotifyEvent.html 2026-03-12 21:37:25.850456150 +0000 @@ -325,7 +325,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.870456269 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxOverlay.html 2026-03-12 21:37:25.874456292 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.902456459 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialog.html 2026-03-12 21:37:25.902456459 +0000 @@ -404,7 +404,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.934456648 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPageSetupDialogData.html 2026-03-12 21:37:25.938456672 +0000 @@ -1444,7 +1444,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.962456813 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintDC.html 2026-03-12 21:37:25.966456838 +0000 @@ -285,7 +285,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:25.990456980 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaintEvent.html 2026-03-12 21:37:25.994457003 +0000 @@ -266,7 +266,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.030457217 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPalette.html 2026-03-12 21:37:26.026457193 +0000 @@ -596,7 +596,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.054457359 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPaletteChangedEvent.html 2026-03-12 21:37:26.054457359 +0000 @@ -351,7 +351,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.078457501 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPanel.html 2026-03-12 21:37:26.082457526 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.110457691 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPasswordEntryDialog.html 2026-03-12 21:37:26.114457715 +0000 @@ -326,7 +326,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.138457857 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPen.html 2026-03-12 21:37:26.138457857 +0000 @@ -827,7 +827,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.166458024 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPickerBase.html 2026-03-12 21:37:26.174458070 +0000 @@ -747,7 +747,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.202458237 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupTransientWindow.html 2026-03-12 21:37:26.206458260 +0000 @@ -474,7 +474,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.234458426 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPopupWindow.html 2026-03-12 21:37:26.238458449 +0000 @@ -483,7 +483,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.266458616 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPostScriptDC.html 2026-03-12 21:37:26.270458639 +0000 @@ -319,7 +319,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.294458782 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewCanvas.html 2026-03-12 21:37:26.294458782 +0000 @@ -186,7 +186,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.326458972 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewControlBar.html 2026-03-12 21:37:26.326458972 +0000 @@ -484,7 +484,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.354459137 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPreviewFrame.html 2026-03-12 21:37:26.358459162 +0000 @@ -485,7 +485,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.398459398 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintData.html 2026-03-12 21:37:26.402459422 +0000 @@ -1050,7 +1050,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.426459564 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialog.html 2026-03-12 21:37:26.430459589 +0000 @@ -398,7 +398,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.458459754 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintDialogData.html 2026-03-12 21:37:26.466459802 +0000 @@ -1235,7 +1235,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.498459992 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintPreview.html 2026-03-12 21:37:26.502460014 +0000 @@ -998,7 +998,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.526460158 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrinter.html 2026-03-12 21:37:26.530460181 +0000 @@ -685,7 +685,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.566460394 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxPrintout.html 2026-03-12 21:37:26.566460394 +0000 @@ -1198,7 +1198,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.594460561 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxProgressDialog.html 2026-03-12 21:37:26.598460584 +0000 @@ -458,7 +458,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.622460727 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxQueryNewPaletteEvent.html 2026-03-12 21:37:26.626460750 +0000 @@ -353,7 +353,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.662460963 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioBox.html 2026-03-12 21:37:26.666460988 +0000 @@ -1086,7 +1086,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.694461153 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRadioButton.html 2026-03-12 21:37:26.698461177 +0000 @@ -543,7 +543,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.726461342 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxRegion.html 2026-03-12 21:37:26.734461390 +0000 @@ -1170,7 +1170,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.762461557 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashEvent.html 2026-03-12 21:37:26.770461604 +0000 @@ -406,7 +406,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.798461769 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashLayoutWindow.html 2026-03-12 21:37:26.802461794 +0000 @@ -653,7 +653,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.834461984 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSashWindow.html 2026-03-12 21:37:26.834461984 +0000 @@ -746,7 +746,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.858462126 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScreenDC.html 2026-03-12 21:37:26.862462149 +0000 @@ -282,7 +282,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.890462315 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollBar.html 2026-03-12 21:37:26.894462338 +0000 @@ -758,7 +758,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.918462482 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollEvent.html 2026-03-12 21:37:26.926462528 +0000 @@ -367,7 +367,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.950462671 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrollWinEvent.html 2026-03-12 21:37:26.954462695 +0000 @@ -358,7 +358,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:26.990462907 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxScrolledWindow.html 2026-03-12 21:37:26.986462884 +0000 @@ -1032,7 +1032,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.014463051 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSetCursorEvent.html 2026-03-12 21:37:27.018463074 +0000 @@ -473,7 +473,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.042463216 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxShowEvent.html 2026-03-12 21:37:27.046463240 +0000 @@ -354,7 +354,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.070463382 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSingleChoiceDialog.html 2026-03-12 21:37:27.078463430 +0000 @@ -445,7 +445,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.102463572 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizeEvent.html 2026-03-12 21:37:27.102463572 +0000 @@ -363,7 +363,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.146463832 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizer.html 2026-03-12 21:37:27.150463857 +0000 @@ -2311,7 +2311,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.182464047 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerFlags.html 2026-03-12 21:37:27.186464070 +0000 @@ -710,7 +710,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.222464283 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSizerItem.html 2026-03-12 21:37:27.226464307 +0000 @@ -1656,7 +1656,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.254464472 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSlider.html 2026-03-12 21:37:27.262464520 +0000 @@ -903,7 +903,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.290464687 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinButton.html 2026-03-12 21:37:27.294464710 +0000 @@ -646,7 +646,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.322464876 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinCtrl.html 2026-03-12 21:37:27.326464899 +0000 @@ -698,7 +698,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.354465066 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSpinEvent.html 2026-03-12 21:37:27.358465089 +0000 @@ -351,7 +351,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.382465231 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplashScreen.html 2026-03-12 21:37:27.386465256 +0000 @@ -412,7 +412,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.414465422 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterEvent.html 2026-03-12 21:37:27.414465422 +0000 @@ -475,7 +475,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.446465612 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSplitterWindow.html 2026-03-12 21:37:27.454465658 +0000 @@ -1308,7 +1308,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.474465777 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBitmap.html 2026-03-12 21:37:27.482465825 +0000 @@ -537,7 +537,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.506465966 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBox.html 2026-03-12 21:37:27.510465991 +0000 @@ -460,7 +460,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.538466156 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticBoxSizer.html 2026-03-12 21:37:27.542466181 +0000 @@ -365,7 +365,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.566466323 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticLine.html 2026-03-12 21:37:27.574466370 +0000 @@ -527,7 +527,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.598466513 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStaticText.html 2026-03-12 21:37:27.598466513 +0000 @@ -590,7 +590,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.630466702 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStatusBar.html 2026-03-12 21:37:27.638466750 +0000 @@ -1056,7 +1056,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.662466892 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStdDialogButtonSizer.html 2026-03-12 21:37:27.666466915 +0000 @@ -482,7 +482,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.802467721 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextCtrl.html 2026-03-12 21:37:27.802467721 +0000 @@ -17621,7 +17621,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.846467982 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxStyledTextEvent.html 2026-03-12 21:37:27.850468007 +0000 @@ -1187,7 +1187,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.874468149 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSysColourChangedEvent.html 2026-03-12 21:37:27.878468172 +0000 @@ -262,7 +262,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.906468338 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemOptions.html 2026-03-12 21:37:27.910468361 +0000 @@ -444,7 +444,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.934468505 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxSystemSettings.html 2026-03-12 21:37:27.938468528 +0000 @@ -403,7 +403,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:27.970468718 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIcon.html 2026-03-12 21:37:27.974468741 +0000 @@ -480,7 +480,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.002468907 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTaskBarIconEvent.html 2026-03-12 21:37:28.006468932 +0000 @@ -260,7 +260,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.042469145 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextAttr.html 2026-03-12 21:37:28.042469145 +0000 @@ -1817,7 +1817,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.090469428 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextCtrl.html 2026-03-12 21:37:28.086469405 +0000 @@ -2479,7 +2479,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.118469595 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextDataObject.html 2026-03-12 21:37:28.122469618 +0000 @@ -446,7 +446,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.150469784 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTextEntryDialog.html 2026-03-12 21:37:28.154469809 +0000 @@ -442,7 +442,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.178469951 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToggleButton.html 2026-03-12 21:37:28.178469951 +0000 @@ -532,7 +532,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.218470188 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolBar.html 2026-03-12 21:37:28.222470212 +0000 @@ -2027,7 +2027,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.254470401 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolTip.html 2026-03-12 21:37:28.250470378 +0000 @@ -470,7 +470,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.290470614 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxToolbook.html 2026-03-12 21:37:28.294470639 +0000 @@ -1324,7 +1324,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.326470828 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTopLevelWindow.html 2026-03-12 21:37:28.330470851 +0000 @@ -1106,7 +1106,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.382471160 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeCtrl.html 2026-03-12 21:37:28.390471208 +0000 @@ -3620,7 +3620,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.422471397 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreeEvent.html 2026-03-12 21:37:28.426471420 +0000 @@ -595,7 +595,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.458471610 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxTreebook.html 2026-03-12 21:37:28.466471658 +0000 @@ -1522,7 +1522,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.494471824 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxUpdateUIEvent.html 2026-03-12 21:37:28.498471848 +0000 @@ -991,7 +991,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.538472085 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebView.html 2026-03-12 21:37:28.542472108 +0000 @@ -2300,7 +2300,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.566472251 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWebViewEvent.html 2026-03-12 21:37:28.570472275 +0000 @@ -443,7 +443,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.650472748 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindow.html 2026-03-12 21:37:28.650472748 +0000 @@ -8178,7 +8178,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.682472938 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowCreateEvent.html 2026-03-12 21:37:28.686472963 +0000 @@ -258,7 +258,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.710473104 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDC.html 2026-03-12 21:37:28.714473129 +0000 @@ -283,7 +283,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.738473271 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxWindowDestroyEvent.html 2026-03-12 21:37:28.738473271 +0000 @@ -265,7 +265,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.774473483 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wxXmlResource.html 2026-03-12 21:37:28.782473532 +0000 @@ -1450,7 +1450,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.810473698 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_misc.html 2026-03-12 21:37:28.814473721 +0000 @@ -1331,7 +1331,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/wx-2.5.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 2026-03-12 21:37:28.854473959 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/wx-2.5.2/doc/html/wx_object.html 2026-03-12 21:37:28.854473959 +0000 @@ -101,36 +101,36 @@ shutdown | Term, terminate(State) is called. It lets the user module clean up, it is always called when server terminates or when wx_object() in the driver is deleted. If the Parent process terminates the Module:terminate/2 function is -called.
            terminate(Reason, State)

            Example:

              -module(myDialog).
            -  -export([new/2, show/1, destroy/1]).  %% API
            -  -export([init/1, handle_call/3, handle_event/2,
            -           handle_info/2, code_change/3, terminate/2]).
            +called.
            terminate(Reason, State)

            Example:

              -module(myDialog).
            +  -export([new/2, show/1, destroy/1]).  %% API
            +  -export([init/1, handle_call/3, handle_event/2,
            +           handle_info/2, code_change/3, terminate/2]).
                        new/2, showModal/1, destroy/1]).  %% Callbacks
             
               %% Client API
            -  new(Parent, Msg) ->
            -     wx_object:start(?MODULE, [Parent,Id], []).
            +  new(Parent, Msg) ->
            +     wx_object:start(?MODULE, [Parent,Id], []).
             
            -  show(Dialog) ->
            -     wx_object:call(Dialog, show_modal).
            +  show(Dialog) ->
            +     wx_object:call(Dialog, show_modal).
             
            -  destroy(Dialog) ->
            -     wx_object:call(Dialog, destroy).
            +  destroy(Dialog) ->
            +     wx_object:call(Dialog, destroy).
             
               %% Server Implementation ala gen_server
            -  init([Parent, Str]) ->
            -     Dialog = wxDialog:new(Parent, 42, "Testing", []),
            +  init([Parent, Str]) ->
            +     Dialog = wxDialog:new(Parent, 42, "Testing", []),
                  ...
            -     wxDialog:connect(Dialog, command_button_clicked),
            -     {Dialog, MyState}.
            +     wxDialog:connect(Dialog, command_button_clicked),
            +     {Dialog, MyState}.
             
            -  handle_call(show, _From, State) ->
            -     wxDialog:show(State#state.win),
            -     {reply, ok, State};
            +  handle_call(show, _From, State) ->
            +     wxDialog:show(State#state.win),
            +     {reply, ok, State};
               ...
            -  handle_event(#wx{}, State) ->
            -     io:format("Users clicked button~n",[]),
            -     {noreply, State};
            +  handle_event(#wx{}, State) ->
            +     io:format("Users clicked button~n",[]),
            +     {noreply, State};
               ...

            DATA TYPES

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

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:28.878474101 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/404.html 2026-03-12 21:37:28.882474124 +0000 @@ -106,7 +106,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:28.910474290 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/api-reference.html 2026-03-12 21:37:28.910474290 +0000 @@ -168,7 +168,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:28.942474480 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/notes.html 2026-03-12 21:37:28.950474528 +0000 @@ -339,7 +339,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:28.974474669 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/search.html 2026-03-12 21:37:28.978474694 +0000 @@ -104,7 +104,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.010474884 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl.html 2026-03-12 21:37:29.014474907 +0000 @@ -1109,7 +1109,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.042475073 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_eventp.html 2026-03-12 21:37:29.042475073 +0000 @@ -519,7 +519,7 @@ Erlang programming language

            -

            Copyright © 1996-2026 Ericsson AB

            +

            Copyright © 1996-2042 Ericsson AB

            /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.074475263 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_examples.html 2026-03-12 21:37:29.074475263 +0000 @@ -104,86 +104,86 @@ user state, use their own state variable instead. Another option (used in e.g. xmerl_eventp.erl) is for customization functions to share one of the local states (in xmerl_eventp.erl, the continuation function and the fetch function -both access the cont_state.)

            Functions to access user state:

            • xmerl_scan:user_state(GlobalState)
            • xmerl_scan:user_state(UserState, GlobalState)

            1.2 Event Function

            {event_fun, fun()} | {event_fun, fun(), EventState}

            The event function is called at the beginning and at the end of a parsed entity. -It has the following format and semantics:

            fun(Event, GlobalState) ->
            -   EventState = xmerl_scan:event_state(GlobalState),
            -   EventState2 = foo(Event, EventState),
            -   GlobalState2 = xmerl_scan:event_state(EventState2, GlobalState)
            -end.

            1.3 Hook Function

            {hook_fun, fun()} | {hook_fun, fun(), HookState}

            The hook function is called when the processor has parsed a complete entity. -Format and semantics:

            fun(Entity, GlobalState) ->
            -   HookState = xmerl_scan:hook_state(GlobalState),
            -   {TransformedEntity, HookState2} = foo(Entity, HookState),
            -   GlobalState2 = xmerl_scan:hook_state(HookState2, GlobalState),
            -   {TransformedEntity, GlobalState2}
            +both access the cont_state.)

            Functions to access user state:

            • xmerl_scan:user_state(GlobalState)
            • xmerl_scan:user_state(UserState, GlobalState)

            1.2 Event Function

            {event_fun, fun()} | {event_fun, fun(), EventState}

            The event function is called at the beginning and at the end of a parsed entity. +It has the following format and semantics:

            fun(Event, GlobalState) ->
            +   EventState = xmerl_scan:event_state(GlobalState),
            +   EventState2 = foo(Event, EventState),
            +   GlobalState2 = xmerl_scan:event_state(EventState2, GlobalState)
            +end.

            1.3 Hook Function

            {hook_fun, fun()} | {hook_fun, fun(), HookState}

            The hook function is called when the processor has parsed a complete entity. +Format and semantics:

            fun(Entity, GlobalState) ->
            +   HookState = xmerl_scan:hook_state(GlobalState),
            +   {TransformedEntity, HookState2} = foo(Entity, HookState),
            +   GlobalState2 = xmerl_scan:hook_state(HookState2, GlobalState),
            +   {TransformedEntity, GlobalState2}
             end.

            The relationship between the event function, the hook function and the accumulator function is as follows:

            1. The event function is first called with an 'ended' event for the parsed entity.
            2. The hook function is called, possibly re-formatting the entity.
            3. The acc function is called in order to (optionally) add the re-formatted -entity to the contents of its parent element.

            1.4 Fetch Function

            {fetch_fun, fun()} | {fetch_fun, fun(), FetchState}

            The fetch function is called in order to fetch an external resource (e.g. a +entity to the contents of its parent element.

          • 1.4 Fetch Function

            {fetch_fun, fun()} | {fetch_fun, fun(), FetchState}

            The fetch function is called in order to fetch an external resource (e.g. a DTD).

            The fetch function can respond with three different return values:

            Result ::=
            -   {ok, {file, Filename}, NewGlobalState} |
            -   {ok, {string, String}, NewGlobalState} |
            -   {ok, not_fetched, NewGlobalState}

            Format and semantics:

            fun(URI, GlobalState) ->
            -   FetchState = xmerl_scan:fetch_state(GlobalState),
            -   Result = foo(URI, FetchState).  % Result being one of the above
            -end.

            1.5 Continuation Function

            {continuation_fun, fun()} | {continuation_fun, fun(), ContinuationState}

            The continuation function is called when the parser encounters the end of the -byte stream. Format and semantics:

            fun(Continue, Exception, GlobalState) ->
            -   ContState = xmerl_scan:cont_state(GlobalState),
            -   {Result, ContState2} = get_more_bytes(ContState),
            +   {ok, {file, Filename}, NewGlobalState} |
            +   {ok, {string, String}, NewGlobalState} |
            +   {ok, not_fetched, NewGlobalState}

            Format and semantics:

            fun(URI, GlobalState) ->
            +   FetchState = xmerl_scan:fetch_state(GlobalState),
            +   Result = foo(URI, FetchState).  % Result being one of the above
            +end.

            1.5 Continuation Function

            {continuation_fun, fun()} | {continuation_fun, fun(), ContinuationState}

            The continuation function is called when the parser encounters the end of the +byte stream. Format and semantics:

            fun(Continue, Exception, GlobalState) ->
            +   ContState = xmerl_scan:cont_state(GlobalState),
            +   {Result, ContState2} = get_more_bytes(ContState),
                case Result of
            -      [] ->
            -         GlobalState2 = xmerl_scan:cont_state(ContState2, GlobalState),
            -         Exception(GlobalState2);
            +      [] ->
            +         GlobalState2 = xmerl_scan:cont_state(ContState2, GlobalState),
            +         Exception(GlobalState2);
                   MoreBytes ->
            -         {MoreBytes2, Rest} = end_on_whitespace_char(MoreBytes),
            -         ContState3 = update_cont_state(Rest, ContState2),
            -         GlobalState3 = xmerl_scan:cont_state(ContState3, GlobalState),
            -         Continue(MoreBytes2, GlobalState3)
            +         {MoreBytes2, Rest} = end_on_whitespace_char(MoreBytes),
            +         ContState3 = update_cont_state(Rest, ContState2),
            +         GlobalState3 = xmerl_scan:cont_state(ContState3, GlobalState),
            +         Continue(MoreBytes2, GlobalState3)
                end
            -end.

            1.6 Rules Functions

            {rules, ReadFun : fun(), WriteFun : fun(), RulesState} |
            -{rules, Table : ets()}

            The rules functions take care of storing scanner information in a rules +end.

      1.6 Rules Functions

      {rules, ReadFun : fun(), WriteFun : fun(), RulesState} |
      +{rules, Table : ets()}

      The rules functions take care of storing scanner information in a rules database. User-provided rules functions may opt to store the information in mnesia, or perhaps in the user_state(RulesState).

      The following modes exist:

      • If the user doesn't specify an option, the scanner creates an ets table, and uses built-in functions to read and write data to it. When the scanner is done, the ets table is deleted.
      • If the user specifies an ets table via the {rules, Table} option, the scanner uses this table. When the scanner is done, it does not delete the table.
      • If the user specifies read and write functions, the scanner will use them -instead.

      The format for the read and write functions are as follows:

       WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
      - ReadFun(Context, Name, ScannerState) -> Definition | undefined.

      Here is a summary of the data objects currently being written by the scanner:

      ContextKey ValueDefinition
      notationNotationName{system, SL} | {public, PIDL, SL}
      elem_defElementName#xmlElement{content = ContentSpec}
      parameter_entityPENamePEDef
      entityEntityNameEntityDef

      Table 1: Scanner data objects

      where

      ContentSpec ::= empty | any | ElemContent
      -ElemContent ::= {Mode, Elems}
      +instead.

    The format for the read and write functions are as follows:

     WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
    + ReadFun(Context, Name, ScannerState) -> Definition | undefined.

    Here is a summary of the data objects currently being written by the scanner:

    ContextKey ValueDefinition
    notationNotationName{system, SL} | {public, PIDL, SL}
    elem_defElementName#xmlElement{content = ContentSpec}
    parameter_entityPENamePEDef
    entityEntityNameEntityDef

    Table 1: Scanner data objects

    where

    ContentSpec ::= empty | any | ElemContent
    +ElemContent ::= {Mode, Elems}
     Mode        ::= seq | choice
    -Elems       ::= [Elem]
    -Elem        ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
    +Elems       ::= [Elem]
    +Elem        ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
     Occurrence  ::= '*' | '?' | '+'

    NOTE: When <Elem> is not wrapped with <Occurrence>, (Occurrence = once) is -implied.

    1.7 Accumulator Function

    {acc_fun, fun()}

    The accumulator function is called to accumulate the contents of an entity.When +implied.

    1.7 Accumulator Function

    {acc_fun, fun()}

    The accumulator function is called to accumulate the contents of an entity.When parsing very large files, it may not be desirable to do so.In this case, an acc function can be provided that simply doesn't accumulate.

    Note that it is possible to even modify the parsed entity before accumulating it, but this must be done with care. xmerl_scan performs post-processing of the element for namespace management. Thus, the element must keep its original structure for this to work.

    The acc function has the following format and semantics:

    %% default accumulating acc fun
    -fun(ParsedEntity, Acc, GlobalState) ->
    -   {[ParsedEntity|Acc], GlobalState}.
    +fun(ParsedEntity, Acc, GlobalState) ->
    +   {[ParsedEntity|Acc], GlobalState}.
     
     %% non-accumulating acc fun
    -fun(ParsedEntity, Acc, GlobalState) ->
    -   {Acc, GlobalState}.

    1.8 Close Function

    The close function is called when a document (either the main document or an +fun(ParsedEntity, Acc, GlobalState) -> + {Acc, GlobalState}.

    1.8 Close Function

    The close function is called when a document (either the main document or an external DTD) has been completely parsed. When xmerl_scan was started using xmerl_scan:file/[1,2], the file will be read in full, and closed immediately, before the parsing starts, so when the close function is called, it will not need to actually close the file. In this case, the close function will be a good -place to modify the state variables.

    Format and semantics:

    fun(GlobalState) ->
    -   GlobalState1 = ....  % state variables may be altered

    2 Examples

    See xmerl_test.erl for more examples.

    2.1 Handling spaces

    The following sample program illustrates three ways of scanning a document:

    1. the default scan, which leaves whitespace untouched
    2. normalizing spaces
    3. normalizing spaces, then removing text elements that only contain one space.
    -module(tmp).
    +place to modify the state variables.

    Format and semantics:

    fun(GlobalState) ->
    +   GlobalState1 = ....  % state variables may be altered

    2 Examples

    See xmerl_test.erl for more examples.

    2.1 Handling spaces

    The following sample program illustrates three ways of scanning a document:

    1. the default scan, which leaves whitespace untouched
    2. normalizing spaces
    3. normalizing spaces, then removing text elements that only contain one space.
    -module(tmp).
     
    --include("xmerl.hrl").
    +-include("xmerl.hrl").
     
    --export([file1/1, file2/1, file3/1]).
    +-export([file1/1, file2/1, file3/1]).
     
    -file1(F) -> xmerl_scan:file(F).
    +file1(F) -> xmerl_scan:file(F).
     
    -file2(F) -> xmerl_scan:file(F, [{space,normalize}]).
    +file2(F) -> xmerl_scan:file(F, [{space,normalize}]).
     
    -file3(F) -> Acc = fun(#xmlText{value = " ", pos = P}, Acc, S) -> {Acc, P,
    -S}; % new return format (X, Acc, S) -> {[X|Acc], S} end, xmerl_scan:file(F,
    -[{space,normalize}, {acc_fun, Acc}]).
    +
    file3(F) -> Acc = fun(#xmlText{value = " ", pos = P}, Acc, S) -> {Acc, P, +S}; % new return format (X, Acc, S) -> {[X|Acc], S} end, xmerl_scan:file(F, +[{space,normalize}, {acc_fun, Acc}]).
    @@ -231,7 +231,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.110475476 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_sax_parser.html 2026-03-12 21:37:29.110475476 +0000 @@ -764,7 +764,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.146475689 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_scan.html 2026-03-12 21:37:29.150475713 +0000 @@ -1112,7 +1112,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.186475926 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_ug.html 2026-03-12 21:37:29.186475926 +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	2026-03-12 21:37:29.214476093 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xpath.html	2026-03-12 21:37:29.218476116 +0000
    @@ -473,7 +473,7 @@
               Erlang programming language
     
           

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.242476259 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs.html 2026-03-12 21:37:29.246476282 +0000 @@ -344,7 +344,7 @@ Erlang programming language

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.274476449 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xs_examples.html 2026-03-12 21:37:29.282476495 +0000 @@ -93,13 +93,13 @@
    <h1> <xsl:apply-templates/> </h1> -</xsl:template>

    becomes in Erlang:

    template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    -    ["<h1>",
    -         xslapply(fun template/1, E),
    -     "</h1>"];


    Example 2 Using value_of and select

    <xsl:template match="title">
    +</xsl:template>

    becomes in Erlang:

    template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    +    ["<h1>",
    +         xslapply(fun template/1, E),
    +     "</h1>"];


    Example 2 Using value_of and select

    <xsl:template match="title">
       <div align="center"><h1><xsl:value-of select="." /></h1></div>
    -</xsl:template>

    becomes:

    template(E = #xmlElement{name='title'}) ->
    -    ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];


    Example 3 Simple xsl stylesheet

    A complete example with the XSLT sheet in the xmerl distribution.

    <xsl:stylesheet version="1.0"
    +</xsl:template>

    becomes:

    template(E = #xmlElement{name='title'}) ->
    +    ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];


    Example 3 Simple xsl stylesheet

    A complete example with the XSLT sheet in the xmerl distribution.

    <xsl:stylesheet version="1.0"
             xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
             xmlns="http://www.w3.org/TR/xhtml1/strict">
     
    @@ -160,60 +160,60 @@
         </em>
       </xsl:template>
     
    -</xsl:stylesheet>


    Example 4 Erlang version

    Erlang transformation of previous example:

    -include("xmerl.hrl").
    +</xsl:stylesheet>


    Example 4 Erlang version

    Erlang transformation of previous example:

    -include("xmerl.hrl").
     
    --import(xmerl_xs,
    -    [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
    +-import(xmerl_xs,
    +    [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
     
    -doctype()->
    +doctype()->
         "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
      \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">".
     
    -process_xml(Doc)->
    -    template(Doc).
    +process_xml(Doc)->
    +    template(Doc).
     
    -template(E = #xmlElement{name='doc'})->
    -    [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
    -      doctype(),
    +template(E = #xmlElement{name='doc'})->
    +    [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
    +      doctype(),
           "<html xmlns=\"http://www.w3.org/1999/xhtml\" >"
           "<head>"
    -      "<title>", value_of(select("title",E)), "</title>"
    +      "<title>", value_of(select("title",E)), "</title>"
           "</head>"
           "<body>",
    -      xslapply( fun template/1, E),
    +      xslapply( fun template/1, E),
           "</body>"
    -      "</html>" ];
    +      "</html>" ];
     
     
    -template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    -    ["<h1>",
    -     xslapply( fun template/1, E),
    -     "</h1>"];
    +template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
    +    ["<h1>",
    +     xslapply( fun template/1, E),
    +     "</h1>"];
     
    -template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
    -    ["<h2>",
    -     xslapply( fun template/1, E),
    -     "</h2>"];
    +template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
    +    ["<h2>",
    +     xslapply( fun template/1, E),
    +     "</h2>"];
     
    -template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
    -    ["<h3>",
    -     xslapply( fun template/1, E),
    -     "</h3>"];
    +template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
    +    ["<h3>",
    +     xslapply( fun template/1, E),
    +     "</h3>"];
     
    -template(E = #xmlElement{ name='para'}) ->
    -    ["<p>", xslapply( fun template/1, E), "</p>"];
    +template(E = #xmlElement{ name='para'}) ->
    +    ["<p>", xslapply( fun template/1, E), "</p>"];
     
    -template(E = #xmlElement{ name='note'}) ->
    -    ["<p class=\"note\">"
    +template(E = #xmlElement{ name='note'}) ->
    +    ["<p class=\"note\">"
          "<b>NOTE: </b>",
    -     xslapply( fun template/1, E),
    -     "</p>"];
    +     xslapply( fun template/1, E),
    +     "</p>"];
     
    -template(E = #xmlElement{ name='emph'}) ->
    -    ["<em>", xslapply( fun template/1, E), "</em>"];
    +template(E = #xmlElement{ name='emph'}) ->
    +    ["<em>", xslapply( fun template/1, E), "</em>"];
     
    -template(E)->
    -    built_in_rules( fun template/1, E).

    It is important to end with a call to xmerl_xs:built_in_rules/2 if you want any +template(E)-> + built_in_rules( fun template/1, E).

    It is important to end with a call to xmerl_xs:built_in_rules/2 if you want any text to be written in "push" transforms. That are the ones using a lot xslapply( fun template/1, E ) instead of value_of(select("xpath",E)), which is pull...


    The largest example is the stylesheet to transform this document from the Simplified Docbook XML format to xhtml. The source file is sdocbook2xhtml.erl.

    Tips and tricks

    for-each

    The function for-each is quite common in XSLT stylesheets. It can often be rewritten and replaced by select/1. Since select/1 returns a list of @@ -226,21 +226,21 @@ <xsl:template match="line"> <xsl:if test="position() mod 2 = 0">&#160;&#160;</xsl:if> <xsl:value-of select="." /><br /> -</xsl:template>

    Can be written as

    template(E = #xmlElement{name='stanza'}) ->
    -    {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
    -    ["<p>", Lines, "</p>"].
    +</xsl:template>

    Can be written as

    template(E = #xmlElement{name='stanza'}) ->
    +    {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
    +    ["<p>", Lines, "</p>"].
     
    -template_pos(E = #xmlElement{name='line'}, P) ->
    -    {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
    +template_pos(E = #xmlElement{name='line'}, P) ->
    +    {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
     
    -indent_line(0)->"&#160;&#160;";
    -indent_line(_)->"".

    Global tree awareness

    In XSLT you have "root" access to the top of the tree with XPath, even though +indent_line(0)->"&#160;&#160;"; +indent_line(_)->"".


    Global tree awareness

    In XSLT you have "root" access to the top of the tree with XPath, even though you are somewhere deep in your tree.

    The xslapply/2 function only carries back the child part of the tree to the template fun. But it is quite easy to write template funs that handles both the -child and top tree.


    Example 6 Passing the root tree

    The following example piece will prepend the article title to any section title

    template(E = #xmlElement{name='title'}, ETop ) ->
    -    ["<h3>", value_of(select("title", ETop))," - ",
    -     xslapply( fun(A) -> template(A, ETop) end, E),
    -     "</h3>"];

    +child and top tree.


    Example 6 Passing the root tree

    The following example piece will prepend the article title to any section title

    template(E = #xmlElement{name='title'}, ETop ) ->
    +    ["<h3>", value_of(select("title", ETop))," - ",
    +     xslapply( fun(A) -> template(A, ETop) end, E),
    +     "</h3>"];

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    /usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.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 2026-03-12 21:37:29.310476662 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/xmerl-2.1.7/doc/html/xmerl_xsd.html 2026-03-12 21:37:29.314476685 +0000 @@ -771,9 +771,9 @@ several times towards the same schema it reduces time consumption.

    The result, ValidElement, is the valid element that conforms to the post-schema-validation infoset. When the validator finds an error it tries to continue and reports a list of all errors found. In those cases an unexpected -error is found it may cause a single error reason.

    Usage example:

    1>{E,_} = xmerl_scan:file("my_XML_document.xml").
    -2>{ok,S} = xmerl_xsd:process_schema("my_XML_Schema.xsd").
    -3>{E2,_} = xmerl_xsd:validate(E,S).

    Observe that E2 may differ from E if for instance there are default values +error is found it may cause a single error reason.

    Usage example:

    1>{E,_} = xmerl_scan:file("my_XML_document.xml").
    +2>{ok,S} = xmerl_xsd:process_schema("my_XML_Schema.xsd").
    +3>{E2,_} = xmerl_xsd:validate(E,S).

    Observe that E2 may differ from E if for instance there are default values defined in my_XML_Schema.xsd.

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

    -

    Copyright © 1996-2026 Ericsson AB

    +

    Copyright © 1996-2042 Ericsson AB

    RPMS.2/erlang-jinterface-28.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 a3d144519ab4438fcebda30a6280d04be16231975e3a3a5965f887b08ec732b4 0 +/usr/lib64/erlang/lib/jinterface-1.15/priv/OtpErlang.jar a2a026d2ca79815a18025336da343cd59fadde6e809dc6b7309f276f1ea7e738 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 overalldiffered=2 (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	2026-03-05 20:51:10.000000000 +0000
    +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/gen_tcp.xhtml	2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/gen_udp.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/global_group.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/inet_res.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/inet.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_chapter.xhtml 2042-04-07 10:09:28.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	2026-03-05 20:51:10.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_cookbook.xhtml	2042-04-07 10:09:28.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	2026-03-05 20:51:10.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_disk_log_h.xhtml	2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_filters.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger_std_h.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/logger.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/net_adm.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/net_kernel.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/net.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/notes.xhtml 2042-04-07 10:09:28.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	2026-03-05 20:51:10.000000000 +0000
      +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/os.xhtml	2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/pg.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/rpc.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/seq_trace.xhtml 2042-04-07 10:09:28.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 2026-03-05 20:51:10.000000000 +0000 +++ new//usr/share/doc/packages/erlang-doc/lib/kernel-10.4.1/doc/html/kernel.epub/OEBPS/socket_usage.xhtml 2042-04-07 10:09:28.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).