Procházet zdrojové kódy

add SOCK_CLOEXEC fallback for socketpair on old kernels

as usual, this is non-atomic, but better than producing an error or
failing to set the close-on-exec flag at all.
Rich Felker před 10 roky
rodič
revize
1d348566e6
1 změnil soubory, kde provedl 19 přidání a 1 odebrání
  1. 19 1
      src/network/socketpair.c

+ 19 - 1
src/network/socketpair.c

@@ -1,7 +1,25 @@
 #include <sys/socket.h>
+#include <fcntl.h>
+#include <errno.h>
 #include "syscall.h"
 
 int socketpair(int domain, int type, int protocol, int fd[2])
 {
-	return socketcall(socketpair, domain, type, protocol, fd, 0, 0);
+	int r = socketcall(socketpair, domain, type, protocol, fd, 0, 0);
+	if (r<0 && (errno==EINVAL || errno==EPROTONOSUPPORT)
+	    && (type&(SOCK_CLOEXEC|SOCK_NONBLOCK))) {
+		r = socketcall(socketpair, domain,
+			type & ~(SOCK_CLOEXEC|SOCK_NONBLOCK),
+			protocol, fd, 0, 0);
+		if (r < 0) return r;
+		if (type & SOCK_CLOEXEC) {
+			__syscall(SYS_fcntl, fd[0], F_SETFD, FD_CLOEXEC);
+			__syscall(SYS_fcntl, fd[1], F_SETFD, FD_CLOEXEC);
+		}
+		if (type & SOCK_NONBLOCK) {
+			__syscall(SYS_fcntl, fd[0], F_SETFL, O_NONBLOCK);
+			__syscall(SYS_fcntl, fd[1], F_SETFL, O_NONBLOCK);
+		}
+	}
+	return r;
 }