| 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 <libgen.h> | 10 #include <libgen.h> |
| (...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 int fd = HANDLE_EINTR(open(filename.value().c_str(), O_RDONLY)); | 705 int fd = HANDLE_EINTR(open(filename.value().c_str(), O_RDONLY)); |
| 706 if (fd < 0) | 706 if (fd < 0) |
| 707 return -1; | 707 return -1; |
| 708 | 708 |
| 709 ssize_t bytes_read = HANDLE_EINTR(read(fd, data, size)); | 709 ssize_t bytes_read = HANDLE_EINTR(read(fd, data, size)); |
| 710 if (int ret = IGNORE_EINTR(close(fd)) < 0) | 710 if (int ret = IGNORE_EINTR(close(fd)) < 0) |
| 711 return ret; | 711 return ret; |
| 712 return bytes_read; | 712 return bytes_read; |
| 713 } | 713 } |
| 714 | 714 |
| 715 int WriteFile(const FilePath& filename, const char* data, int size) { |
| 716 ThreadRestrictions::AssertIOAllowed(); |
| 717 int fd = HANDLE_EINTR(creat(filename.value().c_str(), 0666)); |
| 718 if (fd < 0) |
| 719 return -1; |
| 720 |
| 721 int bytes_written = WriteFileDescriptor(fd, data, size); |
| 722 if (int ret = IGNORE_EINTR(close(fd)) < 0) |
| 723 return ret; |
| 724 return bytes_written; |
| 725 } |
| 726 |
| 727 int WriteFileDescriptor(const int fd, const char* data, int size) { |
| 728 // Allow for partial writes. |
| 729 ssize_t bytes_written_total = 0; |
| 730 for (ssize_t bytes_written_partial = 0; bytes_written_total < size; |
| 731 bytes_written_total += bytes_written_partial) { |
| 732 bytes_written_partial = |
| 733 HANDLE_EINTR(write(fd, data + bytes_written_total, |
| 734 size - bytes_written_total)); |
| 735 if (bytes_written_partial < 0) |
| 736 return -1; |
| 737 } |
| 738 |
| 739 return bytes_written_total; |
| 740 } |
| 741 |
| 715 } // namespace base | 742 } // namespace base |
| 716 | 743 |
| 717 // ----------------------------------------------------------------------------- | 744 // ----------------------------------------------------------------------------- |
| 718 | 745 |
| 719 namespace file_util { | 746 namespace file_util { |
| 720 | 747 |
| 721 using base::stat_wrapper_t; | 748 using base::stat_wrapper_t; |
| 722 using base::CallStat; | 749 using base::CallStat; |
| 723 using base::CallLstat; | 750 using base::CallLstat; |
| 724 using base::CreateAndOpenFdForTemporaryFile; | 751 using base::CreateAndOpenFdForTemporaryFile; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 743 else if (errno != EEXIST) | 770 else if (errno != EEXIST) |
| 744 break; | 771 break; |
| 745 } | 772 } |
| 746 return base::FilePath(); | 773 return base::FilePath(); |
| 747 } | 774 } |
| 748 | 775 |
| 749 FILE* OpenFile(const std::string& filename, const char* mode) { | 776 FILE* OpenFile(const std::string& filename, const char* mode) { |
| 750 return OpenFile(FilePath(filename), mode); | 777 return OpenFile(FilePath(filename), mode); |
| 751 } | 778 } |
| 752 | 779 |
| 753 int WriteFile(const FilePath& filename, const char* data, int size) { | |
| 754 base::ThreadRestrictions::AssertIOAllowed(); | |
| 755 int fd = HANDLE_EINTR(creat(filename.value().c_str(), 0666)); | |
| 756 if (fd < 0) | |
| 757 return -1; | |
| 758 | |
| 759 int bytes_written = WriteFileDescriptor(fd, data, size); | |
| 760 if (int ret = IGNORE_EINTR(close(fd)) < 0) | |
| 761 return ret; | |
| 762 return bytes_written; | |
| 763 } | |
| 764 | |
| 765 int WriteFileDescriptor(const int fd, const char* data, int size) { | |
| 766 // Allow for partial writes. | |
| 767 ssize_t bytes_written_total = 0; | |
| 768 for (ssize_t bytes_written_partial = 0; bytes_written_total < size; | |
| 769 bytes_written_total += bytes_written_partial) { | |
| 770 bytes_written_partial = | |
| 771 HANDLE_EINTR(write(fd, data + bytes_written_total, | |
| 772 size - bytes_written_total)); | |
| 773 if (bytes_written_partial < 0) | |
| 774 return -1; | |
| 775 } | |
| 776 | |
| 777 return bytes_written_total; | |
| 778 } | |
| 779 | |
| 780 int AppendToFile(const FilePath& filename, const char* data, int size) { | 780 int AppendToFile(const FilePath& filename, const char* data, int size) { |
| 781 base::ThreadRestrictions::AssertIOAllowed(); | 781 base::ThreadRestrictions::AssertIOAllowed(); |
| 782 int fd = HANDLE_EINTR(open(filename.value().c_str(), O_WRONLY | O_APPEND)); | 782 int fd = HANDLE_EINTR(open(filename.value().c_str(), O_WRONLY | O_APPEND)); |
| 783 if (fd < 0) | 783 if (fd < 0) |
| 784 return -1; | 784 return -1; |
| 785 | 785 |
| 786 int bytes_written = WriteFileDescriptor(fd, data, size); | 786 int bytes_written = base::WriteFileDescriptor(fd, data, size); |
| 787 if (int ret = IGNORE_EINTR(close(fd)) < 0) | 787 if (int ret = IGNORE_EINTR(close(fd)) < 0) |
| 788 return ret; | 788 return ret; |
| 789 return bytes_written; | 789 return bytes_written; |
| 790 } | 790 } |
| 791 | 791 |
| 792 // Gets the current working directory for the process. | 792 // Gets the current working directory for the process. |
| 793 bool GetCurrentDirectory(FilePath* dir) { | 793 bool GetCurrentDirectory(FilePath* dir) { |
| 794 // getcwd can return ENOENT, which implies it checks against the disk. | 794 // getcwd can return ENOENT, which implies it checks against the disk. |
| 795 base::ThreadRestrictions::AssertIOAllowed(); | 795 base::ThreadRestrictions::AssertIOAllowed(); |
| 796 | 796 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 960 result = false; | 960 result = false; |
| 961 if (IGNORE_EINTR(close(outfile)) < 0) | 961 if (IGNORE_EINTR(close(outfile)) < 0) |
| 962 result = false; | 962 result = false; |
| 963 | 963 |
| 964 return result; | 964 return result; |
| 965 } | 965 } |
| 966 #endif // !defined(OS_MACOSX) | 966 #endif // !defined(OS_MACOSX) |
| 967 | 967 |
| 968 } // namespace internal | 968 } // namespace internal |
| 969 } // namespace base | 969 } // namespace base |
| OLD | NEW |