diff --git a/Cargo.lock b/Cargo.lock index 86820f3928..c602d8936e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1165,9 +1165,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" dependencies = [ "bitflags", ] diff --git a/rtl8168d/Cargo.toml b/rtl8168d/Cargo.toml index f5232dca04..c10aace849 100644 --- a/rtl8168d/Cargo.toml +++ b/rtl8168d/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" bitflags = "1" netutils = { git = "https://gitlab.redox-os.org/redox-os/netutils.git", branch = "redox-unix" } redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" } -redox_syscall = "0.2.9" +redox_syscall = "0.2.11" diff --git a/rtl8168d/src/main.rs b/rtl8168d/src/main.rs index b632089a2f..e81764aa36 100644 --- a/rtl8168d/src/main.rs +++ b/rtl8168d/src/main.rs @@ -74,27 +74,9 @@ fn main() { let irq_str = args.next().expect("rtl8168d: no irq provided"); let irq = irq_str.parse::().expect("rtl8168d: failed to parse irq"); - println!(" + RTL8168 {} on: {:X} size: {} IRQ: {}", name, bar, bar_size, irq); - - // Daemonize - let mut pipes = [0; 2]; - syscall::pipe2(&mut pipes, 0).unwrap(); - let mut read = unsafe { File::from_raw_fd(pipes[0] as RawFd) }; - let mut write = unsafe { File::from_raw_fd(pipes[1] as RawFd) }; - let pid = unsafe { syscall::clone(CloneFlags::empty()).unwrap() }; - if pid != 0 { - drop(write); - - let mut res = [0]; - if read.read(&mut res).unwrap() == res.len() { - process::exit(res[0] as i32); - } else { - eprintln!("rtl8168d: daemon pipe EOF"); - process::exit(1); - } - } else { - drop(read); + eprintln!(" + RTL8168 {} on: {:X} size: {} IRQ: {}", name, bar, bar_size, irq); + syscall::Daemon::new(move |daemon| { let socket_fd = syscall::open( ":network", syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK, @@ -124,8 +106,7 @@ fn main() { syscall::setrens(0, 0).expect("rtl8168d: failed to enter null namespace"); - write.write(&[0]).unwrap(); - drop(write); + daemon.ready().expect("rtl8168d: failed to mark daemon as ready"); let todo = Arc::new(RefCell::new(Vec::::new())); @@ -218,5 +199,6 @@ fn main() { unsafe { let _ = syscall::physunmap(address); } - } + process::exit(0); + }).expect("rtl8168d: failed to create daemon") }