| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_UTILITY_SAFE_BROWSING_MAC_HFS_H_ |
| #define CHROME_UTILITY_SAFE_BROWSING_MAC_HFS_H_ |
| |
| #include <hfs/hfs_format.h> |
| #include <stdint.h> |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "base/strings/string16.h" |
| |
| namespace safe_browsing { |
| namespace dmg { |
| |
| class ReadStream; |
| class HFSBTreeIterator; |
| class HFSForkReadStream; |
| |
| // HFSIterator is a read-only iterator over an HFS+ file system. It provides |
| // access to the data fork of all files on the system, as well as the path. This |
| // implementation has several deliberate limitations: |
| // - Only HFS+ and HFSX are supported. |
| // - The journal file is ignored. As this is intended to be used for HFS+ in |
| // a DMG, replaying the journal should not typically be required. |
| // - The extents overflow file is not consulted. In a DMG, the file system |
| // should not be fragmented, and so consulting this should not typically be |
| // required. |
| // - No access is provided to resource forks. |
| // - Getting the ReadStream for hard linked files is not supported. |
| // - Files in hard linked directories are ignored. |
| // - No content will be returned for files that are decmpfs compressed. |
| // For information on the HFS format, see |
| // <https://developer.apple.com/legacy/library/technotes/tn/tn1150.html>. |
| class HFSIterator { |
| public: |
| // Constructs an iterator from a stream. |
| explicit HFSIterator(ReadStream* stream); |
| ~HFSIterator(); |
| |
| // Opens the filesystem and initializes the iterator. The iterator is |
| // initialized to an invalid item before the first entry. Use Next() to |
| // advance the iterator. This method must be called before any other |
| // method. If this returns false, it is not legal to call any other methods. |
| bool Open(); |
| |
| // Advances the iterator to the next item. If this returns false, then it |
| // is not legal to call any other methods. |
| bool Next(); |
| |
| // Returns true if the current iterator item is a directory and false if it |
| // is a file. |
| bool IsDirectory(); |
| |
| // Returns true if the current iterator item is a symbolic link. |
| bool IsSymbolicLink(); |
| |
| // Returns true if the current iterator item is a hard link. |
| bool IsHardLink(); |
| |
| // Returns true if the current iterator item is decmpfs-compressed. |
| bool IsDecmpfsCompressed(); |
| |
| // Returns the full filesystem path of the current iterator item. |
| base::string16 GetPath(); |
| |
| // Returns a stream for the data fork of the current iterator item. This may |
| // only be called if IsDirectory() and IsHardLink() returns false. |
| std::unique_ptr<ReadStream> GetReadStream(); |
| |
| private: |
| friend class HFSForkReadStream; |
| |
| // Moves the |stream_| position to a specific HFS+ |block|. |
| bool SeekToBlock(uint64_t block); |
| |
| // Reads the catalog file to initialize the iterator. |
| bool ReadCatalogFile(); |
| |
| uint32_t block_size() const { return volume_header_.blockSize; } |
| ReadStream* stream() const { return stream_; } |
| |
| ReadStream* const stream_; // The stream backing the filesystem. |
| HFSPlusVolumeHeader volume_header_; |
| std::unique_ptr<HFSForkReadStream> |
| catalog_file_; // Data of the catalog file. |
| std::unique_ptr<HFSBTreeIterator> |
| catalog_; // Iterator over the catalog file. |
| |
| DISALLOW_COPY_AND_ASSIGN(HFSIterator); |
| }; |
| |
| } // namespace dmg |
| } // namespace safe_browsing |
| |
| #endif // CHROME_UTILITY_SAFE_BROWSING_MAC_HFS_H_ |