(
domain: u32,
raw_ty: u32,
proto: u32,
fds: UserPtr<[i32; 2]>,
)
| 150 | } |
| 151 | |
| 152 | pub 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 | } |
no test coverage detected