mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-23 01:13:23 +00:00
Refactor project structure
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
bd878dd1c9
commit
e3c227ae06
39
kernel/aster-nix/src/syscall/recvfrom.rs
Normal file
39
kernel/aster-nix/src/syscall/recvfrom.rs
Normal file
@ -0,0 +1,39 @@
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
use super::{SyscallReturn, SYS_RECVFROM};
|
||||
use crate::{
|
||||
fs::file_table::FileDescripter,
|
||||
log_syscall_entry,
|
||||
net::socket::SendRecvFlags,
|
||||
prelude::*,
|
||||
util::{
|
||||
net::{get_socket_from_fd, write_socket_addr_to_user},
|
||||
write_bytes_to_user,
|
||||
},
|
||||
};
|
||||
|
||||
pub fn sys_recvfrom(
|
||||
sockfd: FileDescripter,
|
||||
buf: Vaddr,
|
||||
len: usize,
|
||||
flags: i32,
|
||||
src_addr: Vaddr,
|
||||
addrlen_ptr: Vaddr,
|
||||
) -> Result<SyscallReturn> {
|
||||
log_syscall_entry!(SYS_RECVFROM);
|
||||
let flags = SendRecvFlags::from_bits_truncate(flags);
|
||||
debug!("sockfd = {sockfd}, buf = 0x{buf:x}, len = {len}, flags = {flags:?}, src_addr = 0x{src_addr:x}, addrlen_ptr = 0x{addrlen_ptr:x}");
|
||||
|
||||
let socket = get_socket_from_fd(sockfd)?;
|
||||
|
||||
let mut buffer = vec![0u8; len];
|
||||
|
||||
let (recv_size, socket_addr) = socket.recvfrom(&mut buffer, flags)?;
|
||||
if buf != 0 {
|
||||
write_bytes_to_user(buf, &buffer[..recv_size])?;
|
||||
}
|
||||
if src_addr != 0 {
|
||||
write_socket_addr_to_user(&socket_addr, src_addr, addrlen_ptr)?;
|
||||
}
|
||||
Ok(SyscallReturn::Return(recv_size as _))
|
||||
}
|
Reference in New Issue
Block a user