Skip to content

Commit

Permalink
init: Adopt opendir() and readdir() syscalls
Browse files Browse the repository at this point in the history
Use opendir() and readdir() for dm discovery. Currently, it naively runs
the first file discovered under /bin.

Signed-off-by: Peter Fang <[email protected]>
  • Loading branch information
peterfang authored and vijaydhanraj committed Sep 29, 2024
1 parent 08a516b commit de89810
Showing 1 changed file with 34 additions and 4 deletions.
38 changes: 34 additions & 4 deletions init/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@

extern crate alloc;
use alloc::ffi::CString;
use alloc::string::String;
use buddy_system_allocator::*;
use core::ffi::CStr;
use core::panic::PanicInfo;
use syscall::{exec, exit, SysCallError};
use syscall::{exec, exit, opendir, readdir, DirEnt, SysCallError, F_TYPE_FILE};

const HEAP_SIZE: usize = 64 * 1024;
static mut HEAP: [u8; HEAP_SIZE] = [0; HEAP_SIZE];
Expand All @@ -27,13 +29,41 @@ pub extern "C" fn init_start() -> ! {
.init(core::ptr::addr_of!(HEAP) as usize, HEAP_SIZE);
}

let file = CString::new("/dummy").expect("Failed to create new string");
let root = CString::new("/").expect("Failed to create new string");
let bin = CString::new("/bin/").expect("Failed to create new string");
let obj = match opendir(&bin) {
Ok(obj) => obj,
_ => exit(0),
};
let mut dirents: [DirEnt; 8] = Default::default();
let mut binfile = CString::default();

'outer: loop {
let n = readdir(&obj, &mut dirents).unwrap();
for d in dirents.iter().take(n) {
if d.file_type == F_TYPE_FILE {
binfile = CString::from(CStr::from_bytes_until_nul(&d.file_name).unwrap());
break 'outer;
}
}
if n < dirents.len() - 1 {
break;
}
}

if binfile.is_empty() {
exit(0);
}

let mut file = String::from(bin.as_c_str().to_str().unwrap());
file.push_str(binfile.as_c_str().to_str().unwrap());

let file = CString::new(file).unwrap();
let root = CString::new("/").unwrap();

match exec(&file, &root, 0) {
Ok(_) => exit(0),
Err(SysCallError::NotFound) => exit(1),
_ => panic!("exec launch failed"),
_ => panic!("{} launch failed", file.to_str().unwrap()),
};
}

Expand Down

0 comments on commit de89810

Please sign in to comment.