diff --git a/ptyd/src/pgrp.rs b/ptyd/src/pgrp.rs index 353dd33b2e..084f85c4bf 100644 --- a/ptyd/src/pgrp.rs +++ b/ptyd/src/pgrp.rs @@ -43,19 +43,12 @@ impl Resource for PtyPgrp { fn read(&mut self, buf: &mut [u8]) -> Result> { if let Some(pty_lock) = self.pty.upgrade() { let pty = pty_lock.borrow(); - let pgrp: &[u8] = unsafe { - slice::from_raw_parts( - &pty.pgrp as *const usize as *const u8, - mem::size_of::(), - ) - }; - let mut i = 0; - while i < buf.len() && i < pgrp.len() { - buf[i] = pgrp[i]; - i += 1; - } - Ok(Some(i)) + //println!("READ PGRP {}: {}", pty.id, pty.pgrp); + let dst_buf = buf.get_mut(..4).and_then(|b| <&mut [u8; 4]>::try_from(b).ok()).ok_or(Error::new(EBADF))?; + *dst_buf = (pty.pgrp as u32).to_ne_bytes(); + + Ok(Some(4)) } else { Ok(Some(0)) } @@ -64,19 +57,12 @@ impl Resource for PtyPgrp { fn write(&mut self, buf: &[u8]) -> Result> { if let Some(pty_lock) = self.pty.upgrade() { let mut pty = pty_lock.borrow_mut(); - let pgrp: &mut [u8] = unsafe { - slice::from_raw_parts_mut( - &mut pty.pgrp as *mut usize as *mut u8, - mem::size_of::(), - ) - }; - let mut i = 0; - while i < buf.len() && i < pgrp.len() { - pgrp[i] = buf[i]; - i += 1; - } - Ok(Some(i)) + let new_pgrp = u32::from_ne_bytes(buf.get(..4).and_then(|b| <[u8; 4]>::try_from(b).ok()).ok_or(Error::new(EBADF))?); + pty.pgrp = new_pgrp as usize; + //println!("WRITE PGRP {}: {} => {}", pty.id, pty.pgrp, new_pgrp); + + Ok(Some(4)) } else { Err(Error::new(EPIPE)) } diff --git a/ptyd/src/pty.rs b/ptyd/src/pty.rs index 7fc67f9872..58513ca37a 100644 --- a/ptyd/src/pty.rs +++ b/ptyd/src/pty.rs @@ -155,7 +155,7 @@ impl Pty { if isig { if is_cc(b, VINTR) { if self.pgrp != 0 { - let _ = syscall::kill(-(self.pgrp as isize) as usize, syscall::SIGINT); + let _ = libredox::call::kill(-(self.pgrp as isize) as usize, libredox::flag::SIGINT as _); } b = 0; @@ -163,7 +163,7 @@ impl Pty { if is_cc(b, VQUIT) { if self.pgrp != 0 { - let _ = syscall::kill(-(self.pgrp as isize) as usize, syscall::SIGQUIT); + let _ = libredox::call::kill(-(self.pgrp as isize) as usize, libredox::flag::SIGQUIT as _); } b = 0; @@ -171,7 +171,7 @@ impl Pty { if is_cc(b, VSUSP) { if self.pgrp != 0 { - let _ = syscall::kill(-(self.pgrp as isize) as usize, syscall::SIGTSTP); + let _ = libredox::call::kill(-(self.pgrp as isize) as usize, libredox::flag::SIGTSTP as _); } b = 0;