From 79549aab5b9ca8f0cad4f00bc8ad68b7091ab65f Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 5 Jun 2026 10:12:56 +0200 Subject: magic: implement buffer processing support --- cabinet/magic.cpp | 7 +++++++ cabinet/magic.hpp | 3 +++ cabinet/main.cpp | 18 ++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cabinet/magic.cpp b/cabinet/magic.cpp index 96b78a3..3c36881 100644 --- a/cabinet/magic.cpp +++ b/cabinet/magic.cpp @@ -3,8 +3,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -68,6 +70,11 @@ namespace cab return handle_result(::magic_descriptor(m_cookie, file_descriptor)); } + auto magic::process(std::span data) -> std::expected + { + return handle_result(::magic_buffer(m_cookie, data.data(), data.size_bytes())); + } + auto magic::handle_result(char const * result) -> std::expected { auto errno_copy = errno; diff --git a/cabinet/magic.hpp b/cabinet/magic.hpp index 9e078de..68177f9 100644 --- a/cabinet/magic.hpp +++ b/cabinet/magic.hpp @@ -3,8 +3,10 @@ #include +#include #include #include +#include #include #include #include @@ -56,6 +58,7 @@ namespace cab auto process(std::filesystem::path path) -> std::expected; auto process(int file_descriptor) -> std::expected; + auto process(std::span data) -> std::expected; private: auto handle_result(char const * result) -> std::expected; diff --git a/cabinet/main.cpp b/cabinet/main.cpp index ff35d34..3602142 100644 --- a/cabinet/main.cpp +++ b/cabinet/main.cpp @@ -1,8 +1,13 @@ #include #include +#include +#include +#include +#include #include +#include #include #include @@ -23,12 +28,21 @@ auto main(int argc, char ** argv) -> int return EXIT_FAILURE; } - auto fd = open(argv[1], O_RDONLY); - auto mime_type = magic->process(fd); + auto fd = ::open(argv[1], O_RDONLY); + if (fd < 0) + { + std::println(std::cerr, "Failed to determine file type: {}", ::strerror(errno)); + return EXIT_FAILURE; + } + + std::array buffer{}; + ::read(fd, buffer.data(), buffer.size()); + auto mime_type = magic->process(buffer); if (!mime_type) { std::println(std::cerr, "Failed to determine file type: {}", mime_type.error().message()); return EXIT_FAILURE; } + std::println("{}: {}", argv[1], mime_type.value()); } -- cgit v1.2.3