implement sendto for unix sockets

This commit is contained in:
Ashwin Naren
2026-03-08 18:14:32 -07:00
parent 4388408e75
commit bc4199db0b
2 changed files with 31 additions and 7 deletions

View File

@@ -95,7 +95,8 @@ where
buf: UA,
count: usize,
) -> libkernel::error::Result<usize> {
self.recv(ctx, buf, count, RecvFlags::empty()).await
self.recv(ctx, buf, count, RecvFlags::empty())
.await
.map(|(len, _)| len)
}

View File

@@ -349,20 +349,43 @@ impl SocketOps for UnixSocket {
let Some(peer) = self.peer_inbox.lock_save_irq().clone() else {
return Err(KernelError::InvalidValue);
};
let local_addr = { self.local_addr.lock_save_irq().unwrap() };
let local_addr = {
self.local_addr.lock_save_irq().unwrap_or(SockAddrUn {
family: crate::net::AF_UNIX as u16,
path: [0; 108],
})
};
peer.send(local_addr, buf, count).await
}
async fn sendto(
&mut self,
_ctx: &mut FileCtx,
_buf: UA,
_count: usize,
buf: UA,
count: usize,
_flags: SendFlags,
_addr: SockAddr,
addr: SockAddr,
) -> Result<usize> {
todo!();
// self.send(ctx, buf, count, flags).await
let peer_inbox = match addr {
SockAddr::Un(saun) => {
let Some(path) = UnixSocket::path_bytes(&saun) else {
return Err(KernelError::InvalidValue);
};
let reg = endpoints().lock_save_irq();
let Some(ep) = reg.get(&path) else {
return Err(KernelError::Fs(FsError::NotFound));
};
ep.inbox.clone()
}
_ => return Err(KernelError::InvalidValue),
};
let local_addr = {
self.local_addr.lock_save_irq().unwrap_or(SockAddrUn {
family: crate::net::AF_UNIX as u16,
path: [0; 108],
})
};
peer_inbox.send(local_addr, buf, count).await
}
async fn shutdown(&self, how: crate::net::ShutdownHow) -> Result<()> {