blob: 67d6954b471fbacafa95ee46989f04b047ace8ba [file] [log] [blame]
// Copyright 2020 The Fuchsia 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 SRC_STORAGE_MINFS_COMMAND_HANDLER_H_
#define SRC_STORAGE_MINFS_COMMAND_HANDLER_H_
#include <iostream>
#include <map>
#include <ostream>
#include <string>
#include <vector>
#include <disk_inspector/command.h>
#include <disk_inspector/command_handler.h>
#include <disk_inspector/common_types.h>
#include <disk_inspector/disk_struct.h>
#include <disk_inspector/inspector_transaction_handler.h>
#include <storage/buffer/vmo_buffer.h>
#include "src/lib/storage/block_client/cpp/block_device.h"
#include "src/storage/minfs/format.h"
#include "src/storage/minfs/minfs_inspector.h"
namespace minfs {
using ArgType = disk_inspector::ArgType;
using FieldType = disk_inspector::FieldType;
// CommandHandler for Minfs commands.
class CommandHandler : public disk_inspector::CommandHandler {
public:
explicit CommandHandler(std::unique_ptr<MinfsInspector> inspector)
: inspector_(std::move(inspector)) {
InitializeCommands();
}
// disk_inspector::CommandHandler interface:
void PrintSupportedCommands() final;
zx_status_t CallCommand(std::vector<std::string> command) final;
// Function to allow customization where output is redirected.
void SetOutputStream(std::ostream* stream) { output_ = stream; }
private:
void InitializeCommands();
// Commands: we are leaving them in the CommandHandler directly for now
// before the number of commands becomes large and the need to separate them
// out becomes clear.
// Toggles whether future prints calls to display hex numbers for field values.
zx_status_t TogglePrintHex();
// Toggles whether future print calls will display the full array for array fields.
zx_status_t ToggleHideArray();
// Prints the minfs superblock to |output_|.
zx_status_t PrintSuperblock();
// Prints the inode at |index| to |output_|.
zx_status_t PrintInode(uint64_t index);
// Prints every inode in the inode table in order to |output_|. |max| represents
// the number of entries to print if |max| is less the the total number of
// entries.
zx_status_t PrintInodes(uint64_t max);
// Prints inodes defined as allocated in the inode allocation bitmap
// in order to |output_|. |max| represents the number of entries to print
// if |max| is less the the total number of entries.
zx_status_t PrintAllocatedInodes(uint64_t max);
// Prints the JournalInfo object to |output_|.
zx_status_t PrintJournalSuperblock();
// Prints to |output_| every JournalEntry block in order by first getting
// the prefix at each block to check if it is a header, commit, recovation,
// or payload and printing based on the specific format. |max| represents
// the number of entries to print if |max| is less the the total number of
// entries.
zx_status_t PrintJournalEntries(uint64_t max);
// Prints the journal entry at |index| as a JournalHeader struct to |output_|.
zx_status_t PrintJournalHeader(uint64_t index);
// Prints the jouranl entry at |index| as a JournalCommit struct to |output_|.
zx_status_t PrintJournalCommit(uint64_t index);
// Prints the minfs backup superblock to |output_|.
zx_status_t PrintBackupSuperblock();
// Gets the superblock from the inspector, edits the field with |fieldname|
// to be |value|, and writes the superblock to disk.
zx_status_t WriteSuperblockField(std::string fieldname, std::string value);
std::unique_ptr<MinfsInspector> inspector_;
std::vector<disk_inspector::Command> command_list_;
// |name_to_index_| is a mapping of the string name of the command to the
// uint64_t index of the associated disk_inspector::Command in |command_list_|.
std::map<std::string, uint64_t> name_to_index_;
disk_inspector::PrintOptions options_ = {.display_hex = false, .hide_array = true};
std::ostream* output_ = &std::cout;
};
} // namespace minfs
#endif // SRC_STORAGE_MINFS_COMMAND_HANDLER_H_