1#include <sys/socket.h> 2#include <fcntl.h> 3#include <errno.h> 4#include "syscall.h" 5 6int socket(int domain, int type, int protocol) 7{ 8 int s = socketcall(socket, domain, type, protocol, 0, 0, 0); 9 if (s<0 && (errno==EINVAL || errno==EPROTONOSUPPORT) 10 && (type&(SOCK_CLOEXEC|SOCK_NONBLOCK))) { 11 s = socketcall(socket, domain, 12 type & ~(SOCK_CLOEXEC|SOCK_NONBLOCK), 13 protocol, 0, 0, 0); 14 if (s < 0) return s; 15 if (type & SOCK_CLOEXEC) 16 __syscall(SYS_fcntl, s, F_SETFD, FD_CLOEXEC); 17 if (type & SOCK_NONBLOCK) 18 __syscall(SYS_fcntl, s, F_SETFL, O_NONBLOCK); 19 } 20 return s; 21} 22