diff --git a/.gitmodules b/.gitmodules index 9cbca81..8d3eafd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -70,3 +70,6 @@ [submodule "cookbook"] path = cookbook url = https://github.com/redox-os/cookbook.git +[submodule "programs/init"] + path = programs/init + url = https://github.com/redox-os/init.git diff --git a/programs/init b/programs/init new file mode 160000 index 0000000..1b684e2 --- /dev/null +++ b/programs/init @@ -0,0 +1 @@ +Subproject commit 1b684e24064c911705112ecc9a92a7f5e17c0418 diff --git a/programs/init/Cargo.toml b/programs/init/Cargo.toml deleted file mode 100644 index 955abf7..0000000 --- a/programs/init/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "init" -version = "0.1.0" - -[dependencies] -redox_syscall = "0.1" diff --git a/programs/init/src/main.rs b/programs/init/src/main.rs deleted file mode 100644 index d4c3ebd..0000000 --- a/programs/init/src/main.rs +++ /dev/null @@ -1,139 +0,0 @@ -#![deny(warnings)] - -extern crate syscall; - -use std::env; -use std::fs::{File, OpenOptions, read_dir}; -use std::io::{BufRead, BufReader, Error, Result}; -use std::os::unix::io::AsRawFd; -use std::path::Path; -use std::process::Command; - -fn switch_stdio(stdio: &str) -> Result<()> { - let stdin = OpenOptions::new().read(true).open(stdio)?; - let stdout = OpenOptions::new().write(true).open(stdio)?; - let stderr = OpenOptions::new().write(true).open(stdio)?; - - syscall::dup2(stdin.as_raw_fd(), 0, &[]).map_err(|err| Error::from_raw_os_error(err.errno))?; - syscall::dup2(stdout.as_raw_fd(), 1, &[]).map_err(|err| Error::from_raw_os_error(err.errno))?; - syscall::dup2(stderr.as_raw_fd(), 2, &[]).map_err(|err| Error::from_raw_os_error(err.errno))?; - - Ok(()) -} - -pub fn run(file: &Path) -> Result<()> { - let file = File::open(file)?; - let reader = BufReader::new(file); - - for line_result in reader.lines() { - let line = line_result?; - let line = line.trim(); - if ! line.is_empty() && ! line.starts_with('#') { - let mut args = line.split(' '); - if let Some(cmd) = args.next() { - match cmd { - "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"); - }, - "echo" => { - if let Some(arg) = args.next() { - print!("{}", arg); - } - for arg in args { - print!(" {}", arg); - } - print!("\n"); - }, - "export" => if let Some(var) = args.next() { - let mut value = String::new(); - if let Some(arg) = args.next() { - value.push_str(&arg); - } - for arg in args { - value.push(' '); - value.push_str(&arg); - } - env::set_var(var, value); - } else { - println!("init: failed to export: no argument"); - }, - "run" => if let Some(new_file) = args.next() { - if let Err(err) = run(&Path::new(new_file)) { - println!("init: failed to run '{}': {}", new_file, err); - } - } else { - println!("init: failed to run: no argument"); - }, - "run.d" => if let Some(new_dir) = args.next() { - match read_dir(new_dir) { - Ok(list) => { - let mut entries = vec![]; - for entry_res in list { - match entry_res { - Ok(entry) => { - entries.push(entry.path()); - }, - Err(err) => { - println!("init: failed to run.d: '{}': {}", new_dir, err); - } - } - } - - entries.sort(); - - for entry in entries { - if let Err(err) = run(&entry) { - println!("init: failed to run '{}': {}", entry.display(), err); - } - } - }, - Err(err) => { - println!("init: failed to run.d: '{}': {}", new_dir, err); - } - } - } else { - println!("init: failed to run.d: no argument"); - }, - "stdio" => if let Some(stdio) = args.next() { - if let Err(err) = switch_stdio(&stdio) { - println!("init: failed to switch stdio to '{}': {}", stdio, err); - } - } else { - println!("init: failed to set stdio: 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) - } - } - } - } - } - } - - Ok(()) -} - -pub fn main() { - if let Err(err) = run(&Path::new("initfs:etc/init.rc")) { - println!("init: failed to run initfs:etc/init.rc: {}", err); - } - - loop { - let mut status = 0; - syscall::waitpid(0, &mut status, 0).unwrap(); - } -}