0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-29 10:12:39 +01:00

ircd::fs: Reorg path interface related.

This commit is contained in:
Jason Volk 2019-01-25 10:35:39 -08:00
parent f3cc3d945d
commit 2886924bf0
9 changed files with 165 additions and 133 deletions

View file

@ -17,7 +17,7 @@ namespace ircd::fs
size_t size(const fd &); size_t size(const fd &);
size_t block_size(const fd &); size_t block_size(const fd &);
ulong filesystem(const fd &); ulong fstype(const fd &);
ulong device(const fd &); ulong device(const fd &);
} }

View file

@ -11,6 +11,9 @@
#pragma once #pragma once
#define HAVE_IRCD_FS_H #define HAVE_IRCD_FS_H
// Forward declarations for boost because it is not included here.
namespace boost::filesystem {}
/// Local filesystem interface. /// Local filesystem interface.
/// ///
/// IRCd has wrapped operations for the local filesystem to maintain a /// IRCd has wrapped operations for the local filesystem to maintain a
@ -28,6 +31,11 @@ namespace ircd::fs
{ {
struct init; struct init;
struct error; // custom exception; still inherits from ircd::error struct error; // custom exception; still inherits from ircd::error
// Forward interface to boost::filesystem. We do not include boost
// from here; it is used internally only. Some exposed interfaces
// may make forward-declared references to boost symbols.
namespace filesystem = boost::filesystem;
} }
#include "error.h" #include "error.h"

View file

@ -11,6 +11,12 @@
#pragma once #pragma once
#define HAVE_IRCD_FS_PATH_H #define HAVE_IRCD_FS_PATH_H
// Forward declarations for boost because it is not included here.
namespace boost::filesystem
{
struct path;
}
namespace ircd::fs namespace ircd::fs
{ {
enum base :uint; enum base :uint;
@ -19,15 +25,22 @@ namespace ircd::fs
extern const size_t NAME_MAX_LEN; extern const size_t NAME_MAX_LEN;
extern const size_t PATH_MAX_LEN; extern const size_t PATH_MAX_LEN;
const basepath &get(const base &) noexcept; filesystem::path _path(std::string);
string_view make_path(const base &) noexcept; filesystem::path _path(const string_view &);
std::string make_path(const base &, const string_view &); filesystem::path _path(const vector_view<const string_view> &);
std::string make_path(const vector_view<const string_view> &); filesystem::path _path(const vector_view<const std::string> &);
std::string make_path(const vector_view<const std::string> &);
string_view path(const base &) noexcept;
std::string path(const base &, const string_view &);
std::string path(const vector_view<const string_view> &);
std::string path(const vector_view<const std::string> &);
std::string path(const filesystem::path &);
size_t name_max_len(const string_view &path); size_t name_max_len(const string_view &path);
size_t path_max_len(const string_view &path); size_t path_max_len(const string_view &path);
long pathconf(const string_view &path, const int &arg);
string_view cwd(const mutable_buffer &buf); string_view cwd(const mutable_buffer &buf);
std::string cwd(); std::string cwd();
} }
@ -38,6 +51,8 @@ struct ircd::fs::basepath
{ {
string_view name; string_view name;
string_view path; string_view path;
static const basepath &get(const base &) noexcept;
}; };
/// Index of default paths. Must be aligned with the internal array in fs.cc. /// Index of default paths. Must be aligned with the internal array in fs.cc.

View file

@ -180,7 +180,7 @@ try
{ {
const auto dbdir const auto dbdir
{ {
fs::make_path(fs::DB) fs::path(fs::DB)
}; };
if(fs::mkdir(dbdir)) if(fs::mkdir(dbdir))
@ -224,7 +224,7 @@ try
{ {
log, "Direct-IO is not supported in the database directory `%s'" log, "Direct-IO is not supported in the database directory `%s'"
"; Concurrent database queries will not be possible.", "; Concurrent database queries will not be possible.",
fs::get(fs::DB) fs::basepath::get(fs::DB)
}; };
} }
catch(const std::exception &e) catch(const std::exception &e)
@ -246,7 +246,7 @@ ircd::db::direct_io_test_file_path()
"SUPPORTS_DIRECT_IO"_sv "SUPPORTS_DIRECT_IO"_sv
}; };
return fs::make_path(fs::DB, test_file_name); return fs::path(fs::DB, test_file_name);
} }
decltype(ircd::db::compressions) decltype(ircd::db::compressions)
@ -3265,10 +3265,10 @@ ircd::db::database::sst::dump::dump(db::column column,
{ {
const string_view path_parts[] const string_view path_parts[]
{ {
fs::make_path(fs::DB), db::name(d), db::name(c) fs::path(fs::DB), db::name(d), db::name(c)
}; };
path = fs::make_path(path_parts); path = fs::path(path_parts);
} }
rocksdb::Options opts(d.d->GetOptions(c)); rocksdb::Options opts(d.d->GetOptions(c));
@ -7245,7 +7245,7 @@ ircd::db::available()
{ {
const auto &prefix const auto &prefix
{ {
fs::make_path(fs::DB) fs::path(fs::DB)
}; };
const auto dirs const auto dirs
@ -7309,7 +7309,7 @@ ircd::db::path(const string_view &name,
{ {
const auto &prefix const auto &prefix
{ {
fs::make_path(fs::DB) fs::path(fs::DB)
}; };
const string_view parts[] const string_view parts[]
@ -7317,7 +7317,7 @@ ircd::db::path(const string_view &name,
prefix, name, lex_cast(checkpoint) prefix, name, lex_cast(checkpoint)
}; };
return fs::make_path(parts); return fs::path(parts);
} }
std::pair<ircd::string_view, uint64_t> std::pair<ircd::string_view, uint64_t>

View file

@ -18,13 +18,8 @@
#include "fs_aio.h" #include "fs_aio.h"
#endif #endif
namespace filesystem = boost::filesystem;
namespace ircd::fs namespace ircd::fs
{ {
static filesystem::path path(std::string);
static filesystem::path path(const string_view &);
static filesystem::path path(const vector_view<const string_view> &);
static uint posix_flags(const std::ios::openmode &mode); static uint posix_flags(const std::ios::openmode &mode);
static const char *path_str(const string_view &); static const char *path_str(const string_view &);
static void debug_paths(); static void debug_paths();
@ -80,7 +75,7 @@ bool
ircd::fs::mkdir(const string_view &path) ircd::fs::mkdir(const string_view &path)
try try
{ {
return filesystem::create_directories(fs::path(path)); return filesystem::create_directories(_path(path));
} }
catch(const filesystem::filesystem_error &e) catch(const filesystem::filesystem_error &e)
{ {
@ -91,7 +86,7 @@ bool
ircd::fs::remove(const string_view &path) ircd::fs::remove(const string_view &path)
try try
{ {
return filesystem::remove(fs::path(path)); return filesystem::remove(_path(path));
} }
catch(const filesystem::filesystem_error &e) catch(const filesystem::filesystem_error &e)
{ {
@ -103,7 +98,7 @@ ircd::fs::remove(std::nothrow_t,
const string_view &path) const string_view &path)
{ {
boost::system::error_code ec; boost::system::error_code ec;
return filesystem::remove(fs::path(path), ec); return filesystem::remove(_path(path), ec);
} }
bool bool
@ -111,7 +106,7 @@ ircd::fs::rename(const string_view &old,
const string_view &new_) const string_view &new_)
try try
{ {
filesystem::rename(path(old), path(new_)); filesystem::rename(_path(old), _path(new_));
return true; return true;
} }
catch(const filesystem::filesystem_error &e) catch(const filesystem::filesystem_error &e)
@ -125,7 +120,7 @@ ircd::fs::rename(std::nothrow_t,
const string_view &new_) const string_view &new_)
{ {
boost::system::error_code ec; boost::system::error_code ec;
filesystem::rename(path(old), path(new_), ec); filesystem::rename(_path(old), _path(new_), ec);
return !ec; return !ec;
} }
@ -136,7 +131,7 @@ try
const filesystem::recursive_directory_iterator end; const filesystem::recursive_directory_iterator end;
filesystem::recursive_directory_iterator it filesystem::recursive_directory_iterator it
{ {
fs::path(path) _path(path)
}; };
std::vector<std::string> ret; std::vector<std::string> ret;
@ -160,7 +155,7 @@ try
static const filesystem::directory_iterator end; static const filesystem::directory_iterator end;
filesystem::directory_iterator it filesystem::directory_iterator it
{ {
fs::path(path) _path(path)
}; };
std::vector<std::string> ret; std::vector<std::string> ret;
@ -181,7 +176,7 @@ size_t
ircd::fs::size(const string_view &path) ircd::fs::size(const string_view &path)
try try
{ {
return filesystem::file_size(fs::path(path)); return filesystem::file_size(_path(path));
} }
catch(const filesystem::filesystem_error &e) catch(const filesystem::filesystem_error &e)
{ {
@ -192,7 +187,7 @@ bool
ircd::fs::is_reg(const string_view &path) ircd::fs::is_reg(const string_view &path)
try try
{ {
return filesystem::is_regular_file(fs::path(path)); return filesystem::is_regular_file(_path(path));
} }
catch(const filesystem::filesystem_error &e) catch(const filesystem::filesystem_error &e)
{ {
@ -203,7 +198,7 @@ bool
ircd::fs::is_dir(const string_view &path) ircd::fs::is_dir(const string_view &path)
try try
{ {
return filesystem::is_directory(fs::path(path)); return filesystem::is_directory(_path(path));
} }
catch(const filesystem::filesystem_error &e) catch(const filesystem::filesystem_error &e)
{ {
@ -214,7 +209,7 @@ bool
ircd::fs::exists(const string_view &path) ircd::fs::exists(const string_view &path)
try try
{ {
return filesystem::exists(fs::path(path)); return filesystem::exists(_path(path));
} }
catch(const filesystem::filesystem_error &e) catch(const filesystem::filesystem_error &e)
{ {
@ -1015,7 +1010,7 @@ ircd::fs::device(const fd &fd)
#ifdef HAVE_SYS_STATFS_H #ifdef HAVE_SYS_STATFS_H
ulong ulong
ircd::fs::filesystem(const fd &fd) ircd::fs::fstype(const fd &fd)
{ {
struct statfs f{0}; struct statfs f{0};
syscall(::fstatfs, fd, &f); syscall(::fstatfs, fd, &f);
@ -1023,7 +1018,7 @@ ircd::fs::filesystem(const fd &fd)
} }
#else #else
ulong ulong
ircd::fs::filesystem(const fd &fd) ircd::fs::fstype(const fd &fd)
{ {
static_assert static_assert
( (
@ -1337,25 +1332,6 @@ ircd::fs::bytes(const const_iovec_view &iov)
// fs/path.h // fs/path.h
// //
namespace ircd::fs
{
extern const std::array<basepath, num_of<base>()> basepaths;
static long pathconf(const string_view &path, const int &arg);
}
decltype(ircd::fs::basepaths)
ircd::fs::basepaths
{{
{ "installation prefix", RB_PREFIX },
{ "binary directory", RB_BIN_DIR },
{ "configuration directory", RB_CONF_DIR },
{ "data directory", RB_DATA_DIR },
{ "database directory", RB_DB_DIR },
{ "log directory", RB_LOG_DIR },
{ "module directory", RB_MODULE_DIR },
}};
std::string std::string
ircd::fs::cwd() ircd::fs::cwd()
try try
@ -1431,60 +1407,130 @@ ircd::fs::pathconf(const string_view &path,
return syscall(::pathconf, path_str(path), arg); return syscall(::pathconf, path_str(path), arg);
} }
std::string //
ircd::fs::make_path(const vector_view<const std::string> &list) // fs::path()
try //
{
filesystem::path ret;
for(const auto &s : list)
ret /= path(s);
return ret.string(); std::string
} ircd::fs::path(const filesystem::path &path)
catch(const filesystem::filesystem_error &e)
{ {
throw error{e}; return path.string();
} }
std::string std::string
ircd::fs::make_path(const vector_view<const string_view> &list) ircd::fs::path(const vector_view<const std::string> &list)
try
{ {
filesystem::path ret; return _path(list).string();
for(const auto &s : list)
ret /= path(s);
return ret.string();
}
catch(const filesystem::filesystem_error &e)
{
throw error{e};
} }
std::string std::string
ircd::fs::make_path(const base &base, ircd::fs::path(const vector_view<const string_view> &list)
const string_view &rest)
try
{ {
filesystem::path ret; return _path(list).string();
ret /= make_path(base);
ret /= path(rest);
return ret.string();
} }
catch(const filesystem::filesystem_error &e)
std::string
ircd::fs::path(const base &base,
const string_view &rest)
{ {
throw error{e}; const auto p
{
_path(std::initializer_list<const string_view>
{
path(base),
rest,
})
};
return p.string();
} }
ircd::string_view ircd::string_view
ircd::fs::make_path(const base &base) ircd::fs::path(const base &base)
noexcept noexcept
{ {
return get(base).path; return basepath::get(base).path;
} }
//
// fs::_path()
//
boost::filesystem::path
ircd::fs::_path(const vector_view<const std::string> &list)
try
{
filesystem::path ret;
for(const auto &s : list)
ret /= s;
return ret.string();
}
catch(const filesystem::filesystem_error &e)
{
throw error{e};
}
boost::filesystem::path
ircd::fs::_path(const vector_view<const string_view> &list)
try
{
filesystem::path ret;
for(const auto &s : list)
ret /= _path(s);
return ret.string();
}
catch(const filesystem::filesystem_error &e)
{
throw error{e};
}
boost::filesystem::path
ircd::fs::_path(const string_view &s)
try
{
return _path(std::string{s});
}
catch(const filesystem::filesystem_error &e)
{
throw error{e};
}
boost::filesystem::path
ircd::fs::_path(std::string s)
try
{
return filesystem::path{std::move(s)};
}
catch(const filesystem::filesystem_error &e)
{
throw error{e};
}
//
// fs::basepath
//
namespace ircd::fs
{
extern const std::array<basepath, num_of<base>()> basepaths;
}
decltype(ircd::fs::basepaths)
ircd::fs::basepaths
{{
{ "installation prefix", RB_PREFIX },
{ "binary directory", RB_BIN_DIR },
{ "configuration directory", RB_CONF_DIR },
{ "data directory", RB_DATA_DIR },
{ "database directory", RB_DB_DIR },
{ "log directory", RB_LOG_DIR },
{ "module directory", RB_MODULE_DIR },
}};
const ircd::fs::basepath & const ircd::fs::basepath &
ircd::fs::get(const base &base) ircd::fs::basepath::get(const base &base)
noexcept noexcept
{ {
return basepaths.at(base); return basepaths.at(base);
@ -1563,8 +1609,8 @@ ircd::fs::debug_paths()
log::debug log::debug
{ {
"Working %s is `%s'", "Working %s is `%s'",
get(base).name, basepath::get(base).name,
get(base).path, basepath::get(base).path,
}; };
}); });
} }
@ -1598,40 +1644,3 @@ ircd::fs::posix_flags(const std::ios::openmode &mode)
ret |= ret & O_RDWR && ret & (O_TRUNC | O_APPEND)? O_CREAT : 0; ret |= ret & O_RDWR && ret & (O_TRUNC | O_APPEND)? O_CREAT : 0;
return ret; return ret;
} }
filesystem::path
ircd::fs::path(const vector_view<const string_view> &list)
try
{
filesystem::path ret;
for(const auto &s : list)
ret /= path(s);
return ret.string();
}
catch(const filesystem::filesystem_error &e)
{
throw error{e};
}
filesystem::path
ircd::fs::path(const string_view &s)
try
{
return path(std::string{s});
}
catch(const filesystem::filesystem_error &e)
{
throw error{e};
}
filesystem::path
ircd::fs::path(std::string s)
try
{
return filesystem::path(std::move(s));
}
catch(const filesystem::filesystem_error &e)
{
throw error{e};
}

View file

@ -63,7 +63,7 @@ ircd::log::mkdir()
{ {
const auto &dir const auto &dir
{ {
fs::make_path(fs::LOG) fs::path(fs::LOG)
}; };
if(fs::exists(dir)) if(fs::exists(dir))
@ -140,7 +140,7 @@ catch(const std::exception &e)
std::string std::string
ircd::log::file_path(const level &lev) ircd::log::file_path(const level &lev)
{ {
return fs::make_path(fs::LOG, reflect(lev)); return fs::path(fs::LOG, reflect(lev));
} }
void void

View file

@ -881,7 +881,7 @@ namespace ircd::mods
decltype(ircd::mods::modroot) decltype(ircd::mods::modroot)
ircd::mods::modroot ircd::mods::modroot
{ {
fs::make_path(fs::MODULES) fs::path(fs::MODULES)
}; };
decltype(ircd::mods::paths) decltype(ircd::mods::paths)

View file

@ -3390,7 +3390,7 @@ console_cmd__db__list(opt &out, const string_view &line)
{ {
const auto name const auto name
{ {
replace(lstrip(lstrip(path, fs::make_path(fs::DB)), '/'), "/", ":") replace(lstrip(lstrip(path, fs::path(fs::DB)), '/'), "/", ":")
}; };
const auto &d const auto &d

View file

@ -77,17 +77,17 @@ init_my_tls_crt()
const std::string private_key_file const std::string private_key_file
{ {
fs::make_path(private_key_path_parts) fs::path(private_key_path_parts)
}; };
const std::string public_key_file const std::string public_key_file
{ {
fs::make_path(public_key_path_parts) fs::path(public_key_path_parts)
}; };
const std::string cert_file const std::string cert_file
{ {
fs::make_path(certificate_path_parts) fs::path(certificate_path_parts)
}; };
if(!fs::exists(private_key_file)) if(!fs::exists(private_key_file))
@ -104,7 +104,7 @@ init_my_tls_crt()
/* /*
const std::string dhparam_file const std::string dhparam_file
{ {
fs::make_path(dhparam_path_parts) fs::path(dhparam_path_parts)
}; };
if(!fs::exists(dhparam_file)) if(!fs::exists(dhparam_file))
@ -242,7 +242,7 @@ init_my_ed25519()
const std::string sk_file const std::string sk_file
{ {
fs::make_path(path_parts) fs::path(path_parts)
}; };
if(fs::exists(sk_file)) if(fs::exists(sk_file))