blob: 7b1cc725747f6e86f4706ef0a0a95eb8c76c91ca [file] [log] [blame]
Adrien Béraud612b55b2023-05-29 10:42:04 -04001/*
2 * Copyright (C) 2004-2023 Savoir-faire Linux Inc.
3 *
Adrien Béraudcb753622023-07-17 22:32:49 -04004 * This program is free software: you can redistribute it and/or modify
Adrien Béraud612b55b2023-05-29 10:42:04 -04005 * it under the terms of the GNU General Public License as published by
Adrien Béraudcb753622023-07-17 22:32:49 -04006 * the Free Software Foundation, either version 3 of the License, or
Adrien Béraud612b55b2023-05-29 10:42:04 -04007 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Adrien Béraudcb753622023-07-17 22:32:49 -040011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Adrien Béraud612b55b2023-05-29 10:42:04 -040012 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
Adrien Béraudcb753622023-07-17 22:32:49 -040015 * along with this program. If not, see <https://www.gnu.org/licenses/>.
Adrien Béraud612b55b2023-05-29 10:42:04 -040016 */
Adrien Béraud612b55b2023-05-29 10:42:04 -040017#pragma once
18
19#include <string>
20#include <vector>
21#include <chrono>
22#include <mutex>
23#include <cstdio>
24#include <ios>
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040025#include <filesystem>
Adrien Béraud612b55b2023-05-29 10:42:04 -040026
Sébastien Blin7fbedf92023-08-30 08:44:47 -040027#ifndef _WIN32
28#include <sys/stat.h> // mode_t
Sébastien Blinc453ca72023-08-30 14:00:36 -040029#else
30#define mode_t unsigned
Sébastien Blin7fbedf92023-08-30 08:44:47 -040031#endif
32
Adrien Béraud1ae60aa2023-07-07 09:55:09 -040033namespace dhtnet {
Adrien Béraud612b55b2023-05-29 10:42:04 -040034namespace fileutils {
35
36/**
37 * Check directory existence and create it with given mode if it doesn't.
38 * @param path to check, relative or absolute
39 * @param dir last directory creation mode
40 * @param parents default mode for all created directories except the last
41 */
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040042bool check_dir(const std::filesystem::path& path, mode_t dir = 0755, mode_t parents = 0755);
Adrien Béraud612b55b2023-05-29 10:42:04 -040043
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040044bool recursive_mkdir(const std::filesystem::path& path, mode_t mode = 0755);
Adrien Béraud612b55b2023-05-29 10:42:04 -040045
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040046inline bool isPathRelative(const std::filesystem::path& path) {
47 return path.is_relative();
48}
Adrien Béraud612b55b2023-05-29 10:42:04 -040049
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040050bool isFile(const std::filesystem::path& path, bool resolveSymlink = true);
51bool isDirectory(const std::filesystem::path& path);
52bool isSymLink(const std::filesystem::path& path);
53bool hasHardLink(const std::filesystem::path& path);
Adrien Béraud612b55b2023-05-29 10:42:04 -040054
55/**
56 * Read content of the directory.
57 * The result is a list of relative (to @param dir) paths of all entries
58 * in the directory, without "." and "..".
59 */
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040060std::vector<std::string> readDirectory(const std::filesystem::path& dir);
Adrien Béraud612b55b2023-05-29 10:42:04 -040061
62/**
63 * Read the full content of a file at path.
64 * If path is relative, it is appended to default_dir.
65 */
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040066std::vector<uint8_t> loadFile(const std::filesystem::path& path);
Adrien Béraud612b55b2023-05-29 10:42:04 -040067
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040068void saveFile(const std::filesystem::path& path, const uint8_t* data, size_t data_size, mode_t mode = 0644);
Adrien Béraud612b55b2023-05-29 10:42:04 -040069inline void
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040070saveFile(const std::filesystem::path& path, const std::vector<uint8_t>& data, mode_t mode = 0644)
Adrien Béraud612b55b2023-05-29 10:42:04 -040071{
72 saveFile(path, data.data(), data.size(), mode);
73}
74
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040075std::mutex& getFileLock(const std::filesystem::path& path);
Adrien Béraud612b55b2023-05-29 10:42:04 -040076
77/**
78 * Remove a file with optional erasing of content.
79 * Return the same value as std::remove().
80 */
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040081int remove(const std::filesystem::path& path, bool erase = false);
Adrien Béraud612b55b2023-05-29 10:42:04 -040082
83/**
84 * Prune given directory's content and remove it, symlinks are not followed.
85 * Return 0 if succeed, -1 if directory is not removed (content can be removed partially).
86 */
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040087int removeAll(const std::filesystem::path& path, bool erase = false);
Adrien Béraud612b55b2023-05-29 10:42:04 -040088
89/**
90 * Wrappers for fstream opening that will convert paths to wstring
91 * on windows
92 */
93void openStream(std::ifstream& file,
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040094 const std::filesystem::path& path,
Adrien Béraud612b55b2023-05-29 10:42:04 -040095 std::ios_base::openmode mode = std::ios_base::in);
96void openStream(std::ofstream& file,
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040097 const std::filesystem::path& path,
Adrien Béraud612b55b2023-05-29 10:42:04 -040098 std::ios_base::openmode mode = std::ios_base::out);
Adrien Béraud2a4e73d2023-08-27 12:53:55 -040099std::ifstream ifstream(const std::filesystem::path& path, std::ios_base::openmode mode = std::ios_base::in);
100std::ofstream ofstream(const std::filesystem::path& path, std::ios_base::openmode mode = std::ios_base::out);
Adrien Béraud612b55b2023-05-29 10:42:04 -0400101
Adrien Béraud612b55b2023-05-29 10:42:04 -0400102/**
103 * Windows compatibility wrapper for checking read-only attribute
104 */
105int accessFile(const std::string& file, int mode);
106
Adrien Béraud612b55b2023-05-29 10:42:04 -0400107} // namespace fileutils
Sébastien Blin464bdff2023-07-19 08:02:53 -0400108} // namespace dhtnet