Skip to content

Commit bf0f496

Browse files
fix: read and recv
Handles were stored on open(). Obvious that this is wrong as with other fd pointing to the same file would be different. This was totally wrong. Pass open flags for now as thats what we need. May pass &fd or smth in the future. Signed-off-by: Anhad Singh <[email protected]>
1 parent 515bd5b commit bf0f496

File tree

21 files changed

+114
-96
lines changed

21 files changed

+114
-96
lines changed

src/aero_kernel/src/drivers/keyboard.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// You should have received a copy of the GNU General Public License
1616
// along with Aero. If not, see <https://www.gnu.org/licenses/>.
1717

18+
use aero_syscall::OpenFlags;
1819
use alloc::sync::{Arc, Weak};
1920
use alloc::vec::Vec;
2021
use spin::RwLock;
@@ -228,7 +229,7 @@ impl KeyboardListener for KeyboardDevice {
228229
}
229230

230231
impl INodeInterface for KeyboardDevice {
231-
fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
232+
fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
232233
if self.buffer.lock_irq().is_empty() {
233234
return Ok(0);
234235
}

src/aero_kernel/src/drivers/mouse.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// You should have received a copy of the GNU General Public License
1616
// along with Aero. If not, see <https://www.gnu.org/licenses/>.
1717

18+
use aero_syscall::OpenFlags;
1819
use alloc::sync::Arc;
1920
use alloc::vec::Vec;
2021

@@ -137,7 +138,7 @@ impl Device for Mouse {
137138
}
138139

139140
impl INodeInterface for Mouse {
140-
fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
141+
fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
141142
let size = core::mem::size_of::<Packet>();
142143

143144
if buffer.len() < size {

src/aero_kernel/src/drivers/pty.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717

1818
use core::sync::atomic::{AtomicU32, Ordering};
1919

20-
use aero_syscall as libc;
21-
use aero_syscall::{Termios, WinSize};
20+
use aero_syscall::{self as libc, OpenFlags, Termios, WinSize};
2221

2322
use alloc::collections::BTreeMap;
2423
use alloc::string::ToString;
@@ -128,7 +127,7 @@ impl Master {
128127
}
129128

130129
impl INodeInterface for Master {
131-
fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
130+
fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
132131
let mut pty_buffer = self.buffer.lock_irq();
133132

134133
if pty_buffer.is_empty() {
@@ -280,7 +279,7 @@ impl INodeInterface for Slave {
280279
Ok(flags)
281280
}
282281

283-
fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
282+
fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
284283
Ok(self.master.discipline.read(buffer)?)
285284
}
286285

src/aero_kernel/src/drivers/tty/ctty.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
//! `/dev/tty`: Controlling terminal of the current process.
1919
20-
use aero_syscall::TIOCNOTTY;
20+
use aero_syscall::{OpenFlags, TIOCNOTTY};
2121
use alloc::sync::{Arc, Weak};
2222

2323
use crate::fs::devfs::Device;
@@ -64,8 +64,8 @@ impl INodeInterface for Ctty {
6464
})
6565
}
6666

67-
fn read_at(&self, offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
68-
Self::controlling_terminal()?.read_at(offset, buffer)
67+
fn read_at(&self, flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
68+
Self::controlling_terminal()?.read_at(flags, offset, buffer)
6969
}
7070

7171
fn write_at(&self, offset: usize, buffer: &[u8]) -> fs::Result<usize> {

src/aero_kernel/src/drivers/tty/vtty.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
2020
use core::sync::atomic::{AtomicUsize, Ordering};
2121

22+
use aero_syscall::OpenFlags;
2223
use alloc::sync::{Arc, Weak};
2324
use alloc::vec::Vec;
2425

@@ -246,7 +247,7 @@ impl INodeInterface for Tty {
246247
self.connected.fetch_sub(1, Ordering::SeqCst);
247248
}
248249

249-
fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
250+
fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
250251
self.block_queue
251252
.block_on(&self.stdin, |future| future.is_complete())?;
252253

src/aero_kernel/src/fs/devfs.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use super::ramfs::RamFs;
3636
use super::{FileSystem, FileSystemError, Result, MOUNT_MANAGER};
3737

3838
use aero_syscall::prelude::*;
39-
use aero_syscall::MMapFlags;
39+
use aero_syscall::{MMapFlags, OpenFlags};
4040

4141
lazy_static::lazy_static! {
4242
pub static ref DEV_FILESYSTEM: Arc<DevFs> = DevFs::new();
@@ -113,8 +113,8 @@ impl INodeInterface for DevINode {
113113
self.0.inode().write_at(offset, buffer)
114114
}
115115

116-
fn read_at(&self, offset: usize, buffer: &mut [u8]) -> Result<usize> {
117-
self.0.inode().read_at(offset, buffer)
116+
fn read_at(&self, flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> Result<usize> {
117+
self.0.inode().read_at(flags, offset, buffer)
118118
}
119119

120120
fn mmap(&self, offset: usize, size: usize, flags: MMapFlags) -> Result<PhysFrame> {
@@ -178,7 +178,7 @@ impl Device for DevNull {
178178
}
179179

180180
impl INodeInterface for DevNull {
181-
fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> Result<usize> {
181+
fn read_at(&self, _flags: OpenFlags, _offset: usize, _buffer: &mut [u8]) -> Result<usize> {
182182
Ok(0x00)
183183
}
184184

@@ -214,7 +214,7 @@ impl Device for DevKmsg {
214214
}
215215

216216
impl INodeInterface for DevKmsg {
217-
fn read_at(&self, offset: usize, buffer: &mut [u8]) -> Result<usize> {
217+
fn read_at(&self, _flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> Result<usize> {
218218
let buf = logger::get_log_buffer();
219219

220220
let size = core::cmp::min(buffer.len(), buf.len());
@@ -448,7 +448,7 @@ impl Device for DevUrandom {
448448
}
449449

450450
impl INodeInterface for DevUrandom {
451-
fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> Result<usize> {
451+
fn read_at(&self, _flags: OpenFlags, _offset: usize, buffer: &mut [u8]) -> Result<usize> {
452452
for (_, b) in buffer.iter_mut().enumerate() {
453453
*b = 0;
454454
}

src/aero_kernel/src/fs/eventfd.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,12 @@ impl INodeInterface for EventFd {
5454
Ok(None)
5555
}
5656

57-
fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> super::Result<usize> {
57+
fn read_at(
58+
&self,
59+
_flags: OpenFlags,
60+
_offset: usize,
61+
buffer: &mut [u8],
62+
) -> super::Result<usize> {
5863
let size = core::mem::size_of::<u64>();
5964
assert!(buffer.len() >= size);
6065

src/aero_kernel/src/fs/ext2/mod.rs

+17-7
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ mod group_desc;
2121
use core::mem::MaybeUninit;
2222

2323
use aero_syscall::socket::{MessageFlags, MessageHeader};
24-
use aero_syscall::{MMapFlags, SyscallError};
24+
use aero_syscall::{MMapFlags, OpenFlags, SyscallError};
2525
use alloc::boxed::Box;
2626
use alloc::string::ToString;
2727
use alloc::sync::{Arc, Weak};
@@ -364,7 +364,7 @@ impl CachedAccess for INode {
364364
}
365365

366366
fn read_direct(&self, offset: usize, dest: PhysFrame) -> Option<usize> {
367-
INodeInterface::read_at(self, offset, dest.as_slice_mut()).ok()
367+
INodeInterface::read_at(self, OpenFlags::empty(), offset, dest.as_slice_mut()).ok()
368368
}
369369

370370
fn write_direct(&self, offset: usize, src: PhysFrame) -> Option<usize> {
@@ -440,9 +440,14 @@ impl INodeInterface for INode {
440440
Ok(self.make_dirent(parent, entry.name(), entry).unwrap())
441441
}
442442

443-
fn read_at(&self, offset: usize, usr_buffer: &mut [u8]) -> super::Result<usize> {
443+
fn read_at(
444+
&self,
445+
flags: OpenFlags,
446+
offset: usize,
447+
usr_buffer: &mut [u8],
448+
) -> super::Result<usize> {
444449
if let Some(proxy) = self.proxy.as_ref() {
445-
return proxy.read_at(offset, usr_buffer);
450+
return proxy.read_at(flags, offset, usr_buffer);
446451
}
447452

448453
if !self.metadata()?.is_file() {
@@ -596,7 +601,7 @@ impl INodeInterface for INode {
596601
private_cp.as_slice_mut().fill(0);
597602

598603
let buffer = &mut private_cp.as_slice_mut()[..size];
599-
self.read_at(offset, buffer)?;
604+
self.read_at(OpenFlags::empty(), offset, buffer)?;
600605

601606
Ok(private_cp)
602607
}
@@ -644,9 +649,14 @@ impl INodeInterface for INode {
644649
}
645650
}
646651

647-
fn recv(&self, message_hdr: &mut MessageHeader, flags: MessageFlags) -> super::Result<usize> {
652+
fn recv(
653+
&self,
654+
fd_flags: OpenFlags,
655+
message_hdr: &mut MessageHeader,
656+
flags: MessageFlags,
657+
) -> super::Result<usize> {
648658
if let Some(proxy) = self.proxy.as_ref() {
649-
proxy.recv(message_hdr, flags)
659+
proxy.recv(fd_flags, message_hdr, flags)
650660
} else {
651661
Err(FileSystemError::NotSupported)
652662
}

src/aero_kernel/src/fs/file_table.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ impl FileHandle {
8181

8282
pub fn read(&self, buffer: &mut [u8]) -> super::Result<usize> {
8383
let offset = self.offset.load(Ordering::SeqCst);
84-
let new_offset = self.inode.inode().read_at(offset, buffer)?;
84+
let new_offset = self.inode.inode().read_at(self.flags(), offset, buffer)?;
8585

8686
self.offset.fetch_add(new_offset, Ordering::SeqCst);
8787
Ok(new_offset)

src/aero_kernel/src/fs/inode.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ pub trait INodeInterface: Send + Sync {
137137
}
138138

139139
/// Read at the provided `offset` to the given `buffer`.
140-
fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> Result<usize> {
140+
fn read_at(&self, _flags: OpenFlags, _offset: usize, _buffer: &mut [u8]) -> Result<usize> {
141141
Err(FileSystemError::NotSupported)
142142
}
143143

@@ -269,7 +269,12 @@ pub trait INodeInterface: Send + Sync {
269269
Err(FileSystemError::NotSupported)
270270
}
271271

272-
fn recv(&self, _message_hdr: &mut MessageHeader, _flags: MessageFlags) -> Result<usize> {
272+
fn recv(
273+
&self,
274+
_fd_flags: OpenFlags,
275+
_message_hdr: &mut MessageHeader,
276+
_flags: MessageFlags,
277+
) -> Result<usize> {
273278
Err(FileSystemError::NotSocket)
274279
}
275280

src/aero_kernel/src/fs/pipe.rs

+2-10
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ pub struct Pipe {
3737

3838
/// The number of writers currently connected to the pipe.
3939
num_writers: AtomicUsize,
40-
41-
handle: Once<Arc<FileHandle>>,
4240
}
4341

4442
impl Pipe {
@@ -50,8 +48,6 @@ impl Pipe {
5048
writers: WaitQueue::new(),
5149

5250
num_writers: AtomicUsize::new(0),
53-
54-
handle: Once::new(),
5551
})
5652
}
5753

@@ -66,7 +62,6 @@ impl INodeInterface for Pipe {
6662
// Write end of the pipe:
6763
if handle.flags().contains(OpenFlags::O_WRONLY) {
6864
self.num_writers.fetch_add(1, Ordering::SeqCst);
69-
self.handle.call_once(|| handle);
7065
}
7166

7267
Ok(None)
@@ -84,11 +79,8 @@ impl INodeInterface for Pipe {
8479
}
8580
}
8681

87-
fn read_at(&self, _offset: usize, buf: &mut [u8]) -> super::Result<usize> {
88-
let flags = self.handle.get().expect("pipe: internal error").flags();
89-
90-
let nonblock = flags.contains(OpenFlags::O_NONBLOCK);
91-
if nonblock && !self.queue.lock_irq().has_data() {
82+
fn read_at(&self, flags: OpenFlags, _offset: usize, buf: &mut [u8]) -> super::Result<usize> {
83+
if flags.is_nonblock() && !self.queue.lock_irq().has_data() {
9284
return Err(FileSystemError::WouldBlock);
9385
}
9486

src/aero_kernel/src/fs/procfs.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
use core::sync::atomic::{AtomicUsize, Ordering};
1919

20+
use aero_syscall::OpenFlags;
2021
use alloc::borrow::ToOwned;
2122
use alloc::collections::BTreeMap;
2223
use alloc::string::ToString;
@@ -183,7 +184,7 @@ impl LockedProcINode {
183184
}
184185

185186
impl INodeInterface for LockedProcINode {
186-
fn read_at(&self, offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
187+
fn read_at(&self, _flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> fs::Result<usize> {
187188
let this = self.0.read();
188189

189190
let data = match &this.contents {

src/aero_kernel/src/fs/ramfs.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
use core::sync::atomic::{AtomicUsize, Ordering};
1919

20-
use aero_syscall::MMapFlags;
20+
use aero_syscall::{MMapFlags, OpenFlags};
2121
use alloc::collections::BTreeMap;
2222
use alloc::string::ToString;
2323
use alloc::sync::{Arc, Weak};
@@ -261,7 +261,7 @@ impl INodeInterface for LockedRamINode {
261261
}
262262
}
263263

264-
fn read_at(&self, offset: usize, buffer: &mut [u8]) -> Result<usize> {
264+
fn read_at(&self, flags: OpenFlags, offset: usize, buffer: &mut [u8]) -> Result<usize> {
265265
let this = self.0.read();
266266

267267
match &this.contents {
@@ -294,10 +294,10 @@ impl INodeInterface for LockedRamINode {
294294
let device = device.clone();
295295
drop(this);
296296

297-
device.read_at(offset, buffer)
297+
device.read_at(flags, offset, buffer)
298298
}
299299

300-
FileContents::Socket(e) => e.read_at(offset, buffer),
300+
FileContents::Socket(e) => e.read_at(flags, offset, buffer),
301301
FileContents::None => Err(FileSystemError::NotSupported),
302302
}
303303
}

src/aero_kernel/src/socket/netlink.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
2828
use aero_syscall::netlink::{MessageFlags, MessageType, RtAttrType};
2929
use aero_syscall::socket::{self, MessageHeader};
30-
use aero_syscall::{netlink, AF_INET, AF_NETLINK, AF_UNSPEC};
30+
use aero_syscall::{netlink, OpenFlags, AF_INET, AF_NETLINK, AF_UNSPEC};
3131
use alloc::sync::Arc;
3232
use alloc::vec::Vec;
3333
use crabnet::network::Ipv4Addr;
@@ -211,7 +211,7 @@ impl INodeInterface for NetLinkSocket {
211211
unimplemented!()
212212
}
213213

214-
fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> fs::Result<usize> {
214+
fn read_at(&self, _flags: OpenFlags, _offset: usize, _buffer: &mut [u8]) -> fs::Result<usize> {
215215
unimplemented!()
216216
}
217217

@@ -221,6 +221,7 @@ impl INodeInterface for NetLinkSocket {
221221

222222
fn recv(
223223
&self,
224+
_fd_flags: OpenFlags,
224225
message_hdr: &mut MessageHeader,
225226
flags: socket::MessageFlags,
226227
) -> fs::Result<usize> {

0 commit comments

Comments
 (0)