Mercurial > hg > dhcpcd
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);
