mount jetstream as a userspace character device on linux

excuse: init

authored by oppi.li and committed by oppi.li 60523c09

+1
.gitignore
···
··· 1 + /target
+1545
Cargo.lock
···
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "addr2line" 7 + version = "0.24.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.1" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 + 20 + [[package]] 21 + name = "aho-corasick" 22 + version = "1.1.3" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 + dependencies = [ 26 + "memchr", 27 + ] 28 + 29 + [[package]] 30 + name = "anstream" 31 + version = "0.6.20" 32 + source = "registry+https://github.com/rust-lang/crates.io-index" 33 + checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" 34 + dependencies = [ 35 + "anstyle", 36 + "anstyle-parse", 37 + "anstyle-query", 38 + "anstyle-wincon", 39 + "colorchoice", 40 + "is_terminal_polyfill", 41 + "utf8parse", 42 + ] 43 + 44 + [[package]] 45 + name = "anstyle" 46 + version = "1.0.11" 47 + source = "registry+https://github.com/rust-lang/crates.io-index" 48 + checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" 49 + 50 + [[package]] 51 + name = "anstyle-parse" 52 + version = "0.2.7" 53 + source = "registry+https://github.com/rust-lang/crates.io-index" 54 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 55 + dependencies = [ 56 + "utf8parse", 57 + ] 58 + 59 + [[package]] 60 + name = "anstyle-query" 61 + version = "1.1.4" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 64 + dependencies = [ 65 + "windows-sys 0.60.2", 66 + ] 67 + 68 + [[package]] 69 + name = "anstyle-wincon" 70 + version = "3.0.10" 71 + source = "registry+https://github.com/rust-lang/crates.io-index" 72 + checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 73 + dependencies = [ 74 + "anstyle", 75 + "once_cell_polyfill", 76 + "windows-sys 0.60.2", 77 + ] 78 + 79 + [[package]] 80 + name = "autocfg" 81 + version = "1.5.0" 82 + source = "registry+https://github.com/rust-lang/crates.io-index" 83 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 84 + 85 + [[package]] 86 + name = "backtrace" 87 + version = "0.3.75" 88 + source = "registry+https://github.com/rust-lang/crates.io-index" 89 + checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 90 + dependencies = [ 91 + "addr2line", 92 + "cfg-if", 93 + "libc", 94 + "miniz_oxide", 95 + "object", 96 + "rustc-demangle", 97 + "windows-targets 0.52.6", 98 + ] 99 + 100 + [[package]] 101 + name = "bitflags" 102 + version = "2.9.4" 103 + source = "registry+https://github.com/rust-lang/crates.io-index" 104 + checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 105 + 106 + [[package]] 107 + name = "block-buffer" 108 + version = "0.10.4" 109 + source = "registry+https://github.com/rust-lang/crates.io-index" 110 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 111 + dependencies = [ 112 + "generic-array", 113 + ] 114 + 115 + [[package]] 116 + name = "byteorder" 117 + version = "1.5.0" 118 + source = "registry+https://github.com/rust-lang/crates.io-index" 119 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 120 + 121 + [[package]] 122 + name = "bytes" 123 + version = "1.10.1" 124 + source = "registry+https://github.com/rust-lang/crates.io-index" 125 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 126 + 127 + [[package]] 128 + name = "cc" 129 + version = "1.2.34" 130 + source = "registry+https://github.com/rust-lang/crates.io-index" 131 + checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" 132 + dependencies = [ 133 + "shlex", 134 + ] 135 + 136 + [[package]] 137 + name = "cfg-if" 138 + version = "1.0.3" 139 + source = "registry+https://github.com/rust-lang/crates.io-index" 140 + checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 141 + 142 + [[package]] 143 + name = "cfg_aliases" 144 + version = "0.2.1" 145 + source = "registry+https://github.com/rust-lang/crates.io-index" 146 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 147 + 148 + [[package]] 149 + name = "colorchoice" 150 + version = "1.0.4" 151 + source = "registry+https://github.com/rust-lang/crates.io-index" 152 + checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 153 + 154 + [[package]] 155 + name = "core-foundation" 156 + version = "0.9.4" 157 + source = "registry+https://github.com/rust-lang/crates.io-index" 158 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 159 + dependencies = [ 160 + "core-foundation-sys", 161 + "libc", 162 + ] 163 + 164 + [[package]] 165 + name = "core-foundation-sys" 166 + version = "0.8.7" 167 + source = "registry+https://github.com/rust-lang/crates.io-index" 168 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 169 + 170 + [[package]] 171 + name = "cpufeatures" 172 + version = "0.2.17" 173 + source = "registry+https://github.com/rust-lang/crates.io-index" 174 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 175 + dependencies = [ 176 + "libc", 177 + ] 178 + 179 + [[package]] 180 + name = "crypto-common" 181 + version = "0.1.6" 182 + source = "registry+https://github.com/rust-lang/crates.io-index" 183 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 184 + dependencies = [ 185 + "generic-array", 186 + "typenum", 187 + ] 188 + 189 + [[package]] 190 + name = "data-encoding" 191 + version = "2.9.0" 192 + source = "registry+https://github.com/rust-lang/crates.io-index" 193 + checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 194 + 195 + [[package]] 196 + name = "digest" 197 + version = "0.10.7" 198 + source = "registry+https://github.com/rust-lang/crates.io-index" 199 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 200 + dependencies = [ 201 + "block-buffer", 202 + "crypto-common", 203 + ] 204 + 205 + [[package]] 206 + name = "displaydoc" 207 + version = "0.2.5" 208 + source = "registry+https://github.com/rust-lang/crates.io-index" 209 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 210 + dependencies = [ 211 + "proc-macro2", 212 + "quote", 213 + "syn", 214 + ] 215 + 216 + [[package]] 217 + name = "env_filter" 218 + version = "0.1.3" 219 + source = "registry+https://github.com/rust-lang/crates.io-index" 220 + checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" 221 + dependencies = [ 222 + "log", 223 + "regex", 224 + ] 225 + 226 + [[package]] 227 + name = "env_logger" 228 + version = "0.11.8" 229 + source = "registry+https://github.com/rust-lang/crates.io-index" 230 + checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 231 + dependencies = [ 232 + "anstream", 233 + "anstyle", 234 + "env_filter", 235 + "jiff", 236 + "log", 237 + ] 238 + 239 + [[package]] 240 + name = "errno" 241 + version = "0.3.13" 242 + source = "registry+https://github.com/rust-lang/crates.io-index" 243 + checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 244 + dependencies = [ 245 + "libc", 246 + "windows-sys 0.59.0", 247 + ] 248 + 249 + [[package]] 250 + name = "excuse" 251 + version = "0.1.0" 252 + dependencies = [ 253 + "env_logger", 254 + "fuser", 255 + "futures-util", 256 + "libc", 257 + "log", 258 + "tokio", 259 + "tokio-tungstenite", 260 + ] 261 + 262 + [[package]] 263 + name = "fastrand" 264 + version = "2.3.0" 265 + source = "registry+https://github.com/rust-lang/crates.io-index" 266 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 267 + 268 + [[package]] 269 + name = "fnv" 270 + version = "1.0.7" 271 + source = "registry+https://github.com/rust-lang/crates.io-index" 272 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 273 + 274 + [[package]] 275 + name = "foreign-types" 276 + version = "0.3.2" 277 + source = "registry+https://github.com/rust-lang/crates.io-index" 278 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 279 + dependencies = [ 280 + "foreign-types-shared", 281 + ] 282 + 283 + [[package]] 284 + name = "foreign-types-shared" 285 + version = "0.1.1" 286 + source = "registry+https://github.com/rust-lang/crates.io-index" 287 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 288 + 289 + [[package]] 290 + name = "form_urlencoded" 291 + version = "1.2.2" 292 + source = "registry+https://github.com/rust-lang/crates.io-index" 293 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 294 + dependencies = [ 295 + "percent-encoding", 296 + ] 297 + 298 + [[package]] 299 + name = "fuser" 300 + version = "0.15.1" 301 + source = "git+https://github.com/Haoyu-Xiao/fuser#a0d28df7eb7cff47d5c04cf86aa356936a9a6a86" 302 + dependencies = [ 303 + "libc", 304 + "log", 305 + "memchr", 306 + "nix", 307 + "page_size", 308 + "pkg-config", 309 + "smallvec", 310 + "zerocopy", 311 + ] 312 + 313 + [[package]] 314 + name = "futures-core" 315 + version = "0.3.31" 316 + source = "registry+https://github.com/rust-lang/crates.io-index" 317 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 318 + 319 + [[package]] 320 + name = "futures-macro" 321 + version = "0.3.31" 322 + source = "registry+https://github.com/rust-lang/crates.io-index" 323 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 324 + dependencies = [ 325 + "proc-macro2", 326 + "quote", 327 + "syn", 328 + ] 329 + 330 + [[package]] 331 + name = "futures-sink" 332 + version = "0.3.31" 333 + source = "registry+https://github.com/rust-lang/crates.io-index" 334 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 335 + 336 + [[package]] 337 + name = "futures-task" 338 + version = "0.3.31" 339 + source = "registry+https://github.com/rust-lang/crates.io-index" 340 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 341 + 342 + [[package]] 343 + name = "futures-util" 344 + version = "0.3.31" 345 + source = "registry+https://github.com/rust-lang/crates.io-index" 346 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 347 + dependencies = [ 348 + "futures-core", 349 + "futures-macro", 350 + "futures-sink", 351 + "futures-task", 352 + "pin-project-lite", 353 + "pin-utils", 354 + "slab", 355 + ] 356 + 357 + [[package]] 358 + name = "generic-array" 359 + version = "0.14.7" 360 + source = "registry+https://github.com/rust-lang/crates.io-index" 361 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 362 + dependencies = [ 363 + "typenum", 364 + "version_check", 365 + ] 366 + 367 + [[package]] 368 + name = "getrandom" 369 + version = "0.2.16" 370 + source = "registry+https://github.com/rust-lang/crates.io-index" 371 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 372 + dependencies = [ 373 + "cfg-if", 374 + "libc", 375 + "wasi 0.11.1+wasi-snapshot-preview1", 376 + ] 377 + 378 + [[package]] 379 + name = "getrandom" 380 + version = "0.3.3" 381 + source = "registry+https://github.com/rust-lang/crates.io-index" 382 + checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 383 + dependencies = [ 384 + "cfg-if", 385 + "libc", 386 + "r-efi", 387 + "wasi 0.14.7+wasi-0.2.4", 388 + ] 389 + 390 + [[package]] 391 + name = "gimli" 392 + version = "0.31.1" 393 + source = "registry+https://github.com/rust-lang/crates.io-index" 394 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 395 + 396 + [[package]] 397 + name = "http" 398 + version = "0.2.12" 399 + source = "registry+https://github.com/rust-lang/crates.io-index" 400 + checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 401 + dependencies = [ 402 + "bytes", 403 + "fnv", 404 + "itoa", 405 + ] 406 + 407 + [[package]] 408 + name = "httparse" 409 + version = "1.10.1" 410 + source = "registry+https://github.com/rust-lang/crates.io-index" 411 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 412 + 413 + [[package]] 414 + name = "icu_collections" 415 + version = "2.0.0" 416 + source = "registry+https://github.com/rust-lang/crates.io-index" 417 + checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 418 + dependencies = [ 419 + "displaydoc", 420 + "potential_utf", 421 + "yoke", 422 + "zerofrom", 423 + "zerovec", 424 + ] 425 + 426 + [[package]] 427 + name = "icu_locale_core" 428 + version = "2.0.0" 429 + source = "registry+https://github.com/rust-lang/crates.io-index" 430 + checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 431 + dependencies = [ 432 + "displaydoc", 433 + "litemap", 434 + "tinystr", 435 + "writeable", 436 + "zerovec", 437 + ] 438 + 439 + [[package]] 440 + name = "icu_normalizer" 441 + version = "2.0.0" 442 + source = "registry+https://github.com/rust-lang/crates.io-index" 443 + checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 444 + dependencies = [ 445 + "displaydoc", 446 + "icu_collections", 447 + "icu_normalizer_data", 448 + "icu_properties", 449 + "icu_provider", 450 + "smallvec", 451 + "zerovec", 452 + ] 453 + 454 + [[package]] 455 + name = "icu_normalizer_data" 456 + version = "2.0.0" 457 + source = "registry+https://github.com/rust-lang/crates.io-index" 458 + checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 459 + 460 + [[package]] 461 + name = "icu_properties" 462 + version = "2.0.1" 463 + source = "registry+https://github.com/rust-lang/crates.io-index" 464 + checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 465 + dependencies = [ 466 + "displaydoc", 467 + "icu_collections", 468 + "icu_locale_core", 469 + "icu_properties_data", 470 + "icu_provider", 471 + "potential_utf", 472 + "zerotrie", 473 + "zerovec", 474 + ] 475 + 476 + [[package]] 477 + name = "icu_properties_data" 478 + version = "2.0.1" 479 + source = "registry+https://github.com/rust-lang/crates.io-index" 480 + checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 481 + 482 + [[package]] 483 + name = "icu_provider" 484 + version = "2.0.0" 485 + source = "registry+https://github.com/rust-lang/crates.io-index" 486 + checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 487 + dependencies = [ 488 + "displaydoc", 489 + "icu_locale_core", 490 + "stable_deref_trait", 491 + "tinystr", 492 + "writeable", 493 + "yoke", 494 + "zerofrom", 495 + "zerotrie", 496 + "zerovec", 497 + ] 498 + 499 + [[package]] 500 + name = "idna" 501 + version = "1.1.0" 502 + source = "registry+https://github.com/rust-lang/crates.io-index" 503 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 504 + dependencies = [ 505 + "idna_adapter", 506 + "smallvec", 507 + "utf8_iter", 508 + ] 509 + 510 + [[package]] 511 + name = "idna_adapter" 512 + version = "1.2.1" 513 + source = "registry+https://github.com/rust-lang/crates.io-index" 514 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 515 + dependencies = [ 516 + "icu_normalizer", 517 + "icu_properties", 518 + ] 519 + 520 + [[package]] 521 + name = "io-uring" 522 + version = "0.7.10" 523 + source = "registry+https://github.com/rust-lang/crates.io-index" 524 + checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 525 + dependencies = [ 526 + "bitflags", 527 + "cfg-if", 528 + "libc", 529 + ] 530 + 531 + [[package]] 532 + name = "is_terminal_polyfill" 533 + version = "1.70.1" 534 + source = "registry+https://github.com/rust-lang/crates.io-index" 535 + checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 536 + 537 + [[package]] 538 + name = "itoa" 539 + version = "1.0.15" 540 + source = "registry+https://github.com/rust-lang/crates.io-index" 541 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 542 + 543 + [[package]] 544 + name = "jiff" 545 + version = "0.2.15" 546 + source = "registry+https://github.com/rust-lang/crates.io-index" 547 + checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" 548 + dependencies = [ 549 + "jiff-static", 550 + "log", 551 + "portable-atomic", 552 + "portable-atomic-util", 553 + "serde", 554 + ] 555 + 556 + [[package]] 557 + name = "jiff-static" 558 + version = "0.2.15" 559 + source = "registry+https://github.com/rust-lang/crates.io-index" 560 + checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" 561 + dependencies = [ 562 + "proc-macro2", 563 + "quote", 564 + "syn", 565 + ] 566 + 567 + [[package]] 568 + name = "libc" 569 + version = "0.2.175" 570 + source = "registry+https://github.com/rust-lang/crates.io-index" 571 + checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 572 + 573 + [[package]] 574 + name = "linux-raw-sys" 575 + version = "0.9.4" 576 + source = "registry+https://github.com/rust-lang/crates.io-index" 577 + checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 578 + 579 + [[package]] 580 + name = "litemap" 581 + version = "0.8.0" 582 + source = "registry+https://github.com/rust-lang/crates.io-index" 583 + checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 584 + 585 + [[package]] 586 + name = "lock_api" 587 + version = "0.4.13" 588 + source = "registry+https://github.com/rust-lang/crates.io-index" 589 + checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 590 + dependencies = [ 591 + "autocfg", 592 + "scopeguard", 593 + ] 594 + 595 + [[package]] 596 + name = "log" 597 + version = "0.4.28" 598 + source = "registry+https://github.com/rust-lang/crates.io-index" 599 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 600 + 601 + [[package]] 602 + name = "memchr" 603 + version = "2.7.5" 604 + source = "registry+https://github.com/rust-lang/crates.io-index" 605 + checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 606 + 607 + [[package]] 608 + name = "miniz_oxide" 609 + version = "0.8.9" 610 + source = "registry+https://github.com/rust-lang/crates.io-index" 611 + checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 612 + dependencies = [ 613 + "adler2", 614 + ] 615 + 616 + [[package]] 617 + name = "mio" 618 + version = "1.0.4" 619 + source = "registry+https://github.com/rust-lang/crates.io-index" 620 + checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 621 + dependencies = [ 622 + "libc", 623 + "wasi 0.11.1+wasi-snapshot-preview1", 624 + "windows-sys 0.59.0", 625 + ] 626 + 627 + [[package]] 628 + name = "native-tls" 629 + version = "0.2.14" 630 + source = "registry+https://github.com/rust-lang/crates.io-index" 631 + checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 632 + dependencies = [ 633 + "libc", 634 + "log", 635 + "openssl", 636 + "openssl-probe", 637 + "openssl-sys", 638 + "schannel", 639 + "security-framework", 640 + "security-framework-sys", 641 + "tempfile", 642 + ] 643 + 644 + [[package]] 645 + name = "nix" 646 + version = "0.29.0" 647 + source = "registry+https://github.com/rust-lang/crates.io-index" 648 + checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 649 + dependencies = [ 650 + "bitflags", 651 + "cfg-if", 652 + "cfg_aliases", 653 + "libc", 654 + ] 655 + 656 + [[package]] 657 + name = "object" 658 + version = "0.36.7" 659 + source = "registry+https://github.com/rust-lang/crates.io-index" 660 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 661 + dependencies = [ 662 + "memchr", 663 + ] 664 + 665 + [[package]] 666 + name = "once_cell" 667 + version = "1.21.3" 668 + source = "registry+https://github.com/rust-lang/crates.io-index" 669 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 670 + 671 + [[package]] 672 + name = "once_cell_polyfill" 673 + version = "1.70.1" 674 + source = "registry+https://github.com/rust-lang/crates.io-index" 675 + checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 676 + 677 + [[package]] 678 + name = "openssl" 679 + version = "0.10.73" 680 + source = "registry+https://github.com/rust-lang/crates.io-index" 681 + checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 682 + dependencies = [ 683 + "bitflags", 684 + "cfg-if", 685 + "foreign-types", 686 + "libc", 687 + "once_cell", 688 + "openssl-macros", 689 + "openssl-sys", 690 + ] 691 + 692 + [[package]] 693 + name = "openssl-macros" 694 + version = "0.1.1" 695 + source = "registry+https://github.com/rust-lang/crates.io-index" 696 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 697 + dependencies = [ 698 + "proc-macro2", 699 + "quote", 700 + "syn", 701 + ] 702 + 703 + [[package]] 704 + name = "openssl-probe" 705 + version = "0.1.6" 706 + source = "registry+https://github.com/rust-lang/crates.io-index" 707 + checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 708 + 709 + [[package]] 710 + name = "openssl-sys" 711 + version = "0.9.109" 712 + source = "registry+https://github.com/rust-lang/crates.io-index" 713 + checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 714 + dependencies = [ 715 + "cc", 716 + "libc", 717 + "pkg-config", 718 + "vcpkg", 719 + ] 720 + 721 + [[package]] 722 + name = "page_size" 723 + version = "0.6.0" 724 + source = "registry+https://github.com/rust-lang/crates.io-index" 725 + checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" 726 + dependencies = [ 727 + "libc", 728 + "winapi", 729 + ] 730 + 731 + [[package]] 732 + name = "parking_lot" 733 + version = "0.12.4" 734 + source = "registry+https://github.com/rust-lang/crates.io-index" 735 + checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 736 + dependencies = [ 737 + "lock_api", 738 + "parking_lot_core", 739 + ] 740 + 741 + [[package]] 742 + name = "parking_lot_core" 743 + version = "0.9.11" 744 + source = "registry+https://github.com/rust-lang/crates.io-index" 745 + checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 746 + dependencies = [ 747 + "cfg-if", 748 + "libc", 749 + "redox_syscall", 750 + "smallvec", 751 + "windows-targets 0.52.6", 752 + ] 753 + 754 + [[package]] 755 + name = "percent-encoding" 756 + version = "2.3.2" 757 + source = "registry+https://github.com/rust-lang/crates.io-index" 758 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 759 + 760 + [[package]] 761 + name = "pin-project-lite" 762 + version = "0.2.16" 763 + source = "registry+https://github.com/rust-lang/crates.io-index" 764 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 765 + 766 + [[package]] 767 + name = "pin-utils" 768 + version = "0.1.0" 769 + source = "registry+https://github.com/rust-lang/crates.io-index" 770 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 771 + 772 + [[package]] 773 + name = "pkg-config" 774 + version = "0.3.32" 775 + source = "registry+https://github.com/rust-lang/crates.io-index" 776 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 777 + 778 + [[package]] 779 + name = "portable-atomic" 780 + version = "1.11.1" 781 + source = "registry+https://github.com/rust-lang/crates.io-index" 782 + checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 783 + 784 + [[package]] 785 + name = "portable-atomic-util" 786 + version = "0.2.4" 787 + source = "registry+https://github.com/rust-lang/crates.io-index" 788 + checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 789 + dependencies = [ 790 + "portable-atomic", 791 + ] 792 + 793 + [[package]] 794 + name = "potential_utf" 795 + version = "0.1.3" 796 + source = "registry+https://github.com/rust-lang/crates.io-index" 797 + checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 798 + dependencies = [ 799 + "zerovec", 800 + ] 801 + 802 + [[package]] 803 + name = "ppv-lite86" 804 + version = "0.2.21" 805 + source = "registry+https://github.com/rust-lang/crates.io-index" 806 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 807 + dependencies = [ 808 + "zerocopy", 809 + ] 810 + 811 + [[package]] 812 + name = "proc-macro2" 813 + version = "1.0.101" 814 + source = "registry+https://github.com/rust-lang/crates.io-index" 815 + checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 816 + dependencies = [ 817 + "unicode-ident", 818 + ] 819 + 820 + [[package]] 821 + name = "quote" 822 + version = "1.0.40" 823 + source = "registry+https://github.com/rust-lang/crates.io-index" 824 + checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 825 + dependencies = [ 826 + "proc-macro2", 827 + ] 828 + 829 + [[package]] 830 + name = "r-efi" 831 + version = "5.3.0" 832 + source = "registry+https://github.com/rust-lang/crates.io-index" 833 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 834 + 835 + [[package]] 836 + name = "rand" 837 + version = "0.8.5" 838 + source = "registry+https://github.com/rust-lang/crates.io-index" 839 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 840 + dependencies = [ 841 + "libc", 842 + "rand_chacha", 843 + "rand_core", 844 + ] 845 + 846 + [[package]] 847 + name = "rand_chacha" 848 + version = "0.3.1" 849 + source = "registry+https://github.com/rust-lang/crates.io-index" 850 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 851 + dependencies = [ 852 + "ppv-lite86", 853 + "rand_core", 854 + ] 855 + 856 + [[package]] 857 + name = "rand_core" 858 + version = "0.6.4" 859 + source = "registry+https://github.com/rust-lang/crates.io-index" 860 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 861 + dependencies = [ 862 + "getrandom 0.2.16", 863 + ] 864 + 865 + [[package]] 866 + name = "redox_syscall" 867 + version = "0.5.17" 868 + source = "registry+https://github.com/rust-lang/crates.io-index" 869 + checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 870 + dependencies = [ 871 + "bitflags", 872 + ] 873 + 874 + [[package]] 875 + name = "regex" 876 + version = "1.11.2" 877 + source = "registry+https://github.com/rust-lang/crates.io-index" 878 + checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" 879 + dependencies = [ 880 + "aho-corasick", 881 + "memchr", 882 + "regex-automata", 883 + "regex-syntax", 884 + ] 885 + 886 + [[package]] 887 + name = "regex-automata" 888 + version = "0.4.10" 889 + source = "registry+https://github.com/rust-lang/crates.io-index" 890 + checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" 891 + dependencies = [ 892 + "aho-corasick", 893 + "memchr", 894 + "regex-syntax", 895 + ] 896 + 897 + [[package]] 898 + name = "regex-syntax" 899 + version = "0.8.6" 900 + source = "registry+https://github.com/rust-lang/crates.io-index" 901 + checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" 902 + 903 + [[package]] 904 + name = "rustc-demangle" 905 + version = "0.1.26" 906 + source = "registry+https://github.com/rust-lang/crates.io-index" 907 + checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 908 + 909 + [[package]] 910 + name = "rustix" 911 + version = "1.0.8" 912 + source = "registry+https://github.com/rust-lang/crates.io-index" 913 + checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 914 + dependencies = [ 915 + "bitflags", 916 + "errno", 917 + "libc", 918 + "linux-raw-sys", 919 + "windows-sys 0.59.0", 920 + ] 921 + 922 + [[package]] 923 + name = "schannel" 924 + version = "0.1.27" 925 + source = "registry+https://github.com/rust-lang/crates.io-index" 926 + checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 927 + dependencies = [ 928 + "windows-sys 0.59.0", 929 + ] 930 + 931 + [[package]] 932 + name = "scopeguard" 933 + version = "1.2.0" 934 + source = "registry+https://github.com/rust-lang/crates.io-index" 935 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 936 + 937 + [[package]] 938 + name = "security-framework" 939 + version = "2.11.1" 940 + source = "registry+https://github.com/rust-lang/crates.io-index" 941 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 942 + dependencies = [ 943 + "bitflags", 944 + "core-foundation", 945 + "core-foundation-sys", 946 + "libc", 947 + "security-framework-sys", 948 + ] 949 + 950 + [[package]] 951 + name = "security-framework-sys" 952 + version = "2.14.0" 953 + source = "registry+https://github.com/rust-lang/crates.io-index" 954 + checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 955 + dependencies = [ 956 + "core-foundation-sys", 957 + "libc", 958 + ] 959 + 960 + [[package]] 961 + name = "serde" 962 + version = "1.0.225" 963 + source = "registry+https://github.com/rust-lang/crates.io-index" 964 + checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" 965 + dependencies = [ 966 + "serde_core", 967 + "serde_derive", 968 + ] 969 + 970 + [[package]] 971 + name = "serde_core" 972 + version = "1.0.225" 973 + source = "registry+https://github.com/rust-lang/crates.io-index" 974 + checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" 975 + dependencies = [ 976 + "serde_derive", 977 + ] 978 + 979 + [[package]] 980 + name = "serde_derive" 981 + version = "1.0.225" 982 + source = "registry+https://github.com/rust-lang/crates.io-index" 983 + checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" 984 + dependencies = [ 985 + "proc-macro2", 986 + "quote", 987 + "syn", 988 + ] 989 + 990 + [[package]] 991 + name = "sha1" 992 + version = "0.10.6" 993 + source = "registry+https://github.com/rust-lang/crates.io-index" 994 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 995 + dependencies = [ 996 + "cfg-if", 997 + "cpufeatures", 998 + "digest", 999 + ] 1000 + 1001 + [[package]] 1002 + name = "shlex" 1003 + version = "1.3.0" 1004 + source = "registry+https://github.com/rust-lang/crates.io-index" 1005 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1006 + 1007 + [[package]] 1008 + name = "signal-hook-registry" 1009 + version = "1.4.6" 1010 + source = "registry+https://github.com/rust-lang/crates.io-index" 1011 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 1012 + dependencies = [ 1013 + "libc", 1014 + ] 1015 + 1016 + [[package]] 1017 + name = "slab" 1018 + version = "0.4.11" 1019 + source = "registry+https://github.com/rust-lang/crates.io-index" 1020 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 1021 + 1022 + [[package]] 1023 + name = "smallvec" 1024 + version = "1.15.1" 1025 + source = "registry+https://github.com/rust-lang/crates.io-index" 1026 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1027 + 1028 + [[package]] 1029 + name = "socket2" 1030 + version = "0.6.0" 1031 + source = "registry+https://github.com/rust-lang/crates.io-index" 1032 + checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 1033 + dependencies = [ 1034 + "libc", 1035 + "windows-sys 0.59.0", 1036 + ] 1037 + 1038 + [[package]] 1039 + name = "stable_deref_trait" 1040 + version = "1.2.0" 1041 + source = "registry+https://github.com/rust-lang/crates.io-index" 1042 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1043 + 1044 + [[package]] 1045 + name = "syn" 1046 + version = "2.0.106" 1047 + source = "registry+https://github.com/rust-lang/crates.io-index" 1048 + checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 1049 + dependencies = [ 1050 + "proc-macro2", 1051 + "quote", 1052 + "unicode-ident", 1053 + ] 1054 + 1055 + [[package]] 1056 + name = "synstructure" 1057 + version = "0.13.2" 1058 + source = "registry+https://github.com/rust-lang/crates.io-index" 1059 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1060 + dependencies = [ 1061 + "proc-macro2", 1062 + "quote", 1063 + "syn", 1064 + ] 1065 + 1066 + [[package]] 1067 + name = "tempfile" 1068 + version = "3.21.0" 1069 + source = "registry+https://github.com/rust-lang/crates.io-index" 1070 + checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" 1071 + dependencies = [ 1072 + "fastrand", 1073 + "getrandom 0.3.3", 1074 + "once_cell", 1075 + "rustix", 1076 + "windows-sys 0.59.0", 1077 + ] 1078 + 1079 + [[package]] 1080 + name = "thiserror" 1081 + version = "1.0.69" 1082 + source = "registry+https://github.com/rust-lang/crates.io-index" 1083 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1084 + dependencies = [ 1085 + "thiserror-impl", 1086 + ] 1087 + 1088 + [[package]] 1089 + name = "thiserror-impl" 1090 + version = "1.0.69" 1091 + source = "registry+https://github.com/rust-lang/crates.io-index" 1092 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1093 + dependencies = [ 1094 + "proc-macro2", 1095 + "quote", 1096 + "syn", 1097 + ] 1098 + 1099 + [[package]] 1100 + name = "tinystr" 1101 + version = "0.8.1" 1102 + source = "registry+https://github.com/rust-lang/crates.io-index" 1103 + checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 1104 + dependencies = [ 1105 + "displaydoc", 1106 + "zerovec", 1107 + ] 1108 + 1109 + [[package]] 1110 + name = "tokio" 1111 + version = "1.47.1" 1112 + source = "registry+https://github.com/rust-lang/crates.io-index" 1113 + checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 1114 + dependencies = [ 1115 + "backtrace", 1116 + "bytes", 1117 + "io-uring", 1118 + "libc", 1119 + "mio", 1120 + "parking_lot", 1121 + "pin-project-lite", 1122 + "signal-hook-registry", 1123 + "slab", 1124 + "socket2", 1125 + "tokio-macros", 1126 + "windows-sys 0.59.0", 1127 + ] 1128 + 1129 + [[package]] 1130 + name = "tokio-macros" 1131 + version = "2.5.0" 1132 + source = "registry+https://github.com/rust-lang/crates.io-index" 1133 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1134 + dependencies = [ 1135 + "proc-macro2", 1136 + "quote", 1137 + "syn", 1138 + ] 1139 + 1140 + [[package]] 1141 + name = "tokio-native-tls" 1142 + version = "0.3.1" 1143 + source = "registry+https://github.com/rust-lang/crates.io-index" 1144 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1145 + dependencies = [ 1146 + "native-tls", 1147 + "tokio", 1148 + ] 1149 + 1150 + [[package]] 1151 + name = "tokio-tungstenite" 1152 + version = "0.20.1" 1153 + source = "registry+https://github.com/rust-lang/crates.io-index" 1154 + checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" 1155 + dependencies = [ 1156 + "futures-util", 1157 + "log", 1158 + "native-tls", 1159 + "tokio", 1160 + "tokio-native-tls", 1161 + "tungstenite", 1162 + ] 1163 + 1164 + [[package]] 1165 + name = "tungstenite" 1166 + version = "0.20.1" 1167 + source = "registry+https://github.com/rust-lang/crates.io-index" 1168 + checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" 1169 + dependencies = [ 1170 + "byteorder", 1171 + "bytes", 1172 + "data-encoding", 1173 + "http", 1174 + "httparse", 1175 + "log", 1176 + "native-tls", 1177 + "rand", 1178 + "sha1", 1179 + "thiserror", 1180 + "url", 1181 + "utf-8", 1182 + ] 1183 + 1184 + [[package]] 1185 + name = "typenum" 1186 + version = "1.18.0" 1187 + source = "registry+https://github.com/rust-lang/crates.io-index" 1188 + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 1189 + 1190 + [[package]] 1191 + name = "unicode-ident" 1192 + version = "1.0.19" 1193 + source = "registry+https://github.com/rust-lang/crates.io-index" 1194 + checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 1195 + 1196 + [[package]] 1197 + name = "url" 1198 + version = "2.5.7" 1199 + source = "registry+https://github.com/rust-lang/crates.io-index" 1200 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 1201 + dependencies = [ 1202 + "form_urlencoded", 1203 + "idna", 1204 + "percent-encoding", 1205 + "serde", 1206 + ] 1207 + 1208 + [[package]] 1209 + name = "utf-8" 1210 + version = "0.7.6" 1211 + source = "registry+https://github.com/rust-lang/crates.io-index" 1212 + checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1213 + 1214 + [[package]] 1215 + name = "utf8_iter" 1216 + version = "1.0.4" 1217 + source = "registry+https://github.com/rust-lang/crates.io-index" 1218 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1219 + 1220 + [[package]] 1221 + name = "utf8parse" 1222 + version = "0.2.2" 1223 + source = "registry+https://github.com/rust-lang/crates.io-index" 1224 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1225 + 1226 + [[package]] 1227 + name = "vcpkg" 1228 + version = "0.2.15" 1229 + source = "registry+https://github.com/rust-lang/crates.io-index" 1230 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1231 + 1232 + [[package]] 1233 + name = "version_check" 1234 + version = "0.9.5" 1235 + source = "registry+https://github.com/rust-lang/crates.io-index" 1236 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1237 + 1238 + [[package]] 1239 + name = "wasi" 1240 + version = "0.11.1+wasi-snapshot-preview1" 1241 + source = "registry+https://github.com/rust-lang/crates.io-index" 1242 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 1243 + 1244 + [[package]] 1245 + name = "wasi" 1246 + version = "0.14.7+wasi-0.2.4" 1247 + source = "registry+https://github.com/rust-lang/crates.io-index" 1248 + checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" 1249 + dependencies = [ 1250 + "wasip2", 1251 + ] 1252 + 1253 + [[package]] 1254 + name = "wasip2" 1255 + version = "1.0.1+wasi-0.2.4" 1256 + source = "registry+https://github.com/rust-lang/crates.io-index" 1257 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 1258 + dependencies = [ 1259 + "wit-bindgen", 1260 + ] 1261 + 1262 + [[package]] 1263 + name = "winapi" 1264 + version = "0.3.9" 1265 + source = "registry+https://github.com/rust-lang/crates.io-index" 1266 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1267 + dependencies = [ 1268 + "winapi-i686-pc-windows-gnu", 1269 + "winapi-x86_64-pc-windows-gnu", 1270 + ] 1271 + 1272 + [[package]] 1273 + name = "winapi-i686-pc-windows-gnu" 1274 + version = "0.4.0" 1275 + source = "registry+https://github.com/rust-lang/crates.io-index" 1276 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1277 + 1278 + [[package]] 1279 + name = "winapi-x86_64-pc-windows-gnu" 1280 + version = "0.4.0" 1281 + source = "registry+https://github.com/rust-lang/crates.io-index" 1282 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1283 + 1284 + [[package]] 1285 + name = "windows-link" 1286 + version = "0.1.3" 1287 + source = "registry+https://github.com/rust-lang/crates.io-index" 1288 + checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 1289 + 1290 + [[package]] 1291 + name = "windows-sys" 1292 + version = "0.59.0" 1293 + source = "registry+https://github.com/rust-lang/crates.io-index" 1294 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1295 + dependencies = [ 1296 + "windows-targets 0.52.6", 1297 + ] 1298 + 1299 + [[package]] 1300 + name = "windows-sys" 1301 + version = "0.60.2" 1302 + source = "registry+https://github.com/rust-lang/crates.io-index" 1303 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 1304 + dependencies = [ 1305 + "windows-targets 0.53.3", 1306 + ] 1307 + 1308 + [[package]] 1309 + name = "windows-targets" 1310 + version = "0.52.6" 1311 + source = "registry+https://github.com/rust-lang/crates.io-index" 1312 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1313 + dependencies = [ 1314 + "windows_aarch64_gnullvm 0.52.6", 1315 + "windows_aarch64_msvc 0.52.6", 1316 + "windows_i686_gnu 0.52.6", 1317 + "windows_i686_gnullvm 0.52.6", 1318 + "windows_i686_msvc 0.52.6", 1319 + "windows_x86_64_gnu 0.52.6", 1320 + "windows_x86_64_gnullvm 0.52.6", 1321 + "windows_x86_64_msvc 0.52.6", 1322 + ] 1323 + 1324 + [[package]] 1325 + name = "windows-targets" 1326 + version = "0.53.3" 1327 + source = "registry+https://github.com/rust-lang/crates.io-index" 1328 + checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 1329 + dependencies = [ 1330 + "windows-link", 1331 + "windows_aarch64_gnullvm 0.53.0", 1332 + "windows_aarch64_msvc 0.53.0", 1333 + "windows_i686_gnu 0.53.0", 1334 + "windows_i686_gnullvm 0.53.0", 1335 + "windows_i686_msvc 0.53.0", 1336 + "windows_x86_64_gnu 0.53.0", 1337 + "windows_x86_64_gnullvm 0.53.0", 1338 + "windows_x86_64_msvc 0.53.0", 1339 + ] 1340 + 1341 + [[package]] 1342 + name = "windows_aarch64_gnullvm" 1343 + version = "0.52.6" 1344 + source = "registry+https://github.com/rust-lang/crates.io-index" 1345 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1346 + 1347 + [[package]] 1348 + name = "windows_aarch64_gnullvm" 1349 + version = "0.53.0" 1350 + source = "registry+https://github.com/rust-lang/crates.io-index" 1351 + checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 1352 + 1353 + [[package]] 1354 + name = "windows_aarch64_msvc" 1355 + version = "0.52.6" 1356 + source = "registry+https://github.com/rust-lang/crates.io-index" 1357 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1358 + 1359 + [[package]] 1360 + name = "windows_aarch64_msvc" 1361 + version = "0.53.0" 1362 + source = "registry+https://github.com/rust-lang/crates.io-index" 1363 + checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 1364 + 1365 + [[package]] 1366 + name = "windows_i686_gnu" 1367 + version = "0.52.6" 1368 + source = "registry+https://github.com/rust-lang/crates.io-index" 1369 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1370 + 1371 + [[package]] 1372 + name = "windows_i686_gnu" 1373 + version = "0.53.0" 1374 + source = "registry+https://github.com/rust-lang/crates.io-index" 1375 + checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 1376 + 1377 + [[package]] 1378 + name = "windows_i686_gnullvm" 1379 + version = "0.52.6" 1380 + source = "registry+https://github.com/rust-lang/crates.io-index" 1381 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1382 + 1383 + [[package]] 1384 + name = "windows_i686_gnullvm" 1385 + version = "0.53.0" 1386 + source = "registry+https://github.com/rust-lang/crates.io-index" 1387 + checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 1388 + 1389 + [[package]] 1390 + name = "windows_i686_msvc" 1391 + version = "0.52.6" 1392 + source = "registry+https://github.com/rust-lang/crates.io-index" 1393 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1394 + 1395 + [[package]] 1396 + name = "windows_i686_msvc" 1397 + version = "0.53.0" 1398 + source = "registry+https://github.com/rust-lang/crates.io-index" 1399 + checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 1400 + 1401 + [[package]] 1402 + name = "windows_x86_64_gnu" 1403 + version = "0.52.6" 1404 + source = "registry+https://github.com/rust-lang/crates.io-index" 1405 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1406 + 1407 + [[package]] 1408 + name = "windows_x86_64_gnu" 1409 + version = "0.53.0" 1410 + source = "registry+https://github.com/rust-lang/crates.io-index" 1411 + checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 1412 + 1413 + [[package]] 1414 + name = "windows_x86_64_gnullvm" 1415 + version = "0.52.6" 1416 + source = "registry+https://github.com/rust-lang/crates.io-index" 1417 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1418 + 1419 + [[package]] 1420 + name = "windows_x86_64_gnullvm" 1421 + version = "0.53.0" 1422 + source = "registry+https://github.com/rust-lang/crates.io-index" 1423 + checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 1424 + 1425 + [[package]] 1426 + name = "windows_x86_64_msvc" 1427 + version = "0.52.6" 1428 + source = "registry+https://github.com/rust-lang/crates.io-index" 1429 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1430 + 1431 + [[package]] 1432 + name = "windows_x86_64_msvc" 1433 + version = "0.53.0" 1434 + source = "registry+https://github.com/rust-lang/crates.io-index" 1435 + checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 1436 + 1437 + [[package]] 1438 + name = "wit-bindgen" 1439 + version = "0.46.0" 1440 + source = "registry+https://github.com/rust-lang/crates.io-index" 1441 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 1442 + 1443 + [[package]] 1444 + name = "writeable" 1445 + version = "0.6.1" 1446 + source = "registry+https://github.com/rust-lang/crates.io-index" 1447 + checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 1448 + 1449 + [[package]] 1450 + name = "yoke" 1451 + version = "0.8.0" 1452 + source = "registry+https://github.com/rust-lang/crates.io-index" 1453 + checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 1454 + dependencies = [ 1455 + "serde", 1456 + "stable_deref_trait", 1457 + "yoke-derive", 1458 + "zerofrom", 1459 + ] 1460 + 1461 + [[package]] 1462 + name = "yoke-derive" 1463 + version = "0.8.0" 1464 + source = "registry+https://github.com/rust-lang/crates.io-index" 1465 + checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 1466 + dependencies = [ 1467 + "proc-macro2", 1468 + "quote", 1469 + "syn", 1470 + "synstructure", 1471 + ] 1472 + 1473 + [[package]] 1474 + name = "zerocopy" 1475 + version = "0.8.27" 1476 + source = "registry+https://github.com/rust-lang/crates.io-index" 1477 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 1478 + dependencies = [ 1479 + "zerocopy-derive", 1480 + ] 1481 + 1482 + [[package]] 1483 + name = "zerocopy-derive" 1484 + version = "0.8.27" 1485 + source = "registry+https://github.com/rust-lang/crates.io-index" 1486 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 1487 + dependencies = [ 1488 + "proc-macro2", 1489 + "quote", 1490 + "syn", 1491 + ] 1492 + 1493 + [[package]] 1494 + name = "zerofrom" 1495 + version = "0.1.6" 1496 + source = "registry+https://github.com/rust-lang/crates.io-index" 1497 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 1498 + dependencies = [ 1499 + "zerofrom-derive", 1500 + ] 1501 + 1502 + [[package]] 1503 + name = "zerofrom-derive" 1504 + version = "0.1.6" 1505 + source = "registry+https://github.com/rust-lang/crates.io-index" 1506 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 1507 + dependencies = [ 1508 + "proc-macro2", 1509 + "quote", 1510 + "syn", 1511 + "synstructure", 1512 + ] 1513 + 1514 + [[package]] 1515 + name = "zerotrie" 1516 + version = "0.2.2" 1517 + source = "registry+https://github.com/rust-lang/crates.io-index" 1518 + checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 1519 + dependencies = [ 1520 + "displaydoc", 1521 + "yoke", 1522 + "zerofrom", 1523 + ] 1524 + 1525 + [[package]] 1526 + name = "zerovec" 1527 + version = "0.11.4" 1528 + source = "registry+https://github.com/rust-lang/crates.io-index" 1529 + checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 1530 + dependencies = [ 1531 + "yoke", 1532 + "zerofrom", 1533 + "zerovec-derive", 1534 + ] 1535 + 1536 + [[package]] 1537 + name = "zerovec-derive" 1538 + version = "0.11.1" 1539 + source = "registry+https://github.com/rust-lang/crates.io-index" 1540 + checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 1541 + dependencies = [ 1542 + "proc-macro2", 1543 + "quote", 1544 + "syn", 1545 + ]
+13
Cargo.toml
···
··· 1 + [package] 2 + name = "excuse" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + env_logger = "0.11.8" 8 + fuser = { git = "https://github.com/Haoyu-Xiao/fuser", features = ["abi-7-12", "libfuse"] } 9 + libc = "0.2.174" 10 + log = "0.4.28" 11 + tokio = { version = "1.0", features = ["full"] } 12 + tokio-tungstenite = { version = "0.20", features = ["native-tls"] } 13 + futures-util = "0.3"
+20
readme.md
···
··· 1 + # excuse 2 + 3 + mount jetstream as a userspace character device on linux. 4 + 5 + ## usage 6 + 7 + ``` 8 + λ cargo b 9 + λ sudo RUST_LOG=info ./target/debug/excuse 10 + 11 + # -- in another shell -- 12 + λ cat /dev/jetstream | jq 13 + ``` 14 + 15 + ## motivation 16 + 17 + > People who think that userspace filesystems are realistic 18 + > for anything but toys are just misguided 19 + > 20 + > Linus Torvalds
+219
src/main.rs
···
··· 1 + use fuser::{Filesystem, ReplyData}; 2 + use futures_util::StreamExt; 3 + use log::{error, info, warn}; 4 + use std::collections::VecDeque; 5 + use std::process::Command; 6 + use std::sync::{Arc, Mutex}; 7 + use std::thread; 8 + use tokio::sync::oneshot; 9 + use tokio_tungstenite::{connect_async, tungstenite::Message}; 10 + 11 + const DEV: &str = "jetstream"; 12 + 13 + struct CuseDevice { 14 + buffer: Arc<Mutex<VecDeque<u8>>>, 15 + is_running: Arc<Mutex<bool>>, 16 + cancel: Arc<Mutex<Option<oneshot::Sender<()>>>>, 17 + } 18 + 19 + impl CuseDevice { 20 + fn new() -> Self { 21 + Self { 22 + buffer: Arc::new(Mutex::new(VecDeque::new())), 23 + is_running: Arc::new(Mutex::new(false)), 24 + cancel: Arc::new(Mutex::new(None)), 25 + } 26 + } 27 + 28 + fn begin_stream(&self) { 29 + let mut is_running = self.is_running.lock().unwrap(); 30 + if !*is_running { 31 + *is_running = true; 32 + let buffer_clone = Arc::clone(&self.buffer); 33 + let (cancel_tx, cancel_rx) = oneshot::channel(); 34 + 35 + *self.cancel.lock().unwrap() = Some(cancel_tx); 36 + 37 + thread::spawn(move || { 38 + let rt = tokio::runtime::Runtime::new().unwrap(); 39 + rt.block_on(async { 40 + Self::websocket_task(buffer_clone, cancel_rx).await; 41 + }); 42 + }); 43 + info!("started websocket connection thread"); 44 + } 45 + } 46 + 47 + fn end_stream(&self) { 48 + let mut shutdown_tx = self.cancel.lock().unwrap(); 49 + if let Some(tx) = shutdown_tx.take() { 50 + let _ = tx.send(()); 51 + info!("sent shutdown signal to websocket"); 52 + } 53 + *self.is_running.lock().unwrap() = false; 54 + } 55 + 56 + async fn websocket_task( 57 + buffer: Arc<Mutex<VecDeque<u8>>>, 58 + mut shutdown_rx: oneshot::Receiver<()>, 59 + ) { 60 + loop { 61 + info!("connecting to jetstream..."); 62 + match connect_async("wss://jetstream1.us-west.bsky.network/subscribe").await { 63 + Ok((mut ws, _)) => { 64 + info!("connected to jetstream ... "); 65 + 66 + loop { 67 + tokio::select! { 68 + _ = &mut shutdown_rx => { 69 + info!("shutting down ... "); 70 + let _ = ws.close(None).await; 71 + return; 72 + } 73 + 74 + msg = ws.next() => { 75 + match msg { 76 + Some(Ok(Message::Text(text))) => { 77 + let mut buf = buffer.lock().unwrap(); 78 + 79 + buf.extend(text.as_bytes()); 80 + buf.push_back(b'\n'); 81 + 82 + while buf.len() > 1024 * 1024 { 83 + buf.pop_front(); 84 + } 85 + 86 + info!("received {} bytes, buffer size: {}", text.len(), buf.len()); 87 + } 88 + Some(Ok(Message::Close(_))) => { 89 + warn!("websocket closed by server"); 90 + break; 91 + } 92 + Some(Err(e)) => { 93 + error!("websocket error: {}", e); 94 + break; 95 + } 96 + None => { 97 + warn!("websocket stream ended"); 98 + break; 99 + } 100 + _ => {} 101 + } 102 + } 103 + } 104 + } 105 + } 106 + Err(e) => { 107 + error!("failed to connect to websocket: {}", e); 108 + } 109 + } 110 + 111 + if shutdown_rx.try_recv().is_ok() { 112 + info!("shutdown requested, stopping websocket task"); 113 + return; 114 + } 115 + 116 + info!("reconnecting in 5 seconds..."); 117 + tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; 118 + } 119 + } 120 + } 121 + 122 + impl Filesystem for CuseDevice { 123 + fn cuse_init( 124 + &mut self, 125 + _req: &fuser::Request<'_>, 126 + reply: fuser::ReplyCuseInit, 127 + ) -> Result<(), libc::c_int> { 128 + let name = DEV; 129 + let major = 51; 130 + let minor = 0; 131 + info!("Initializing CUSE at /dev/{name}"); 132 + let config = fuser::CuseConfig::new(name, major, minor); 133 + reply.reply(config); 134 + Ok(()) 135 + } 136 + 137 + fn read( 138 + &mut self, 139 + _req: &fuser::Request<'_>, 140 + ino: u64, 141 + fh: u64, 142 + offset: i64, 143 + size: u32, 144 + flags: i32, 145 + lock_owner: Option<u64>, 146 + reply: ReplyData, 147 + ) { 148 + info!( 149 + "read(ino: {ino:#x?}, fh: {fh}, offset: {offset}, size: {size}, flags: {flags:#x?}, lock_owner: {lock_owner:?})", 150 + ); 151 + 152 + self.begin_stream(); 153 + 154 + loop { 155 + let mut buffer = self.buffer.lock().unwrap(); 156 + if !buffer.is_empty() { 157 + let bytes_to_read = std::cmp::min(size as usize, buffer.len()); 158 + let data = buffer.drain(0..bytes_to_read).collect::<Vec<_>>(); 159 + info!( 160 + "Returning {} bytes, buffer remaining: {}", 161 + data.len(), 162 + buffer.len() 163 + ); 164 + reply.data(&data); 165 + return; 166 + } 167 + 168 + drop(buffer); 169 + std::thread::sleep(std::time::Duration::from_millis(10)); 170 + } 171 + } 172 + 173 + fn release( 174 + &mut self, 175 + _req: &fuser::Request<'_>, 176 + ino: u64, 177 + fh: u64, 178 + flags: i32, 179 + lock_owner: Option<u64>, 180 + flush: bool, 181 + reply: fuser::ReplyEmpty, 182 + ) { 183 + info!( 184 + "release(ino: {:#x?}, fh: {}, flags: {:#x?}, lock_owner: {:?}, flush: {})", 185 + ino, fh, flags, lock_owner, flush 186 + ); 187 + self.end_stream(); 188 + reply.ok(); 189 + } 190 + } 191 + 192 + fn main() { 193 + env_logger::init(); 194 + let device = CuseDevice::new(); 195 + 196 + // run cuse in a separate thread 197 + let handle = thread::spawn(|| { 198 + fuser::cuse(device).unwrap_or_else(|e| { 199 + error!( 200 + "failed to start cuse device: {}. try run this example as privileged user", 201 + e 202 + ); 203 + std::process::exit(1); 204 + }) 205 + }); 206 + 207 + // make the device readable without sudo 208 + let output = Command::new("chmod") 209 + .args(&["644", &format!("/dev/{DEV}")]) 210 + .output(); 211 + 212 + match output { 213 + Ok(result) if result.status.success() => info!("/dev/{DEV} is now 0644"), 214 + _ => warn!("failed to execute chmod"), 215 + } 216 + 217 + let _ = handle.join(); 218 + info!("done"); 219 + }