From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 772 invoked by alias); 7 Jan 2019 18:37:03 -0000 Mailing-List: contact cygwin-cvs-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cygwin-cvs-owner@cygwin.com Received: (qmail 739 invoked by uid 9078); 7 Jan 2019 18:37:03 -0000 Date: Mon, 07 Jan 2019 18:37:00 -0000 Message-ID: <20190107183703.737.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org, newlib-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: linkat: support Linux-specific AT_EMPTY_PATH flag X-Act-Checkin: newlib-cygwin X-Git-Author: Corinna Vinschen X-Git-Refname: refs/heads/master X-Git-Oldrev: b93022a82dc523bcb731c2f69fb6e602c79060b5 X-Git-Newrev: 9443efe0990ad32c1896717ac7c38ff9c8c57073 X-SW-Source: 2019-q1/txt/msg00025.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=9443efe0990ad32c1896717ac7c38ff9c8c57073 commit 9443efe0990ad32c1896717ac7c38ff9c8c57073 Author: Corinna Vinschen Date: Mon Jan 7 19:36:37 2019 +0100 Cygwin: linkat: support Linux-specific AT_EMPTY_PATH flag Signed-off-by: Corinna Vinschen Diff: --- 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 2dc0068..0647e59 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 c9e63a6..81a55b5 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 d6f81ca..cb62a62 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 b55e031..f84a9c4 100644 --- a/winsup/doc/new-features.xml +++ b/winsup/doc/new-features.xml @@ -42,6 +42,10 @@ 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.