Skip to content

Commit 149d73a

Browse files
syscalls::sock_recv: init
Signed-off-by: Andy-Python-Programmer <[email protected]>
1 parent 8fea888 commit 149d73a

File tree

11 files changed

+135
-48
lines changed

11 files changed

+135
-48
lines changed

patches/mlibc/mlibc.patch

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
1-
From bb17d740b50e98b67c4bdc6449e874568993aa84 Mon Sep 17 00:00:00 2001
1+
From 24a4e9494f8b2d78936d08ffdfe4cf84cf35e76b Mon Sep 17 00:00:00 2001
22
From: Andy-Python-Programmer <[email protected]>
33
Date: Fri, 8 Jul 2022 12:32:32 +1000
44
Subject: [PATCH] yes
55

66
Signed-off-by: Andy-Python-Programmer <[email protected]>
77
---
8+
.gitignore | 2 +
89
options/ansi/generic/stdlib-stubs.cpp | 142 +++++++++++++++++++++-----
910
options/glibc/generic/execinfo.cpp | 5 +-
1011
options/rtdl/generic/linker.cpp | 2 +-
1112
sysdeps/aero/generic/aero.cpp | 38 +++----
1213
sysdeps/aero/generic/filesystem.cpp | 25 ++++-
13-
sysdeps/aero/generic/sockets.cpp | 65 +++++++++++-
14-
sysdeps/aero/include/aero/syscall.h | 2 +
15-
7 files changed, 225 insertions(+), 54 deletions(-)
14+
sysdeps/aero/generic/sockets.cpp | 77 +++++++++++++-
15+
sysdeps/aero/include/aero/syscall.h | 4 +
16+
8 files changed, 241 insertions(+), 54 deletions(-)
1617

18+
diff --git a/.gitignore b/.gitignore
19+
index fdd60a00..9f811f47 100644
20+
--- a/.gitignore
21+
+++ b/.gitignore
22+
@@ -3,3 +3,5 @@ subprojects
23+
*.xbstrap
24+
# editor configs:
25+
.vscode
26+
+# clangd cache files:
27+
+.cache
1728
diff --git a/options/ansi/generic/stdlib-stubs.cpp b/options/ansi/generic/stdlib-stubs.cpp
1829
index 4836391e..2a73c6d0 100644
1930
--- a/options/ansi/generic/stdlib-stubs.cpp
@@ -316,7 +327,7 @@ index a3e2aca2..4187059e 100644
316327
+}
317328
} // namespace mlibc
318329
diff --git a/sysdeps/aero/generic/sockets.cpp b/sysdeps/aero/generic/sockets.cpp
319-
index b6b18fe7..33609ca4 100644
330+
index b6b18fe7..e03c634b 100644
320331
--- a/sysdeps/aero/generic/sockets.cpp
321332
+++ b/sysdeps/aero/generic/sockets.cpp
322333
@@ -1,5 +1,6 @@
@@ -332,16 +343,28 @@ index b6b18fe7..33609ca4 100644
332343

333344
-int sys_accept(int fd, int *newfd) {
334345
- auto result = syscall(SYS_ACCEPT, fd);
335-
+int sys_accept(int fd, int *newfd, struct sockaddr *addr_ptr, socklen_t *addr_length) {
336-
+ auto result = syscall(SYS_ACCEPT, fd, addr_ptr, addr_length);
346+
+int sys_accept(int sockfd, int *newfd, struct sockaddr *addr_ptr, socklen_t *addr_length) {
347+
+ auto result = syscall(SYS_ACCEPT, sockfd, addr_ptr, addr_length);
337348

338349
if (result < 0) {
339350
return -result;
340-
@@ -56,4 +57,64 @@ int sys_accept(int fd, int *newfd) {
351+
@@ -56,4 +57,76 @@ int sys_accept(int fd, int *newfd) {
341352
*newfd = result;
342353
return 0;
343354
}
344355
+
356+
+
357+
+int sys_msg_recv(int sockfd, struct msghdr *msg_hdr, int flags, ssize_t *length) {
358+
+ auto result = syscall(SYS_SOCK_RECV, sockfd, msg_hdr, flags);
359+
+
360+
+ if (result < 0) {
361+
+ return -result;
362+
+ }
363+
+
364+
+ *length = result;
365+
+ return 0;
366+
+}
367+
+
345368
+int sys_getsockopt(int fd, int layer, int number, void *__restrict buffer, socklen_t *__restrict size) {
346369
+ (void)fd; (void)size;
347370
+ if (layer == SOL_SOCKET && number == SO_PEERCRED) {
@@ -403,15 +426,17 @@ index b6b18fe7..33609ca4 100644
403426
+}
404427
} // namespace mlibc
405428
diff --git a/sysdeps/aero/include/aero/syscall.h b/sysdeps/aero/include/aero/syscall.h
406-
index 12f8dc61..fcc219a9 100644
429+
index 12f8dc61..50f8cfa7 100644
407430
--- a/sysdeps/aero/include/aero/syscall.h
408431
+++ b/sysdeps/aero/include/aero/syscall.h
409-
@@ -64,6 +64,8 @@
432+
@@ -64,6 +64,10 @@
410433
#define SYS_FUTEX_WAIT 57
411434
#define SYS_FUTEX_WAKE 58
412435
#define SYS_LINK 59
413436
+#define SYS_BACKTRACE 60
414437
+#define SYS_POLL 61
438+
+#define SYS_EXIT_THREAD 62
439+
+#define SYS_SOCK_RECV 63
415440

416441
// Invalid syscall used to trigger a log error in the kernel (as a hint)
417442
// so, that we can implement the syscall in the kernel.

src/aero_kernel/src/fs/inode.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use core::sync::atomic::{AtomicUsize, Ordering};
2121

2222
use aero_syscall::prelude::{EPollEventFlags, PollEventFlags};
23+
use aero_syscall::socket::MessageHeader;
2324
use aero_syscall::{MMapFlags, OpenFlags};
2425

2526
use alloc::sync::Arc;
@@ -231,6 +232,10 @@ pub trait INodeInterface: Send + Sync {
231232
Err(FileSystemError::NotSocket)
232233
}
233234

235+
fn recv(&self, _message_header: &mut MessageHeader) -> Result<()> {
236+
Err(FileSystemError::NotSocket)
237+
}
238+
234239
/// Returns the inner UNIX socket inode if bound to one.
235240
fn as_unix_socket(&self) -> Result<Arc<dyn INodeInterface>> {
236241
Err(FileSystemError::NotSocket)

src/aero_kernel/src/fs/pipe.rs

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,13 @@
11
use core::sync::atomic::{AtomicUsize, Ordering};
22

33
use aero_syscall::OpenFlags;
4-
use alloc::{sync::Arc, vec::Vec};
4+
use alloc::sync::Arc;
55

6+
use crate::utils::buffer::Buffer;
67
use crate::utils::sync::{BlockQueue, Mutex};
78

89
use super::inode::{INodeInterface, PollFlags, PollTable};
910

10-
struct Buffer {
11-
data: Vec<u8>,
12-
}
13-
14-
impl Buffer {
15-
fn new() -> Self {
16-
Self { data: Vec::new() }
17-
}
18-
19-
fn has_data(&self) -> bool {
20-
!self.data.is_empty()
21-
}
22-
23-
fn read_data(&mut self, buffer: &mut [u8]) -> usize {
24-
// nothing to read mate
25-
if self.data.is_empty() {
26-
return 0;
27-
}
28-
29-
let count = core::cmp::min(buffer.len(), self.data.len());
30-
31-
for (i, b) in self.data.drain(..count).enumerate() {
32-
buffer[i] = b;
33-
}
34-
35-
count
36-
}
37-
38-
fn write_data(&mut self, data: &[u8]) -> usize {
39-
self.data.extend_from_slice(data);
40-
data.len() - 1
41-
}
42-
}
43-
4411
pub struct Pipe {
4512
queue: Mutex<Buffer>,
4613

src/aero_kernel/src/socket/unix.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919

2020
use aero_syscall::SocketAddrUnix;
2121

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

2526
use crate::fs;
2627
use crate::fs::inode::{DirEntry, FileType, INodeInterface, Metadata, PollFlags, PollTable};
2728
use crate::fs::{FileSystemError, Path, Result};
29+
use crate::utils::buffer::Buffer;
2830
use crate::utils::sync::{BlockQueue, Mutex};
2931

3032
use super::SocketAddr;
@@ -89,6 +91,7 @@ struct UnixSocketInner {
8991

9092
pub struct UnixSocket {
9193
inner: Mutex<UnixSocketInner>,
94+
buffer: Mutex<Buffer>,
9295
wq: BlockQueue,
9396
weak: Weak<UnixSocket>,
9497
}
@@ -101,6 +104,7 @@ impl UnixSocket {
101104
..Default::default()
102105
}),
103106

107+
buffer: Mutex::new(Buffer::new()),
104108
wq: BlockQueue::new(),
105109
weak: weak.clone(),
106110
})
@@ -112,8 +116,11 @@ impl UnixSocket {
112116
}
113117

114118
impl INodeInterface for UnixSocket {
115-
fn read_at(&self, _offset: usize, _buffer: &mut [u8]) -> Result<usize> {
116-
unimplemented!()
119+
fn read_at(&self, _offset: usize, user_buffer: &mut [u8]) -> Result<usize> {
120+
let mut buffer = self.wq.block_on(&self.buffer, |lock| lock.has_data())?;
121+
122+
let read = buffer.read_data(user_buffer);
123+
Ok(read)
117124
}
118125

119126
fn write_at(&self, _offset: usize, _buffer: &[u8]) -> Result<usize> {
@@ -210,6 +217,10 @@ impl INodeInterface for UnixSocket {
210217
Ok(sock)
211218
}
212219

220+
fn recv(&self, _message_header: &mut MessageHeader) -> Result<()> {
221+
Ok(())
222+
}
223+
213224
fn poll(&self, table: Option<&mut PollTable>) -> Result<PollFlags> {
214225
table.map(|e| e.insert(&self.wq));
215226

src/aero_kernel/src/syscall/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ pub fn generic_do_syscall(
219219
SYS_CONNECT => net::connect(b, c, d),
220220
SYS_LISTEN => net::listen(b, c),
221221
SYS_ACCEPT => net::accept(b, c, d),
222+
SYS_SOCK_RECV => net::sock_recv(b, c, d),
222223

223224
SYS_GETTIME => time::gettime(b, c),
224225
SYS_SLEEP => time::sleep(b),

src/aero_kernel/src/syscall/net.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use aero_syscall::socket::MessageHeader;
12
use aero_syscall::*;
23

34
use crate::fs::inode::DirEntry;
@@ -52,6 +53,24 @@ pub fn accept(
5253
Ok(handle)
5354
}
5455

56+
#[syscall]
57+
pub fn sock_recv(
58+
sockfd: usize,
59+
header: &mut MessageHeader,
60+
flags: usize,
61+
) -> Result<usize, SyscallError> {
62+
assert!(flags == 0, "sock_recv: flags are not currently supported");
63+
64+
let current_task = scheduler::get_scheduler().current_task();
65+
let socket = current_task
66+
.file_table
67+
.get_handle(sockfd)
68+
.ok_or(SyscallError::EINVAL)?;
69+
70+
socket.inode().recv(header)?;
71+
Ok(0)
72+
}
73+
5574
/// Marks the socket as a passive socket (i.e. as a socket that will be used to accept incoming
5675
/// connection requests).
5776
#[syscall]

src/aero_kernel/src/unwind.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ pub fn unwind_stack_trace() {
111111

112112
log::trace!("{:-^80}", " BACKTRACE ");
113113

114-
for depth in 0..64 {
114+
for depth in 0../*64*/16 {
115115
if let Some(rip_rbp) = rbp.checked_add(core::mem::size_of::<usize>()) {
116116
if offset_table
117117
.translate_addr(VirtAddr::new(rip_rbp as u64))

src/aero_kernel/src/utils/buffer.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,42 @@
1919

2020
use core::fmt::Write;
2121

22+
use alloc::vec::Vec;
23+
24+
pub struct Buffer {
25+
data: Vec<u8>,
26+
}
27+
28+
impl Buffer {
29+
pub fn new() -> Self {
30+
Self { data: Vec::new() }
31+
}
32+
33+
pub fn has_data(&self) -> bool {
34+
!self.data.is_empty()
35+
}
36+
37+
pub fn read_data(&mut self, buffer: &mut [u8]) -> usize {
38+
// nothing to read
39+
if self.data.is_empty() {
40+
return 0;
41+
}
42+
43+
let count = core::cmp::min(buffer.len(), self.data.len());
44+
45+
for (i, b) in self.data.drain(..count).enumerate() {
46+
buffer[i] = b;
47+
}
48+
49+
count
50+
}
51+
52+
pub fn write_data(&mut self, data: &[u8]) -> usize {
53+
self.data.extend_from_slice(data);
54+
data.len() - 1
55+
}
56+
}
57+
2258
/// Special special kind of buffer that stores valid UTF-8 text
2359
/// is always a constant size, removing the oldest messages when
2460
/// new messages are received without allocating memory on the

src/aero_syscall/src/consts.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ pub const SYS_LINK: usize = 59;
8383
pub const SYS_BACKTRACE: usize = 60;
8484
pub const SYS_POLL: usize = 61;
8585
pub const SYS_EXIT_THREAD: usize = 62;
86+
pub const SYS_SOCK_RECV: usize = 63;
8687

8788
// constants for fcntl()'s command argument:
8889
pub const F_DUPFD: usize = 1;

src/aero_syscall/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
pub mod consts;
2424
pub mod signal;
25+
pub mod socket;
2526
pub mod syscall;
2627

2728
pub use crate::syscall::*;

0 commit comments

Comments
 (0)