1c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// 2c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// Copyright (C) 2016 The Android Open Source Project 3c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// 4c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// you may not use this file except in compliance with the License. 6c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// You may obtain a copy of the License at 7c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// 8c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// 10c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// Unless required by applicable law or agreed to in writing, software 11c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// See the License for the specific language governing permissions and 14c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// limitations under the License. 15c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// 16c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 17c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// A filesystem parser based on the Android .map files. When generating a 18c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// filesystem with the Android tools, either squashfs or ext4, a .map file can 19c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// be generated at the same time with the list of files and the 4K-blocks where 20c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// the data for those files is located in the filesystem. This class parses this 21c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// .map text file instead of parsing the structure of the actual filesystem 22c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo// contents. 23c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 24c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo#ifndef UPDATE_ENGINE_PAYLOAD_GENERATOR_MAPFILE_FILESYSTEM_H_ 25c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo#define UPDATE_ENGINE_PAYLOAD_GENERATOR_MAPFILE_FILESYSTEM_H_ 26c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 27c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo#include "update_engine/payload_generator/filesystem_interface.h" 28c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 29c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo#include <memory> 30c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo#include <string> 31c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo#include <vector> 32c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 33c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymonamespace chromeos_update_engine { 34c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 35c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymoclass MapfileFilesystem : public FilesystemInterface { 36c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo public: 37c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo static std::unique_ptr<MapfileFilesystem> CreateFromFile( 38c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo const std::string& filename, const std::string& mapfile_filename); 39c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo virtual ~MapfileFilesystem() = default; 40c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 41c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo // FilesystemInterface overrides. 42c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo size_t GetBlockSize() const override; 43c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo size_t GetBlockCount() const override; 44c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 45c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo // All the generated FilesystemInterface::File are reported as regular files. 46c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo // Files may overlap with other files in the same block. 47c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo bool GetFiles(std::vector<File>* files) const override; 48c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 49c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo bool LoadSettings(brillo::KeyValueStore* store) const override; 50c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 51c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo private: 52c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo MapfileFilesystem(const std::string& mapfile_filename, off_t num_blocks); 53c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 54c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo // The file where the map filesystem is stored. 55c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo std::string mapfile_filename_; 56c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 57c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo // The number of blocks in the filesystem. 58c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo off_t num_blocks_; 59c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 60c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo DISALLOW_COPY_AND_ASSIGN(MapfileFilesystem); 61c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo}; 62c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 63c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo} // namespace chromeos_update_engine 64c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo 65c736d4791c584760848a228b7eb579362ecf4e6fAlex Deymo#endif // UPDATE_ENGINE_PAYLOAD_GENERATOR_MAPFILE_FILESYSTEM_H_ 66