Update init to handle directories

This commit is contained in:
Jeremy Soller 2017-01-05 15:02:54 -07:00
parent e3f3f27fbc
commit cda17ce4c1
9 changed files with 49 additions and 18 deletions

View file

@ -0,0 +1,3 @@
/sbin/randd
/sbin/ptyd
/sbin/pcid /etc/pcid.toml

View file

@ -0,0 +1,5 @@
/sbin/ethernetd
/sbin/ipd
/sbin/tcpd
/sbin/udpd
dhcpd -b

View file

@ -0,0 +1,2 @@
getty display:2
getty display:3

View file

@ -0,0 +1 @@
/sbin/orbital display:4/activate /ui/bin/orblogin /ui/bin/launcher

View file

@ -0,0 +1 @@
getty debug: -J

View file

@ -1,12 +0,0 @@
/sbin/randd
/sbin/ptyd
/sbin/pcid /etc/pcid.toml
/sbin/ethernetd
/sbin/ipd
/sbin/tcpd
/sbin/udpd
dhcpd -b
getty display:2
getty display:3
/sbin/orbital display:4/activate /ui/bin/orblogin /ui/bin/launcher
getty debug: -J

View file

@ -6,4 +6,4 @@ pcid /etc/pcid.toml
redoxfs disk:0 file redoxfs disk:0 file
cd file: cd file:
export PATH file:/bin export PATH file:/bin
run /etc/init.rc run.d /etc/init.d

@ -1 +1 @@
Subproject commit 67098b38c671d7804c3b9b7b856090099d4cecda Subproject commit a3b7f7af5e2695c309eb5d87158deb50cbbab2a6

View file

@ -1,11 +1,12 @@
extern crate syscall; extern crate syscall;
use std::env; use std::env;
use std::fs::File; use std::fs::{File, read_dir};
use std::io::{BufRead, BufReader, Result}; use std::io::{BufRead, BufReader, Result};
use std::path::Path;
use std::process::Command; use std::process::Command;
pub fn run(file: &str) -> Result<()> { pub fn run(file: &Path) -> Result<()> {
let file = File::open(file)?; let file = File::open(file)?;
let reader = BufReader::new(file); let reader = BufReader::new(file);
@ -46,12 +47,42 @@ pub fn run(file: &str) -> Result<()> {
println!("init: failed to export: no argument"); println!("init: failed to export: no argument");
}, },
"run" => if let Some(new_file) = args.next() { "run" => if let Some(new_file) = args.next() {
if let Err(err) = run(&new_file) { if let Err(err) = run(&Path::new(new_file)) {
println!("init: failed to run '{}': {}", new_file, err); println!("init: failed to run '{}': {}", new_file, err);
} }
} else { } else {
println!("init: failed to run: no argument"); 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() { "stdio" => if let Some(stdio) = args.next() {
let _ = syscall::close(2); let _ = syscall::close(2);
let _ = syscall::close(1); let _ = syscall::close(1);
@ -86,7 +117,7 @@ pub fn run(file: &str) -> Result<()> {
} }
pub fn main() { pub fn main() {
if let Err(err) = run("initfs:etc/init.rc") { if let Err(err) = run(&Path::new("initfs:etc/init.rc")) {
println!("init: failed to run initfs:etc/init.rc: {}", err); println!("init: failed to run initfs:etc/init.rc: {}", err);
} }