Make wxFILE_EXISTS_SYMLINK work on its own, without wxFILE_EXISTS_NO_FOLLOW.
Include the wxFILE_EXISTS_NO_FOLLOW bit in wxFILE_EXISTS_SYMLINK definition to allow using just wxFileName::Exists(wxFILE_EXISTS_SYMLINK) which used to never work because the link was followed. Closes #14777. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72777 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -113,13 +113,15 @@ enum
|
|||||||
{
|
{
|
||||||
wxFILE_EXISTS_REGULAR = 0x0001, // check for existence of a regular file
|
wxFILE_EXISTS_REGULAR = 0x0001, // check for existence of a regular file
|
||||||
wxFILE_EXISTS_DIR = 0x0002, // check for existence of a directory
|
wxFILE_EXISTS_DIR = 0x0002, // check for existence of a directory
|
||||||
wxFILE_EXISTS_SYMLINK = 0x0004, // check for existence of a symbolic link
|
wxFILE_EXISTS_SYMLINK = 0x1004, // check for existence of a symbolic link;
|
||||||
|
// also sets wxFILE_EXISTS_NO_FOLLOW as
|
||||||
|
// it would never be satisfied otherwise
|
||||||
wxFILE_EXISTS_DEVICE = 0x0008, // check for existence of a device
|
wxFILE_EXISTS_DEVICE = 0x0008, // check for existence of a device
|
||||||
wxFILE_EXISTS_FIFO = 0x0016, // check for existence of a FIFO
|
wxFILE_EXISTS_FIFO = 0x0016, // check for existence of a FIFO
|
||||||
wxFILE_EXISTS_SOCKET = 0x0032, // check for existence of a socket
|
wxFILE_EXISTS_SOCKET = 0x0032, // check for existence of a socket
|
||||||
// gap for future types
|
// gap for future types
|
||||||
wxFILE_EXISTS_ANY = 0x0FFF, // check for existence of anything
|
wxFILE_EXISTS_NO_FOLLOW = 0x1000, // don't dereference a contained symlink
|
||||||
wxFILE_EXISTS_NO_FOLLOW = 0x1000 // don't dereference a contained symlink
|
wxFILE_EXISTS_ANY = 0x1FFF // check for existence of anything
|
||||||
};
|
};
|
||||||
|
|
||||||
#if wxUSE_LONGLONG
|
#if wxUSE_LONGLONG
|
||||||
|
@@ -102,18 +102,16 @@ enum
|
|||||||
/**
|
/**
|
||||||
Check for existence of a symlink.
|
Check for existence of a symlink.
|
||||||
|
|
||||||
Notice that this flag should be used either with
|
Notice that this flag also sets ::wxFILE_EXISTS_NO_FOLLOW, otherwise it
|
||||||
::wxFILE_EXISTS_NO_FOLLOW or with a wxFileName object on which
|
would never be satisfied as wxFileName::Exists() would be checking for
|
||||||
wxFileName::DontFollowLink() had been called, otherwise it would never
|
the existence of the symlink target and not the symlink itself.
|
||||||
be satisfied as wxFileName::Exists() would be checking for the
|
|
||||||
existence of the symlink target and not the symlink itself.
|
|
||||||
*/
|
*/
|
||||||
wxFILE_EXISTS_SYMLINK = 0x0004,
|
wxFILE_EXISTS_SYMLINK = 0x1004,
|
||||||
wxFILE_EXISTS_DEVICE = 0x0008, //!< Check for existence of a device
|
wxFILE_EXISTS_DEVICE = 0x0008, //!< Check for existence of a device
|
||||||
wxFILE_EXISTS_FIFO = 0x0016, //!< Check for existence of a FIFO
|
wxFILE_EXISTS_FIFO = 0x0016, //!< Check for existence of a FIFO
|
||||||
wxFILE_EXISTS_SOCKET = 0x0032, //!< Check for existence of a socket
|
wxFILE_EXISTS_SOCKET = 0x0032, //!< Check for existence of a socket
|
||||||
wxFILE_EXISTS_ANY = 0x0FFF, //!< Check for existence of anything
|
|
||||||
wxFILE_EXISTS_NO_FOLLOW = 0x1000 //!< Don't dereference a contained symbolic link
|
wxFILE_EXISTS_NO_FOLLOW = 0x1000 //!< Don't dereference a contained symbolic link
|
||||||
|
wxFILE_EXISTS_ANY = 0x1FFF, //!< Check for existence of anything
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -737,7 +737,12 @@ wxFileSystemObjectExists(const wxString& path, int flags)
|
|||||||
if ( S_ISDIR(st.st_mode) )
|
if ( S_ISDIR(st.st_mode) )
|
||||||
return acceptDir;
|
return acceptDir;
|
||||||
if ( S_ISLNK(st.st_mode) )
|
if ( S_ISLNK(st.st_mode) )
|
||||||
return (flags & wxFILE_EXISTS_SYMLINK) != 0;
|
{
|
||||||
|
// Take care to not test for "!= 0" here as this would erroneously
|
||||||
|
// return true if only wxFILE_EXISTS_NO_FOLLOW, which is part of
|
||||||
|
// wxFILE_EXISTS_SYMLINK, is set too.
|
||||||
|
return (flags & wxFILE_EXISTS_SYMLINK) == wxFILE_EXISTS_SYMLINK;
|
||||||
|
}
|
||||||
if ( S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode) )
|
if ( S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode) )
|
||||||
return (flags & wxFILE_EXISTS_DEVICE) != 0;
|
return (flags & wxFILE_EXISTS_DEVICE) != 0;
|
||||||
if ( S_ISFIFO(st.st_mode) )
|
if ( S_ISFIFO(st.st_mode) )
|
||||||
@@ -1422,8 +1427,7 @@ bool wxFileName::Rmdir(const wxString& dir, int flags)
|
|||||||
// this directory itself even when it is a symlink -- but without
|
// this directory itself even when it is a symlink -- but without
|
||||||
// following it. Do it here as wxRmdir() would simply follow if
|
// following it. Do it here as wxRmdir() would simply follow if
|
||||||
// called for a symlink.
|
// called for a symlink.
|
||||||
if ( wxFileName::Exists(dir, wxFILE_EXISTS_SYMLINK |
|
if ( wxFileName::Exists(dir, wxFILE_EXISTS_SYMLINK) )
|
||||||
wxFILE_EXISTS_NO_FOLLOW) )
|
|
||||||
{
|
{
|
||||||
return wxRemoveFile(dir);
|
return wxRemoveFile(dir);
|
||||||
}
|
}
|
||||||
|
@@ -698,9 +698,8 @@ void FileNameTestCase::TestExists()
|
|||||||
CPPUNIT_ASSERT( wxFileName::Exists("/dev/null", wxFILE_EXISTS_DEVICE) );
|
CPPUNIT_ASSERT( wxFileName::Exists("/dev/null", wxFILE_EXISTS_DEVICE) );
|
||||||
#ifdef __LINUX__
|
#ifdef __LINUX__
|
||||||
// These files are only guaranteed to exist under Linux.
|
// These files are only guaranteed to exist under Linux.
|
||||||
CPPUNIT_ASSERT( !wxFileName::Exists("/dev/core", wxFILE_EXISTS_SYMLINK) );
|
// No need for wxFILE_EXISTS_NO_FOLLOW here; wxFILE_EXISTS_SYMLINK implies it
|
||||||
CPPUNIT_ASSERT( wxFileName::Exists("/dev/core",
|
CPPUNIT_ASSERT( wxFileName::Exists("/dev/core", wxFILE_EXISTS_SYMLINK) );
|
||||||
wxFILE_EXISTS_SYMLINK | wxFILE_EXISTS_NO_FOLLOW) );
|
|
||||||
CPPUNIT_ASSERT( wxFileName::Exists("/dev/log", wxFILE_EXISTS_SOCKET) );
|
CPPUNIT_ASSERT( wxFileName::Exists("/dev/log", wxFILE_EXISTS_SOCKET) );
|
||||||
#endif // __LINUX__
|
#endif // __LINUX__
|
||||||
wxString fifo = dirTemp.GetPath() + "/fifo";
|
wxString fifo = dirTemp.GetPath() + "/fifo";
|
||||||
@@ -923,7 +922,15 @@ void FileNameTestCase::TestSymlinks()
|
|||||||
|
|
||||||
// Finally test Exists() after removing the file.
|
// Finally test Exists() after removing the file.
|
||||||
CPPUNIT_ASSERT(wxRemoveFile(targetfn.GetFullPath()));
|
CPPUNIT_ASSERT(wxRemoveFile(targetfn.GetFullPath()));
|
||||||
CPPUNIT_ASSERT(!wxFileName(tempdir, "linktofile").Exists());
|
// This should succeed, as the symlink still exists and
|
||||||
|
// the default wxFILE_EXISTS_ANY implies wxFILE_EXISTS_NO_FOLLOW
|
||||||
|
CPPUNIT_ASSERT(wxFileName(tempdir, "linktofile").Exists());
|
||||||
|
// So should this one, as wxFILE_EXISTS_SYMLINK does too
|
||||||
|
CPPUNIT_ASSERT(wxFileName(tempdir, "linktofile").
|
||||||
|
Exists(wxFILE_EXISTS_SYMLINK));
|
||||||
|
// but not this one, as the now broken symlink is followed
|
||||||
|
CPPUNIT_ASSERT(!wxFileName(tempdir, "linktofile").
|
||||||
|
Exists(wxFILE_EXISTS_REGULAR));
|
||||||
CPPUNIT_ASSERT(linktofile.Exists());
|
CPPUNIT_ASSERT(linktofile.Exists());
|
||||||
|
|
||||||
// This is also a convenient place to test Rmdir() as we have things to
|
// This is also a convenient place to test Rmdir() as we have things to
|
||||||
|
Reference in New Issue
Block a user