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