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

commit a3a5d52b398887a5ee1ca75b23915d17a60ac10a
Author: Corinna Vinschen <[email protected]>
Date:   Sat Jan 5 21:41:01 2019 +0100

    Cygwin: introduce virt_fdsymlink to simplify /proc/PID/fd symlink handling
    
    Signed-off-by: Corinna Vinschen <[email protected]>

Diff:
---
 winsup/cygwin/fhandler.h          | 1 +
 winsup/cygwin/fhandler_process.cc | 3 ++-
 winsup/cygwin/path.cc             | 4 +++-
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 07e8a18..0ead0d9 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -126,6 +126,7 @@ enum del_lock_called_from {
 };
 
 enum virtual_ftype_t {
+  virt_fdsymlink = -8, /* Fd symlink (e.g. /proc/<PID>/fd/0) */
   virt_blk = -7,       /* Block special */
   virt_chr = -6,       /* Character special */
   virt_fsfile = -5,    /* FS-based file via /proc/sys */
diff --git a/winsup/cygwin/fhandler_process.cc 
b/winsup/cygwin/fhandler_process.cc
index b0fae4c..24ef7d0 100644
--- a/winsup/cygwin/fhandler_process.cc
+++ b/winsup/cygwin/fhandler_process.cc
@@ -175,6 +175,7 @@ fhandler_process::fstat (struct stat *buf)
        buf->st_nlink = 3;
       return 0;
     case virt_symlink:
+    case virt_fdsymlink:
       buf->st_uid = p->uid;
       buf->st_gid = p->gid;
       buf->st_mode = S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO;
@@ -397,7 +398,7 @@ format_process_fd (void *data, char *&destbuf)
          return 0;
        }
       if (*e == '\0')
-       *((process_fd_t *) data)->fd_type = virt_symlink;
+       *((process_fd_t *) data)->fd_type = virt_fdsymlink;
       else /* trailing path */
        {
          char *newbuf = (char *) cmalloc_abort (HEAP_STR, strlen (destbuf)
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 3324395..563ba0e 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -801,7 +801,8 @@ path_conv::check (const char *src, unsigned opt,
                  else
                    {
                      file_type = fh->exists ();
-                     if (file_type == virt_symlink)
+                     if (file_type == virt_symlink
+                         || file_type == virt_fdsymlink)
                        {
                          fh->fill_filebuf ();
                          symlen = sym.set (fh->get_filebuf ());
@@ -842,6 +843,7 @@ path_conv::check (const char *src, unsigned opt,
                        if (component == 0)
                          fileattr = 0;
                        break;
+                     case virt_fdsymlink:
                      case virt_symlink:
                        goto is_virtual_symlink;
                      case virt_pipe:

Reply via email to