doos 0.1.0: user-level overlayfs containers with slirp networking

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 20:54:55 +02:00
co-authored by Claude Sonnet 5.5
commit 36f4f890c7
21 changed files with 1418 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
#pragma once
#include <cerrno>
#include <filesystem>
#include <stdexcept>
#include <string>
namespace doos {
class SysError : public std::runtime_error {
public:
explicit SysError(const std::string& what, int err = errno);
int code() const { return code_; }
private:
int code_;
};
class Fd {
public:
Fd() = default;
explicit Fd(int fd) : fd_(fd) {}
Fd(Fd&& o) noexcept : fd_(o.release()) {}
Fd& operator=(Fd&& o) noexcept;
Fd(const Fd&) = delete;
Fd& operator=(const Fd&) = delete;
~Fd() { reset(); }
int get() const { return fd_; }
int release();
void reset(int fd = -1);
bool valid() const { return fd_ >= 0; }
private:
int fd_ = -1;
};
// flock(2) on a file for the lifetime of the object, bounded wait.
class FileLock {
public:
FileLock(const std::filesystem::path& file, int timeoutMs);
~FileLock() = default;
void unlock() { fd_.reset(); }
int fd() const { return fd_.get(); }
private:
Fd fd_;
};
namespace fsutil {
void mkdirs(const std::filesystem::path& p, mode_t mode = 0755);
void writeFile(const std::filesystem::path& p, const std::string& content);
std::string readFile(const std::filesystem::path& p);
// Removes a tree without following symlinks; bounded depth.
void removeTree(const std::filesystem::path& p, std::size_t depth = 0);
std::size_t countEntries(const std::filesystem::path& p, std::size_t cap);
} // namespace fsutil
} // namespace doos