xref: /aosp_15_r20/external/musl/src/network/socketpair.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1 #include <sys/socket.h>
2 #include <fcntl.h>
3 #include <errno.h>
4 #include "syscall.h"
5 
socketpair(int domain,int type,int protocol,int fd[2])6 int socketpair(int domain, int type, int protocol, int fd[2])
7 {
8 	int r = socketcall(socketpair, domain, type, protocol, fd, 0, 0);
9 	if (r<0 && (errno==EINVAL || errno==EPROTONOSUPPORT)
10 	    && (type&(SOCK_CLOEXEC|SOCK_NONBLOCK))) {
11 		r = socketcall(socketpair, domain,
12 			type & ~(SOCK_CLOEXEC|SOCK_NONBLOCK),
13 			protocol, fd, 0, 0);
14 		if (r < 0) return r;
15 		if (type & SOCK_CLOEXEC) {
16 			__syscall(SYS_fcntl, fd[0], F_SETFD, FD_CLOEXEC);
17 			__syscall(SYS_fcntl, fd[1], F_SETFD, FD_CLOEXEC);
18 		}
19 		if (type & SOCK_NONBLOCK) {
20 			__syscall(SYS_fcntl, fd[0], F_SETFL, O_NONBLOCK);
21 			__syscall(SYS_fcntl, fd[1], F_SETFL, O_NONBLOCK);
22 		}
23 	}
24 	return r;
25 }
26