From f0ffa77500a3df47a121598d4e767024cd61be7b Mon Sep 17 00:00:00 2001 From: Noratrieb <48135649+Noratrieb@users.noreply.github.com> Date: Sun, 15 Sep 2024 21:02:23 +0200 Subject: [PATCH] Initial commit --- .envrc | 1 + .gitignore | 1 + Cargo.lock | 546 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 6 + ahoy/.gitignore | 1 + ahoy/README.md | 1 + ahoy/build-root.sh | 30 +++ ahoy/run.sh | 13 + cog/.gitignore | 1 + cog/Cargo.toml | 7 + cog/README.md | 5 + cog/src/main.rs | 47 ++++ coreutils/.gitignore | 1 + coreutils/Cargo.toml | 8 + coreutils/README.md | 3 + coreutils/src/bin/ls.rs | 25 ++ coreutils/src/bin/net.rs | 56 ++++ coreutils/src/lib.rs | 0 quarterdeck/.gitignore | 1 + quarterdeck/Cargo.lock | 7 + quarterdeck/Cargo.toml | 10 + quarterdeck/README.md | 3 + quarterdeck/src/main.rs | 26 ++ shell.nix | 3 + 24 files changed, 802 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 ahoy/.gitignore create mode 100644 ahoy/README.md create mode 100755 ahoy/build-root.sh create mode 100755 ahoy/run.sh create mode 100644 cog/.gitignore create mode 100644 cog/Cargo.toml create mode 100644 cog/README.md create mode 100644 cog/src/main.rs create mode 100644 coreutils/.gitignore create mode 100644 coreutils/Cargo.toml create mode 100644 coreutils/README.md create mode 100644 coreutils/src/bin/ls.rs create mode 100644 coreutils/src/bin/net.rs create mode 100644 coreutils/src/lib.rs create mode 100644 quarterdeck/.gitignore create mode 100644 quarterdeck/Cargo.lock create mode 100644 quarterdeck/Cargo.toml create mode 100644 quarterdeck/README.md create mode 100644 quarterdeck/src/main.rs create mode 100644 shell.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..1d953f4 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..e793739 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,546 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "cog" +version = "0.1.0" +dependencies = [ + "shlex", +] + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "coreutils" +version = "0.1.0" +dependencies = [ + "clap", + "eyre", +] + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.158" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "once_cell" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ea5043e58958ee56f3e15a90aee535795cd7dfd319846288d93c5b57d85cbe" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quarterdeck" +version = "0.1.0" +dependencies = [ + "eyre", + "rustix", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[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]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..7da90c7 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +resolver = "2" +members = [ "cog", "coreutils","quarterdeck"] + +[workspace.dependencies] +eyre = "0.6.12" diff --git a/ahoy/.gitignore b/ahoy/.gitignore new file mode 100644 index 0000000..2a3efb7 --- /dev/null +++ b/ahoy/.gitignore @@ -0,0 +1 @@ +/rootfs diff --git a/ahoy/README.md b/ahoy/README.md new file mode 100644 index 0000000..73bc499 --- /dev/null +++ b/ahoy/README.md @@ -0,0 +1 @@ +# testing the system in a container diff --git a/ahoy/build-root.sh b/ahoy/build-root.sh new file mode 100755 index 0000000..2259cb7 --- /dev/null +++ b/ahoy/build-root.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -euo pipefail + +cd "$(dirname "$0")" + +target_tuple="$(uname -m)-unknown-linux-musl" + +cargo build -p quarterdeck --target "$target_tuple" +cargo build -p cog --target "$target_tuple" +cargo build -p coreutils --target "$target_tuple" + +target_dir="../target/$target_tuple/debug" + +rm -rf rootfs + +mkdir -p rootfs +mkdir -p rootfs/bin + +install_bin() { + cp "$target_dir/$1" rootfs/bin +} + +install_bin quarterdeck +install_bin cog +install_bin net +install_bin ls + +mkdir -p rootfs/etc +cp /etc/resolv.conf rootfs/etc/resolv.conf diff --git a/ahoy/run.sh b/ahoy/run.sh new file mode 100755 index 0000000..64ec0a5 --- /dev/null +++ b/ahoy/run.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +exec bwrap \ + --bind ./ahoy/rootfs / \ + --proc /proc \ + --dev /dev \ + --unshare-user \ + --unshare-ipc \ + --unshare-pid \ + --unshare-uts \ + --unshare-cgroup \ + --as-pid-1 \ + /bin/quarterdeck diff --git a/cog/.gitignore b/cog/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/cog/.gitignore @@ -0,0 +1 @@ +/target diff --git a/cog/Cargo.toml b/cog/Cargo.toml new file mode 100644 index 0000000..57b16c5 --- /dev/null +++ b/cog/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "cog" +version = "0.1.0" +edition = "2021" + +[dependencies] +shlex = "1.3.0" diff --git a/cog/README.md b/cog/README.md new file mode 100644 index 0000000..8ceafa3 --- /dev/null +++ b/cog/README.md @@ -0,0 +1,5 @@ +# cog + +> Cog: Smaller war ship + +A super simple shell diff --git a/cog/src/main.rs b/cog/src/main.rs new file mode 100644 index 0000000..79b437a --- /dev/null +++ b/cog/src/main.rs @@ -0,0 +1,47 @@ +use std::io::Write; + +fn main() -> std::io::Result<()> { + let mut last_success = true; + loop { + let mut line = String::new(); + + print!("{}$ ", if last_success { "".into() } else { "[error]" }); + std::io::stdout().flush()?; + std::io::stdin().read_line(&mut line)?; + + if !line.trim().is_empty() { + match exec_line(&line) { + Ok(success) => last_success = success, + Err(err) => { + eprintln!("{err}"); + } + } + } + } +} + +fn exec_line(line: &str) -> Result { + let commands = shlex::split(line).ok_or_else(|| "invalid command".to_owned())?; + if commands.len() < 1 { + return Err("invalid command".to_owned()); + } + + let arg0 = &commands[0]; + + if arg0 == "exit" { + std::process::exit(0); + } + + let mut cmd = std::process::Command::new(arg0); + cmd.args(&commands[1..]); + + let mut cmd = cmd + .spawn() + .map_err(|err| format!("failed to spawn {arg0}: {err}"))?; + + let result = cmd + .wait() + .map_err(|err| format!("failed to wait for {arg0}: {err}"))?; + + Ok(result.success()) +} diff --git a/coreutils/.gitignore b/coreutils/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/coreutils/.gitignore @@ -0,0 +1 @@ +/target diff --git a/coreutils/Cargo.toml b/coreutils/Cargo.toml new file mode 100644 index 0000000..090d91a --- /dev/null +++ b/coreutils/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "coreutils" +version = "0.1.0" +edition = "2021" + +[dependencies] +clap = { version = "4.5.17", features = ["derive"] } +eyre.workspace = true diff --git a/coreutils/README.md b/coreutils/README.md new file mode 100644 index 0000000..d0c9871 --- /dev/null +++ b/coreutils/README.md @@ -0,0 +1,3 @@ +# coreutils + +Core utilities for the system. Not to be confused with GNU coreutils, these are quite different. diff --git a/coreutils/src/bin/ls.rs b/coreutils/src/bin/ls.rs new file mode 100644 index 0000000..aab9337 --- /dev/null +++ b/coreutils/src/bin/ls.rs @@ -0,0 +1,25 @@ +use std::path::PathBuf; + +use clap::Parser; +use eyre::{Context, Result}; + +#[derive(Parser)] +struct Cmd { + directory: PathBuf, +} + +fn main() -> Result<()> { + let args = Cmd::parse(); + + let entries = std::fs::read_dir(&args.directory) + .wrap_err_with(|| format!("opening {}", args.directory.display()))?; + + for entry in entries { + let entry = + entry.wrap_err_with(|| format!("reading entry from {}", args.directory.display()))?; + + println!("{}", entry.file_name().to_string_lossy()); + } + + Ok(()) +} diff --git a/coreutils/src/bin/net.rs b/coreutils/src/bin/net.rs new file mode 100644 index 0000000..03f8e2d --- /dev/null +++ b/coreutils/src/bin/net.rs @@ -0,0 +1,56 @@ +use std::net::{TcpStream, ToSocketAddrs}; + +use clap::Parser; +use eyre::{Context, Result}; + +#[derive(Parser)] +struct Cmd { + #[command(subcommand)] + cmd: Subcommand, +} + +#[derive(clap::Subcommand)] +enum Subcommand { + /// Performs DNS resolution of a domain name + Resolve { addr: String }, + Tcp { + #[command(subcommand)] + cmd: Tcp, + }, +} + +#[derive(clap::Subcommand)] +enum Tcp { + /// Connect via TCP and use stdin/stdout to communicate + Connect { addr: String }, +} + +fn main() -> Result<()> { + let args = Cmd::parse(); + + match args.cmd { + Subcommand::Resolve { addr } => { + let addrs = (addr.as_str(), 0) + .to_socket_addrs() + .wrap_err_with(|| format!("resolving {addr}"))?; + + for addr in addrs { + println!("{}", addr.ip()); + } + } + Subcommand::Tcp { + cmd: Tcp::Connect { addr }, + } => { + let mut stream = TcpStream::connect(&addr).wrap_err_with(|| { + format!("connecting to {addr}. note: use IP:PORT as the address format") + })?; + let mut reader = stream.try_clone().wrap_err("cloning stream")?; + + std::thread::spawn(move || std::io::copy(&mut reader, &mut std::io::stdout().lock())); + + std::io::copy(&mut std::io::stdin().lock(), &mut stream)?; + } + } + + Ok(()) +} diff --git a/coreutils/src/lib.rs b/coreutils/src/lib.rs new file mode 100644 index 0000000..e69de29 diff --git a/quarterdeck/.gitignore b/quarterdeck/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/quarterdeck/.gitignore @@ -0,0 +1 @@ +/target diff --git a/quarterdeck/Cargo.lock b/quarterdeck/Cargo.lock new file mode 100644 index 0000000..ba57178 --- /dev/null +++ b/quarterdeck/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "quarterdeck" +version = "0.1.0" diff --git a/quarterdeck/Cargo.toml b/quarterdeck/Cargo.toml new file mode 100644 index 0000000..4df0d59 --- /dev/null +++ b/quarterdeck/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "quarterdeck" +version = "0.1.0" +edition = "2021" + +[dependencies] +eyre.workspace = true +rustix = { version = "0.38.37", features = ["process", "thread"] } +tracing = "0.1.40" +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/quarterdeck/README.md b/quarterdeck/README.md new file mode 100644 index 0000000..31d7968 --- /dev/null +++ b/quarterdeck/README.md @@ -0,0 +1,3 @@ +# quarterdeck + +The init system, PID 1. diff --git a/quarterdeck/src/main.rs b/quarterdeck/src/main.rs new file mode 100644 index 0000000..b204dd1 --- /dev/null +++ b/quarterdeck/src/main.rs @@ -0,0 +1,26 @@ +use eyre::Result; +use tracing::{error, info, warn}; + +fn main() { + tracing_subscriber::fmt().init(); + info!("Booting up system"); + + if let Err(err) = run() { + error!(?err, "Failed to boot system"); + } + + // uh.. i dont think we should exit? +} + +fn run() -> Result<()> { + if let Err(err) = rustix::thread::set_no_new_privs(true) { + warn!(?err, "Failed to set PR_SET_NO_NEW_PRIVS"); + } + + std::process::Command::new("/bin/cog") + .env("PATH", "/bin") + .spawn()? + .wait()?; + + loop {} +} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..5fe3a1d --- /dev/null +++ b/shell.nix @@ -0,0 +1,3 @@ +{ pkgs ? import { } }: pkgs.mkShell { + packages = with pkgs;[ bubblewrap ]; +}