Browse Source

Cygwin: introduce close_range(2)

This function closes or sets the close-on-exec flag for a specified
range of file descriptors.  It is available on FreeBSD and Linux.

Signed-off-by: Christian Franke <christian.franke@t-online.de>
topic/3.6
Christian Franke 3 years ago
committed by Corinna Vinschen
parent
commit
d8c0fb090c
  1. 6
      newlib/libc/include/sys/unistd.h
  2. 1
      winsup/cygwin/cygwin.din
  3. 3
      winsup/cygwin/include/cygwin/version.h
  4. 2
      winsup/cygwin/release/3.5.0
  5. 42
      winsup/cygwin/syscalls.cc
  6. 4
      winsup/doc/new-features.xml
  7. 5
      winsup/doc/posix.xml

6
newlib/libc/include/sys/unistd.h

@ -26,6 +26,12 @@ int chown (const char *__path, uid_t __owner, gid_t __group);
int chroot (const char *__path);
#endif
int close (int __fildes);
#if defined(__CYGWIN__) && (__BSD_VISIBLE || __GNU_VISIBLE)
/* Available on FreeBSD (__BSD_VISIBLE) and Linux (__GNU_VISIBLE). */
int close_range (unsigned int __firstfd, unsigned int __lastfd, int __flags);
/* CLOSE_RANGE_UNSHARE (1 << 1) */ /* Linux-specific, not supported. */
#define CLOSE_RANGE_CLOEXEC (1 << 2)
#endif
#if __POSIX_VISIBLE >= 199209
size_t confstr (int __name, char *__buf, size_t __len);
#endif

1
winsup/cygwin/cygwin.din

@ -347,6 +347,7 @@ clog10l NOSIGFE
clogf NOSIGFE
clogl NOSIGFE
close SIGFE
close_range SIGFE
closedir SIGFE
closelog SIGFE
cnd_broadcast SIGFE

3
winsup/cygwin/include/cygwin/version.h

@ -484,12 +484,13 @@ details. */
347: Add c16rtomb, c32rtomb, mbrtoc16, mbrtoc32.
348: Add c8rtomb, mbrtoc.
349: Add fallocate.
350: Add close_range.
Note that we forgot to bump the api for ualarm, strtoll, strtoull,
sigaltstack, sethostname. */
#define CYGWIN_VERSION_API_MAJOR 0
#define CYGWIN_VERSION_API_MINOR 349
#define CYGWIN_VERSION_API_MINOR 350
/* There is also a compatibity version number associated with the shared memory
regions. It is incremented when incompatible changes are made to the shared

2
winsup/cygwin/release/3.5.0

@ -43,6 +43,8 @@ What's new:
- New API calls: c8rtomb, c16rtomb, c32rtomb, mbrtoc8, mbrtoc16, mbrtoc32.
- New API call: close_range (available on FreeBSD and Linux).
- New API call: fallocate (Linux-specific).
- Implement OSS-based sound mixer device (/dev/mixer).

42
winsup/cygwin/syscalls.cc

@ -85,6 +85,48 @@ close_all_files (bool norelease)
cygheap->fdtab.unlock ();
}
/* Close or set the close-on-exec flag for all open file descriptors
from firstfd to lastfd. CLOSE_RANGE_UNSHARE is not supported.
Available on FreeBSD since 13 and Linux since 5.9 */
extern "C" int
close_range (unsigned int firstfd, unsigned int lastfd, int flags)
{
pthread_testcancel ();
if (!(firstfd <= lastfd && !(flags & ~CLOSE_RANGE_CLOEXEC)))
{
set_errno (EINVAL);
return -1;
}
cygheap->fdtab.lock ();
unsigned int size = (lastfd < cygheap->fdtab.size ? lastfd + 1 :
cygheap->fdtab.size);
for (unsigned int i = firstfd; i < size; i++)
{
cygheap_fdget cfd ((int) i, false, false);
if (cfd < 0)
continue;
if (flags & CLOSE_RANGE_CLOEXEC)
{
syscall_printf ("set FD_CLOEXEC on fd %u", i);
cfd->fcntl (F_SETFD, FD_CLOEXEC);
}
else
{
syscall_printf ("closing fd %u", i);
cfd->close_with_arch ();
cfd.release ();
}
}
cygheap->fdtab.unlock ();
return 0;
}
extern "C" int
dup (int fd)
{

4
winsup/doc/new-features.xml

@ -74,6 +74,10 @@ posix_spawn_file_actions_addfchdir_np.
New API calls: c8rtomb, c16rtomb, c32rtomb, mbrtoc8, mbrtoc16, mbrtoc32.
</para></listitem>
<listitem><para>
New API call: close_range (available on FreeBSD and Linux).
</para></listitem>
<listitem><para>
New API call: fallocate (Linux-specific).
</para></listitem>

5
winsup/doc/posix.xml

@ -1143,6 +1143,7 @@ also IEEE Std 1003.1-2017 (POSIX.1-2017).</para>
cfmakeraw
cfsetspeed
clearerr_unlocked
close_range
daemon
dn_comp
dn_expand
@ -1297,6 +1298,7 @@ also IEEE Std 1003.1-2017 (POSIX.1-2017).</para>
clog10
clog10f
clog10l
close_range (see <xref linkend="std-notes">chapter "Implementation Notes"</xref>)
crypt_r (available in external "crypt" library)
dladdr (see <xref linkend="std-notes">chapter "Implementation Notes"</xref>)
dremf
@ -1656,6 +1658,9 @@ CLOCK_REALTIME and CLOCK_MONOTONIC. <function>clock_setres</function>,
<function>clock_settime</function>, and <function>timer_create</function>
currently support only CLOCK_REALTIME.</para>
<para><function>close_range</function> does not support the Linux-specific
flag CLOSE_RANGE_UNSHARE.</para>
<para>POSIX file locks via <function>fcntl</function> or
<function>lockf</function>, as well as BSD <function>flock</function> locks
are advisory locks. They don't interact with Windows mandatory locks, nor

Loading…
Cancel
Save