mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-17 02:26:46 +00:00
Add syscall accept4
This commit is contained in:
parent
ea25157790
commit
b11e6d2d62
@ -308,7 +308,7 @@ provided by Linux on x86-64 architecture.
|
|||||||
| 285 | fallocate | ❌ |
|
| 285 | fallocate | ❌ |
|
||||||
| 286 | timerfd_settime | ❌ |
|
| 286 | timerfd_settime | ❌ |
|
||||||
| 287 | timerfd_gettime | ❌ |
|
| 287 | timerfd_gettime | ❌ |
|
||||||
| 288 | accept4 | ❌ |
|
| 288 | accept4 | ✅ |
|
||||||
| 289 | signalfd4 | ❌ |
|
| 289 | signalfd4 | ❌ |
|
||||||
| 290 | eventfd2 | ✅ |
|
| 290 | eventfd2 | ✅ |
|
||||||
| 291 | epoll_create1 | ✅ |
|
| 291 | epoll_create1 | ✅ |
|
||||||
|
@ -2,9 +2,13 @@
|
|||||||
|
|
||||||
use super::{SyscallReturn, SYS_ACCEPT};
|
use super::{SyscallReturn, SYS_ACCEPT};
|
||||||
use crate::{
|
use crate::{
|
||||||
fs::file_table::{FdFlags, FileDesc},
|
fs::{
|
||||||
|
file_table::{FdFlags, FileDesc},
|
||||||
|
utils::{CreationFlags, StatusFlags},
|
||||||
|
},
|
||||||
log_syscall_entry,
|
log_syscall_entry,
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
syscall::SYS_ACCEPT4,
|
||||||
util::net::{get_socket_from_fd, write_socket_addr_to_user},
|
util::net::{get_socket_from_fd, write_socket_addr_to_user},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -16,15 +20,68 @@ pub fn sys_accept(
|
|||||||
log_syscall_entry!(SYS_ACCEPT);
|
log_syscall_entry!(SYS_ACCEPT);
|
||||||
debug!("sockfd = {sockfd}, sockaddr_ptr = 0x{sockaddr_ptr:x}, addrlen_ptr = 0x{addrlen_ptr:x}");
|
debug!("sockfd = {sockfd}, sockaddr_ptr = 0x{sockaddr_ptr:x}, addrlen_ptr = 0x{addrlen_ptr:x}");
|
||||||
|
|
||||||
|
let fd = do_accept(sockfd, sockaddr_ptr, addrlen_ptr, Flags::empty())?;
|
||||||
|
Ok(SyscallReturn::Return(fd as _))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sys_accept4(
|
||||||
|
sockfd: FileDesc,
|
||||||
|
sockaddr_ptr: Vaddr,
|
||||||
|
addrlen_ptr: Vaddr,
|
||||||
|
flags: u32,
|
||||||
|
) -> Result<SyscallReturn> {
|
||||||
|
log_syscall_entry!(SYS_ACCEPT4);
|
||||||
|
trace!("raw flags = 0x{:x}", flags);
|
||||||
|
let flags = Flags::from_bits_truncate(flags);
|
||||||
|
debug!(
|
||||||
|
"sockfd = {}, sockaddr_ptr = 0x{:x}, addrlen_ptr = 0x{:x}, flags = {:?}",
|
||||||
|
sockfd, sockaddr_ptr, addrlen_ptr, flags
|
||||||
|
);
|
||||||
|
|
||||||
|
let fd = do_accept(sockfd, sockaddr_ptr, addrlen_ptr, flags)?;
|
||||||
|
Ok(SyscallReturn::Return(fd as _))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_accept(
|
||||||
|
sockfd: FileDesc,
|
||||||
|
sockaddr_ptr: Vaddr,
|
||||||
|
addrlen_ptr: Vaddr,
|
||||||
|
flags: Flags,
|
||||||
|
) -> Result<FileDesc> {
|
||||||
|
let (connected_socket, socket_addr) = {
|
||||||
let socket = get_socket_from_fd(sockfd)?;
|
let socket = get_socket_from_fd(sockfd)?;
|
||||||
|
socket.accept()?
|
||||||
|
};
|
||||||
|
|
||||||
let (connected_socket, socket_addr) = socket.accept()?;
|
if flags.contains(Flags::SOCK_NONBLOCK) {
|
||||||
|
connected_socket.set_status_flags(StatusFlags::O_NONBLOCK)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let fd_flags = if flags.contains(Flags::SOCK_CLOEXEC) {
|
||||||
|
FdFlags::CLOEXEC
|
||||||
|
} else {
|
||||||
|
FdFlags::empty()
|
||||||
|
};
|
||||||
|
|
||||||
|
if sockaddr_ptr != 0 {
|
||||||
write_socket_addr_to_user(&socket_addr, sockaddr_ptr, addrlen_ptr)?;
|
write_socket_addr_to_user(&socket_addr, sockaddr_ptr, addrlen_ptr)?;
|
||||||
|
}
|
||||||
|
|
||||||
let connected_fd = {
|
let fd = {
|
||||||
let current = current!();
|
let current = current!();
|
||||||
let mut file_table = current.file_table().lock();
|
let mut file_table = current.file_table().lock();
|
||||||
file_table.insert(connected_socket, FdFlags::empty())
|
file_table.insert(connected_socket, fd_flags)
|
||||||
};
|
};
|
||||||
Ok(SyscallReturn::Return(connected_fd as _))
|
|
||||||
|
Ok(fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
struct Flags: u32 {
|
||||||
|
const SOCK_NONBLOCK = NONBLOCK;
|
||||||
|
const SOCK_CLOEXEC = CLOEXEC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const NONBLOCK: u32 = StatusFlags::O_NONBLOCK.bits();
|
||||||
|
const CLOEXEC: u32 = CreationFlags::O_CLOEXEC.bits();
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
use aster_frame::cpu::UserContext;
|
use aster_frame::cpu::UserContext;
|
||||||
|
|
||||||
use self::{
|
use self::{
|
||||||
accept::sys_accept,
|
accept::{sys_accept, sys_accept4},
|
||||||
alarm::sys_alarm,
|
alarm::sys_alarm,
|
||||||
bind::sys_bind,
|
bind::sys_bind,
|
||||||
connect::sys_connect,
|
connect::sys_connect,
|
||||||
@ -391,6 +391,7 @@ define_syscall_nums!(
|
|||||||
SYS_UTIMENSAT = 280,
|
SYS_UTIMENSAT = 280,
|
||||||
SYS_EPOLL_PWAIT = 281,
|
SYS_EPOLL_PWAIT = 281,
|
||||||
SYS_EVENTFD = 284,
|
SYS_EVENTFD = 284,
|
||||||
|
SYS_ACCEPT4 = 288,
|
||||||
SYS_EVENTFD2 = 290,
|
SYS_EVENTFD2 = 290,
|
||||||
SYS_EPOLL_CREATE1 = 291,
|
SYS_EPOLL_CREATE1 = 291,
|
||||||
SYS_PIPE2 = 293,
|
SYS_PIPE2 = 293,
|
||||||
@ -584,6 +585,7 @@ pub fn syscall_dispatch(
|
|||||||
SYS_UTIMENSAT => syscall_handler!(4, sys_utimensat, args),
|
SYS_UTIMENSAT => syscall_handler!(4, sys_utimensat, args),
|
||||||
SYS_EPOLL_PWAIT => syscall_handler!(5, sys_epoll_pwait, args),
|
SYS_EPOLL_PWAIT => syscall_handler!(5, sys_epoll_pwait, args),
|
||||||
SYS_EVENTFD => syscall_handler!(1, sys_eventfd, args),
|
SYS_EVENTFD => syscall_handler!(1, sys_eventfd, args),
|
||||||
|
SYS_ACCEPT4 => syscall_handler!(4, sys_accept4, args),
|
||||||
SYS_EVENTFD2 => syscall_handler!(2, sys_eventfd2, args),
|
SYS_EVENTFD2 => syscall_handler!(2, sys_eventfd2, args),
|
||||||
SYS_EPOLL_CREATE1 => syscall_handler!(1, sys_epoll_create1, args),
|
SYS_EPOLL_CREATE1 => syscall_handler!(1, sys_epoll_create1, args),
|
||||||
SYS_PIPE2 => syscall_handler!(2, sys_pipe2, args),
|
SYS_PIPE2 => syscall_handler!(2, sys_pipe2, args),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user