Cygwin: add AF_UNIX reparse points to path handling
* check_reparse_point_target returns a path flag mask, rather than just 1. Return PATH_SYMLINK | PATH_REP for symlinks and directory mount points, PATH_SOCKET | PATH_REP for AF_UNIX sockets. * Define Cygwin AF_UNIX socket reparse tag and GUID in ntdll.h. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
65267a9a34
commit
aa467e6e33
|
@ -10,6 +10,9 @@
|
||||||
|
|
||||||
#include <w32api/ntstatus.h>
|
#include <w32api/ntstatus.h>
|
||||||
|
|
||||||
|
/* Special values for Cygwin AF_UNIX socket reparse points. */
|
||||||
|
#define IO_REPARSE_TAG_CYGUNIX (0x00006375)
|
||||||
|
#define CYGWIN_SOCKET_UUID L"efc1714d-7b19-4407-bab3-c5b1f92cb88c"
|
||||||
|
|
||||||
/* custom status code: */
|
/* custom status code: */
|
||||||
#define STATUS_ILLEGAL_DLL_PSEUDO_RELOCATION ((NTSTATUS) 0xe0000269)
|
#define STATUS_ILLEGAL_DLL_PSEUDO_RELOCATION ((NTSTATUS) 0xe0000269)
|
||||||
|
|
|
@ -951,8 +951,9 @@ path_conv::check (const char *src, unsigned opt,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fileattr = sym.fileattr;
|
fileattr = sym.fileattr;
|
||||||
dev.parse (FH_LOCAL);
|
dev.parse ((sym.pflags & PATH_REP) ? FH_UNIX : FH_LOCAL);
|
||||||
dev.setfs (1);
|
dev.setfs (1);
|
||||||
|
path_flags = sym.pflags;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2329,7 +2330,7 @@ check_reparse_point_target (HANDLE h, bool remote, PREPARSE_DATA_BUFFER rp,
|
||||||
rp->SymbolicLinkReparseBuffer.SubstituteNameLength);
|
rp->SymbolicLinkReparseBuffer.SubstituteNameLength);
|
||||||
if ((rp->SymbolicLinkReparseBuffer.Flags & SYMLINK_FLAG_RELATIVE) ||
|
if ((rp->SymbolicLinkReparseBuffer.Flags & SYMLINK_FLAG_RELATIVE) ||
|
||||||
check_reparse_point_string (psymbuf))
|
check_reparse_point_string (psymbuf))
|
||||||
return 1;
|
return PATH_SYMLINK | PATH_REP;
|
||||||
}
|
}
|
||||||
else if (!remote && rp->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT)
|
else if (!remote && rp->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT)
|
||||||
{
|
{
|
||||||
|
@ -2350,7 +2351,16 @@ check_reparse_point_target (HANDLE h, bool remote, PREPARSE_DATA_BUFFER rp,
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
if (check_reparse_point_string (psymbuf))
|
if (check_reparse_point_string (psymbuf))
|
||||||
return 1;
|
return PATH_SYMLINK | PATH_REP;
|
||||||
|
}
|
||||||
|
else if (rp->ReparseTag == IO_REPARSE_TAG_CYGUNIX)
|
||||||
|
{
|
||||||
|
PREPARSE_GUID_DATA_BUFFER rgp = (PREPARSE_GUID_DATA_BUFFER) rp;
|
||||||
|
UUID uuid;
|
||||||
|
|
||||||
|
uuid_from_string (CYGWIN_SOCKET_UUID, uuid);
|
||||||
|
if (memcmp (&uuid, &rgp->ReparseGuid, sizeof (UUID)) == 0)
|
||||||
|
return PATH_SOCKET | PATH_REP;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2377,10 +2387,11 @@ symlink_info::check_reparse_point (HANDLE h, bool remote)
|
||||||
fileattr &= ~FILE_ATTRIBUTE_REPARSE_POINT;
|
fileattr &= ~FILE_ATTRIBUTE_REPARSE_POINT;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
/* ret is > 0, so it's a reparse point, path in symbuf. */
|
/* ret is > 0, so it's a known reparse point, path in symbuf. */
|
||||||
sys_wcstombs (srcbuf, SYMLINK_MAX + 7, symbuf.Buffer,
|
pflags |= ret;
|
||||||
symbuf.Length / sizeof (WCHAR));
|
if (ret & PATH_SYMLINK)
|
||||||
pflags |= PATH_SYMLINK | PATH_REP;
|
sys_wcstombs (srcbuf, SYMLINK_MAX + 7, symbuf.Buffer,
|
||||||
|
symbuf.Length / sizeof (WCHAR));
|
||||||
/* A symlink is never a directory. */
|
/* A symlink is never a directory. */
|
||||||
fileattr &= ~FILE_ATTRIBUTE_DIRECTORY;
|
fileattr &= ~FILE_ATTRIBUTE_DIRECTORY;
|
||||||
return posixify (srcbuf);
|
return posixify (srcbuf);
|
||||||
|
|
|
@ -192,7 +192,8 @@ class path_conv
|
||||||
int is_fs_device () const {return isdevice () && is_fs_special ();}
|
int is_fs_device () const {return isdevice () && is_fs_special ();}
|
||||||
int is_fs_special () const {return dev.is_fs_special ();}
|
int is_fs_special () const {return dev.is_fs_special ();}
|
||||||
int is_lnk_special () const {return is_fs_device () || isfifo () || is_lnk_symlink ();}
|
int is_lnk_special () const {return is_fs_device () || isfifo () || is_lnk_symlink ();}
|
||||||
int issocket () const {return dev.is_device (FH_LOCAL);}
|
int issocket () const {return dev.is_device (FH_LOCAL)
|
||||||
|
|| dev.is_device (FH_UNIX);}
|
||||||
int iscygexec () const {return path_flags & PATH_CYGWIN_EXEC;}
|
int iscygexec () const {return path_flags & PATH_CYGWIN_EXEC;}
|
||||||
int isopen () const {return path_flags & PATH_OPEN;}
|
int isopen () const {return path_flags & PATH_OPEN;}
|
||||||
int isctty_capable () const {return path_flags & PATH_CTTY;}
|
int isctty_capable () const {return path_flags & PATH_CTTY;}
|
||||||
|
|
Loading…
Reference in New Issue