diff --git a/.gitignore b/.gitignore index 22d3516..060ac1c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,14 +2,20 @@ # will have compiled files and executables /target/ -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - # These are backup files generated by rustfmt **/*.rs.bk - # Added by cargo - /target + +# Debian packaging stuff +.cargo +vendor.tar +*.xz +*.deb +*.ddeb +*.dsc +*.changes +*.deb.tar.* +*.buildinfo +*.build diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c8d034e --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,743 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "async-signals" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7764064e8871fca00fb487328c3c9cfc71c0871b46d7b61f0089fd8a2d69cc30" +dependencies = [ + "futures-core", + "nix 0.23.1", + "once_cell", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "color-eyre" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ebf286c900a6d5867aeff75cfee3192857bb7f24b547d4f0df2ed6baa812c90" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "cosmic-session" +version = "0.1.0" +dependencies = [ + "async-signals", + "color-eyre", + "futures-util", + "libc", + "nix 0.24.1", + "sendfd", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-macro" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "lock_api" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" + +[[package]] +name = "owo-colors" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "decf7381921fea4dcb2549c5667eda59b3ec297ab7e2b5fc33eac69d2e7da87b" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sendfd" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604b71b8fc267e13bb3023a2c901126c8f349393666a6d98ac1ae5729b701798" +dependencies = [ + "libc", + "tokio", +] + +[[package]] +name = "serde" +version = "1.0.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "smallvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tokio" +version = "1.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-util" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a713421342a5a666b7577783721d3117f1b69a393df803ee17bb73b1e122a59" +dependencies = [ + "ansi_term", + "matchers", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" diff --git a/Cargo.toml b/Cargo.toml index d1bf85a..cc06395 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,8 +12,8 @@ async-signals = "0.4" color-eyre = "0.6" futures-util = "0.3" libc = "0.2" -nix = { version = "0.24.1", features = ["fs"], default-features = false } -sendfd = { version = "0.4.1", features = ["tokio"] } +nix = { version = "0.24", features = ["fs"], default-features = false } +sendfd = { version = "0.4", features = ["tokio"] } serde = { version = "1", features = ["derive"] } serde_json = "1" tokio = { version = "1", features = ["full"] } diff --git a/Justfile b/Justfile new file mode 100644 index 0000000..7f8458f --- /dev/null +++ b/Justfile @@ -0,0 +1,37 @@ +rootdir := '' +etcdir := rootdir + '/etc' +prefix := rootdir + '/usr' +clean := '0' +debug := '0' +vendor := '0' +target := if debug == '1' { 'debug' } else { 'release' } +vendor_args := if vendor == '1' { '--frozen --offline' } else { '' } +debug_args := if debug == '1' { '' } else { '--release' } +cargo_args := vendor_args + ' ' + debug_args + +bindir := prefix + '/bin' +sessiondir := prefix + '/share/wayland-sessions' + +all: _extract_vendor + cargo build {{cargo_args}} + +# Installs files into the system +install: + # main binary + install -Dm0755 target/release/cosmic-session {{bindir}}/cosmic-session + + # session desktop file + install -Dm0644 data/cosmic.desktop {{sessiondir}}/cosmic.desktop + +clean_vendor: + rm -rf vendor vendor.tar .cargo/config + +clean: clean_vendor + cargo clean + +# Extracts vendored dependencies if vendor=1 +_extract_vendor: + #!/usr/bin/env sh + if test {{vendor}} = 1; then + rm -rf vendor; tar pxf vendor.tar + fi diff --git a/data/cosmic.desktop b/data/cosmic.desktop new file mode 100644 index 0000000..06673cd --- /dev/null +++ b/data/cosmic.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=COSMIC +Comment=This session logs you into the COSMIC desktop +Exec=/usr/bin/dbus-run-session -- /usr/bin/cosmic-session +TryExec=/usr/bin/gnome-shell +Type=Application +DesktopNames=pop:COSMIC diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..4c62d02 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +cosmic-session (0.1.0) UNRELEASED; urgency=medium + + * Initial release. + + -- Lucy Thu, 07 Jul 2022 14:42:01 -0400 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..9c59262 --- /dev/null +++ b/debian/control @@ -0,0 +1,20 @@ +Source: cosmic-session +Section: admin +Priority: optional +Maintainer: System76 +Build-Depends: + debhelper (>= 11), + debhelper-compat (= 11), + cargo, + just +Standards-Version: 4.3.0 +Homepage: https://github.com/pop-os/cosmic-session + +Package: cosmic-session +Architecture: amd64 arm64 +Depends: + ${misc:Depends}, + ${shlibs:Depends}, + cosmic-panel, + cosmic-comp +Description: The session for the COSMIC desktop diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..7a513eb --- /dev/null +++ b/debian/copyright @@ -0,0 +1,7 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: cosmic-session +Source: https://github.com/pop-os/cosmic-session + +Files: * +Copyright: Copyright 2022 System76 +License: GPL-3.0-only diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..a7441f8 --- /dev/null +++ b/debian/rules @@ -0,0 +1,30 @@ +#!/usr/bin/make -f + +DESTDIR = debian/pop-snapshot +CLEAN ?= 1 +VENDOR ?= 1 + +%: + dh $@ + +override_dh_shlibdeps: + dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info + +override_dh_auto_clean: + if test "${CLEAN}" = "1"; then \ + cargo clean; \ + fi + + if ! ischroot && test "${VENDOR}" = "1"; then \ + mkdir -p .cargo; \ + cargo vendor --sync Cargo.toml | head -n -1 > .cargo/config; \ + echo 'directory = "vendor"' >> .cargo/config; \ + tar pcf vendor.tar vendor; \ + rm -rf vendor; \ + fi + +override_dh_auto_build: + just rootdir=$(DESTDIR) debug=$(DEBUG) vendor=$(VENDOR) + +override_dh_auto_install: + just rootdir=$(DESTDIR) install diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/src/comp.rs b/src/comp.rs index 7448f5b..260f1f5 100644 --- a/src/comp.rs +++ b/src/comp.rs @@ -4,17 +4,25 @@ use color_eyre::eyre::{ContextCompat, Result, WrapErr}; use nix::fcntl; use sendfd::SendWithFd; use serde::{Deserialize, Serialize}; -use std::os::unix::prelude::{AsRawFd, IntoRawFd}; +use std::{ + collections::HashMap, + os::unix::prelude::{AsRawFd, IntoRawFd}, +}; use tokio::{ - io::AsyncWriteExt, - net::UnixStream, + io::{AsyncReadExt, AsyncWriteExt}, + net::{ + unix::{OwnedReadHalf, OwnedWriteHalf}, + UnixStream, + }, sync::mpsc::{self, unbounded_channel}, }; use tokio_util::sync::CancellationToken; +use tracing::Instrument; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "snake_case", tag = "message")] pub enum Message { + SetEnv { variables: HashMap }, NewPrivilegedClient { count: usize }, } @@ -77,7 +85,70 @@ async fn receive_event(rx: &mut mpsc::UnboundedReceiver) -> Option } } -async fn send_fd(session_tx: &mut UnixStream, stream: Vec) -> Result<()> { +// Cancellation safe! +#[derive(Default)] +struct IpcState { + length: Option, + bytes_read: usize, + buf: Vec, +} + +fn parse_and_handle_ipc(bytes: &[u8]) { + match serde_json::from_slice::(bytes) { + Ok(Message::SetEnv { variables }) => { + debug!(?variables); + } + Ok(Message::NewPrivilegedClient { .. }) => { + unreachable!("NewPrivilegedClient should not be sent TO the session!"); + } + Err(_) => { + warn!( + "Unknown session socket message, are you using incompatible cosmic-session and \ + cosmic-comp versions?" + ) + } + } +} + +async fn receive_ipc(state: &mut IpcState, rx: &mut OwnedReadHalf) -> Result<()> { + match state.length { + Some(length) => { + let index = state.bytes_read.saturating_sub(1); + state.bytes_read += rx + .read_exact(&mut state.buf[index..]) + .await + .wrap_err("failed to read IPC length")?; + if state.bytes_read >= length as usize { + parse_and_handle_ipc(&state.buf); + state.length = None; + state.bytes_read = 0; + state.buf.clear(); + } + Ok(()) + } + None => { + state.buf.resize(2, 0); + let index = state.bytes_read.saturating_sub(1); + state.bytes_read += rx + .read_exact(&mut state.buf[index..]) + .await + .wrap_err("failed to read IPC length")?; + if state.bytes_read >= 2 { + let length = u16::from_ne_bytes( + state.buf[..2] + .try_into() + .wrap_err("failed to convert IPC length to u16")?, + ); + state.length = Some(length); + state.bytes_read = 0; + state.buf.resize(length as usize, 0); + } + Ok(()) + } + } +} + +async fn send_fd(session_tx: &mut OwnedWriteHalf, stream: Vec) -> Result<()> { let fds = stream .into_iter() .map(|stream| { @@ -103,20 +174,19 @@ async fn send_fd(session_tx: &mut UnixStream, stream: Vec) -> Result .await .wrap_err("failed to write json")?; tokio::time::sleep(std::time::Duration::from_micros(100)).await; - session_tx - .send_with_fd(&[0], &fds) - .wrap_err("failed to send fd")?; + let fd: &UnixStream = session_tx.as_ref(); + fd.send_with_fd(&[0], &fds).wrap_err("failed to send fd")?; info!("sent {} fds", fds.len()); Ok(()) } -pub async fn run_compositor( +pub fn run_compositor( token: CancellationToken, mut socket_rx: mpsc::UnboundedReceiver>, ) -> Result<()> { let (tx, mut rx) = unbounded_channel::(); - let (mut session, comp) = - UnixStream::pair().wrap_err("failed to create pair of unix sockets")?; + let (session, comp) = UnixStream::pair().wrap_err("failed to create pair of unix sockets")?; + let (mut session_rx, mut session_tx) = session.into_split(); let comp = { mark_as_not_cloexec(&comp).wrap_err("failed to mark compositor stream as CLOEXEC")?; let std_stream = comp @@ -127,21 +197,35 @@ pub async fn run_compositor( .wrap_err("failed to mark compositor unix stream as blocking")?; std_stream.into_raw_fd() }; - ProcessHandler::new(tx, &token).run("cosmic-comp", vec![], vec![( - "COSMIC_SESSION_SOCK".into(), - comp.to_string(), - )]); - loop { - tokio::select! { - exit = receive_event(&mut rx) => if exit.is_none() { - break; - }, - Some(socket) = socket_rx.recv() => { - send_fd(&mut session, socket) - .await - .wrap_err("failed to send file descriptor to compositor")?; + let span = info_span!(parent: None, "cosmic-comp"); + let _span = span.clone(); + tokio::spawn( + async move { + ProcessHandler::new(tx, &token).run( + "cosmic-comp", + vec![], + vec![("COSMIC_SESSION_SOCK".into(), comp.to_string())], + &span, + ); + let mut ipc_state = IpcState::default(); + loop { + tokio::select! { + exit = receive_event(&mut rx) => if exit.is_none() { + break; + }, + result = receive_ipc(&mut ipc_state, &mut session_rx) => if let Err(err) = result { + error!("failed to receive IPC: {:?}", err); + }, + Some(socket) = socket_rx.recv() => { + send_fd(&mut session_tx, socket) + .await + .wrap_err("failed to send file descriptor to compositor")?; + } + } } + Result::<()>::Ok(()) } - } + .instrument(_span), + ); Ok(()) } diff --git a/src/generic.rs b/src/generic.rs new file mode 100644 index 0000000..9e9c2ba --- /dev/null +++ b/src/generic.rs @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-3.0-only +use crate::process::{ProcessEvent, ProcessHandler}; +use tokio::sync::mpsc::unbounded_channel; +use tokio_util::sync::CancellationToken; +use tracing::{Instrument, Span}; + +pub fn run_executable( + token: CancellationToken, + span: Span, + executable: &'static str, + args: Vec, + env_vars: Vec<(String, String)>, +) { + let span_2 = span.clone(); + let (tx, mut rx) = unbounded_channel::(); + tokio::spawn( + async move { + ProcessHandler::new(tx, &token).run(executable, args, env_vars, &span); + while let Some(event) = rx.recv().await { + match event { + ProcessEvent::Started => { + info!("started"); + } + ProcessEvent::Stdout(line) => { + info!("{}", line); + } + ProcessEvent::Stderr(line) => { + error!("{}", line); + } + ProcessEvent::Ended(Some(status)) => { + error!("exited with status {}", status); + return; + } + ProcessEvent::Ended(None) => { + error!("exited"); + return; + } + } + } + } + .instrument(span_2), + ); +} diff --git a/src/main.rs b/src/main.rs index 5a05275..791b3be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ extern crate tracing; mod comp; -mod panel; +mod generic; mod process; use async_signals::Signals; @@ -32,32 +32,39 @@ async fn main() -> Result<()> { let token = CancellationToken::new(); let (socket_tx, socket_rx) = mpsc::unbounded_channel(); - tokio::spawn({ - let token = token.child_token(); - async move { - if let Err(err) = comp::run_compositor(token, socket_rx).await { - error!("compositor errored: {:?}", err); - } - } - }); + if let Err(err) = comp::run_compositor(token.child_token(), socket_rx) { + error!("compositor errored: {:?}", err); + } tokio::time::sleep(std::time::Duration::from_millis(100)).await; let env_vars = Vec::new(); info!("got environmental variables: {:?}", env_vars); let mut sockets = Vec::with_capacity(2); - tokio::spawn(panel::run_panel( + generic::run_executable( token.child_token(), - "testing-panel", + info_span!(parent: None, "cosmic-panel"), + "cosmic-panel", + vec!["testing-panel".into()], comp::create_privileged_socket(&mut sockets, &env_vars) .wrap_err("failed to create panel socket")?, - )); - tokio::spawn(panel::run_panel( + ); + generic::run_executable( token.child_token(), - "testing-dock", + info_span!(parent: None, "cosmic-panel dock"), + "cosmic-panel", + vec!["testing-dock".into()], comp::create_privileged_socket(&mut sockets, &env_vars) .wrap_err("failed to create dock socket")?, - )); + ); + generic::run_executable( + token.child_token(), + info_span!(parent: None, "cosmic-app-library"), + "cosmic-app-library", + vec![], + comp::create_privileged_socket(&mut sockets, &env_vars) + .wrap_err("failed to create dock socket")?, + ); socket_tx.send(sockets).unwrap(); diff --git a/src/panel.rs b/src/panel.rs deleted file mode 100644 index 8d31710..0000000 --- a/src/panel.rs +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -use crate::process::{ProcessEvent, ProcessHandler}; -use tokio::sync::mpsc::unbounded_channel; -use tokio_util::sync::CancellationToken; - -pub async fn run_panel(token: CancellationToken, config: &str, env_vars: Vec<(String, String)>) { - let (tx, mut rx) = unbounded_channel::(); - ProcessHandler::new(tx, &token).run("cosmic-panel", vec![config.to_string()], env_vars); - while let Some(event) = rx.recv().await { - match event { - ProcessEvent::Started => { - info!("started"); - } - ProcessEvent::Stdout(line) => { - info!("{}", line); - } - ProcessEvent::Stderr(line) => { - error!("{}", line); - } - ProcessEvent::Ended(Some(status)) => { - error!("exited with status {}", status); - return; - } - ProcessEvent::Ended(None) => { - error!("exited"); - return; - } - } - } -} diff --git a/src/process.rs b/src/process.rs index 892d740..e7a4aad 100644 --- a/src/process.rs +++ b/src/process.rs @@ -6,6 +6,7 @@ use tokio::{ sync::mpsc::UnboundedSender, }; use tokio_util::sync::CancellationToken; +use tracing::{Instrument, Span}; pub enum ProcessEvent { Started, @@ -27,82 +28,91 @@ impl ProcessHandler { } } - pub fn run(self, executable: impl ToString, args: Vec, vars: Vec<(String, String)>) { + pub fn run( + self, + executable: impl ToString, + args: Vec, + vars: Vec<(String, String)>, + span: &Span, + ) { let executable = executable.to_string(); - tokio::spawn(async move { - let mut child = match Command::new(&executable) - .args(&args) - .stdin(Stdio::null()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .envs(vars) - .kill_on_drop(true) - .spawn() - { - Ok(child) => child, - Err(error) => { - error!( - "failed to launch '{} {}': {}", - executable, - args.join(" "), - error - ); - return; - } - }; - let mut stdout = BufReader::new(child.stdout.take().unwrap()).lines(); - let mut stderr = BufReader::new(child.stderr.take().unwrap()).lines(); - std::mem::drop(self.tx.send(ProcessEvent::Started)); - loop { - tokio::select! { - status = child.wait() => match status { - Ok(status) => { - info!("'{}' exited with status {}", executable, status); - std::mem::drop(self.tx.send(ProcessEvent::Ended(Some(status)))); - return; - } - Err(error) => { - error!( - "failed to wait for '{}' to end: {}", - executable, - error - ); - return; - } - }, - line = stdout.next_line() => match line { - Ok(Some(line)) => { - std::mem::drop(self.tx.send(ProcessEvent::Stdout(line))); - }, - Ok(None) => (), - Err(error) => { - warn!( - "failed to get stdout line from '{}': {}", - executable, - error - ); - } - }, - line = stderr.next_line() => match line { - Ok(Some(line)) => { - std::mem::drop(self.tx.send(ProcessEvent::Stderr(line))); - }, - Ok(None) => (), - Err(error) => { - warn!( - "failed to get stderr line from '{}': {}", - executable, - error - ); - } - }, - _ = self.cancellation_token.cancelled() => { - warn!("exiting '{}': cancelled", executable); - std::mem::drop(self.tx.send(ProcessEvent::Ended(None))); + tokio::spawn( + async move { + let mut child = match Command::new(&executable) + .args(&args) + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .envs(vars) + .kill_on_drop(true) + .spawn() + { + Ok(child) => child, + Err(error) => { + error!( + "failed to launch '{} {}': {}", + executable, + args.join(" "), + error + ); return; } + }; + let mut stdout = BufReader::new(child.stdout.take().unwrap()).lines(); + let mut stderr = BufReader::new(child.stderr.take().unwrap()).lines(); + std::mem::drop(self.tx.send(ProcessEvent::Started)); + loop { + tokio::select! { + status = child.wait() => match status { + Ok(status) => { + info!("'{}' exited with status {}", executable, status); + std::mem::drop(self.tx.send(ProcessEvent::Ended(Some(status)))); + return; + } + Err(error) => { + error!( + "failed to wait for '{}' to end: {}", + executable, + error + ); + return; + } + }, + line = stdout.next_line() => match line { + Ok(Some(line)) => { + std::mem::drop(self.tx.send(ProcessEvent::Stdout(line))); + }, + Ok(None) => (), + Err(error) => { + warn!( + "failed to get stdout line from '{}': {}", + executable, + error + ); + } + }, + line = stderr.next_line() => match line { + Ok(Some(line)) => { + std::mem::drop(self.tx.send(ProcessEvent::Stderr(line))); + }, + Ok(None) => (), + Err(error) => { + warn!( + "failed to get stderr line from '{}': {}", + executable, + error + ); + } + }, + _ = self.cancellation_token.cancelled() => { + warn!("exiting '{}': cancelled", executable); + std::mem::drop(self.tx.send(ProcessEvent::Ended(None))); + return; + } + } } } - }); + .instrument(span.clone()), + ); } }