|
#define SOCKET_FLAGS_PRIV
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#ifdef NEED_SOCKET_FLAGS
|
|
|
|
#include <fcntl.h>
|
|
|
|
int
|
|
_socket(int domain, int type, int protocol)
|
|
{
|
|
int s = socket(domain, type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK), protocol);
|
|
int flags;
|
|
if (s == -1)
|
|
return s;
|
|
|
|
if (type & SOCK_CLOEXEC) {
|
|
flags = fcntl(s, F_GETFD);
|
|
fcntl(s, F_SETFD, flags | FD_CLOEXEC);
|
|
}
|
|
|
|
if (type & SOCK_NONBLOCK) {
|
|
flags = fcntl(s, F_GETFL);
|
|
fcntl(s, F_SETFL, flags | O_NONBLOCK);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
int
|
|
_socketpair(int domain, int type, int protocol, int socket_vector[2])
|
|
{
|
|
int rc = socketpair(domain, type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK), protocol, socket_vector);
|
|
int flags, i;
|
|
if (rc == -1)
|
|
return rc;
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
if (type & SOCK_CLOEXEC) {
|
|
flags = fcntl(socket_vector[i], F_GETFD);
|
|
fcntl(socket_vector[i], F_SETFD, flags | FD_CLOEXEC);
|
|
}
|
|
|
|
if (type & SOCK_NONBLOCK) {
|
|
flags = fcntl(socket_vector[i], F_GETFL);
|
|
fcntl(socket_vector[i], F_SETFL, flags | O_NONBLOCK);
|
|
}
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
#endif
|