From 8d631dcd5ec8b98eb9810a2021ddef975848ae4d Mon Sep 17 00:00:00 2001 From: David Isaksson Date: Fri, 8 Oct 2021 22:15:07 +0200 Subject: [PATCH] Utilities: Add blockdev utility This new utility queries a block device for its size via the newly introduced ioctl STORAGE_DEVICE_GET_SIZE request. --- Userland/Utilities/blockdev.cpp | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Userland/Utilities/blockdev.cpp diff --git a/Userland/Utilities/blockdev.cpp b/Userland/Utilities/blockdev.cpp new file mode 100644 index 0000000000..04f92fc2d7 --- /dev/null +++ b/Userland/Utilities/blockdev.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2021, David Isaksson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +static void fetch_ioctl(int fd, int request) +{ + size_t value; + if (ioctl(fd, request, &value) < 0) { + perror("ioctl"); + exit(1); + } + outln("{}", value); +} + +int main(int argc, char** argv) +{ + if (unveil("/dev", "r") < 0) { + perror("unveil"); + return 1; + } + + if (unveil(nullptr, nullptr) < 0) { + perror("unveil"); + return 1; + } + + if (pledge("stdio rpath", nullptr) < 0) { + perror("pledge"); + return 1; + } + + const char* device = nullptr; + + bool flag_get_disk_size = false; + + Core::ArgsParser args_parser; + args_parser.set_general_help("Call block device ioctls"); + args_parser.add_option(flag_get_disk_size, "Get size in bytes", "size", 's'); + args_parser.add_positional_argument(device, "Device to query", "device"); + args_parser.parse(argc, argv); + + int fd = open(device, O_RDONLY); + if (fd < 0) { + perror("open"); + return 1; + } + + if (flag_get_disk_size) { + fetch_ioctl(fd, STORAGE_DEVICE_GET_SIZE); + } + + return 0; +}