//! ls — list directory contents via the exports table. //! //! Args: [path] — defaults to "." (root). #![no_std] #![no_main] #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { loop { core::hint::spin_loop(); } } fn put(exports: &rsapi::Exports, buf: &[u8]) { (exports.put_line)(rsapi::Line { ptr: buf.as_ptr(), len: buf.len() }); } #[unsafe(no_mangle)] pub extern "C" fn efi_main(exports: &'static rsapi::Exports, argc: usize, argv: *const rsapi::Arg) -> i32 { let path_str = if argc > 0 { let a = unsafe { &*argv }; unsafe { core::str::from_utf8_unchecked(core::slice::from_raw_parts(a.ptr, a.len)) } } else { "/" }; let h = (exports.fs_resolve)(rsapi::Line { ptr: path_str.as_ptr(), len: path_str.len() }); if h < 0 { return 1; } let mut entry = rsapi::DirEntry { name: rsapi::Line { ptr: core::ptr::null(), len: 0 }, is_dir: false, _pad: 0, size: 0, }; while (exports.fs_dir_next)(h, &mut entry) { let name = unsafe { core::str::from_utf8_unchecked(core::slice::from_raw_parts(entry.name.ptr, entry.name.len)) }; if entry.is_dir { let mut buf = [0u8; 64]; let nb = name.as_bytes(); buf[..nb.len()].copy_from_slice(nb); buf[nb.len()] = b'/'; put(exports, &buf[..nb.len() + 1]); } else { put(exports, name.as_bytes()); } } (exports.fs_close)(h); 0 }