# HG changeset patch # User Roy Marples # Date 1599318630 -3600 # Node ID 56c934c73aa8a41dbc086d6ff7e714584b953daf # Parent 557a3f9f2be4feff22ac41b4852ac9ff5f4e55c9 if: introduce xsocketpair, similar to xsocket Old systems don't have SOCK_CLOEXEC, etc, this makes it easy. While here, right limit the sockets. diff -r 557a3f9f2be4 -r 56c934c73aa8 src/if.c --- 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 +} diff -r 557a3f9f2be4 -r 56c934c73aa8 src/if.h --- 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);