diff options
Diffstat (limited to 'hurd/fcntl-internal.h')
-rw-r--r-- | hurd/fcntl-internal.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/hurd/fcntl-internal.h b/hurd/fcntl-internal.h new file mode 100644 index 0000000000..d795e4089c --- /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 + <https://www.gnu.org/licenses/>. */ + + +#include <fcntl.h> +#include <sys/socket.h> + +/* 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; +} |