Add login process. Remove debugging. Fix order of arguments
This commit is contained in:
parent
afe7a99700
commit
046236c10f
11 changed files with 70 additions and 97 deletions
3
programs/init/Cargo.toml
Normal file
3
programs/init/Cargo.toml
Normal file
|
@ -0,0 +1,3 @@
|
|||
[package]
|
||||
name = "init"
|
||||
version = "0.1.0"
|
51
programs/init/src/main.rs
Normal file
51
programs/init/src/main.rs
Normal file
|
@ -0,0 +1,51 @@
|
|||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::io::{BufRead, BufReader};
|
||||
use std::process::Command;
|
||||
|
||||
pub fn main() {
|
||||
let file = File::open("initfs:etc/init.rc").expect("failed to open init.rc");
|
||||
let reader = BufReader::new(file);
|
||||
|
||||
for line_result in reader.lines() {
|
||||
let line = line_result.expect("failed to read init.rc");
|
||||
let line = line.trim();
|
||||
if ! line.is_empty() && ! line.starts_with('#') {
|
||||
let mut args = line.split(' ');
|
||||
if let Some(cmd) = args.next() {
|
||||
match cmd {
|
||||
"echo" => {
|
||||
if let Some(arg) = args.next() {
|
||||
print!("{}", arg);
|
||||
}
|
||||
for arg in args {
|
||||
print!(" {}", arg);
|
||||
}
|
||||
print!("\n");
|
||||
},
|
||||
"cd" => if let Some(dir) = args.next() {
|
||||
if let Err(err) = env::set_current_dir(dir) {
|
||||
println!("init: failed to cd to '{}': {}", dir, err);
|
||||
}
|
||||
} else {
|
||||
println!("init: failed to cd: no argument");
|
||||
},
|
||||
_ => {
|
||||
let mut command = Command::new(cmd);
|
||||
for arg in args {
|
||||
command.arg(arg);
|
||||
}
|
||||
|
||||
match command.spawn() {
|
||||
Ok(mut child) => match child.wait() {
|
||||
Ok(_status) => (), //println!("init: waited for {}: {:?}", line, status.code()),
|
||||
Err(err) => println!("init: failed to wait for '{}': {}", line, err)
|
||||
},
|
||||
Err(err) => println!("init: failed to execute '{}': {}", line, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
1
programs/ion
Submodule
1
programs/ion
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 4d87d44273ce1a408e833c7bc44312ad30c779ee
|
6
programs/login/Cargo.toml
Normal file
6
programs/login/Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "login"
|
||||
version = "0.1.0"
|
||||
|
||||
[dependencies]
|
||||
syscall = { path = "../../syscall/" }
|
38
programs/login/src/main.rs
Normal file
38
programs/login/src/main.rs
Normal file
|
@ -0,0 +1,38 @@
|
|||
extern crate syscall;
|
||||
|
||||
use std::env;
|
||||
use std::process::Command;
|
||||
use std::thread;
|
||||
|
||||
pub fn main() {
|
||||
let mut args = env::args().skip(1);
|
||||
|
||||
let tty = args.next().expect("login: no tty provided");
|
||||
let sh = args.next().expect("login: no sh provided");
|
||||
let sh_args: Vec<String> = args.collect();
|
||||
|
||||
syscall::close(2);
|
||||
syscall::close(1);
|
||||
syscall::close(0);
|
||||
|
||||
syscall::open(&tty, syscall::flag::O_RDWR);
|
||||
syscall::open(&tty, syscall::flag::O_RDWR);
|
||||
syscall::open(&tty, syscall::flag::O_RDWR);
|
||||
|
||||
thread::spawn(move || {
|
||||
loop {
|
||||
let mut command = Command::new(&sh);
|
||||
for arg in sh_args.iter() {
|
||||
command.arg(arg);
|
||||
}
|
||||
|
||||
match command.spawn() {
|
||||
Ok(mut child) => match child.wait() {
|
||||
Ok(_status) => (), //println!("login: waited for {}: {:?}", sh, status.code()),
|
||||
Err(err) => panic!("login: failed to wait for '{}': {}", sh, err)
|
||||
},
|
||||
Err(err) => panic!("login: failed to execute '{}': {}", sh, err)
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue