diff --git a/docs/changes.txt b/docs/changes.txt index 7e772e11cb..0611debd8f 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -531,6 +531,7 @@ All: - Add wxEvtHandler::CallAfter() method for asynchronous method calls. - Add support for symlinks to wxFileName (David Hart). +- Add wxDIR_NO_FOLLOW flag for wxDir traversal (David Hart). - Allow testing for symlink/FIFO/socket existence in wxFileName (David Hart). - Many important bug fixes in wxFileSystemWatcher (David Hart). - Add separate read/written bytes counters and per-direction NOWAIT and WAITALL diff --git a/include/wx/dir.h b/include/wx/dir.h index 83dab66454..de389aef89 100644 --- a/include/wx/dir.h +++ b/include/wx/dir.h @@ -22,14 +22,17 @@ class WXDLLIMPEXP_FWD_BASE wxArrayString; // constants // ---------------------------------------------------------------------------- -// these flags define what kind of filenames is included in the list of files -// enumerated by GetFirst/GetNext +// These flags affect the behaviour of GetFirst/GetNext() and Traverse(). +// They define what types are included in the list of items they produce. +// Note that wxDIR_NO_FOLLOW is relevant only on Unix and ignored under systems +// not supporting symbolic links. enum wxDirFlags { wxDIR_FILES = 0x0001, // include files wxDIR_DIRS = 0x0002, // include directories wxDIR_HIDDEN = 0x0004, // include hidden files wxDIR_DOTDOT = 0x0008, // include '.' and '..' + wxDIR_NO_FOLLOW = 0x0010, // don't dereference any symlink // by default, enumerate everything except '.' and '..' wxDIR_DEFAULT = wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN diff --git a/interface/wx/dir.h b/interface/wx/dir.h index f4b25eb29f..14f0148e0e 100644 --- a/interface/wx/dir.h +++ b/interface/wx/dir.h @@ -94,8 +94,8 @@ public: /** - These flags define what kind of filenames are included in the list of files - enumerated by wxDir::GetFirst() and wxDir::GetNext(). + These flags affect the behaviour of GetFirst/GetNext() and Traverse(), + determining what types are included in the list of items they produce. */ enum wxDirFlags { @@ -104,8 +104,28 @@ enum wxDirFlags wxDIR_HIDDEN = 0x0004, ///< Includes hidden files. wxDIR_DOTDOT = 0x0008, ///< Includes "." and "..". - //! Combination of the @c wxDIR_FILES, @c wxDIR_DIRS, @c wxDIR_HIDDEN flags - //! defined above. + /** + Don't follow symbolic links during the directory traversal. + + This flag is ignored under systems not supporting symbolic links (i.e. + non-Unix ones). + + Notice that this flag is @e not included in wxDIR_DEFAULT and so the + default behaviour of wxDir::Traverse() is to follow symbolic links, + even if they lead outside of the directory being traversed. + + @since 2.9.5 + */ + wxDIR_NO_FOLLOW = 0x0010, + + /** + Default directory traversal flags include both files and directories, + even hidden. + + Notice that by default wxDIR_NO_FOLLOW is @e not included, meaning that + symbolic links are followed by default. If this is not desired, you + must pass that flag explicitly. + */ wxDIR_DEFAULT = wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN }; diff --git a/src/unix/dir.cpp b/src/unix/dir.cpp index f0e6cd9197..2924741545 100644 --- a/src/unix/dir.cpp +++ b/src/unix/dir.cpp @@ -150,10 +150,13 @@ bool wxDirData::Read(wxString *filename) break; } - // check the type now: notice that we want to check the type of this - // path itself and not whatever it points to in case of a symlink + // check the type now: notice that we may want to check the type of + // the path itself and not whatever it points to in case of a symlink wxFileName fn = wxFileName::DirName(path + de_d_name); - fn.DontFollowLink(); + if ( m_flags & wxDIR_NO_FOLLOW ) + { + fn.DontFollowLink(); + } if ( !(m_flags & wxDIR_FILES) && !fn.DirExists() ) {