[newlib-cygwin] Cygwin: Change /proc/$PID/fd/<fd> symlink target for deleted files

Corinna Vinschen corinna@sourceware.org
Wed Dec 26 21:17:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=7148fbc49688986b3648ba6ce3f2afd527d8baa0

commit 7148fbc49688986b3648ba6ce3f2afd527d8baa0
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Wed Dec 26 21:22:40 2018 +0100

    Cygwin: Change /proc/$PID/fd/<fd> symlink target for deleted files
    
    - As on Linux, print the file name with an attached " (deleted)"
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/fhandler.cc | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
index 22dbdb0..f7e34c7 100644
--- a/winsup/cygwin/fhandler.cc
+++ b/winsup/cygwin/fhandler.cc
@@ -137,11 +137,23 @@ fhandler_base::set_name (path_conv &in_pc)
 
 char *fhandler_base::get_proc_fd_name (char *buf)
 {
+  IO_STATUS_BLOCK io;
+  FILE_STANDARD_INFORMATION fsi;
+
   /* If the file had been opened with O_TMPFILE | O_EXCL, don't
      expose the filename.  linkat is supposed to return ENOENT in this
-     case.  See man 2 open on Linux. */
-  if ((get_flags () & (O_TMPFILE | O_EXCL)) == (O_TMPFILE | O_EXCL))
-    return strcpy (buf, "");
+     case.  FIXME: As soon as we open by handle from /proc/<PID>/fd,
+     the O_EXCL test has to be moved to open. */
+  if ((get_flags () & (O_TMPFILE | O_EXCL)) == (O_TMPFILE | O_EXCL)
+      || (get_device () == FH_FS
+	  && NT_SUCCESS (NtQueryInformationFile (get_handle (), &io,
+						 &fsi, sizeof fsi,
+						 FileStandardInformation))
+	  && fsi.DeletePending))
+    {
+      stpcpy (stpcpy (buf, get_name ()), " (deleted)");
+      return buf;
+    }
   if (get_name ())
     return strcpy (buf, get_name ());
   if (dev ().name ())



More information about the Cygwin-cvs mailing list