| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/file_util.h" | 5 #include "base/file_util.h" |
| 6 | 6 |
| 7 #include <dirent.h> | 7 #include <dirent.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <fcntl.h> | 9 #include <fcntl.h> |
| 10 #include <fnmatch.h> | 10 #include <fnmatch.h> |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 return ret; | 220 return ret; |
| 221 } | 221 } |
| 222 if (!S_ISDIR(file_info.st_mode)) | 222 if (!S_ISDIR(file_info.st_mode)) |
| 223 return (unlink(path_str) == 0); | 223 return (unlink(path_str) == 0); |
| 224 if (!recursive) | 224 if (!recursive) |
| 225 return (rmdir(path_str) == 0); | 225 return (rmdir(path_str) == 0); |
| 226 | 226 |
| 227 bool success = true; | 227 bool success = true; |
| 228 std::stack<std::string> directories; | 228 std::stack<std::string> directories; |
| 229 directories.push(path.value()); | 229 directories.push(path.value()); |
| 230 FileEnumerator traversal(path, true, static_cast<FileEnumerator::FileType>( | 230 FileEnumerator traversal(path, true, |
| 231 FileEnumerator::FILES | FileEnumerator::DIRECTORIES | | 231 FileEnumerator::FILES | FileEnumerator::DIRECTORIES | |
| 232 FileEnumerator::SHOW_SYM_LINKS)); | 232 FileEnumerator::SHOW_SYM_LINKS); |
| 233 for (FilePath current = traversal.Next(); success && !current.empty(); | 233 for (FilePath current = traversal.Next(); success && !current.empty(); |
| 234 current = traversal.Next()) { | 234 current = traversal.Next()) { |
| 235 FileEnumerator::FindInfo info; | 235 FileEnumerator::FindInfo info; |
| 236 traversal.GetFindInfo(&info); | 236 traversal.GetFindInfo(&info); |
| 237 | 237 |
| 238 if (S_ISDIR(info.stat.st_mode)) | 238 if (S_ISDIR(info.stat.st_mode)) |
| 239 directories.push(current.value()); | 239 directories.push(current.value()); |
| 240 else | 240 else |
| 241 success = (unlink(current.value().c_str()) == 0); | 241 success = (unlink(current.value().c_str()) == 0); |
| 242 } | 242 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 } | 308 } |
| 309 FilePath real_from_path = from_path; | 309 FilePath real_from_path = from_path; |
| 310 if (!AbsolutePath(&real_from_path)) | 310 if (!AbsolutePath(&real_from_path)) |
| 311 return false; | 311 return false; |
| 312 if (real_to_path.value().size() >= real_from_path.value().size() && | 312 if (real_to_path.value().size() >= real_from_path.value().size() && |
| 313 real_to_path.value().compare(0, real_from_path.value().size(), | 313 real_to_path.value().compare(0, real_from_path.value().size(), |
| 314 real_from_path.value()) == 0) | 314 real_from_path.value()) == 0) |
| 315 return false; | 315 return false; |
| 316 | 316 |
| 317 bool success = true; | 317 bool success = true; |
| 318 FileEnumerator::FileType traverse_type = | 318 int traverse_type = FileEnumerator::FILES | FileEnumerator::SHOW_SYM_LINKS; |
| 319 static_cast<FileEnumerator::FileType>(FileEnumerator::FILES | | |
| 320 FileEnumerator::SHOW_SYM_LINKS); | |
| 321 if (recursive) | 319 if (recursive) |
| 322 traverse_type = static_cast<FileEnumerator::FileType>( | 320 traverse_type |= FileEnumerator::DIRECTORIES; |
| 323 traverse_type | FileEnumerator::DIRECTORIES); | |
| 324 FileEnumerator traversal(from_path, recursive, traverse_type); | 321 FileEnumerator traversal(from_path, recursive, traverse_type); |
| 325 | 322 |
| 326 // We have to mimic windows behavior here. |to_path| may not exist yet, | 323 // We have to mimic windows behavior here. |to_path| may not exist yet, |
| 327 // start the loop with |to_path|. | 324 // start the loop with |to_path|. |
| 328 FileEnumerator::FindInfo info; | 325 FileEnumerator::FindInfo info; |
| 329 FilePath current = from_path; | 326 FilePath current = from_path; |
| 330 if (stat(from_path.value().c_str(), &info.stat) < 0) { | 327 if (stat(from_path.value().c_str(), &info.stat) < 0) { |
| 331 DLOG(ERROR) << "CopyDirectory() couldn't stat source directory: " | 328 DLOG(ERROR) << "CopyDirectory() couldn't stat source directory: " |
| 332 << from_path.value() << " errno = " << errno; | 329 << from_path.value() << " errno = " << errno; |
| 333 success = false; | 330 success = false; |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 base::ThreadRestrictions::AssertIOAllowed(); | 733 base::ThreadRestrictions::AssertIOAllowed(); |
| 737 int ret = chdir(path.value().c_str()); | 734 int ret = chdir(path.value().c_str()); |
| 738 return !ret; | 735 return !ret; |
| 739 } | 736 } |
| 740 | 737 |
| 741 /////////////////////////////////////////////// | 738 /////////////////////////////////////////////// |
| 742 // FileEnumerator | 739 // FileEnumerator |
| 743 | 740 |
| 744 FileEnumerator::FileEnumerator(const FilePath& root_path, | 741 FileEnumerator::FileEnumerator(const FilePath& root_path, |
| 745 bool recursive, | 742 bool recursive, |
| 746 FileType file_type) | 743 int file_type) |
| 747 : current_directory_entry_(0), | 744 : current_directory_entry_(0), |
| 748 root_path_(root_path), | 745 root_path_(root_path), |
| 749 recursive_(recursive), | 746 recursive_(recursive), |
| 750 file_type_(file_type) { | 747 file_type_(file_type) { |
| 751 // INCLUDE_DOT_DOT must not be specified if recursive. | 748 // INCLUDE_DOT_DOT must not be specified if recursive. |
| 752 DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); | 749 DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); |
| 753 pending_paths_.push(root_path); | 750 pending_paths_.push(root_path); |
| 754 } | 751 } |
| 755 | 752 |
| 756 FileEnumerator::FileEnumerator(const FilePath& root_path, | 753 FileEnumerator::FileEnumerator(const FilePath& root_path, |
| 757 bool recursive, | 754 bool recursive, |
| 758 FileType file_type, | 755 int file_type, |
| 759 const FilePath::StringType& pattern) | 756 const FilePath::StringType& pattern) |
| 760 : current_directory_entry_(0), | 757 : current_directory_entry_(0), |
| 761 root_path_(root_path), | 758 root_path_(root_path), |
| 762 recursive_(recursive), | 759 recursive_(recursive), |
| 763 file_type_(file_type), | 760 file_type_(file_type), |
| 764 pattern_(root_path.Append(pattern).value()) { | 761 pattern_(root_path.Append(pattern).value()) { |
| 765 // INCLUDE_DOT_DOT must not be specified if recursive. | 762 // INCLUDE_DOT_DOT must not be specified if recursive. |
| 766 DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); | 763 DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); |
| 767 // The Windows version of this code appends the pattern to the root_path, | 764 // The Windows version of this code appends the pattern to the root_path, |
| 768 // potentially only matching against items in the top-most directory. | 765 // potentially only matching against items in the top-most directory. |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1160 | 1157 |
| 1161 allowed_group_ids.insert(group_record->gr_gid); | 1158 allowed_group_ids.insert(group_record->gr_gid); |
| 1162 } | 1159 } |
| 1163 | 1160 |
| 1164 return VerifyPathControlledByUser( | 1161 return VerifyPathControlledByUser( |
| 1165 kFileSystemRoot, path, kRootUid, allowed_group_ids); | 1162 kFileSystemRoot, path, kRootUid, allowed_group_ids); |
| 1166 } | 1163 } |
| 1167 #endif // defined(OS_MACOSX) && !defined(OS_IOS) | 1164 #endif // defined(OS_MACOSX) && !defined(OS_IOS) |
| 1168 | 1165 |
| 1169 } // namespace file_util | 1166 } // namespace file_util |
| OLD | NEW |