From 9443efe0990ad32c1896717ac7c38ff9c8c57073 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 7 Jan 2019 19:36:37 +0100 Subject: [PATCH] Cygwin: linkat: support Linux-specific AT_EMPTY_PATH flag Signed-off-by: Corinna Vinschen --- newlib/libc/include/sys/_default_fcntl.h | 1 + winsup/cygwin/release/2.12.0 | 2 ++ winsup/cygwin/syscalls.cc | 20 ++++++++++++++++++-- winsup/doc/new-features.xml | 4 ++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/newlib/libc/include/sys/_default_fcntl.h b/newlib/libc/include/sys/_default_fcntl.h index 2dc0068c9..0647e590f 100644 --- a/newlib/libc/include/sys/_default_fcntl.h +++ b/newlib/libc/include/sys/_default_fcntl.h @@ -166,6 +166,7 @@ extern "C" { #define AT_SYMLINK_NOFOLLOW 2 #define AT_SYMLINK_FOLLOW 4 #define AT_REMOVEDIR 8 +#define AT_EMPTY_PATH 16 #endif #if __BSD_VISIBLE diff --git a/winsup/cygwin/release/2.12.0 b/winsup/cygwin/release/2.12.0 index c9e63a6ba..81a55b58d 100644 --- a/winsup/cygwin/release/2.12.0 +++ b/winsup/cygwin/release/2.12.0 @@ -22,6 +22,8 @@ What's new: - Support Linux-specific open(2) flag O_PATH. +- Support Linux-specific linkat(2) flag AT_EMPTY_PATH. + What changed: ------------- diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index d6f81cab9..cb62a6242 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -4812,13 +4812,29 @@ linkat (int olddirfd, const char *oldpathname, tmp_pathbuf tp; __try { - if (flags & ~AT_SYMLINK_FOLLOW) + if (flags & ~(AT_SYMLINK_FOLLOW | AT_EMPTY_PATH)) { set_errno (EINVAL); __leave; } char *oldpath = tp.c_get (); - if (gen_full_path_at (oldpath, olddirfd, oldpathname)) + /* AT_EMPTY_PATH with an empty oldpathname is equivalent to + + linkat(AT_FDCWD, "/proc/self/fd/", newdirfd, + newname, AT_SYMLINK_FOLLOW); + + Convert the request accordingly. */ + if ((flags & AT_EMPTY_PATH) && oldpathname && oldpathname[0] == '\0') + { + if (olddirfd == AT_FDCWD) + { + set_errno (EPERM); + __leave; + } + __small_sprintf (oldpath, "/proc/%d/fd/%d", myself->pid, olddirfd); + flags = AT_SYMLINK_FOLLOW; + } + else if (gen_full_path_at (oldpath, olddirfd, oldpathname)) __leave; char *newpath = tp.c_get (); if (gen_full_path_at (newpath, newdirfd, newpathname)) diff --git a/winsup/doc/new-features.xml b/winsup/doc/new-features.xml index b55e031bc..f84a9c443 100644 --- a/winsup/doc/new-features.xml +++ b/winsup/doc/new-features.xml @@ -41,6 +41,10 @@ Support for exFAT. Support Linux-specific open(2) flag O_PATH. + +- Support Linux-specific linkat(2) flag AT_EMPTY_PATH. + + clock_nanosleep, pthread_condattr_setclock and timer_create now support all clocks, except CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID.