summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2006-07-03 18:30:08 +0000
committerCorinna Vinschen <corinna@vinschen.de>2006-07-03 18:30:08 +0000
commit4635b6ebd8eba1a7755f985db509aff8c3c06859 (patch)
treefe36a0121e6056888f98cebead9103ea32d012b4 /winsup/cygwin/path.cc
parente60e8d3b0ee8b75f3833ba804e385b935b0f4440 (diff)
downloadcygnal-4635b6ebd8eba1a7755f985db509aff8c3c06859.tar.gz
cygnal-4635b6ebd8eba1a7755f985db509aff8c3c06859.tar.bz2
cygnal-4635b6ebd8eba1a7755f985db509aff8c3c06859.zip
* autoload.cc (NtQueryEaFile): Define.
(NtSetEaFile): Define. * fhandler.cc (fhandler_base::open): Use appropriate open flags in query case when allow_ntea is set. * ntdll.h (struct _FILE_GET_EA_INFORMATION): Define. (struct _FILE_FULL_EA_INFORMATION): Define. (NtQueryEaFile): Declare. (NtSetEaFile): Declare. * ntea.cc (read_ea): Rename from NTReadEA and rewrite using NtQueryEaFile. (write_ea): Rename from NTWriteEA and rewrite using NtSetEaFile. * path.cc (get_symlink_ea): Make static. Add handle parameter to accomodate new read_ea call. (set_symlink_ea): Make static. Add handle parameter to accomodate new write_ea call. (symlink_worker): Call set_symlink_ea while file is still open. (symlink_info::check): Call get_symlink_ea after file has been opened. * security.cc (get_file_attribute): Accomodate new read_ea call. (set_file_attribute): Accomodate new write_ea call. * security.h (read_ea): Change declaration accordingly. (write_ea): Ditto.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r--winsup/cygwin/path.cc39
1 files changed, 19 insertions, 20 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index ea96596ef..f9891f5a8 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -2694,20 +2694,20 @@ endmntent (FILE *)
/********************** Symbolic Link Support **************************/
/* Read symlink from Extended Attribute */
-int
-get_symlink_ea (const char* frompath, char* buf, int buf_size)
+static int
+get_symlink_ea (HANDLE hdl, const char* frompath, char* buf, int buf_size)
{
- int res = NTReadEA (frompath, SYMLINK_EA_NAME, buf, buf_size);
+ int res = read_ea (hdl, frompath, SYMLINK_EA_NAME, buf, buf_size);
if (res == 0)
debug_printf ("Cannot read symlink from EA");
return (res - 1);
}
/* Save symlink to Extended Attribute */
-bool
-set_symlink_ea (const char* frompath, const char* topath)
+static bool
+set_symlink_ea (HANDLE hdl, const char* frompath, const char* topath)
{
- if (!NTWriteEA (frompath, SYMLINK_EA_NAME, topath, strlen (topath) + 1))
+ if (!write_ea (hdl, frompath, SYMLINK_EA_NAME, topath, strlen (topath) + 1))
{
debug_printf ("Cannot save symlink in EA");
return false;
@@ -2926,6 +2926,8 @@ symlink_worker (const char *oldpath, const char *newpath, bool use_winsym,
}
if (success)
{
+ if (!isdevice && win32_path.fs_has_ea ())
+ set_symlink_ea (h, win32_path, oldpath);
CloseHandle (h);
if (!allow_ntsec && allow_ntea)
set_file_attribute (false, NULL, win32_path.get_win32 (),
@@ -2940,8 +2942,6 @@ symlink_worker (const char *oldpath, const char *newpath, bool use_winsym,
#endif
SetFileAttributes (win32_path, attr);
- if (!isdevice && win32_path.fs_has_ea ())
- set_symlink_ea (win32_path, oldpath);
res = 0;
}
else
@@ -3340,16 +3340,6 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt)
if (!sym_check)
goto file_not_symlink;
- if (sym_check > 0 && opt & PC_CHECK_EA &&
- (res = get_symlink_ea (suffix.path, contents, sizeof (contents))) > 0)
- {
- pflags = PATH_SYMLINK | pflags_or;
- if (sym_check == 1)
- pflags |= PATH_LNK;
- debug_printf ("Got symlink from EA: %s", contents);
- break;
- }
-
/* Open the file. */
h = CreateFile (suffix.path, GENERIC_READ, FILE_SHARE_READ,
@@ -3358,8 +3348,17 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt)
if (h == INVALID_HANDLE_VALUE)
goto file_not_symlink;
- /* FIXME: if symlink isn't present in EA, but EAs are supported,
- should we write it there? */
+ if (sym_check > 0 && opt & PC_CHECK_EA
+ && (res = get_symlink_ea (h, suffix.path, contents,
+ sizeof (contents))) > 0)
+ {
+ pflags = PATH_SYMLINK | pflags_or;
+ if (sym_check == 1)
+ pflags |= PATH_LNK;
+ debug_printf ("Got symlink from EA: %s", contents);
+ break;
+ }
+
switch (sym_check)
{
case 1: