summary refs log tree commit diff
path: root/manual
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-03-10 12:26:31 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-07-08 14:08:13 -0300
commit286286283e9bdc7ef894306e2dbcf4c115b97ba2 (patch)
tree00fa61df0e6e6093c337bc59a6c5fdd914d9fe6f /manual
parentae8c243d2473bdfc3c0f9c6b46e6dffb5a28725c (diff)
downloadglibc-286286283e9bdc7ef894306e2dbcf4c115b97ba2.tar.gz
glibc-286286283e9bdc7ef894306e2dbcf4c115b97ba2.tar.xz
glibc-286286283e9bdc7ef894306e2dbcf4c115b97ba2.zip
linux: Add close_range
It was added on Linux 5.9 (278a5fbaed89) with CLOSE_RANGE_CLOEXEC
added on 5.11 (582f1fb6b721f).  Although FreeBSD has added the same
syscall, this only adds the symbol on Linux ports.  This syscall is
required to provided a fail-safe way to implement the closefrom
symbol (BZ #10353).

Checked on x86_64-linux-gnu and i686-linux-gnu on kernel 5.11 and 4.15.
Diffstat (limited to 'manual')
-rw-r--r--manual/llio.texi51
1 files changed, 51 insertions, 0 deletions
diff --git a/manual/llio.texi b/manual/llio.texi
index eafc27120d..e21a71fdd0 100644
--- a/manual/llio.texi
+++ b/manual/llio.texi
@@ -284,6 +284,57 @@ of trying to close its underlying file descriptor with @code{close}.
 This flushes any buffered output and updates the stream object to
 indicate that it is closed.
 
+@deftypefun int close_range (unsigned int @var{lowfd}, unsigned int @var{maxfd}, int @var{flags})
+@standards{Linux, unistd.h}
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
+@c This is a syscall for Linux v5.9.  There is no fallback emulation for
+@c older kernels.
+
+The function @code{close_range} closes the file descriptor from @var{lowfd}
+to @var{maxfd} (inclusive).  This function is similar to call @code{close} in
+specified file descriptor range depending on the @var{flags}.
+
+This is function is only supported on recent Linux versions and @theglibc{}
+does not provide any fallback (the application will need to handle possible
+@code{ENOSYS}).
+
+The @var{flags} add options on how the files are closes.  Linux currently
+supports:
+
+@vtable @code
+@item CLOSE_RANGE_UNSHARE
+Unshare the file descriptor table before closing file descriptors.
+
+@item CLOSE_RANGE_CLOEXEC
+Set the @code{FD_CLOEXEC} bit instead of closing the file descriptor.
+@end vtable
+
+The normal return value from @code{close_range} is @math{0}; a value
+of @math{-1} is returned in case of failure.  The following @code{errno} error
+conditions are defined for this function:
+
+@table @code
+@item EINVAL
+The @var{lowfd} value is larger than @var{maxfd} or an unsupported @var{flags}
+is used.
+
+@item ENOMEM
+Either there is not enough memory for the operation, or the process is
+out of address space.  It can only happnes when @code{CLOSE_RANGE_UNSHARED}
+flag is used.
+
+@item EMFILE
+The process has too many files open and it can only happens when
+@code{CLOSE_RANGE_UNSHARED} flag is used.
+The maximum number of file descriptors is controlled by the
+@code{RLIMIT_NOFILE} resource limit; @pxref{Limits on Resources}.
+
+@item ENOSYS
+The kernel does not implement the required functionality.
+@end table
+@end deftypefun
+
+
 @node I/O Primitives
 @section Input and Output Primitives