Compare commits
2 Commits
42d499e76a
...
b3a16d49bc
Author | SHA1 | Date |
---|---|---|
|
b3a16d49bc | |
|
68326174f7 |
|
@ -9,7 +9,7 @@ use system::dmesg;
|
|||
fn main() {
|
||||
if let Err(e) = init() {
|
||||
dmesg(format!("Error: {e}"));
|
||||
let mut opt = Some(&e as &dyn std::error::Error);
|
||||
let mut opt = std::error::Error::source(&e);
|
||||
while let Some(current_source) = opt {
|
||||
dmesg(format!("Caused by: {current_source}"));
|
||||
opt = current_source.source();
|
||||
|
@ -28,7 +28,7 @@ fn init() -> Result<()> {
|
|||
if let Err(errors) = system::mount_default_targets() {
|
||||
for error in errors {
|
||||
dmesg(format!("Error while mounting: {error}"));
|
||||
let mut opt = Some(&error as &dyn std::error::Error);
|
||||
let mut opt = std::error::Error::source(&error);
|
||||
while let Some(current_source) = opt {
|
||||
dmesg(format!("Caused by: {current_source}"));
|
||||
opt = current_source.source();
|
||||
|
@ -65,7 +65,7 @@ fn init() -> Result<()> {
|
|||
*/
|
||||
}
|
||||
config::Mode::Exec => {
|
||||
dmesg("pivoting to {command}");
|
||||
dmesg(format!("pivoting to {command}"));
|
||||
system::syscall::execv(command, &[])?;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -200,12 +200,18 @@ pub fn execv(command: impl AsRef<Path>, args: &[&str]) -> Result<()> {
|
|||
.context(format_args!("bad command: {}", command.display()))?;
|
||||
let mut args_cstr = vec![];
|
||||
for arg in args {
|
||||
let cur_arg_cstr = CString::new(arg.as_bytes()).context(format_args!("bad arg: {arg}"));
|
||||
let cur_arg_cstr = CString::new(arg.as_bytes()).context(format_args!("bad arg: {arg}"))?;
|
||||
args_cstr.push(cur_arg_cstr);
|
||||
}
|
||||
|
||||
// NOTE: The last arg must be a null pointer. We construct a CString from the raw pointer.
|
||||
args_cstr.push(unsafe { CString::from_raw(std::ptr::null_mut()) });
|
||||
|
||||
if unsafe { libc::execv(command_cstr.as_ptr().cast(), args_cstr.as_ptr().cast()) } == -1 {
|
||||
return ctx_os_error(format_args!("error calling exec()"));
|
||||
return ctx_os_error(format_args!(
|
||||
"error calling exec({command}, {args:?})",
|
||||
command = command.display()
|
||||
));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
|
Loading…
Reference in New Issue