[PATCH wayland v3 3/7] os: Expose set_cloexec_or_close with a namespaced name

Pekka Paalanen ppaalanen at gmail.com
Mon Dec 14 00:28:56 PST 2015


On Mon,  7 Dec 2015 22:49:15 -0800
Bryce Harrington <bryce at osg.samsung.com> wrote:

> Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
> ---
>  src/wayland-os.c | 24 +++++++++++++++++-------
>  src/wayland-os.h |  3 +++
>  2 files changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/src/wayland-os.c b/src/wayland-os.c
> index 93b6f5f..342a73a 100644
> --- a/src/wayland-os.c
> +++ b/src/wayland-os.c
> @@ -35,8 +35,18 @@
>  #include "../config.h"
>  #include "wayland-os.h"
>  
> -static int
> -set_cloexec_or_close(int fd)
> +
> +/** Ensure the file descriptor will close after an execve
> + *
> + * If the fd cannot be set as cloexec, close it and return
> + * an error.

Returns either the fd passed in, or -1 on error.

NOTE: Setting cloexec after the file descriptor already exists is
inherently racy against forks with threads, and should only be used as
a fallback when the OS does not offer a race-free way.


With those added and *if* this function is actually needed:
Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

I say "if", because I think it might be better that
wl_display_add_socket_fd() simply required its argument fd to be
cloexec already. But that's to discuss in the relevant patch, not here.

Btw. committing this documentation even if wl_os_set_cloexec_or_close()
wasn't needed would be nice.


Thanks,
pq

> + *
> + * \param fd The file descriptor to be modified
> + *
> + * \memberof wl_os
> + */
> +int
> +wl_os_set_cloexec_or_close(int fd)
>  {
>  	long flags;
>  
> @@ -69,7 +79,7 @@ wl_os_socket_cloexec(int domain, int type, int protocol)
>  		return -1;
>  
>  	fd = socket(domain, type, protocol);
> -	return set_cloexec_or_close(fd);
> +	return wl_os_set_cloexec_or_close(fd);
>  }
>  
>  int
> @@ -84,7 +94,7 @@ wl_os_dupfd_cloexec(int fd, long minfd)
>  		return -1;
>  
>  	newfd = fcntl(fd, F_DUPFD, minfd);
> -	return set_cloexec_or_close(newfd);
> +	return wl_os_set_cloexec_or_close(newfd);
>  }
>  
>  static ssize_t
> @@ -112,7 +122,7 @@ recvmsg_cloexec_fallback(int sockfd, struct msghdr *msg, int flags)
>  		data = CMSG_DATA(cmsg);
>  		end = (int *)(data + cmsg->cmsg_len - CMSG_LEN(0));
>  		for (fd = (int *)data; fd < end; ++fd)
> -			*fd = set_cloexec_or_close(*fd);
> +			*fd = wl_os_set_cloexec_or_close(*fd);
>  	}
>  
>  	return len;
> @@ -146,7 +156,7 @@ wl_os_epoll_create_cloexec(void)
>  #endif
>  
>  	fd = epoll_create(1);
> -	return set_cloexec_or_close(fd);
> +	return wl_os_set_cloexec_or_close(fd);
>  }
>  
>  int
> @@ -163,5 +173,5 @@ wl_os_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
>  #endif
>  
>  	fd = accept(sockfd, addr, addrlen);
> -	return set_cloexec_or_close(fd);
> +	return wl_os_set_cloexec_or_close(fd);
>  }
> diff --git a/src/wayland-os.h b/src/wayland-os.h
> index f51efaa..e756841 100644
> --- a/src/wayland-os.h
> +++ b/src/wayland-os.h
> @@ -27,6 +27,9 @@
>  #define WAYLAND_OS_H
>  
>  int
> +wl_os_set_cloexec_or_close(int fd);
> +
> +int
>  wl_os_socket_cloexec(int domain, int type, int protocol);
>  
>  int

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 811 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20151214/c3787091/attachment-0001.sig>


More information about the wayland-devel mailing list