roo_io
API Documentation for roo_io
Loading...
Searching...
No Matches
posix_file_output_stream.cpp
Go to the documentation of this file.
2
3#if ROO_IO_FS_SUPPORT_POSIX
4
6
7namespace roo_io {
8
9PosixFileOutputStream::PosixFileOutputStream(Status error)
10 : file_(nullptr), size_(-1), status_(error) {}
11
12PosixFileOutputStream::PosixFileOutputStream(std::shared_ptr<MountImpl> mount,
13 FILE* file)
14 : mount_(std::move(mount)),
15 file_(file),
16 size_(-1),
17 status_(file_ != nullptr ? kOk : kClosed) {}
18
19PosixFileOutputStream::~PosixFileOutputStream() { ::fclose(file_); }
20
21size_t PosixFileOutputStream::write(const byte* buf, size_t count) {
22 if (status_ != kOk) return 0;
23 size_t result = ::fwrite(buf, 1, count, file_);
24 if (result == count) return result;
25 if (ferror(file_)) {
26 mount_.reset();
27 switch (errno) {
28 case ENOMEM: {
29 status_ = kOutOfMemory;
30 break;
31 }
32 case ENOSPC: {
33 status_ = kNoSpaceLeftOnDevice;
34 break;
35 }
36 default:
37 status_ = kUnknownIOError;
38 break;
39 }
40 } else {
41 status_ = kUnknownIOError;
42 }
43 return result;
44}
45
46void PosixFileOutputStream::close() {
47 mount_.reset();
48 if (status_ != kOk && status_ != kEndOfStream) return;
49 if (::fclose(file_) == 0) {
50 status_ = kClosed;
51 return;
52 }
53 switch (errno) {
54 case ENOSPC:
55 status_ = kNoSpaceLeftOnDevice;
56 break;
57 default:
58 status_ = kUnknownIOError;
59 }
60}
61
62} // namespace roo_io
63
64#endif // ROO_IO_FS_SUPPORT_POSIX
Definition byte.h:6
roo::basic_string_view< CharT, Traits > basic_string_view
Definition string_view.h:8
Status
Definition status.h:7
@ kNoSpaceLeftOnDevice
Definition status.h:55
@ kUnknownIOError
Definition status.h:58
@ kOutOfMemory
Definition status.h:49
@ kOk
Definition status.h:8
@ kClosed
Definition status.h:10