/* * This source code is released into the public domain. */ #include #include #include #include #include "context.hh" #include "fileutils.hh" #include "generic_error.hh" namespace lfjail { void ensure_dir(context const &ctx, std::string_view dir) { auto const cdir = std::string(dir); struct ::stat st{}; if (auto const err = ::stat(cdir.c_str(), &st); err == 0) { if (!S_ISDIR(st.st_mode)) throw generic_error("{}: already exists", dir); return; } if (errno != ENOENT) throw generic_error("{}: stat: {}", dir, ::strerror(errno)); if (auto const err = ::mkdir(cdir.c_str(), 0700); err != 0) throw generic_error("{}: mkdir: {}", dir, ::strerror(errno)); if (ctx.verbose) std::print(std::cerr, "{}: created {}\n", getprogname(), dir); } } // namespace lfjail