Only create acpi scheme after tables are found and parsed

This commit is contained in:
Jeremy Soller
2022-02-28 11:21:47 -07:00
parent 07a2c5d590
commit 88fc91dfb7
+32 -38
View File
@@ -85,44 +85,7 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
}
}
fn main() {
let mut pipes = [0; 2];
syscall::pipe2(&mut pipes, 0).expect("acpid: failed to create synchronization pipe");
let [read_part, write_part] = pipes;
let mut read_part = unsafe { File::from_raw_fd(read_part as RawFd) };
let mut write_part = unsafe { File::from_raw_fd(write_part as RawFd) };
let pid = unsafe { syscall::clone(syscall::CloneFlags::empty()).expect("failed to daemonize acpid") };
if pid != 0 {
drop(write_part);
let mut res = [0];
let bytes_read = read_part.read(&mut res).expect("acpid: failed to read from sync pipe");
let exit_code = if bytes_read == res.len() {
res[0]
} else {
eprintln!("acpid: daemon pipe EOF");
1
};
drop(read_part);
std::process::exit(exit_code.into());
}
drop(read_part);
let mut scheme_socket = OpenOptions::new()
.write(true)
.read(true)
.create(true)
.custom_flags(O_NONBLOCK as i32)
.open(":acpi")
.expect("acpid: failed to open scheme socket");
let _ = write_part.write(&[0]).expect("acpid: failed to write to sync pipe");
drop(write_part);
fn daemon(mut write_part: File) {
setup_logging();
let rxsdt_raw_data: Arc<[u8]> = std::fs::read("kernel/acpi:rxsdt")
@@ -170,6 +133,17 @@ fn main() {
.open("event:")
.expect("acpid: failed to open event queue");
let mut scheme_socket = OpenOptions::new()
.write(true)
.read(true)
.create(true)
.custom_flags(O_NONBLOCK as i32)
.open(":acpi")
.expect("acpid: failed to open scheme socket");
write_part.write_all(&[0]).expect("acpid: failed to write to sync pipe");
drop(write_part);
syscall::setrens(0, 0).expect("acpid: failed to enter null namespace");
let _ = event_queue.write(&Event {
@@ -252,3 +226,23 @@ fn main() {
unreachable!("System should have shut down before this is entered");
}
fn main() {
let mut pipes = [0; 2];
syscall::pipe2(&mut pipes, 0).expect("acpid: failed to create synchronization pipe");
let mut read_part = unsafe { File::from_raw_fd(pipes[0] as RawFd) };
let mut write_part = unsafe { File::from_raw_fd(pipes[1] as RawFd) };
if unsafe { syscall::clone(syscall::CloneFlags::empty()).expect("failed to daemonize acpid") } == 0 {
drop(read_part);
daemon(write_part);
} else {
drop(write_part);
let mut res = [0];
let bytes_read = read_part.read_exact(&mut res).expect("acpid: failed to read from sync pipe");
std::process::exit(res[0].into());
}
}