mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-16 17:46:48 +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 | ❌ |
|
||||
| 286 | timerfd_settime | ❌ |
|
||||
| 287 | timerfd_gettime | ❌ |
|
||||
| 288 | accept4 | ❌ |
|
||||
| 288 | accept4 | ✅ |
|
||||
| 289 | signalfd4 | ❌ |
|
||||
| 290 | eventfd2 | ✅ |
|
||||
| 291 | epoll_create1 | ✅ |
|
||||
|
@ -2,9 +2,13 @@
|
||||
|
||||
use super::{SyscallReturn, SYS_ACCEPT};
|
||||
use crate::{
|
||||
fs::file_table::{FdFlags, FileDesc},
|
||||
fs::{
|
||||
file_table::{FdFlags, FileDesc},
|
||||
utils::{CreationFlags, StatusFlags},
|
||||
},
|
||||
log_syscall_entry,
|
||||
prelude::*,
|
||||
syscall::SYS_ACCEPT4,
|
||||
util::net::{get_socket_from_fd, write_socket_addr_to_user},
|
||||
};
|
||||
|
||||
@ -16,15 +20,68 @@ pub fn sys_accept(
|
||||
log_syscall_entry!(SYS_ACCEPT);
|
||||
debug!("sockfd = {sockfd}, sockaddr_ptr = 0x{sockaddr_ptr:x}, addrlen_ptr = 0x{addrlen_ptr:x}");
|
||||
|
||||
let socket = get_socket_from_fd(sockfd)?;
|
||||
let fd = do_accept(sockfd, sockaddr_ptr, addrlen_ptr, Flags::empty())?;
|
||||
Ok(SyscallReturn::Return(fd as _))
|
||||
}
|
||||
|
||||
let (connected_socket, socket_addr) = socket.accept()?;
|
||||
write_socket_addr_to_user(&socket_addr, sockaddr_ptr, addrlen_ptr)?;
|
||||
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 connected_fd = {
|
||||
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)?;
|
||||
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)?;
|
||||
}
|
||||
|
||||
let fd = {
|
||||
let current = current!();
|
||||
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 self::{
|
||||
accept::sys_accept,
|
||||
accept::{sys_accept, sys_accept4},
|
||||
alarm::sys_alarm,
|
||||
bind::sys_bind,
|
||||
connect::sys_connect,
|
||||
@ -391,6 +391,7 @@ define_syscall_nums!(
|
||||
SYS_UTIMENSAT = 280,
|
||||
SYS_EPOLL_PWAIT = 281,
|
||||
SYS_EVENTFD = 284,
|
||||
SYS_ACCEPT4 = 288,
|
||||
SYS_EVENTFD2 = 290,
|
||||
SYS_EPOLL_CREATE1 = 291,
|
||||
SYS_PIPE2 = 293,
|
||||
@ -584,6 +585,7 @@ pub fn syscall_dispatch(
|
||||
SYS_UTIMENSAT => syscall_handler!(4, sys_utimensat, args),
|
||||
SYS_EPOLL_PWAIT => syscall_handler!(5, sys_epoll_pwait, 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_EPOLL_CREATE1 => syscall_handler!(1, sys_epoll_create1, args),
|
||||
SYS_PIPE2 => syscall_handler!(2, sys_pipe2, args),
|
||||
|
Loading…
x
Reference in New Issue
Block a user