diff options
Diffstat (limited to 'libxcb/src/xcb_util.c')
-rw-r--r-- | libxcb/src/xcb_util.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/libxcb/src/xcb_util.c b/libxcb/src/xcb_util.c index c3cbfa6c1..996ff2518 100644 --- a/libxcb/src/xcb_util.c +++ b/libxcb/src/xcb_util.c @@ -41,6 +41,7 @@ #include <stdlib.h> #include <stddef.h> #include <unistd.h> +#include <fcntl.h> #include <string.h> #include "xcb.h" @@ -177,6 +178,22 @@ static int _xcb_open(char *host, char *protocol, const int display) return _xcb_open_unix(protocol, file); } +static int _xcb_socket(int family, int type, int proto) +{ + int fd; + +#ifdef SOCK_CLOEXEC + fd = socket(family, type | SOCK_CLOEXEC, proto); + if (fd == -1 && errno == EINVAL) +#endif + { + fd = socket(family, type, proto); + if (fd >= 0) + fcntl(fd, F_SETFD, FD_CLOEXEC); + } + return fd; +} + #ifdef DNETCONN static int _xcb_open_decnet(const char *host, const char *protocol, const unsigned short port) { @@ -199,7 +216,7 @@ static int _xcb_open_decnet(const char *host, const char *protocol, const unsign return -1; addr.sdn_objnum = 0; - fd = socket(PF_DECnet, SOCK_STREAM, 0); + fd = _xcb_socket(PF_DECnet, SOCK_STREAM, 0); if(fd == -1) return -1; @@ -256,7 +273,7 @@ static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port) for(addr = results; addr; addr = addr->ai_next) { - fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); + fd = _xcb_socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); if(fd >= 0) { int on = 1; setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); @@ -285,7 +302,7 @@ static int _xcb_open_unix(char *protocol, const char *file) #ifdef HAVE_SOCKADDR_SUN_LEN addr.sun_len = SUN_LEN(&addr); #endif - fd = socket(AF_UNIX, SOCK_STREAM, 0); + fd = _xcb_socket(AF_UNIX, SOCK_STREAM, 0); if(fd == -1) return -1; if(connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { @@ -311,7 +328,7 @@ static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen) #ifdef HAVE_SOCKADDR_SUN_LEN addr.sun_len = 1 + filelen; #endif - fd = socket(AF_UNIX, SOCK_STREAM, 0); + fd = _xcb_socket(AF_UNIX, SOCK_STREAM, 0); if (fd == -1) return -1; if (connect(fd, (struct sockaddr *) &addr, namelen) == -1) { |