From 95545648bdf9b03e71cc3a786135c32d37e93e99 Mon Sep 17 00:00:00 2001 From: Itamar Date: Fri, 7 Jan 2022 16:22:39 +0200 Subject: [PATCH] LibCore: Add utility class for temporary files and directories Core::TempFile is a RAII type that creates a temporary file or directory on construction and deletes it on destruction. --- Userland/Libraries/LibCore/CMakeLists.txt | 1 + Userland/Libraries/LibCore/TempFile.cpp | 59 +++++++++++++++++++++++ Userland/Libraries/LibCore/TempFile.h | 37 ++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 Userland/Libraries/LibCore/TempFile.cpp create mode 100644 Userland/Libraries/LibCore/TempFile.h diff --git a/Userland/Libraries/LibCore/CMakeLists.txt b/Userland/Libraries/LibCore/CMakeLists.txt index 5981e880fe..a7eb071d8a 100644 --- a/Userland/Libraries/LibCore/CMakeLists.txt +++ b/Userland/Libraries/LibCore/CMakeLists.txt @@ -33,6 +33,7 @@ set(SOURCES System.cpp TCPServer.cpp TCPSocket.cpp + TempFile.cpp Timer.cpp UDPServer.cpp UDPSocket.cpp diff --git a/Userland/Libraries/LibCore/TempFile.cpp b/Userland/Libraries/LibCore/TempFile.cpp new file mode 100644 index 0000000000..19251e9869 --- /dev/null +++ b/Userland/Libraries/LibCore/TempFile.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020-2021, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "TempFile.h" +#include +#include +#include +#include +#include +#include + +namespace Core { + +NonnullOwnPtr TempFile::create(Type type) +{ + return adopt_own(*new TempFile(type)); +} + +String TempFile::create_temp(Type type) +{ + char name_template[] = "/tmp/tmp.XXXXXX"; + switch (type) { + case Type::File: { + auto fd = mkstemp(name_template); + VERIFY(fd >= 0); + close(fd); + break; + } + case Type::Directory: { + auto fd = mkdtemp(name_template); + VERIFY(fd != nullptr); + break; + } + } + return String { name_template }; +} + +TempFile::TempFile(Type type) + : m_type(type) + , m_path(create_temp(type)) +{ +} + +TempFile::~TempFile() +{ + File::RecursionMode recursion_allowed { File::RecursionMode::Disallowed }; + if (m_type == Type::Directory) + recursion_allowed = File::RecursionMode::Allowed; + + auto rc = File::remove(m_path.characters(), recursion_allowed, false); + if (rc.is_error()) { + warnln("File::remove failed: {}", rc.error().string_literal()); + } +} + +} diff --git a/Userland/Libraries/LibCore/TempFile.h b/Userland/Libraries/LibCore/TempFile.h new file mode 100644 index 0000000000..d691365a04 --- /dev/null +++ b/Userland/Libraries/LibCore/TempFile.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020-2021, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Core { + +class TempFile { + AK_MAKE_NONCOPYABLE(TempFile); + AK_MAKE_NONMOVABLE(TempFile); + +public: + enum class Type { + File, + Directory + }; + + static NonnullOwnPtr create(Type = Type::File); + ~TempFile(); + + String path() const { return m_path; } + +private: + TempFile(Type); + static String create_temp(Type); + + Type m_type { Type::File }; + String m_path; +}; + +}