1use 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 ¤t_task,
168 SocketDomain::Qipcrtr,
169 SocketType::Datagram,
170 SocketProtocol::default(),
171 false,
172 )
173 .expect("Failed to create socket.");
174 })
175 .await;
176 }
177}