dius 0.1.0
Loading...
Searching...
No Matches
sync_file.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/container/path/path.h"
4#include "di/function/container/function.h"
5#include "di/util/prelude.h"
6#include "di/util/scope_exit.h"
7#include "dius/c_definitions.h"
8#include "dius/error.h"
10#include "dius/tty.h"
11
12namespace dius {
13#ifdef PROT_NONE
14enum class Protection : int {
15 None = PROT_NONE,
16 Executable = PROT_EXEC,
17 Readable = PROT_READ,
18 Writeable = PROT_WRITE,
19};
20
21DI_DEFINE_ENUM_BITWISE_OPERATIONS(Protection)
22
23enum class MapFlags : int {
24 None = 0,
25 Shared = MAP_SHARED,
26 Private = MAP_PRIVATE,
27 Fixed = MAP_FIXED,
28 Anonymous = MAP_ANONYMOUS,
29#ifdef MAP_POPULATE
30 Stack = MAP_STACK,
31#endif
32#ifdef MAP_POPULATE
33 Populate = MAP_POPULATE,
34#endif
35};
36
37DI_DEFINE_ENUM_BITWISE_OPERATIONS(MapFlags)
38#endif
39
40class SyncFile {
41public:
42 enum class Owned { Yes, No };
43
44 constexpr SyncFile() = default;
45
46 constexpr explicit SyncFile(Owned owned, int fd) : m_owned(owned), m_fd(fd) {}
47
48 constexpr SyncFile(SyncFile&& other)
49 : m_owned(di::exchange(other.m_owned, Owned::No)), m_fd(di::exchange(other.m_fd, -1)) {}
50
51 constexpr ~SyncFile() {
52 if (m_owned == Owned::No) {
53 return;
54 }
55 (void) this->close();
56 }
57
58 auto operator=(SyncFile&& other) -> SyncFile& {
59 (void) this->close();
60 m_owned = di::exchange(other.m_owned, Owned::No);
61 m_fd = di::exchange(other.m_fd, -1);
62 return *this;
63 }
64
65 constexpr auto valid() const -> bool { return m_fd != -1; }
66 constexpr explicit operator bool() const { return valid(); }
67
68 constexpr auto file_descriptor() const -> int { return m_fd; }
69 constexpr auto leak_file_descriptor() -> int {
70 m_owned = Owned::No;
71 return m_fd;
72 }
73
74 auto close() -> di::Expected<void, di::GenericCode>;
75
76 auto read_some(u64 offset, di::Span<di::Byte>) const -> di::Expected<size_t, di::GenericCode>;
77 auto read_some(di::Span<di::Byte>) const -> di::Expected<size_t, di::GenericCode>;
78 auto write_some(u64 offset, di::Span<di::Byte const>) const -> di::Expected<size_t, di::GenericCode>;
79 auto write_some(di::Span<di::Byte const>) const -> di::Expected<size_t, di::GenericCode>;
80
81 auto read_exactly(u64 offset, di::Span<di::Byte>) const -> di::Expected<void, di::GenericCode>;
82 auto read_exactly(di::Span<di::Byte>) const -> di::Expected<void, di::GenericCode>;
83 auto write_exactly(u64 offset, di::Span<di::Byte const>) const -> di::Expected<void, di::GenericCode>;
84 auto write_exactly(di::Span<di::Byte const>) const -> di::Expected<void, di::GenericCode>;
85
86 auto resize_file(u64 new_size) const -> di::Expected<void, di::GenericCode>;
87
88#ifdef PROT_NONE
89 auto map(u64 offset, size_t size, Protection protection, MapFlags flags) const
90 -> di::Expected<MemoryRegion, di::GenericCode>;
91#endif
92
93 auto flush() const -> di::Expected<void, di::GenericCode> { return {}; }
94
95 auto interactive_device() const -> bool { return true; }
96
97 auto set_tty_window_size(tty::WindowSize size) -> di::Expected<void, di::GenericCode>;
98 auto get_tty_window_size() -> di::Expected<tty::WindowSize, di::GenericCode>;
99 auto get_psuedo_terminal_path() -> di::Expected<di::Path, di::GenericCode>;
100
101 using RawModeToken = di::ScopeExit<di::Function<void()>>;
102 auto enter_raw_mode() -> di::Expected<RawModeToken, di::GenericCode>;
103
104private:
105 Owned m_owned { Owned::No };
106 int m_fd { -1 };
107};
108
110
116
117DI_DEFINE_ENUM_BITWISE_OPERATIONS(OpenFlags)
118
119auto open_sync(di::PathView path, OpenMode open_mode, u16 create_mode = 0666, OpenFlags flags = OpenFlags::None)
120 -> di::Expected<SyncFile, di::GenericCode>;
121auto open_psuedo_terminal_controller(OpenMode open_mode) -> di::Expected<SyncFile, di::GenericCode>;
122auto open_tempory_file() -> di::Expected<SyncFile, di::GenericCode>;
123auto read_to_string(di::PathView path) -> di::Result<di::String>;
124
125inline auto stdin = SyncFile { SyncFile::Owned::No, 0 };
128}
Definition sync_file.h:40
constexpr ~SyncFile()
Definition sync_file.h:51
constexpr auto valid() const -> bool
Definition sync_file.h:65
auto read_exactly(di::Span< di::Byte >) const -> di::Expected< void, di::GenericCode >
auto write_some(di::Span< di::Byte const >) const -> di::Expected< size_t, di::GenericCode >
auto write_exactly(di::Span< di::Byte const >) const -> di::Expected< void, di::GenericCode >
constexpr SyncFile()=default
auto read_exactly(u64 offset, di::Span< di::Byte >) const -> di::Expected< void, di::GenericCode >
constexpr SyncFile(Owned owned, int fd)
Definition sync_file.h:46
auto get_tty_window_size() -> di::Expected< tty::WindowSize, di::GenericCode >
auto resize_file(u64 new_size) const -> di::Expected< void, di::GenericCode >
auto enter_raw_mode() -> di::Expected< RawModeToken, di::GenericCode >
auto operator=(SyncFile &&other) -> SyncFile &
Definition sync_file.h:58
auto read_some(u64 offset, di::Span< di::Byte >) const -> di::Expected< size_t, di::GenericCode >
constexpr SyncFile(SyncFile &&other)
Definition sync_file.h:48
constexpr auto file_descriptor() const -> int
Definition sync_file.h:68
auto flush() const -> di::Expected< void, di::GenericCode >
Definition sync_file.h:93
constexpr auto leak_file_descriptor() -> int
Definition sync_file.h:69
auto close() -> di::Expected< void, di::GenericCode >
auto set_tty_window_size(tty::WindowSize size) -> di::Expected< void, di::GenericCode >
Owned
Definition sync_file.h:42
@ Yes
Definition sync_file.h:42
@ No
Definition sync_file.h:42
auto read_some(di::Span< di::Byte >) const -> di::Expected< size_t, di::GenericCode >
auto interactive_device() const -> bool
Definition sync_file.h:95
auto write_exactly(u64 offset, di::Span< di::Byte const >) const -> di::Expected< void, di::GenericCode >
di::ScopeExit< di::Function< void()> > RawModeToken
Definition sync_file.h:101
auto get_psuedo_terminal_path() -> di::Expected< di::Path, di::GenericCode >
auto write_some(u64 offset, di::Span< di::Byte const >) const -> di::Expected< size_t, di::GenericCode >
Definition error.h:7
Definition directory_entry.h:11
auto open_sync(di::PathView path, OpenMode open_mode, u16 create_mode=0666, OpenFlags flags=OpenFlags::None) -> di::Expected< SyncFile, di::GenericCode >
auto stderr
Definition sync_file.h:127
auto open_psuedo_terminal_controller(OpenMode open_mode) -> di::Expected< SyncFile, di::GenericCode >
OpenFlags
Definition sync_file.h:111
@ KeepAfterExec
Definition sync_file.h:114
@ None
Definition sync_file.h:112
@ NoControllingTerminal
Definition sync_file.h:113
auto read_to_string(di::PathView path) -> di::Result< di::String >
auto open_tempory_file() -> di::Expected< SyncFile, di::GenericCode >
auto stdout
Definition sync_file.h:126
OpenMode
Definition sync_file.h:109
@ Readonly
Definition sync_file.h:109
@ WriteNew
Definition sync_file.h:109
@ AppendOnly
Definition sync_file.h:109
@ AppendReadWrite
Definition sync_file.h:109
@ ReadWrite
Definition sync_file.h:109
@ WriteClobber
Definition sync_file.h:109
@ ReadWriteClobber
Definition sync_file.h:109
auto stdin
Definition sync_file.h:125
Definition tty.h:7