Skip to content

Commit 4cbc29e

Browse files
misc: cleanups and minor fixes for webkitgtk
* cleanup: remove the unused flags argument in INode::open() * cleanup: make `flags` on `FileHandle` private and use getter and setter functions to set the flags. * feat: add initial netlink socket support * feat(unix): implement get_{sockname, peername} * fix: the ABI for `MessageHeader` was wrong, i.e, {name_len, control_len} are supposed to be a u32 instead of a usize. Signed-off-by: Anhad Singh <[email protected]>
1 parent f4add34 commit 4cbc29e

File tree

25 files changed

+774
-275
lines changed

25 files changed

+774
-275
lines changed

patches/mlibc/mlibc.patch

Lines changed: 0 additions & 183 deletions
This file was deleted.

src/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/aero_kernel/src/drivers/pty.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -330,11 +330,7 @@ impl devfs::Device for Ptmx {
330330
}
331331

332332
impl INodeInterface for Ptmx {
333-
fn open(
334-
&self,
335-
_flags: aero_syscall::OpenFlags,
336-
_handle: Arc<fs::file_table::FileHandle>,
337-
) -> fs::Result<Option<DirCacheItem>> {
333+
fn open(&self, _handle: Arc<fs::file_table::FileHandle>) -> fs::Result<Option<DirCacheItem>> {
338334
let master = Arc::new(Master::new());
339335
let slave = Slave::new(master.clone());
340336
let inode = DirEntry::from_inode(master, String::from("<pty>"));

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ impl Tty {
229229
impl INodeInterface for Tty {
230230
fn open(
231231
&self,
232-
_flags: aero_syscall::OpenFlags,
233232
_handle: Arc<fs::file_table::FileHandle>,
234233
) -> fs::Result<Option<fs::cache::DirCacheItem>> {
235234
let connected = self.connected.fetch_add(1, Ordering::SeqCst);

src/aero_kernel/src/fs/devfs.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,8 @@ impl INodeInterface for DevINode {
129129
self.0.inode().poll(table)
130130
}
131131

132-
fn open(
133-
&self,
134-
flags: aero_syscall::OpenFlags,
135-
handle: Arc<super::file_table::FileHandle>,
136-
) -> Result<Option<DirCacheItem>> {
137-
self.0.inode().open(flags, handle)
132+
fn open(&self, handle: Arc<super::file_table::FileHandle>) -> Result<Option<DirCacheItem>> {
133+
self.0.inode().open(handle)
138134
}
139135
}
140136

src/aero_kernel/src/fs/eventfd.rs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,45 @@
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;
20+
use spin::Once;
1921

22+
use super::file_table::FileHandle;
2023
use super::inode::{INodeInterface, PollFlags, PollTable};
24+
use crate::fs::FileSystemError;
2125
use crate::utils::sync::{Mutex, WaitQueue};
2226

2327
pub struct EventFd {
2428
wq: WaitQueue,
29+
/// Every write(2) on an eventfd, the value written is added to `count` and a wakeup
30+
/// is performed on `wq`.
2531
count: Mutex<u64>,
32+
// FIXME: https://github.com/Andy-Python-Programmer/aero/issues/113
33+
handle: Once<Arc<FileHandle>>,
2634
}
2735

2836
impl EventFd {
2937
pub fn new() -> Arc<Self> {
3038
Arc::new(Self {
3139
wq: WaitQueue::new(),
3240
count: Mutex::new(0),
41+
handle: Once::new(),
3342
})
3443
}
44+
45+
fn is_nonblock(&self) -> bool {
46+
let handle = self.handle.get().expect("file handle is not initialized");
47+
handle.flags().contains(OpenFlags::O_NONBLOCK)
48+
}
3549
}
3650

3751
impl INodeInterface for EventFd {
52+
fn open(&self, handle: Arc<FileHandle>) -> super::Result<Option<super::cache::DirCacheItem>> {
53+
self.handle.call_once(|| handle);
54+
Ok(None)
55+
}
56+
3857
fn read_at(&self, _offset: usize, buffer: &mut [u8]) -> super::Result<usize> {
3958
let size = core::mem::size_of::<u64>();
4059
assert!(buffer.len() >= size);
@@ -52,16 +71,28 @@ impl INodeInterface for EventFd {
5271
}
5372

5473
fn write_at(&self, _offset: usize, buffer: &[u8]) -> super::Result<usize> {
55-
let size = core::mem::size_of::<u64>();
56-
assert!(buffer.len() >= size);
74+
let chunk_size = core::mem::size_of::<u64>();
75+
assert!(buffer.len() >= chunk_size);
5776

58-
// SAFETY: We have above verified that it is safe to dereference
59-
// the value.
60-
let value = unsafe { *(buffer.as_ptr() as *const u64) };
77+
// TODO: use bytemuck to remove the unsafe.
78+
let target = unsafe { *(buffer.as_ptr() as *const u64) };
79+
80+
if target == u64::MAX {
81+
return Err(FileSystemError::NotSupported);
82+
}
83+
84+
let mut count = self.count.lock();
85+
86+
if u64::MAX - *count > target {
87+
*count += target;
88+
} else if !self.is_nonblock() {
89+
unimplemented!()
90+
} else {
91+
return Ok(0);
92+
};
6193

62-
*self.count.lock_irq() += value;
6394
self.wq.notify_all();
64-
Ok(size)
95+
Ok(chunk_size)
6596
}
6697

6798
fn poll(&self, table: Option<&mut PollTable>) -> super::Result<PollFlags> {
@@ -70,7 +101,7 @@ impl INodeInterface for EventFd {
70101

71102
if let Some(e) = table {
72103
e.insert(&self.wq)
73-
} // listen for changes
104+
}
74105

75106
if *count > 0 {
76107
events.insert(PollFlags::IN);

0 commit comments

Comments
 (0)