blob: 6aa4656c00117dbacc63cfa3d0e642e5255fd22d [file] [log] [blame]
// Copyright 2018 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 DLCSERVICE_BOOT_BOOT_SLOT_H_
#define DLCSERVICE_BOOT_BOOT_SLOT_H_
#include <memory>
#include <string>
#include <gtest/gtest_prod.h> // for FRIEND_TEST
namespace dlcservice {
class BootDeviceInterface;
class BootSlot {
public:
enum class Slot : int {
A = 0,
B = 1,
};
explicit BootSlot(std::unique_ptr<BootDeviceInterface> boot_device);
~BootSlot();
// Gets the partition slot the system is currently booted from. Returns true
// if the operation returns valid results, otherwise returns false.
// |boot_disk_name_out| returns the device path of the disk the system is
// booted from. For example, "/dev/sda". |current_slot_out| returns the slot
// the system is currently booted from. |is_removable_out| returns whether the
// system is currently booted from a removable device or not.
bool GetCurrentSlot(std::string* boot_disk_name_out,
BootSlot::Slot* current_slot_out,
bool* is_removable_out = nullptr) const;
// Returns the string representation of |Slot|.
static std::string ToString(Slot slot);
private:
FRIEND_TEST(BootSlotTest, SplitPartitionNameTest);
// Splits the partition device name into the block device name and partition
// number. For example, "/dev/sda3" will be split into {"/dev/sda", 3} and
// "/dev/mmcblk0p2" into {"/dev/mmcblk0", 2}
// Returns false when malformed device name is passed in.
// If both output parameters are omitted (null), can be used
// just to test the validity of the device name. Note that the function
// simply checks if the device name looks like a valid device, no other
// checks are performed (i.e. it doesn't check if the device actually exists).
bool SplitPartitionName(std::string partition_name,
std::string* disk_name_out,
int* partition_num_out) const;
std::unique_ptr<BootDeviceInterface> boot_device_;
BootSlot(const BootSlot&) = delete;
BootSlot& operator=(const BootSlot&) = delete;
};
} // namespace dlcservice
#endif // DLCSERVICE_BOOT_BOOT_SLOT_H_