Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
File.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4#include "../Common/CompilerMacrosExport.h"
5#ifndef SC_EXPORT_LIBRARY_FILE
6#define SC_EXPORT_LIBRARY_FILE 0
7#endif
8#define SC_FILE_EXPORT SC_COMPILER_LIBRARY_EXPORT(SC_EXPORT_LIBRARY_FILE)
9
10#include "../Common/IGrowableBufferSpan.h"
11#include "../Common/IGrowableBufferStringPath.h"
12#include "../Common/PlatformMacrosInstructionSet.h"
13#include "../Common/PlatformMacrosType.h"
14#include "../Common/PrimitiveDefinitions.h"
15#include "../Common/Result.h"
16#include "../Common/Span.h"
17#include "../Common/StringSpan.h"
18#include "../Common/UniqueHandle.h"
19
22
23namespace SC
24{
25namespace detail
26{
27#if SC_PLATFORM_WINDOWS
28struct SC_FILE_EXPORT FileDescriptorDefinition
29{
30 using Handle = void*; // HANDLE
31 static Result releaseHandle(Handle& handle);
32#ifdef __clang__
33 static constexpr void* Invalid = __builtin_constant_p(-1) ? (void*)-1 : (void*)-1; // INVALID_HANDLE_VALUE
34#else
35 static constexpr void* Invalid = (void*)-1; // INVALID_HANDLE_VALUE
36#endif
37};
38
39#else
41
43struct SC_FILE_EXPORT FileDescriptorDefinition
44{
45 using Handle = int; // fd
46 static Result releaseHandle(Handle& handle);
47
48 static constexpr Handle Invalid = -1; // invalid fd
49};
51#endif
52} // namespace detail
53
56
58enum class FileDescriptorEntryType : uint8_t
59{
60 Unknown,
61 File,
62 Directory,
63 SymbolicLink,
64 Other,
65};
66
69{
70 FileDescriptorEntryType entryType = FileDescriptorEntryType::Unknown;
71
72 size_t fileSize = 0;
73 size_t hardLinkCount = 0;
74 TimeMs creationTime;
75 TimeMs accessedTime;
76 TimeMs modifiedTime;
77
78 struct
79 {
80 uint32_t mode = 0;
81 uint32_t uid = 0;
82 uint32_t gid = 0;
83 uint64_t inode = 0;
84 uint64_t device = 0;
85 uint64_t specialDevice = 0;
86 uint64_t blocks = 0;
87 uint64_t blockSize = 0;
88 } posix;
89
90 struct
91 {
92 uint32_t attributes = 0;
93 uint32_t reparseTag = 0;
94 uint32_t volumeSerialNumber = 0;
95 uint64_t fileIndex = 0;
96 } windows;
97};
98
100struct SC_FILE_EXPORT FileOpen
101{
103 enum Mode : uint8_t
104 {
105 Read = 0,
111 };
112
113 FileOpen(Mode mode = Read) : mode(mode) {}
114
116 bool inheritable = false;
117 bool blocking = true;
118 bool sync = false;
119 bool exclusive = false;
120
121#if !SC_PLATFORM_WINDOWS
122 int toPosixFlags() const;
123 int toPosixAccess() const;
124#endif
125};
127
129struct SC_FILE_EXPORT FileDescriptor : public UniqueHandle<detail::FileDescriptorDefinition>
130{
131 using UniqueHandle::UniqueHandle;
132
135
139
143
147
151
156 Result open(StringSpan path, FileOpen mode);
157
163 Result read(Span<char> data, Span<char>& actuallyRead, uint64_t offset);
164
170 Result read(Span<uint8_t> data, Span<uint8_t>& actuallyRead, uint64_t offset);
171
176 Result read(Span<char> data, Span<char>& actuallyRead);
177
182 Result readUntilFullOrEOF(Span<char> data, Span<char>& actuallyRead);
183
188 Result read(Span<uint8_t> data, Span<uint8_t>& actuallyRead);
189
195 template <typename T>
196 Result readUntilEOF(T& destination)
197 {
198 return readUntilEOF(GrowableBuffer<T>{destination});
199 }
200
205 Result readUntilEOF(IGrowableBuffer&& buffer);
206
210 Result writeString(StringSpan data);
211
216 Result write(Span<const char> data, uint64_t offset);
217
222 Result write(Span<const uint8_t> data, uint64_t offset);
223
227 Result write(Span<const char> data);
228
232 Result write(Span<const uint8_t> data);
233
241
246 Result seek(SeekMode seekMode, int64_t offset);
247
251 Result currentPosition(size_t& position) const;
252
256 Result sizeInBytes(size_t& sizeInBytes) const;
257
261 Result stat(FileDescriptorStat& fileStat) const;
262
266 Result chmod(uint32_t mode);
267
272 Result chown(uint32_t uid, uint32_t gid);
273
276 Result sync();
277
280 Result syncData();
281
285 Result truncate(uint64_t sizeInBytes);
286
287 private:
288 friend struct File;
289 friend struct PipeDescriptor;
290 struct Internal;
291};
292
293struct SC_FILE_EXPORT PipeOptions
294{
295 bool readInheritable = false;
296 bool writeInheritable = false;
297 bool blocking = true;
298};
299
301struct SC_FILE_EXPORT PipeDescriptor
302{
305
308 Result createPipe(PipeOptions options = {});
309
312 Result close();
313};
314
315struct SC_FILE_EXPORT NamedPipeNameOptions
316{
317 StringSpan posixDirectory = "/tmp";
318};
319
321struct SC_FILE_EXPORT NamedPipeName
322{
328 static Result build(StringSpan logicalName, StringPath& outName, NamedPipeNameOptions options = {});
329};
330
331struct SC_FILE_EXPORT NamedPipeServerOptions
332{
333 PipeOptions connectionOptions = {};
334 uint32_t maxPendingConnections = 16;
335
336 struct Posix
337 {
338 bool removeEndpointOnClose = true;
339 bool removeEndpointBeforeCreate = false;
340 } posix;
341};
342
343struct SC_FILE_EXPORT NamedPipeClientOptions
344{
345 PipeOptions connectionOptions = {};
346 struct Windows
347 {
348 uint32_t connectTimeoutMilliseconds = 0xffffffff;
349 } windows;
350};
351
356struct SC_FILE_EXPORT NamedPipeServer
357{
364 Result create(StringSpan name, NamedPipeServerOptions options = {});
368 Result accept(PipeDescriptor& outConnection);
372 Result close();
373
374 private:
376 StringPath name;
377#if SC_PLATFORM_WINDOWS
378 FileDescriptor pendingConnection;
379 bool firstInstance = true;
380#else
381 FileDescriptor listeningSocket;
382#endif
383 bool created = false;
384};
385
387struct SC_FILE_EXPORT NamedPipeClient
388{
396 static Result connect(StringSpan name, PipeDescriptor& outConnection, NamedPipeClientOptions options = {});
397};
399} // namespace SC
FileDescriptorEntryType
A structure to describe metadata associated with an open descriptor.
Definition File.h:59
A structure to describe file stats queried through a file descriptor.
Definition File.h:69
uint32_t reparseTag
Windows reparse tag.
Definition File.h:93
uint32_t uid
POSIX st_uid.
Definition File.h:81
uint32_t mode
POSIX st_mode.
Definition File.h:80
uint64_t blockSize
POSIX st_blksize.
Definition File.h:87
uint64_t fileIndex
Windows file index.
Definition File.h:95
uint32_t attributes
Windows file attributes.
Definition File.h:92
FileDescriptorEntryType entryType
Type of entry associated with descriptor.
Definition File.h:70
TimeMs accessedTime
Time when file was last accessed when available.
Definition File.h:75
size_t hardLinkCount
Number of hard links to the entry.
Definition File.h:73
uint64_t device
POSIX st_dev.
Definition File.h:84
uint64_t specialDevice
POSIX st_rdev.
Definition File.h:85
TimeMs modifiedTime
Time when file was last modified.
Definition File.h:76
uint64_t blocks
POSIX st_blocks.
Definition File.h:86
size_t fileSize
Size of the file in bytes.
Definition File.h:72
uint32_t volumeSerialNumber
Windows volume serial number.
Definition File.h:94
uint32_t gid
POSIX st_gid.
Definition File.h:82
TimeMs creationTime
Time when file was created when available.
Definition File.h:74
uint64_t inode
POSIX st_ino.
Definition File.h:83
[UniqueHandleDeclaration2Snippet]
Definition File.h:130
SeekMode
How the offset to FileDescriptor::seek is defined.
Definition File.h:236
@ SeekCurrent
Offset to FileDescriptor::seek is to be applied from current descriptor position.
Definition File.h:239
@ SeekEnd
Offset to FileDescriptor::seek is to be applied (backwards) from end of descriptor.
Definition File.h:238
@ SeekStart
Offset to FileDescriptor::seek is to be applied from start of descriptor.
Definition File.h:237
Result syncData()
Flush file data to stable storage.
Result read(Span< uint8_t > data, Span< uint8_t > &actuallyRead)
Reads bytes from current position (FileDescriptor::seek) into user supplied Span.
Result openForWriteToDevNull()
... [UniqueHandleDeclaration2Snippet]
Result write(Span< const uint8_t > data, uint64_t offset)
Writes bytes at offset from start of the file descriptor.
Result openStdErrDuplicate()
Opens a duplicated file descriptor handle for reading from stderr.
Result chmod(uint32_t mode)
Change file permission bits for the currently open descriptor.
Result readUntilEOF(T &destination)
Reads into a given dynamic buffer until End of File (EOF) is signaled.
Definition File.h:196
Result readUntilEOF(IGrowableBuffer &&buffer)
Reads into a given dynamic buffer until End of File (EOF) is signaled.
Result seek(SeekMode seekMode, int64_t offset)
Changes the current position in the file descriptor, if seekable.
Result stat(FileDescriptorStat &fileStat) const
Obtains richer metadata associated with the currently open descriptor.
Result read(Span< char > data, Span< char > &actuallyRead)
Reads bytes from current position (FileDescriptor::seek) into user supplied Span.
Result currentPosition(size_t &position) const
Gets current descriptor position (if seekable)
Result write(Span< const uint8_t > data)
Writes bytes from current position (FileDescriptor::seek) of the file descriptor.
Result write(Span< const char > data, uint64_t offset)
Writes bytes at offset from start of the file descriptor.
Result sizeInBytes(size_t &sizeInBytes) const
Gets total file size in bytes (if seekable)
Result truncate(uint64_t sizeInBytes)
Resize the underlying file to the specified size in bytes.
Result openStdOutDuplicate()
Opens a duplicated file descriptor handle for reading from stdout.
Result read(Span< char > data, Span< char > &actuallyRead, uint64_t offset)
Reads bytes at offset into user supplied span.
Result readUntilFullOrEOF(Span< char > data, Span< char > &actuallyRead)
Reads bytes from current position (FileDescriptor::seek) into Span, until full or EOF is reached.
Result chown(uint32_t uid, uint32_t gid)
Change owner and group for the currently open descriptor.
Result sync()
Flush file data and metadata to stable storage.
Result openStdInDuplicate()
Opens a duplicated file descriptor handle for reading from stdin.
Result open(StringSpan path, FileOpen mode)
Opens a file descriptor handle from a file system path.
Result read(Span< uint8_t > data, Span< uint8_t > &actuallyRead, uint64_t offset)
Reads bytes at offset into user supplied span.
Result writeString(StringSpan data)
Writes a string to the file descriptor.
Result write(Span< const char > data)
Writes bytes from current position (FileDescriptor::seek) of the file descriptor.
Options used to open a file descriptor.
Definition File.h:101
Mode
Indicates the mode in which the file should be opened (read, write, append, etc.)
Definition File.h:104
@ Append
a Open for appending. The file is created if it does not exist.
Definition File.h:107
@ WriteRead
w+ Open for reading and writing. The file is created (if it does not exist) or truncated.
Definition File.h:110
@ ReadWrite
r+ Open for reading and writing. An error occurs if the file does not exist.
Definition File.h:106
@ Write
w Open for writing. The file is created (if it does not exist) or truncated (if it exists).
Definition File.h:109
@ AppendRead
a+ Open for reading and appending. The file is created if it does not exist.
Definition File.h:108
Mode mode
Open mode (read, write, append, etc.). See FileOpen::Mode for more details.
Definition File.h:115
Definition File.h:344
Named pipe client endpoint creator.
Definition File.h:388
static Result connect(StringSpan name, PipeDescriptor &outConnection, NamedPipeClientOptions options={})
Connects to an existing named pipe server endpoint.
Definition File.h:316
Utility for building platform-native named pipe endpoint names from logical names.
Definition File.h:322
static Result build(StringSpan logicalName, StringPath &outName, NamedPipeNameOptions options={})
Builds a platform-native named pipe endpoint path.
Definition File.h:332
Named pipe server endpoint.
Definition File.h:357
Result close()
Closes the listening endpoint.
Result create(StringSpan name, NamedPipeServerOptions options={})
Creates a named pipe server endpoint.
Result accept(PipeDescriptor &outConnection)
Accept one client connection and return it as a connected PipeDescriptor.
Read / Write pipe (Process stdin/stdout and IPC communication)
Definition File.h:302
Result createPipe(PipeOptions options={})
Creates a Pipe.
FileDescriptor writePipe
The write side of the pipe.
Definition File.h:304
Result close()
Closes the pipe.
FileDescriptor readPipe
The read side of the pipe.
Definition File.h:303
Definition File.h:294