diff options
-rw-r--r-- | Base/usr/share/man/man8/lsblk.md | 24 | ||||
-rw-r--r-- | Userland/Utilities/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Userland/Utilities/lsblk.cpp | 70 |
3 files changed, 95 insertions, 0 deletions
diff --git a/Base/usr/share/man/man8/lsblk.md b/Base/usr/share/man/man8/lsblk.md new file mode 100644 index 0000000000..9acf2eda43 --- /dev/null +++ b/Base/usr/share/man/man8/lsblk.md @@ -0,0 +1,24 @@ +## Name + +lsblk - list connected storage devices + +## Synopsis + +```**sh +$ lsblk +``` + +## Description + +lsblk is a utility for displaying information about storage devices in the system. +It shows a brief list of these devices. + +## Files + +* `/sys/devices/storage` - source of the storage devices list. + +## Examples + +```sh +$ lsblk +``` diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index f3b51a1115..eb8d6de1a7 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -149,6 +149,7 @@ target_link_libraries(ls LibMain) target_link_libraries(lscpu LibMain) target_link_libraries(lsirq LibMain) target_link_libraries(lsof LibMain) +target_link_libraries(lsblk LibMain) target_link_libraries(lspci LibPCIDB LibMain) target_link_libraries(lsusb LibUSBDB LibMain) target_link_libraries(man LibMarkdown LibMain) diff --git a/Userland/Utilities/lsblk.cpp b/Userland/Utilities/lsblk.cpp new file mode 100644 index 0000000000..278ef95202 --- /dev/null +++ b/Userland/Utilities/lsblk.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <AK/Hex.h> +#include <AK/String.h> +#include <AK/StringView.h> +#include <LibCore/ArgsParser.h> +#include <LibCore/DirIterator.h> +#include <LibCore/File.h> +#include <LibCore/System.h> +#include <LibMain/Main.h> + +static constexpr StringView format_row = "{:10s}\t{:10s}\t{:10s}\t{:10s}\t{:10s}"sv; + +ErrorOr<int> serenity_main(Main::Arguments arguments) +{ + TRY(Core::System::pledge("stdio rpath")); + TRY(Core::System::unveil("/sys/devices/storage", "r")); + TRY(Core::System::unveil(nullptr, nullptr)); + + Core::ArgsParser args_parser; + args_parser.set_general_help("List Storage (Block) devices."); + args_parser.parse(arguments); + + Core::DirIterator di("/sys/devices/storage/", Core::DirIterator::SkipParentAndBaseDir); + if (di.has_error()) { + warnln("Failed to open /sys/devices/storage - {}", di.error()); + return 1; + } + + outln(format_row, "LUN"sv, "Interface type"sv, "Command set"sv, "Block Size"sv, "Last LBA"sv); + + TRY(Core::System::pledge("stdio rpath")); + + while (di.has_next()) { + auto dir = di.next_path(); + auto command_set_file = Core::File::construct(String::formatted("/sys/devices/storage/{}/command_set", dir)); + if (!command_set_file->open(Core::OpenMode::ReadOnly)) { + dbgln("Error: Could not open {}: {}", command_set_file->name(), command_set_file->error_string()); + continue; + } + auto interface_type_file = Core::File::construct(String::formatted("/sys/devices/storage/{}/interface_type", dir)); + if (!interface_type_file->open(Core::OpenMode::ReadOnly)) { + dbgln("Error: Could not open {}: {}", interface_type_file->name(), interface_type_file->error_string()); + continue; + } + auto last_lba_file = Core::File::construct(String::formatted("/sys/devices/storage/{}/last_lba", dir)); + if (!last_lba_file->open(Core::OpenMode::ReadOnly)) { + dbgln("Error: Could not open {}: {}", last_lba_file->name(), last_lba_file->error_string()); + continue; + } + auto sector_size_file = Core::File::construct(String::formatted("/sys/devices/storage/{}/sector_size", dir)); + if (!sector_size_file->open(Core::OpenMode::ReadOnly)) { + dbgln("Error: Could not open {}: {}", sector_size_file->name(), sector_size_file->error_string()); + continue; + } + + String command_set = StringView(command_set_file->read_all().bytes()); + String interface_type = StringView(interface_type_file->read_all().bytes()); + String last_lba = StringView(last_lba_file->read_all().bytes()); + String sector_size = StringView(sector_size_file->read_all().bytes()); + + outln(format_row, dir, interface_type, command_set, sector_size, last_lba); + } + + return 0; +} |