Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: base/file_util_posix.cc

Issue 189333004: Move more file_util functions to base namespace. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/file_util_linux.cc ('k') | base/file_util_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <libgen.h> 10 #include <libgen.h>
(...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 return true; 765 return true;
766 } 766 }
767 767
768 // Sets the current working directory for the process. 768 // Sets the current working directory for the process.
769 bool SetCurrentDirectory(const FilePath& path) { 769 bool SetCurrentDirectory(const FilePath& path) {
770 ThreadRestrictions::AssertIOAllowed(); 770 ThreadRestrictions::AssertIOAllowed();
771 int ret = chdir(path.value().c_str()); 771 int ret = chdir(path.value().c_str());
772 return !ret; 772 return !ret;
773 } 773 }
774 774
775 } // namespace base
776
777 // -----------------------------------------------------------------------------
778
779 namespace file_util {
780
781 using base::stat_wrapper_t;
782 using base::CallStat;
783 using base::CallLstat;
784 using base::CreateAndOpenFdForTemporaryFile;
785 using base::DirectoryExists;
786 using base::FileEnumerator;
787 using base::FilePath;
788 using base::MakeAbsoluteFilePath;
789 using base::VerifySpecificPathControlledByUser;
790
791 base::FilePath MakeUniqueDirectory(const base::FilePath& path) {
792 const int kMaxAttempts = 20;
793 for (int attempts = 0; attempts < kMaxAttempts; attempts++) {
794 int uniquifier =
795 GetUniquePathNumber(path, base::FilePath::StringType());
796 if (uniquifier < 0)
797 break;
798 base::FilePath test_path = (uniquifier == 0) ? path :
799 path.InsertBeforeExtensionASCII(
800 base::StringPrintf(" (%d)", uniquifier));
801 if (mkdir(test_path.value().c_str(), 0777) == 0)
802 return test_path;
803 else if (errno != EEXIST)
804 break;
805 }
806 return base::FilePath();
807 }
808
809 FILE* OpenFile(const std::string& filename, const char* mode) {
810 return OpenFile(FilePath(filename), mode);
811 }
812
813 bool VerifyPathControlledByUser(const FilePath& base, 775 bool VerifyPathControlledByUser(const FilePath& base,
814 const FilePath& path, 776 const FilePath& path,
815 uid_t owner_uid, 777 uid_t owner_uid,
816 const std::set<gid_t>& group_gids) { 778 const std::set<gid_t>& group_gids) {
817 if (base != path && !base.IsParent(path)) { 779 if (base != path && !base.IsParent(path)) {
818 DLOG(ERROR) << "|base| must be a subdirectory of |path|. base = \"" 780 DLOG(ERROR) << "|base| must be a subdirectory of |path|. base = \""
819 << base.value() << "\", path = \"" << path.value() << "\""; 781 << base.value() << "\", path = \"" << path.value() << "\"";
820 return false; 782 return false;
821 } 783 }
822 784
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 const unsigned kRootUid = 0; 816 const unsigned kRootUid = 0;
855 const FilePath kFileSystemRoot("/"); 817 const FilePath kFileSystemRoot("/");
856 818
857 // The name of the administrator group on mac os. 819 // The name of the administrator group on mac os.
858 const char* const kAdminGroupNames[] = { 820 const char* const kAdminGroupNames[] = {
859 "admin", 821 "admin",
860 "wheel" 822 "wheel"
861 }; 823 };
862 824
863 // Reading the groups database may touch the file system. 825 // Reading the groups database may touch the file system.
864 base::ThreadRestrictions::AssertIOAllowed(); 826 ThreadRestrictions::AssertIOAllowed();
865 827
866 std::set<gid_t> allowed_group_ids; 828 std::set<gid_t> allowed_group_ids;
867 for (int i = 0, ie = arraysize(kAdminGroupNames); i < ie; ++i) { 829 for (int i = 0, ie = arraysize(kAdminGroupNames); i < ie; ++i) {
868 struct group *group_record = getgrnam(kAdminGroupNames[i]); 830 struct group *group_record = getgrnam(kAdminGroupNames[i]);
869 if (!group_record) { 831 if (!group_record) {
870 DPLOG(ERROR) << "Could not get the group ID of group \"" 832 DPLOG(ERROR) << "Could not get the group ID of group \""
871 << kAdminGroupNames[i] << "\"."; 833 << kAdminGroupNames[i] << "\".";
872 continue; 834 continue;
873 } 835 }
874 836
875 allowed_group_ids.insert(group_record->gr_gid); 837 allowed_group_ids.insert(group_record->gr_gid);
876 } 838 }
877 839
878 return VerifyPathControlledByUser( 840 return VerifyPathControlledByUser(
879 kFileSystemRoot, path, kRootUid, allowed_group_ids); 841 kFileSystemRoot, path, kRootUid, allowed_group_ids);
880 } 842 }
881 #endif // defined(OS_MACOSX) && !defined(OS_IOS) 843 #endif // defined(OS_MACOSX) && !defined(OS_IOS)
882 844
883 int GetMaximumPathComponentLength(const FilePath& path) { 845 int GetMaximumPathComponentLength(const FilePath& path) {
884 base::ThreadRestrictions::AssertIOAllowed(); 846 ThreadRestrictions::AssertIOAllowed();
885 return pathconf(path.value().c_str(), _PC_NAME_MAX); 847 return pathconf(path.value().c_str(), _PC_NAME_MAX);
886 } 848 }
887 849
888 } // namespace file_util 850 // -----------------------------------------------------------------------------
889 851
890 namespace base {
891 namespace internal { 852 namespace internal {
892 853
893 bool MoveUnsafe(const FilePath& from_path, const FilePath& to_path) { 854 bool MoveUnsafe(const FilePath& from_path, const FilePath& to_path) {
894 ThreadRestrictions::AssertIOAllowed(); 855 ThreadRestrictions::AssertIOAllowed();
895 // Windows compatibility: if to_path exists, from_path and to_path 856 // Windows compatibility: if to_path exists, from_path and to_path
896 // must be the same type, either both files, or both directories. 857 // must be the same type, either both files, or both directories.
897 stat_wrapper_t to_file_info; 858 stat_wrapper_t to_file_info;
898 if (CallStat(to_path.value().c_str(), &to_file_info) == 0) { 859 if (CallStat(to_path.value().c_str(), &to_file_info) == 0) {
899 stat_wrapper_t from_file_info; 860 stat_wrapper_t from_file_info;
900 if (CallStat(from_path.value().c_str(), &from_file_info) == 0) { 861 if (CallStat(from_path.value().c_str(), &from_file_info) == 0) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 result = false; 921 result = false;
961 if (IGNORE_EINTR(close(outfile)) < 0) 922 if (IGNORE_EINTR(close(outfile)) < 0)
962 result = false; 923 result = false;
963 924
964 return result; 925 return result;
965 } 926 }
966 #endif // !defined(OS_MACOSX) 927 #endif // !defined(OS_MACOSX)
967 928
968 } // namespace internal 929 } // namespace internal
969 } // namespace base 930 } // namespace base
OLDNEW
« no previous file with comments | « base/file_util_linux.cc ('k') | base/file_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698