You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.0 KiB
113 lines
3.0 KiB
// 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.
|
|
|
|
#include <brillo/blkdev_utils/device_mapper_fake.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
namespace brillo {
|
|
namespace fake {
|
|
|
|
namespace {
|
|
|
|
// Stub DmTask runs into a map for easy reference.
|
|
bool StubDmRunTask(DmTask* task, bool udev_sync) {
|
|
std::string dev_name = task->name;
|
|
std::string params;
|
|
int type = task->type;
|
|
static auto& dm_target_map_ =
|
|
*new std::unordered_map<std::string, std::vector<DmTarget>>();
|
|
|
|
switch (type) {
|
|
case DM_DEVICE_CREATE:
|
|
CHECK_EQ(udev_sync, true);
|
|
if (dm_target_map_.find(dev_name) != dm_target_map_.end())
|
|
return false;
|
|
dm_target_map_.insert(std::make_pair(dev_name, task->targets));
|
|
break;
|
|
case DM_DEVICE_REMOVE:
|
|
CHECK_EQ(udev_sync, true);
|
|
if (dm_target_map_.find(dev_name) == dm_target_map_.end())
|
|
return false;
|
|
dm_target_map_.erase(dev_name);
|
|
break;
|
|
case DM_DEVICE_TABLE:
|
|
CHECK_EQ(udev_sync, false);
|
|
if (dm_target_map_.find(dev_name) == dm_target_map_.end())
|
|
return false;
|
|
task->targets = dm_target_map_[dev_name];
|
|
break;
|
|
case DM_DEVICE_RELOAD:
|
|
CHECK_EQ(udev_sync, false);
|
|
if (dm_target_map_.find(dev_name) == dm_target_map_.end())
|
|
return false;
|
|
dm_target_map_.erase(dev_name);
|
|
dm_target_map_.insert(std::make_pair(dev_name, task->targets));
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
std::unique_ptr<DmTask> DmTaskCreate(int type) {
|
|
auto t = std::make_unique<DmTask>();
|
|
t->type = type;
|
|
return t;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
FakeDevmapperTask::FakeDevmapperTask(int type) : task_(DmTaskCreate(type)) {}
|
|
|
|
bool FakeDevmapperTask::SetName(const std::string& name) {
|
|
task_->name = std::string(name);
|
|
return true;
|
|
}
|
|
|
|
bool FakeDevmapperTask::AddTarget(uint64_t start,
|
|
uint64_t sectors,
|
|
const std::string& type,
|
|
const SecureBlob& parameters) {
|
|
DmTarget dmt;
|
|
dmt.start = start;
|
|
dmt.size = sectors;
|
|
dmt.type = type;
|
|
dmt.parameters = parameters;
|
|
task_->targets.push_back(dmt);
|
|
return true;
|
|
}
|
|
|
|
bool FakeDevmapperTask::GetNextTarget(uint64_t* start,
|
|
uint64_t* sectors,
|
|
std::string* type,
|
|
SecureBlob* parameters) {
|
|
if (task_->targets.empty())
|
|
return false;
|
|
|
|
DmTarget dmt = task_->targets[0];
|
|
*start = dmt.start;
|
|
*sectors = dmt.size;
|
|
*type = dmt.type;
|
|
*parameters = dmt.parameters;
|
|
task_->targets.erase(task_->targets.begin());
|
|
|
|
return !task_->targets.empty();
|
|
}
|
|
|
|
bool FakeDevmapperTask::Run(bool udev_sync) {
|
|
return StubDmRunTask(task_.get(), udev_sync);
|
|
}
|
|
|
|
std::unique_ptr<DevmapperTask> CreateDevmapperTask(int type) {
|
|
return std::make_unique<FakeDevmapperTask>(type);
|
|
}
|
|
|
|
} // namespace fake
|
|
} // namespace brillo
|