diff --git a/schemes/tcpd/src/main.rs b/schemes/tcpd/src/main.rs index 8c7e16e..64661ce 100644 --- a/schemes/tcpd/src/main.rs +++ b/schemes/tcpd/src/main.rs @@ -16,7 +16,7 @@ use event::EventQueue; use netutils::{n16, n32, Ipv4, Ipv4Addr, Ipv4Header, Tcp, TcpHeader, Checksum, TCP_FIN, TCP_SYN, TCP_RST, TCP_PSH, TCP_ACK}; use syscall::data::Packet; use syscall::error::{Error, Result, EACCES, EADDRINUSE, EBADF, EIO, EINVAL, EISCONN, EMSGSIZE, ENOTCONN, EWOULDBLOCK}; -use syscall::flag::{EVENT_READ, O_CREAT, O_RDWR, O_NONBLOCK}; +use syscall::flag::{EVENT_READ, F_GETFL, F_SETFL, O_ACCMODE, O_CREAT, O_RDWR, O_NONBLOCK}; use syscall::scheme::SchemeMut; fn parse_socket(socket: &str) -> (Ipv4Addr, u16) { @@ -570,6 +570,19 @@ impl SchemeMut for Tcpd { } } + fn fcntl(&mut self, file: usize, cmd: usize, arg: usize) -> Result { + let mut handle = self.handles.get_mut(&file).ok_or(Error::new(EBADF))?; + + match cmd { + F_GETFL => Ok(handle.flags), + F_SETFL => { + handle.flags = arg & ! O_ACCMODE; + Ok(0) + }, + _ => Err(Error::new(EINVAL)) + } + } + fn fevent(&mut self, file: usize, flags: usize) -> Result { let mut handle = self.handles.get_mut(&file).ok_or(Error::new(EBADF))?; diff --git a/schemes/udpd/src/main.rs b/schemes/udpd/src/main.rs index 7b39eec..1193236 100644 --- a/schemes/udpd/src/main.rs +++ b/schemes/udpd/src/main.rs @@ -16,7 +16,7 @@ use event::EventQueue; use netutils::{n16, Ipv4, Ipv4Addr, Ipv4Header, Udp, UdpHeader, Checksum}; use syscall::data::Packet; use syscall::error::{Error, Result, EACCES, EADDRINUSE, EBADF, EIO, EINVAL, EMSGSIZE, ENOTCONN, EWOULDBLOCK}; -use syscall::flag::{EVENT_READ, O_CREAT, O_RDWR, O_NONBLOCK}; +use syscall::flag::{EVENT_READ, F_GETFL, F_SETFL, O_ACCMODE, O_CREAT, O_RDWR, O_NONBLOCK}; use syscall::scheme::SchemeMut; fn parse_socket(socket: &str) -> (Ipv4Addr, u16) { @@ -269,6 +269,19 @@ impl SchemeMut for Udpd { } } + fn fcntl(&mut self, file: usize, cmd: usize, arg: usize) -> Result { + let mut handle = self.handles.get_mut(&file).ok_or(Error::new(EBADF))?; + + match cmd { + F_GETFL => Ok(handle.flags), + F_SETFL => { + handle.flags = arg & ! O_ACCMODE; + Ok(0) + }, + _ => Err(Error::new(EINVAL)) + } + } + fn fevent(&mut self, file: usize, flags: usize) -> Result { let mut handle = self.handles.get_mut(&file).ok_or(Error::new(EBADF))?;