starnix_core/vfs/socket/
socket_qipcrtr.rs

1// Copyright 2025 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::task::{CurrentTask, EventHandler, WaitCanceler, Waiter};
6use crate::vfs::buffers::{AncillaryData, InputBuffer, MessageReadInfo, OutputBuffer};
7use crate::vfs::socket::{
8    Socket, SocketAddress, SocketHandle, SocketMessageFlags, SocketOps, SocketPeer,
9    SocketShutdownFlags, SocketType,
10};
11use starnix_logging::track_stub;
12use starnix_sync::{FileOpsCore, Locked};
13use starnix_uapi::errors::Errno;
14use starnix_uapi::vfs::FdEvents;
15use starnix_uapi::{error, ucred};
16
17pub struct QipcrtrSocket {}
18
19impl QipcrtrSocket {
20    pub fn new(_socket_type: SocketType) -> Self {
21        Self {}
22    }
23}
24
25impl SocketOps for QipcrtrSocket {
26    fn connect(
27        &self,
28        _locked: &mut Locked<FileOpsCore>,
29        _socket: &SocketHandle,
30        _current_task: &CurrentTask,
31        _peer: SocketPeer,
32    ) -> Result<(), Errno> {
33        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::connect");
34        error!(EINVAL)
35    }
36
37    fn listen(
38        &self,
39        _locked: &mut Locked<FileOpsCore>,
40        _socket: &Socket,
41        _backlog: i32,
42        _credentials: ucred,
43    ) -> Result<(), Errno> {
44        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::listen");
45        error!(EINVAL)
46    }
47
48    fn accept(
49        &self,
50        _locked: &mut Locked<FileOpsCore>,
51        _socket: &Socket,
52        _current_task: &CurrentTask,
53    ) -> Result<SocketHandle, Errno> {
54        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::accept");
55        error!(EINVAL)
56    }
57
58    fn bind(
59        &self,
60        _locked: &mut Locked<FileOpsCore>,
61        _socket: &Socket,
62        _current_task: &CurrentTask,
63        _socket_address: SocketAddress,
64    ) -> Result<(), Errno> {
65        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::bind");
66        error!(EINVAL)
67    }
68
69    fn read(
70        &self,
71        _locked: &mut Locked<FileOpsCore>,
72        _socket: &Socket,
73        _current_task: &CurrentTask,
74        _data: &mut dyn OutputBuffer,
75        _flags: SocketMessageFlags,
76    ) -> Result<MessageReadInfo, Errno> {
77        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::read");
78        error!(EINVAL)
79    }
80
81    fn write(
82        &self,
83        _locked: &mut Locked<FileOpsCore>,
84        _socket: &Socket,
85        _current_task: &CurrentTask,
86        _data: &mut dyn InputBuffer,
87        _dest_address: &mut Option<SocketAddress>,
88        _ancillary_data: &mut Vec<AncillaryData>,
89    ) -> Result<usize, Errno> {
90        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::write");
91        error!(EINVAL)
92    }
93
94    fn wait_async(
95        &self,
96        _locked: &mut Locked<FileOpsCore>,
97        _socket: &Socket,
98        _current_task: &CurrentTask,
99        _waiter: &Waiter,
100        _events: FdEvents,
101        _handler: EventHandler,
102    ) -> WaitCanceler {
103        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::wait_async");
104        WaitCanceler::new_noop()
105    }
106
107    fn query_events(
108        &self,
109        _locked: &mut Locked<FileOpsCore>,
110        _socket: &Socket,
111        _current_task: &CurrentTask,
112    ) -> Result<FdEvents, Errno> {
113        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::query_events");
114        error!(EINVAL)
115    }
116
117    fn shutdown(
118        &self,
119        _locked: &mut Locked<FileOpsCore>,
120        _socket: &Socket,
121        _how: SocketShutdownFlags,
122    ) -> Result<(), Errno> {
123        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::shutdown");
124        error!(EINVAL)
125    }
126
127    fn close(
128        &self,
129        _locked: &mut Locked<FileOpsCore>,
130        _current_task: &CurrentTask,
131        _socket: &Socket,
132    ) {
133        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::close");
134    }
135
136    fn getsockname(
137        &self,
138        _locked: &mut Locked<FileOpsCore>,
139        _socket: &Socket,
140    ) -> Result<SocketAddress, Errno> {
141        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::getsockname");
142        error!(EINVAL)
143    }
144
145    fn getpeername(
146        &self,
147        _locked: &mut Locked<FileOpsCore>,
148        _socket: &Socket,
149    ) -> Result<SocketAddress, Errno> {
150        track_stub!(TODO("https://fxbug.dev/388082019"), "QipcrtrSocket::getpeername");
151        error!(EINVAL)
152    }
153}
154
155#[cfg(test)]
156mod tests {
157    use super::*;
158    use crate::testing::spawn_kernel_and_run;
159    use crate::vfs::socket::{SocketDomain, SocketProtocol, SocketType};
160
161    #[::fuchsia::test]
162    async fn test_qipcrtr_socket_new() {
163        spawn_kernel_and_run(async |locked, current_task| {
164            let _kernel = current_task.kernel();
165            let _socket = Socket::new(
166                locked,
167                &current_task,
168                SocketDomain::Qipcrtr,
169                SocketType::Datagram,
170                SocketProtocol::default(),
171                /* kernel_private = */ false,
172            )
173            .expect("Failed to create socket.");
174        })
175        .await;
176    }
177}