diff options
Diffstat (limited to 'cgpt/CgptManager.h')
-rw-r--r-- | cgpt/CgptManager.h | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/cgpt/CgptManager.h b/cgpt/CgptManager.h new file mode 100644 index 00000000..85fd882e --- /dev/null +++ b/cgpt/CgptManager.h @@ -0,0 +1,172 @@ +// Copyright (c) 2012 The Chromium OS 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 VBOOT_REFERENCE_CGPT_CGPTMANAGER_H_ +#define VBOOT_REFERENCE_CGPT_CGPTMANAGER_H_ + +#include <string> +#include <base/basictypes.h> +#include "gpt.h" + +// This file defines a simple C++ wrapper class interface for the cgpt methods. + +// These are the possible error codes that can be returned by the CgptManager. +typedef enum CgptErrorCode +{ + kCgptSuccess = 0, + kCgptNotInitialized = 1, + kCgptUnknownError = 2, + kCgptInvalidArgument = 3, +} CgptErrorCode; + + +// CgptManager exposes methods to manipulate the Guid Partition Table as needed +// for ChromeOS scenarios. +class CgptManager { + public: + // Default constructor. The Initialize method must be called before + // any other method can be called on this class. + CgptManager(); + + // Destructor. Automatically closes any opened device. + ~CgptManager(); + + // Opens the given device_name (e.g. "/dev/sdc") and initializes + // with the Guid Partition Table of that device. This is the first method + // that should be called on this class. Otherwise those methods will + // return kCgptNotInitialized. + // Returns kCgptSuccess or an appropriate error code. + // This device is automatically closed when this object is destructed. + CgptErrorCode Initialize(const std::string& device_name); + + // Clears all the existing contents of the GPT and PMBR on the current + // device. + CgptErrorCode ClearAll(); + + // Adds a new partition at the end of the existing partitions + // with the new label, type, unique Id, offset and size. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode AddPartition(const std::string& label, + const Guid& partition_type_guid, + const Guid& unique_id, + uint64_t beginning_offset, + uint64_t num_sectors); + + // Populates num_partitions parameter with the number of partitions + // that are currently on this device and not empty. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetNumNonEmptyPartitions(uint8_t* num_partitions) const; + + // Sets the Protective Master Boot Record on this device with the given + // boot_partition number after populating the MBR with the contents of the + // given boot_file_name. It also creates a legacy partition if + // should_create_legacy_partition is true. + // Note: Strictly speaking, the PMBR is not part of the GPT, but it is + // included here for ease of use. + CgptErrorCode SetPmbr(uint32_t boot_partition_number, + const std::string& boot_file_name, + bool should_create_legacy_partition); + + // Populates boot_partition with the partition number that's set to + // boot in the PMBR. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetPmbrBootPartitionNumber(uint32_t* boot_partition) const; + + // Sets the "successful" attribute of the given kernelPartition to 0 or 1 + // based on the value of is_successful being true (1) or false(0) + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode SetSuccessful(uint32_t partition_number, bool is_successful); + + // Populates is_successful to true if the successful attribute in the + // given kernelPartition is non-zero, or to false if it's zero. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetSuccessful(uint32_t partition_number, + bool* is_successful) const; + + // Sets the "NumTriesLeft" attribute of the given kernelPartition to + // the given num_tries_left value. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode SetNumTriesLeft(uint32_t partition_number, + int num_tries_left); + + // Populates the num_tries_left parameter with the value of the + // NumTriesLeft attribute of the given kernelPartition. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetNumTriesLeft(uint32_t partition_number, + int* num_tries_left) const; + + // Sets the "Priority" attribute of the given kernelPartition to + // the given priority value. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode SetPriority(uint32_t partition_number, + uint8_t priority); + + // Populates the priority parameter with the value of the Priority + // attribute of the given kernelPartition. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetPriority(uint32_t partition_number, + uint8_t* priority) const; + + // Populates the offset parameter with the beginning offset of the + // given partition. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetBeginningOffset(uint32_t partition_number, + uint64_t* offset) const; + + // Populates the number of sectors in the given partition. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetNumSectors(uint32_t partition_number, + uint64_t* num_sectors) const; + + // Populates the type_id parameter with the partition type id + // (these are the standard ids for kernel, rootfs, etc.) + // of the partition corresponding to the given partition_number. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetPartitionTypeId(uint32_t partition_number, + Guid* type_id) const; + + // Populates the unique_id parameter with the Guid that uniquely identifies + // the given partition_number. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetPartitionUniqueId(uint32_t partition_number, + Guid* unique_id) const; + + // Populates the partition_number parameter with the partition number of + // the partition which is uniquely identified by the given unique_id. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode GetPartitionNumberByUniqueId( + const Guid& unique_id, + uint32_t* partition_number) const; + + // Sets the "Priority" attribute of given kernelPartition to the value + // specified in higestPriority parameter. In addition, also reduces the + // priorities of all the other kernel partitions, if necessary, to ensure + // no other partition has a higher priority. It does preserve the relative + // ordering among the remaining partitions and doesn't touch the partitions + // whose priorities are zero. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode SetHighestPriority(uint32_t partition_number, + uint8_t highest_priority); + + // Same as SetHighestPriority above but works without having to explicitly + // give a value for highest_priority. The internal implementation figures + // out the best highest number that needs to be given depending on the + // existing priorities. + // Returns kCgptSuccess or an appropriate error code. + CgptErrorCode SetHighestPriority(uint32_t partition_number); + + // Runs the sanity checks on the CGPT and MBR and + // Returns kCgptSuccess if everything is valid or an appropriate error code + // if there's anything invalid or if there's any error encountered during + // the validation. + CgptErrorCode Validate(); + + private: + std::string device_name_; + bool is_initialized_; + + DISALLOW_COPY_AND_ASSIGN(CgptManager); +}; + +#endif // VBOOT_REFERENCE_CGPT_CGPTMANAGER_H_ |