RustForge

rust-kernel

Rustbelt: a hobby x86_64 kernel written in Rust

rust-kernel / user / child.rs
1151 bytes ยท raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//! Helper program that `demo` (and the tests) spawn:
//!   child             -> print my arguments, exit 0
//!   child <number>    -> exit with that number (tests wait() exit codes)
//!   child pipe        -> write a line to stdout (demo reads it via a pipe)
//!   child cat         -> copy stdin to stdout until EOF
#![no_std]
#![no_main]

#[macro_use]
#[path = "ulib.rs"]
mod ulib;

use ulib::*;

fn main() -> i64 {
    match arg(1) {
        Some("pipe") => {
            println!("hello through a pipe from pid {}", getpid());
            0
        }
        Some("cat") => {
            let mut buf = [0u8; 64];
            loop {
                let n = read(0, &mut buf);
                if n <= 0 {
                    return n;
                }
                write(1, &buf[..n as usize]);
            }
        }
        Some(number) if number.parse::<i64>().is_ok() => number.parse().unwrap(),
        _ => {
            print!("[child] pid {} got {} args:", getpid(), argc());
            for i in 0..argc() {
                print!(" {:?}", arg(i).unwrap_or("?"));
            }
            println!();
            0
        }
    }
}