MCPcopy Create free account
hub / github.com/Starry-OS/StarryOS / sys_socketpair

Function sys_socketpair

api/src/syscall/net/socket.rs:152–194  ·  view source on GitHub ↗
(
    domain: u32,
    raw_ty: u32,
    proto: u32,
    fds: UserPtr<[i32; 2]>,
)

Source from the content-addressed store, hash-verified

150}
151
152pub fn sys_socketpair(
153 domain: u32,
154 raw_ty: u32,
155 proto: u32,
156 fds: UserPtr<[i32; 2]>,
157) -> AxResult<isize> {
158 debug!("sys_socketpair <= domain: {domain}, ty: {raw_ty}, proto: {proto}");
159 let ty = raw_ty & 0xFF;
160
161 if domain != AF_UNIX {
162 return Err(AxError::from(LinuxError::EAFNOSUPPORT));
163 }
164
165 let pid = current().as_thread().proc_data.proc.pid();
166 let (sock1, sock2) = match ty {
167 SOCK_STREAM => {
168 let (sock1, sock2) = StreamTransport::new_pair(pid);
169 (UnixSocket::new(sock1), UnixSocket::new(sock2))
170 }
171 SOCK_DGRAM | SOCK_SEQPACKET => {
172 let (sock1, sock2) = DgramTransport::new_pair(pid);
173 (UnixSocket::new(sock1), UnixSocket::new(sock2))
174 }
175 _ => {
176 warn!("Unsupported socketpair type: {ty}");
177 return Err(AxError::from(LinuxError::ESOCKTNOSUPPORT));
178 }
179 };
180 let sock1 = Socket(axnet::Socket::Unix(sock1));
181 let sock2 = Socket(axnet::Socket::Unix(sock2));
182
183 if raw_ty & O_NONBLOCK != 0 {
184 sock1.set_nonblocking(true)?;
185 sock2.set_nonblocking(true)?;
186 }
187 let cloexec = raw_ty & O_CLOEXEC != 0;
188
189 *fds.get_as_mut()? = [
190 sock1.add_to_fd_table(cloexec)?,
191 sock2.add_to_fd_table(cloexec)?,
192 ];
193 Ok(0)
194}

Callers 1

handle_syscallFunction · 0.85

Calls 5

SocketClass · 0.85
as_threadMethod · 0.80
get_as_mutMethod · 0.80
add_to_fd_tableMethod · 0.80
set_nonblockingMethod · 0.45

Tested by

no test coverage detected