mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-04 13:29:51 -05:00
os: wrap accept4(SOCK_CLOEXEC)
Some system C libraries do not have SOCK_CLOEXEC, and completely miss accept4(), too. Provide a fallback for this case. This changes the behaviour: no error messages are printed now for failing to set CLOEXEC but the file descriptor is closed. The unit test for this wrapper is NOT included. Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
This commit is contained in:
parent
b2eaf870cf
commit
ff50f6bfc4
5 changed files with 29 additions and 8 deletions
|
|
@ -20,6 +20,8 @@
|
|||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
|
@ -27,6 +29,7 @@
|
|||
#include <errno.h>
|
||||
#include <sys/epoll.h>
|
||||
|
||||
#include "../config.h"
|
||||
#include "wayland-os.h"
|
||||
|
||||
static int
|
||||
|
|
@ -142,3 +145,20 @@ wl_os_epoll_create_cloexec(void)
|
|||
fd = epoll_create(1);
|
||||
return set_cloexec_or_close(fd);
|
||||
}
|
||||
|
||||
int
|
||||
wl_os_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
||||
{
|
||||
int fd;
|
||||
|
||||
#ifdef HAVE_ACCEPT4
|
||||
fd = accept4(sockfd, addr, addrlen, SOCK_CLOEXEC);
|
||||
if (fd >= 0)
|
||||
return fd;
|
||||
if (errno != ENOSYS)
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
fd = accept(sockfd, addr, addrlen);
|
||||
return set_cloexec_or_close(fd);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue