init
This commit is contained in:
commit
0a2ec5f358
6 changed files with 4324 additions and 0 deletions
4164
Cargo.lock
generated
Normal file
4164
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
7
Cargo.toml
Normal file
7
Cargo.toml
Normal file
|
@ -0,0 +1,7 @@
|
|||
[package]
|
||||
name = "rust_term"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
nix = { version = "0.30.1", features = ["term", "process", "fs"], default-features = false }
|
47
flake.lock
generated
Normal file
47
flake.lock
generated
Normal file
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
"nodes": {
|
||||
"naersk": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1745925850,
|
||||
"narHash": "sha256-cyAAMal0aPrlb1NgzMxZqeN1mAJ2pJseDhm2m6Um8T0=",
|
||||
"owner": "nix-community",
|
||||
"repo": "naersk",
|
||||
"rev": "38bc60bbc157ae266d4a0c96671c6c742ee17a5f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "naersk",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1751011381,
|
||||
"narHash": "sha256-krGXKxvkBhnrSC/kGBmg5MyupUUT5R6IBCLEzx9jhMM=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "30e2e2857ba47844aa71991daa6ed1fc678bcbb7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-unstable",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"naersk": "naersk",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
24
flake.nix
Normal file
24
flake.nix
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "nixpkgs/nixos-unstable";
|
||||
naersk = {
|
||||
url = "github:nix-community/naersk";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
outputs = {
|
||||
nixpkgs,
|
||||
naersk,
|
||||
...
|
||||
}: let
|
||||
system = "x86_64-linux";
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
in {
|
||||
packages.${system} = {
|
||||
default = pkgs.callPackage ./package.nix {
|
||||
naersk = pkgs.callPackage naersk {};
|
||||
};
|
||||
};
|
||||
# nixosModules.${system}.default = ./module.nix;
|
||||
};
|
||||
}
|
26
package.nix
Normal file
26
package.nix
Normal file
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
busybox-sandbox-shell,
|
||||
lib,
|
||||
makeWrapper,
|
||||
naersk,
|
||||
pkg-config,
|
||||
...
|
||||
}:
|
||||
naersk.buildPackage rec {
|
||||
name = "rust_pty";
|
||||
src = ./.;
|
||||
buildInputs = [
|
||||
busybox-sandbox-shell
|
||||
];
|
||||
nativeBuildInputs = [
|
||||
pkg-config
|
||||
makeWrapper
|
||||
];
|
||||
postInstall = ''
|
||||
wrapProgram "$out/bin/${meta.mainProgram}" --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath buildInputs}"
|
||||
'';
|
||||
meta = {
|
||||
mainProgram = "rust_term";
|
||||
homepage = "https://mtgmonkey.net";
|
||||
};
|
||||
}
|
56
src/main.rs
Normal file
56
src/main.rs
Normal file
|
@ -0,0 +1,56 @@
|
|||
use nix::pty::{ForkptyResult, forkpty};
|
||||
use nix::unistd::{read, write};
|
||||
use std::fs::File;
|
||||
use std::io::{Read, Write};
|
||||
use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, OwnedFd};
|
||||
use std::process::Command;
|
||||
|
||||
fn main() {
|
||||
let default_shell = "/home/mtgmonkey/.nix-profile/bin/dash".to_string();
|
||||
let fd = spawn_pty_with_shell(default_shell);
|
||||
set_nonblock(&fd);
|
||||
let mut write_buffer = "tty\n".as_bytes().to_vec();
|
||||
write(fd.as_fd(), &mut write_buffer);
|
||||
loop {
|
||||
let red = read_from_fd(fd.try_clone().unwrap());
|
||||
match red {
|
||||
Some(red) => print!("{}", String::from_utf8(red).unwrap()),
|
||||
None => {
|
||||
let mut write_buffer = vec![];
|
||||
std::io::stdin().read_to_end(&mut write_buffer);
|
||||
write(fd.as_fd(), &mut write_buffer);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
fn spawn_pty_with_shell(default_shell: String) -> OwnedFd {
|
||||
match (unsafe { forkpty(None, None) }) {
|
||||
Ok(fork_pty_res) => match fork_pty_res {
|
||||
ForkptyResult::Parent { master, .. } => master,
|
||||
ForkptyResult::Child => {
|
||||
Command::new(&default_shell).spawn().unwrap();
|
||||
std::thread::sleep(std::time::Duration::MAX);
|
||||
std::process::exit(0);
|
||||
}
|
||||
},
|
||||
Err(e) => panic!("failed to fork {:?}", e),
|
||||
}
|
||||
}
|
||||
|
||||
fn read_from_fd(fd: OwnedFd) -> Option<Vec<u8>> {
|
||||
let mut read_buffer = [0; 65536];
|
||||
let mut file = File::from(fd).read(&mut read_buffer);
|
||||
match file {
|
||||
Ok(file) => Some(read_buffer[..file].to_vec()),
|
||||
Err(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn set_nonblock(fd: &OwnedFd) {
|
||||
let flags = nix::fcntl::fcntl(fd, nix::fcntl::FcntlArg::F_GETFL).unwrap();
|
||||
let mut flags =
|
||||
nix::fcntl::OFlag::from_bits(flags & nix::fcntl::OFlag::O_ACCMODE.bits()).unwrap();
|
||||
flags.set(nix::fcntl::OFlag::O_NONBLOCK, true);
|
||||
nix::fcntl::fcntl(fd, nix::fcntl::FcntlArg::F_SETFL(flags)).unwrap();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue