diff --git a/Cargo.lock b/Cargo.lock index 909e281..e8716d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,70 +27,78 @@ dependencies = [ ] [[package]] -name = "async-broadcast" -version = "0.5.1" +name = "anyhow" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" + +[[package]] +name = "async-broadcast" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb" dependencies = [ - "event-listener", + "event-listener 5.2.0", + "event-listener-strategy 0.5.0", "futures-core", + "pin-project-lite", ] [[package]] name = "async-channel" -version = "1.9.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 5.2.0", + "event-listener-strategy 0.5.0", "futures-core", + "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.5.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock", + "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 1.9.0", + "fastrand", "futures-lite", "slab", ] [[package]] name = "async-fs" -version = "1.6.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +checksum = "bc19683171f287921f2405677dd2ed2549c3b3bda697a563ebc3a121ace2aba1" dependencies = [ - "async-lock", - "autocfg", + "async-lock 3.3.0", "blocking", "futures-lite", ] [[package]] name = "async-io" -version = "1.13.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" dependencies = [ - "async-lock", - "autocfg", + "async-lock 3.3.0", "cfg-if", "concurrent-queue", + "futures-io", "futures-lite", - "log", "parking", "polling", - "rustix 0.37.23", + "rustix", "slab", - "socket2 0.4.9", - "waker-fn", + "tracing", + "windows-sys 0.52.0", ] [[package]] @@ -99,25 +107,36 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", ] [[package]] name = "async-process" -version = "1.7.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" +checksum = "451e3cf68011bd56771c79db04a9e333095ab6349f7e47592b788e9b98720cc8" dependencies = [ + "async-channel", "async-io", - "async-lock", - "autocfg", + "async-lock 3.3.0", + "async-signal", "blocking", "cfg-if", - "event-listener", + "event-listener 5.2.0", "futures-lite", - "rustix 0.37.23", - "signal-hook", - "windows-sys", + "rustix", + "windows-sys 0.52.0", ] [[package]] @@ -128,24 +147,42 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.53", +] + +[[package]] +name = "async-signal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +dependencies = [ + "async-io", + "async-lock 2.8.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.48.0", ] [[package]] name = "async-task" -version = "4.4.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.53", ] [[package]] @@ -198,25 +235,20 @@ dependencies = [ [[package]] name = "blocking" -version = "1.3.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ "async-channel", - "async-lock", + "async-lock 3.3.0", "async-task", - "atomic-waker", - "fastrand 1.9.0", + "fastrand", + "futures-io", "futures-lite", - "log", + "piper", + "tracing", ] -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - [[package]] name = "bytes" version = "1.5.0" @@ -238,6 +270,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "concurrent-queue" version = "2.2.0" @@ -297,10 +335,16 @@ dependencies = [ ] [[package]] -name = "enumflags2" -version = "0.7.8" +name = "endi" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" dependencies = [ "enumflags2_derive", "serde", @@ -308,13 +352,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" +checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.53", ] [[package]] @@ -325,23 +369,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.3" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] @@ -351,12 +384,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] -name = "fastrand" -version = "1.9.0" +name = "event-listener" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" dependencies = [ - "instant", + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +dependencies = [ + "event-listener 5.2.0", + "pin-project-lite", ] [[package]] @@ -367,23 +433,23 @@ checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" -version = "1.13.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +checksum = "9c1155db57329dca6d018b61e76b1488ce9a2e5e44028cac420a5898f4fcef63" dependencies = [ - "fastrand 1.9.0", + "fastrand", "futures-core", "futures-io", "memchr", @@ -394,21 +460,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", "futures-io", @@ -476,48 +542,22 @@ dependencies = [ ] [[package]] -name = "instant" -version = "0.1.12" +name = "lazy_static" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.148" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "memchr" @@ -527,9 +567,9 @@ checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "memoffset" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -551,17 +591,18 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "nix" -version = "0.26.4" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cfg-if", + "cfg_aliases", "libc", "memoffset", ] @@ -620,19 +661,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "polling" -version = "2.8.0" +name = "piper" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "polling" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" dependencies = [ - "autocfg", - "bitflags 1.3.2", "cfg-if", "concurrent-queue", - "libc", - "log", "pin-project-lite", - "windows-sys", + "rustix", + "tracing", + "windows-sys 0.52.0", ] [[package]] @@ -643,28 +693,27 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "once_cell", "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -710,9 +759,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.5" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -722,9 +771,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.8" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -733,9 +782,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rustc-demangle" @@ -745,29 +794,15 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.37.23" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys", -] - -[[package]] -name = "rustix" -version = "0.38.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ "bitflags 2.4.0", "errno", "libc", - "linux-raw-sys 0.4.7", - "windows-sys", + "linux-raw-sys", + "windows-sys 0.52.0", ] [[package]] @@ -787,25 +822,25 @@ checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.53", ] [[package]] name = "serde_repr" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.53", ] [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -813,13 +848,12 @@ dependencies = [ ] [[package]] -name = "signal-hook" -version = "0.3.17" +name = "sharded-slab" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ - "libc", - "signal-hook-registry", + "lazy_static", ] [[package]] @@ -840,16 +874,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "socket2" version = "0.5.4" @@ -857,7 +881,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -868,11 +892,13 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "steamos-manager" -version = "0.9.0" +version = "24.3.0" dependencies = [ + "anyhow", "tokio", + "tracing", + "tracing-subscriber", "zbus", - "zbus_macros", ] [[package]] @@ -888,9 +914,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.33" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9caece70c63bfba29ec2fed841a09851b14a235c60010fa4de58089b6c025668" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -904,10 +930,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", - "fastrand 2.0.0", + "fastrand", "redox_syscall", - "rustix 0.38.13", - "windows-sys", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", ] [[package]] @@ -923,10 +959,10 @@ dependencies = [ "num_cpus", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.4", + "socket2", "tokio-macros", "tracing", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -937,20 +973,20 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.53", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap", "toml_datetime", @@ -959,11 +995,10 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -971,24 +1006,35 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.53", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + [[package]] name = "typenum" version = "1.16.0" @@ -997,10 +1043,11 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "uds_windows" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ + "memoffset", "tempfile", "winapi", ] @@ -1057,7 +1104,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", ] [[package]] @@ -1066,13 +1122,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -1081,42 +1152,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + [[package]] name = "winnow" version = "0.5.15" @@ -1128,40 +1241,38 @@ dependencies = [ [[package]] name = "xdg-home" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" +checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" dependencies = [ - "nix", + "libc", "winapi", ] [[package]] name = "zbus" -version = "3.14.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "c9ff46f2a25abd690ed072054733e0bc3157e3d4c45f41bd183dce09c2ff8ab9" dependencies = [ "async-broadcast", "async-executor", "async-fs", "async-io", - "async-lock", + "async-lock 3.3.0", "async-process", "async-recursion", "async-task", "async-trait", "blocking", - "byteorder", "derivative", "enumflags2", - "event-listener", + "event-listener 5.2.0", "futures-core", "futures-sink", "futures-util", "hex", "nix", - "once_cell", "ordered-stream", "rand", "serde", @@ -1171,7 +1282,7 @@ dependencies = [ "tokio", "tracing", "uds_windows", - "winapi", + "windows-sys 0.52.0", "xdg-home", "zbus_macros", "zbus_names", @@ -1180,9 +1291,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.14.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "4e0e3852c93dcdb49c9462afe67a2a468f7bd464150d866e861eaf06208633e0" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1194,9 +1305,9 @@ dependencies = [ [[package]] name = "zbus_names" -version = "2.6.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", @@ -1205,13 +1316,12 @@ dependencies = [ [[package]] name = "zvariant" -version = "3.15.0" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "2c1b3ca6db667bfada0f1ebfc94b2b1759ba25472ee5373d4551bb892616389a" dependencies = [ - "byteorder", + "endi", "enumflags2", - "libc", "serde", "static_assertions", "zvariant_derive", @@ -1219,9 +1329,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "b7a4b236063316163b69039f77ce3117accb41a09567fd24c168e43491e521bc" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1232,9 +1342,9 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 4b4e8b6..ccb7b20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "steamos-manager" -version = "0.9.0" +version = "24.3.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [profile.release] strip="symbols" [dependencies] -tokio = { version = "1.33.0", features = ["fs", "process", "io-std", "rt-multi-thread", "macros"] } -zbus = { version = "3.14.1", features = ["tokio"] } -zbus_macros = "3.14.1" +anyhow = "1" +tokio = { version = "1", features = ["fs", "io-std", "macros", "process", "rt-multi-thread", "signal"] } +tracing = { version = "0.1", default-features = false } +tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] } +zbus = { version = "4", features = ["tokio"] } diff --git a/src/main.rs b/src/main.rs index 0336182..a9045c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ /* * Copyright © 2023 Collabora Ltd. + * Copyright © 2024 Valve Software * * SPDX-License-Identifier: MIT * @@ -23,16 +24,23 @@ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -use zbus::{ConnectionBuilder, Result}; +use anyhow::{Error, Result}; +use tokio::signal::unix::{signal, SignalKind}; +use tracing_subscriber; +use zbus::ConnectionBuilder; -pub mod manager; +mod manager; #[tokio::main] async fn main() -> Result<()> { // This daemon is responsible for creating a dbus api that steam client can use to do various OS // level things. It implements com.steampowered.SteamOSManager1 interface - let manager = manager::SMManager::default(); + tracing_subscriber::fmt::init(); + + let mut sigterm = signal(SignalKind::terminate())?; + + let manager = manager::SMManager::new()?; let _system_connection = ConnectionBuilder::system()? .name("com.steampowered.SteamOSManager1")? @@ -40,7 +48,8 @@ async fn main() -> Result<()> { .build() .await?; - loop { - std::future::pending::<()>().await; + tokio::select! { + e = sigterm.recv() => e.ok_or(Error::msg("SIGTERM pipe broke")), + e = tokio::signal::ctrl_c() => Ok(e?), } } diff --git a/src/manager.rs b/src/manager.rs index 513c406..4c698c3 100644 --- a/src/manager.rs +++ b/src/manager.rs @@ -1,5 +1,6 @@ /* * Copyright © 2023 Collabora Ltd. + * Copyright © 2024 Valve Software * * SPDX-License-Identifier: MIT * @@ -23,10 +24,11 @@ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -use std::{ fs, ffi::OsStr, fmt, os::fd::{FromRawFd, IntoRawFd} }; +use anyhow::{ensure, Result}; +use std::{ffi::OsStr, fmt, fs}; use tokio::{fs::File, io::AsyncWriteExt, process::Command}; -use zbus::zvariant::OwnedFd; -use zbus_macros::dbus_interface; +use tracing::{error, warn}; +use zbus::{interface, zvariant::Fd}; #[derive(PartialEq, Debug, Copy, Clone)] #[repr(u32)] @@ -37,16 +39,13 @@ enum WifiDebugMode { impl TryFrom for WifiDebugMode { type Error = &'static str; - fn try_from(v: u32) -> Result - { + fn try_from(v: u32) -> Result { match v { x if x == WifiDebugMode::Off as u32 => Ok(WifiDebugMode::Off), x if x == WifiDebugMode::On as u32 => Ok(WifiDebugMode::On), - _ => { Err("No enum match for value {v}") }, + _ => Err("No enum match for value {v}"), } - } - } impl fmt::Display for WifiDebugMode { @@ -65,28 +64,16 @@ pub struct SMManager { should_trace: bool, } -impl SMManager -{ - pub fn new() -> Self - { - SMManager { +impl SMManager { + pub fn new() -> Result { + Ok(SMManager { wifi_debug_mode: WifiDebugMode::Off, - should_trace: is_galileo().unwrap(), - } + should_trace: is_galileo()?, + }) } } -impl Default for SMManager -{ - fn default() -> Self - { - SMManager::new() - } - -} - -const OVERRIDE_CONTENTS: &str = -"[Service] +const OVERRIDE_CONTENTS: &str = "[Service] ExecStart= ExecStart=/usr/lib/iwd/iwd -d "; @@ -100,8 +87,15 @@ const MIN_BUFFER_SIZE: u32 = 100; const BOARD_NAME_PATH: &str = "/sys/class/dmi/id/board_name"; const GALILEO_NAME: &str = "Galileo"; -fn is_galileo() -> std::io::Result -{ +const ALS_INTEGRATION_PATH: &str = "/sys/devices/platform/AMDI0010:00/i2c-0/i2c-PRP0001:01/iio:device0/in_illuminance_integration_time"; +const POWER1_CAP_PATH: &str = "/sys/class/hwmon/hwmon5/power1_cap"; +const POWER2_CAP_PATH: &str = "/sys/class/hwmon/hwmon5/power2_cap"; + +const GPU_PERFORMANCE_LEVEL_PATH: &str = + "/sys/class/drm/card0/device/power_dpm_force_performance_level"; +const GPU_CLOCKS_PATH: &str = "/sys/class/drm/card0/device/pp_od_clk_voltage"; + +fn is_galileo() -> Result { let mut board_name = fs::read_to_string(BOARD_NAME_PATH)?; board_name = board_name.trim().to_string(); @@ -109,49 +103,33 @@ fn is_galileo() -> std::io::Result Ok(matches) } -async fn script_exit_code( - executable: &str, - args: &[impl AsRef], -) -> std::io::Result { +async fn script_exit_code(executable: &str, args: &[impl AsRef]) -> Result { // Run given script and return true on success - let mut child = Command::new(executable) - .args(args) - .spawn()?; + let mut child = Command::new(executable).args(args).spawn()?; let status = child.wait().await?; Ok(status.success()) } -async fn run_script(name: &str, executable: &str, args: &[impl AsRef]) -> std::io::Result { +async fn run_script(name: &str, executable: &str, args: &[impl AsRef]) -> Result { // Run given script to get exit code and return true on success. // Return false on failure, but also print an error if needed - match script_exit_code(executable, args).await { - Ok(value) => Ok(value), - Err(err) => { - println!("Error running {} {}", name, err); - Err(err) - } - } + script_exit_code(executable, args) + .await + .inspect_err(|message| warn!("Error running {name} {message}")) } -async fn script_output( - executable: &str, - args: &[impl AsRef], -) -> Result> { +async fn script_output(executable: &str, args: &[impl AsRef]) -> Result { // Run given command and return the output given let output = Command::new(executable).args(args).output(); let output = output.await?; - let s = match std::str::from_utf8(&output.stdout) { - Ok(v) => v, - Err(e) => panic!("Invalid UTF-8 sequence: {}", e), - }; + let s = std::str::from_utf8(&output.stdout)?; Ok(s.to_string()) } -async fn setup_iwd_config(want_override: bool) -> Result<(), std::io::Error> -{ - // Copy override.conf file into place or out of place depending +async fn setup_iwd_config(want_override: bool) -> std::io::Result<()> { + // Copy override.conf file into place or out of place depending // on install value if want_override { @@ -166,10 +144,9 @@ async fn setup_iwd_config(want_override: bool) -> Result<(), std::io::Error> } } -async fn restart_iwd() -> std::io::Result -{ +async fn restart_iwd() -> Result { // First reload systemd since we modified the config most likely - // othorwise we wouldn't be restarting iwd. + // otherwise we wouldn't be restarting iwd. match run_script("reload systemd", "systemctl", &["daemon-reload"]).await { Ok(value) => { if value { @@ -177,19 +154,18 @@ async fn restart_iwd() -> std::io::Result run_script("restart iwd", "systemctl", &["restart", "iwd"]).await } else { // reload failed - println!("restart_iwd: reload systemd failed somehow"); + error!("restart_iwd: reload systemd failed with non-zero exit code"); Ok(false) } - }, + } Err(message) => { - println!("restart_iwd: reload systemd got an error {message}"); + error!("restart_iwd: reload systemd got an error: {message}"); Err(message) } } } -async fn stop_tracing(should_trace: bool) -> std::io::Result -{ +async fn stop_tracing(should_trace: bool) -> Result { if !should_trace { return Ok(true); } @@ -197,21 +173,105 @@ async fn stop_tracing(should_trace: bool) -> std::io::Result // Stop tracing and extract ring buffer to disk for capture run_script("stop tracing", "trace-cmd", &["stop"]).await?; // stop tracing worked - run_script("extract traces", "trace-cmd", &["extract", "-o", OUTPUT_FILE]).await + run_script( + "extract traces", + "trace-cmd", + &["extract", "-o", OUTPUT_FILE], + ) + .await } -async fn start_tracing(buffer_size:u32, should_trace: bool) -> std::io::Result -{ +async fn start_tracing(buffer_size: u32, should_trace: bool) -> Result { if !should_trace { return Ok(true); } // Start tracing let size_str = format!("{}", buffer_size); - run_script("start tracing", "trace-cmd", &["start", "-e", "ath11k_wmi_diag", "-b", &size_str]).await + run_script( + "start tracing", + "trace-cmd", + &["start", "-e", "ath11k_wmi_diag", "-b", &size_str], + ) + .await } -#[dbus_interface(name = "com.steampowered.SteamOSManager1")] +async fn set_gpu_performance_level(level: i32) -> Result<()> { + // Set given GPU performance level + // Levels are defined below + // return true if able to write, false otherwise or if level is out of range, etc. + let levels = ["auto", "low", "high", "manual", "peak_performance"]; + ensure!( + level >= 0 && level < levels.len() as i32, + "Invalid performance level" + ); + + let mut myfile = File::create(GPU_PERFORMANCE_LEVEL_PATH) + .await + .inspect_err(|message| error!("Error opening sysfs file for writing: {message}"))?; + + myfile + .write_all(levels[level as usize].as_bytes()) + .await + .inspect_err(|message| error!("Error writing to sysfs file: {message}"))?; + Ok(()) +} + +async fn set_gpu_clocks(clocks: i32) -> Result<()> { + // Set GPU clocks to given value valid between 200 - 1600 + // Only used when GPU Performance Level is manual, but write whenever called. + ensure!((200..=1600).contains(&clocks), "Invalid clocks"); + + let mut myfile = File::create(GPU_CLOCKS_PATH) + .await + .inspect_err(|message| error!("Error opening sysfs file for writing: {message}"))?; + + let data = format!("s 0 {clocks}\n"); + myfile + .write(data.as_bytes()) + .await + .inspect_err(|message| error!("Error writing to sysfs file: {message}"))?; + + let data = format!("s 1 {clocks}\n"); + myfile + .write(data.as_bytes()) + .await + .inspect_err(|message| error!("Error writing to sysfs file: {message}"))?; + + myfile + .write("c\n".as_bytes()) + .await + .inspect_err(|message| error!("Error writing to sysfs file: {message}"))?; + Ok(()) +} + +async fn set_tdp_limit(limit: i32) -> Result<()> { + // Set TDP limit given if within range (3-15) + // Returns false on error or out of range + ensure!((3..=15).contains(&limit), "Invalid limit"); + + let mut power1file = File::create(POWER1_CAP_PATH).await.inspect_err(|message| { + error!("Error opening sysfs power1_cap file for writing TDP limits {message}") + })?; + + let mut power2file = File::create(POWER2_CAP_PATH).await.inspect_err(|message| { + error!("Error opening sysfs power2_cap file for wtriting TDP limits {message}") + })?; + + // Now write the value * 1,000,000 + let data = format!("{limit}000000"); + power1file + .write(data.as_bytes()) + .await + .inspect_err(|message| error!("Error writing to power1_cap file: {message}"))?; + power2file + .write(data.as_bytes()) + .await + .inspect_err(|message| error!("Error writing to power2_cap file: {message}"))?; + Ok(()) +} + +#[interface(name = "com.steampowered.SteamOSManager1")] impl SMManager { const API_VERSION: u32 = 1; @@ -221,57 +281,49 @@ impl SMManager { async fn factory_reset(&self) -> bool { // Run steamos factory reset script and return true on success - match run_script("factory reset", "steamos-factory-reset-config", &[""]).await { - Ok(value) => { value }, - Err(_) => { false } - } + run_script("factory reset", "steamos-factory-reset-config", &[""]) + .await + .unwrap_or(false) } async fn disable_wifi_power_management(&self) -> bool { // Run polkit helper script and return true on success - match run_script( + run_script( "disable wifi power management", "/usr/bin/steamos-polkit-helpers/steamos-disable-wireless-power-management", &[""], ) - .await { - Ok(value) => { value }, - Err(_) => { false } - } + .await + .unwrap_or(false) } async fn enable_fan_control(&self, enable: bool) -> bool { // Run what steamos-polkit-helpers/jupiter-fan-control does if enable { - match run_script( + run_script( "enable fan control", "systemcltl", &["start", "jupiter-fan-control-service"], ) - .await { - Ok(value) => { value }, - Err(_) => { false } - } + .await + .unwrap_or(false) } else { - match run_script( + run_script( "disable fan control", "systemctl", &["stop", "jupiter-fan-control.service"], ) - .await { - Ok(value) => { value }, - Err(_) => { false } - } + .await + .unwrap_or(false) } } async fn hardware_check_support(&self) -> bool { // Run jupiter-check-support note this script does exit 1 for "Support: No" case // so no need to parse output, etc. - match run_script("check hardware support", "jupiter-check-support", &[""]).await { - Ok(value) => { value }, - Err(_) => { false } - } + run_script("check hardware support", "jupiter-check-support", &[""]) + .await + .unwrap_or(false) } async fn read_als_calibration(&self) -> f32 { @@ -281,218 +333,82 @@ impl SMManager { &[""], ) .await; - let mut value: f32 = -1.0; match result { - Ok(as_string) => value = as_string.trim().parse().unwrap(), - Err(message) => println!("Unable to run als calibration script : {}", message), + Ok(as_string) => as_string.trim().parse().unwrap_or(-1.0), + Err(message) => { + error!("Unable to run als calibration script: {}", message); + -1.0 + } } - - value } async fn update_bios(&self) -> bool { // Update the bios as needed // Return true if the script was successful (though that might mean no update was needed), false otherwise - match run_script( + run_script( "update bios", "/usr/bin/steamos-potlkit-helpers/jupiter-biosupdate", &["--auto"], ) - .await { - Ok(value) => { value }, - Err(_) => { false } - } + .await + .unwrap_or(false) } async fn update_dock(&self) -> bool { // Update the dock firmware as needed // Retur true if successful, false otherwise - match run_script( + run_script( "update dock firmware", "/usr/bin/steamos-polkit-helpers/jupiter-dock-updater", &[""], ) - .await { - Ok(value) => { value }, - Err(_) => { false } - } + .await + .unwrap_or(false) } async fn trim_devices(&self) -> bool { // Run steamos-trim-devices script // return true on success, false otherwise - match run_script( + run_script( "trim devices", "/usr/bin/steamos-polkit-helpers/steamos-trim-devices", &[""], ) - .await { - Ok(value) => { value }, - Err(_) => { false } - } + .await + .unwrap_or(false) } async fn format_sdcard(&self) -> bool { // Run steamos-format-sdcard script // return true on success, false otherwise - match run_script( + run_script( "format sdcard", "/usr/bin/steamos-polkit-helpers/steamos-format-sdcard", &[""], ) - .await { - Ok(value) => { value }, - Err(_) => { false } - } + .await + .unwrap_or(false) } async fn set_gpu_performance_level(&self, level: i32) -> bool { - // Set given level to sysfs path /sys/class/drm/card0/device/power_dpm_force_performance_level - // Levels are defined below - // return true if able to write, false otherwise or if level is out of range, etc. - let levels = ["auto", "low", "high", "manual", "peak_performance"]; - if level < 0 || level >= levels.len() as i32 { - return false; - } - - // Open sysfs file - let result = - File::create("/sys/class/drm/card0/device/power_dpm_force_performance_level").await; - let mut myfile; - match result { - Ok(f) => myfile = f, - Err(message) => { - println!("Error opening sysfs file for writing {message}"); - return false; - } - }; - - // write value - let result = myfile.write_all(levels[level as usize].as_bytes()).await; - match result { - Ok(_worked) => true, - Err(message) => { - println!("Error writing to sysfs file {message}"); - false - } - } + set_gpu_performance_level(level).await.is_ok() } async fn set_gpu_clocks(&self, clocks: i32) -> bool { - // Set gpu clocks to given value valid between 200 - 1600 - // Only used when Gpu Performance Level is manual, but write whenever called. - // Writes value to /sys/class/drm/card0/device/pp_od_clk_voltage - if !(200..=1600).contains(&clocks) { - return false; - } - - let result = File::create("/sys/class/drm/card0/device/pp_od_clk_voltage").await; - let mut myfile; - match result { - Ok(f) => myfile = f, - Err(message) => { - println!("Error opening sysfs file for writing {message}"); - return false; - } - }; - - // write value - let data = format!("s 0 {clocks}\n"); - let result = myfile.write(data.as_bytes()).await; - match result { - Ok(_worked) => { - let data = format!("s 1 {clocks}\n"); - let result = myfile.write(data.as_bytes()).await; - match result { - Ok(_worked) => { - let result = myfile.write("c\n".as_bytes()).await; - match result { - Ok(_worked) => true, - Err(message) => { - println!("Error writing to sysfs file {message}"); - false - } - } - } - Err(message) => { - println!("Error writing to sysfs file {message}"); - false - } - } - } - Err(message) => { - println!("Error writing to sysfs file {message}"); - false - } - } + set_gpu_clocks(clocks).await.is_ok() } async fn set_tdp_limit(&self, limit: i32) -> bool { - // Set TDP limit given if within range (3-15) - // Returns false on error or out of range - // Writes value to /sys/class/hwmon/hwmon5/power[12]_cap - if !(3..=15).contains(&limit) { - return false; - } - - let result = File::create("/sys/class/hwmon/hwmon5/power1_cap").await; - let mut power1file; - match result { - Ok(f) => power1file = f, - Err(message) => { - println!("Error opening sysfs power1_cap file for writing TDP limits {message}"); - return false; - } - }; - - let result = File::create("/sys/class/hwmon/hwmon5/power2_cap").await; - let mut power2file; - match result { - Ok(f) => power2file = f, - Err(message) => { - println!("Error opening sysfs power2_cap file for wtriting TDP limits {message}"); - return false; - } - }; - - // Now write the value * 1,000,000 - let data = format!("{limit}000000"); - let result = power1file.write(data.as_bytes()).await; - match result { - Ok(_worked) => { - let result = power2file.write(data.as_bytes()).await; - match result { - Ok(_worked) => true, - Err(message) => { - println!("Error writing to power2_cap file: {message}"); - false - } - } - } - Err(message) => { - println!("Error writing to power1_cap file: {message}"); - false - } - } + set_tdp_limit(limit).await.is_ok() } - async fn get_als_integration_time_file_descriptor( - &self, - ) -> Result { + async fn get_als_integration_time_file_descriptor(&self) -> Result { // Get the file descriptor for the als integration time sysfs path - // /sys/devices/platform/AMDI0010:00/i2c-0/i2c-PRP0001:01/iio:device0/in_illuminance_integration_time - // Return -1 on error - let result = File::create("/sys/devices/platform/AMDI0010:00/i2c-0/i2c-PRP0001:01/iio:device0/in_illuminance_integration_time").await; + let result = File::create(ALS_INTEGRATION_PATH).await; match result { - Ok(f) => { - let raw = f.into_std().await.into_raw_fd(); - unsafe { - let fd: OwnedFd = OwnedFd::from_raw_fd(raw); - Ok(fd) - } - } + Ok(f) => Ok(Fd::Owned(std::os::fd::OwnedFd::from(f.into_std().await))), Err(message) => { - println!("Error opening sysfs file for giving file descriptor {message}"); + error!("Error opening sysfs file for giving file descriptor: {message}"); Err(zbus::fdo::Error::IOError(message.to_string())) } } @@ -513,105 +429,90 @@ impl SMManager { Ok(WifiDebugMode::Off) => { // If mode is 0 disable wifi debug mode // Stop any existing trace and flush to disk. - match stop_tracing(self.should_trace).await { - Ok(result) => { - if result { - // Stop_tracing was successful - match setup_iwd_config(false).await { - Ok(_) => { - // setup_iwd_config false worked - match restart_iwd().await { - Ok(value) => { - if value { - // restart iwd worked - self.wifi_debug_mode = WifiDebugMode::Off; - } else { - // restart_iwd failed - println!("restart_iwd failed somehow, check log above"); - return false; - } - }, - Err(message) => { - println!("restart_iwd got an error {message}"); - return false; - } - } - }, - Err(message) => { - println!("setup_iwd_config false got an error somehow {message}"); - return false; - } - } - } else { - println!("stop_tracing command failed somehow, bailing"); - return false; - - } - }, + let result = match stop_tracing(self.should_trace).await { + Ok(result) => result, Err(message) => { - println!("stop_tracing command had an error {message}"); + error!("stop_tracing command got an error: {message}"); return false; } + }; + if !result { + error!("stop_tracing command returned non-zero"); + return false; } - }, + // Stop_tracing was successful + if let Err(message) = setup_iwd_config(false).await { + error!("setup_iwd_config false got an error: {message}"); + return false; + } + // setup_iwd_config false worked + let value = match restart_iwd().await { + Ok(value) => value, + Err(message) => { + error!("restart_iwd got an error: {message}"); + return false; + } + }; + if value { + // restart iwd worked + self.wifi_debug_mode = WifiDebugMode::Off; + } else { + // restart_iwd failed + error!("restart_iwd failed, check log above"); + return false; + } + } Ok(WifiDebugMode::On) => { // If mode is 1 enable wifi debug mode if buffer_size < MIN_BUFFER_SIZE { return false; } - match setup_iwd_config(true).await { - Ok(_) => { - // setup_iwd_config worked - match restart_iwd().await { - Ok(value) => { - if value { - // restart_iwd worked - match start_tracing(buffer_size, self.should_trace).await { - Ok(value) => { - if value { - // start_tracing worked - self.wifi_debug_mode = WifiDebugMode::On; - } else { - // start_tracing failed - println!("start_tracing failed somehow"); - return false; - } - }, - Err(message) => { - println!("start_tracing got an error {message}"); - return false; - } - } - } else { - println!("restart_iwd failed somehow"); - return false; - } - }, - Err(message) => { - println!("restart_iwd got an error {message}"); - return false; - } - } - }, + if let Err(message) = setup_iwd_config(true).await { + error!("setup_iwd_config true got an error: {message}"); + return false; + } + // setup_iwd_config worked + let value = match restart_iwd().await { + Ok(value) => value, Err(message) => { - println!("setup_iwd_config true got an error somehow {message}"); + error!("restart_iwd got an error: {message}"); return false; } + }; + if !value { + error!("restart_iwd failed"); + return false; } - }, + // restart_iwd worked + let value = match start_tracing(buffer_size, self.should_trace).await { + Ok(value) => value, + Err(message) => { + error!("start_tracing got an error: {message}"); + return false; + } + }; + if value { + // start_tracing worked + self.wifi_debug_mode = WifiDebugMode::On; + } else { + // start_tracing failed + error!("start_tracing failed"); + return false; + } + } Err(_) => { // Invalid mode requested, more coming later, but add this catch-all for now - println!("Invalid wifi debug mode {mode} requested"); + warn!("Invalid wifi debug mode {mode} requested"); return false; - }, + } } true } /// A version property. - #[dbus_interface(property)] + #[zbus(property)] async fn version(&self) -> u32 { SMManager::API_VERSION }