diff options
author | David Isaksson <davidisaksson93@gmail.com> | 2021-10-08 22:15:07 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-10-09 12:06:47 +0200 |
commit | 8d631dcd5ec8b98eb9810a2021ddef975848ae4d (patch) | |
tree | ee42dee55f889e75fefcda9c729b42802a5f48ed /Userland | |
parent | 3b089032f4bacbfad8e8d15f13903e1a93d44847 (diff) | |
download | serenity-8d631dcd5ec8b98eb9810a2021ddef975848ae4d.zip |
Utilities: Add blockdev utility
This new utility queries a block device for its size via the newly
introduced ioctl STORAGE_DEVICE_GET_SIZE request.
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Utilities/blockdev.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
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 <davidisaksson93@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibCore/ArgsParser.h> +#include <fcntl.h> +#include <stdio.h> +#include <sys/ioctl.h> +#include <unistd.h> + +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; +} |