changeset 5436:56c934c73aa8 draft

if: introduce xsocketpair, similar to xsocket Old systems don't have SOCK_CLOEXEC, etc, this makes it easy. While here, right limit the sockets.
author Roy Marples <roy@marples.name>
date Sat, 05 Sep 2020 16:10:30 +0100
parents 557a3f9f2be4
children 5bbb5bae3e66
files src/if.c src/if.h
diffstat 2 files changed, 54 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/if.c	Wed Sep 02 09:56:32 2020 +0100
+++ b/src/if.c	Sat Sep 05 16:10:30 2020 +0100
@@ -995,3 +995,55 @@
 	return -1;
 #endif
 }
+
+int
+xsocketpair(int domain, int type, int protocol, int fd[2])
+{
+	int s;
+#if !defined(HAVE_SOCK_CLOEXEC) || !defined(HAVE_SOCK_NONBLOCK)
+	int xflags, xtype = type;
+#endif
+
+#ifndef HAVE_SOCK_CLOEXEC
+	if (xtype & SOCK_CLOEXEC)
+		type &= ~SOCK_CLOEXEC;
+#endif
+#ifndef HAVE_SOCK_NONBLOCK
+	if (xtype & SOCK_NONBLOCK)
+		type &= ~SOCK_NONBLOCK;
+#endif
+
+	if ((s = socketpair(domain, type, protocol, fd)) == -1)
+		return -1;
+
+#ifdef PRIVSEP_RIGHTS
+	if (ps_rights_limit_fdpair(fd) == -1)
+		goto out;
+#endif
+#ifndef HAVE_SOCK_CLOEXEC
+	if ((xtype & SOCK_CLOEXEC) && ((xflags = fcntl(fd[0], F_GETFD)) == -1 ||
+	    fcntl(fd[0], F_SETFD, xflags | FD_CLOEXEC) == -1))
+		goto out;
+	if ((xtype & SOCK_CLOEXEC) && ((xflags = fcntl(fd[1], F_GETFD)) == -1 ||
+	    fcntl(fd[1], F_SETFD, xflags | FD_CLOEXEC) == -1))
+		goto out;
+#endif
+#ifndef HAVE_SOCK_NONBLOCK
+	if ((xtype & SOCK_NONBLOCK) && ((xflags = fcntl(fd[0], F_GETFL)) == -1 ||
+	    fcntl(fd[0], F_SETFL, xflags | O_NONBLOCK) == -1))
+		goto out;
+	if ((xtype & SOCK_NONBLOCK) && ((xflags = fcntl(fd[1], F_GETFL)) == -1 ||
+	    fcntl(fd[1], F_SETFL, xflags | O_NONBLOCK) == -1))
+		goto out;
+#endif
+
+	return s;
+
+#if defined(PRIVSEP_RIGHTS) || \
+	!defined(HAVE_SOCK_CLOEXEC) || !defined(HAVE_SOCK_NONBLOCK)
+out:
+	close(fd[0]);
+	close(fd[1]);
+	return -1;
+#endif
+}
--- a/src/if.h	Wed Sep 02 09:56:32 2020 +0100
+++ b/src/if.h	Sat Sep 05 16:10:30 2020 +0100
@@ -224,6 +224,8 @@
 #ifndef SOCK_CXNB
 #define	SOCK_CXNB	SOCK_CLOEXEC | SOCK_NONBLOCK
 #endif
+int xsocket(int, int, int);
+int xsocketpair(int, int, int, int[2]);
 
 int if_route(unsigned char, const struct rt *rt);
 int if_initrt(struct dhcpcd_ctx *, rb_tree_t *, int);
@@ -259,7 +261,6 @@
 int if_machinearch(char *, size_t);
 struct interface *if_findifpfromcmsg(struct dhcpcd_ctx *,
     struct msghdr *, int *);
-int xsocket(int, int, int);
 
 #ifdef __linux__
 int if_linksocket(struct sockaddr_nl *, int, int);