From 84814e2a40fc220afcc111a91bd16b6f8f57786a Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Sun, 28 Jan 2018 16:53:32 +0100 Subject: hurd: Add missing fcntl-internal.h * hurd/fcntl-internal.h: New file. --- hurd/fcntl-internal.h | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 hurd/fcntl-internal.h (limited to 'hurd/fcntl-internal.h') diff --git a/hurd/fcntl-internal.h b/hurd/fcntl-internal.h new file mode 100644 index 0000000..d795e40 --- /dev/null +++ b/hurd/fcntl-internal.h @@ -0,0 +1,62 @@ +/* Helper functions for translating between O_* and SOCK_* flags. + Copyright (C) 2008-2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + + +#include +#include + +/* Do some compile-time checks for the SOCK_* constants, which we rely on. */ +_Static_assert (SOCK_CLOEXEC == O_CLOEXEC, + "SOCK_CLOEXEC is assumed to be the same as O_CLOEXEC"); +_Static_assert (((SOCK_MAX - 1) | SOCK_TYPE_MASK) == SOCK_TYPE_MASK, + "SOCK_TYPE_MASK must contain SOCK_MAX - 1"); +_Static_assert ((SOCK_CLOEXEC & SOCK_TYPE_MASK) == 0, + "SOCK_TYPE_MASK must not contain SOCK_CLOEXEC"); +_Static_assert ((SOCK_NONBLOCK & SOCK_TYPE_MASK) == 0, + "SOCK_TYPE_MASK must not contain SOCK_NONBLOCK"); + + +/* Convert from SOCK_* flags to O_* flags. */ +__extern_always_inline +int +sock_to_o_flags (int in) +{ + int out = 0; + + if (in & SOCK_NONBLOCK) + out |= O_NONBLOCK; + /* Others are passed through unfiltered. */ + out |= in & ~(SOCK_NONBLOCK); + + return out; +} + +/* Convert from O_* flags to SOCK_* flags. */ +__extern_always_inline +int +o_to_sock_flags (int in) +{ + int out = 0; + + if (in & O_NONBLOCK) + out |= SOCK_NONBLOCK; + /* Others are passed through unfiltered. */ + out |= in & ~(O_NONBLOCK); + + return out; +} -- cgit v1.1