roo_io
API Documentation for roo_io
Loading...
Searching...
No Matches
posix_file_input_stream.cpp
Go to the documentation of this file.
2
3#if ROO_IO_FS_SUPPORT_POSIX
4
6
7#include <sys/stat.h>
8
9namespace roo_io {
10
11PosixFileInputStream::PosixFileInputStream(Status error)
12 : file_(nullptr), status_(error) {}
13
14PosixFileInputStream::PosixFileInputStream(std::shared_ptr<MountImpl> mount,
15 FILE* file)
16 : mount_(std::move(mount)),
17 file_(file),
18 status_(file_ != nullptr ? kOk : kClosed) {}
19
20PosixFileInputStream::~PosixFileInputStream() {
21 if (file_ != nullptr) ::fclose(file_);
22}
23
24size_t PosixFileInputStream::read(byte* buf, size_t count) {
25 if (status_ != kOk) return 0;
26 int result = fread(buf, 1, count, file_);
27 if (result > 0) return result;
28 if (ferror(file_) != 0) {
29 switch (errno) {
30 case ENOMEM: {
31 status_ = kOutOfMemory;
32 break;
33 }
34 default:
35 status_ = kUnknownIOError;
36 break;
37 }
38 return 0;
39 }
40 if (feof(file_) != 0) {
41 status_ = kEndOfStream;
42 } else {
43 status_ = kUnknownIOError;
44 mount_.reset();
45 }
46 return 0;
47}
48
49void PosixFileInputStream::seek(uint64_t offset) {
50 if (status_ != kOk && status_ != kEndOfStream) return;
51 if (::fseek(file_, offset, SEEK_SET) == 0) {
52 status_ = kOk;
53 return;
54 }
55 switch (errno) {
56 case EFBIG:
57 case EINVAL:
58 case EOVERFLOW:
59 status_ = kSeekError;
60 break;
61 default:
62 status_ = kUnknownIOError;
63 mount_.reset();
64 break;
65 }
66}
67
68void PosixFileInputStream::skip(uint64_t count) {
69 if (status_ != kOk) return;
70 if (::fseek(file_, count, SEEK_CUR) == 0) {
71 if (position() > size()) status_ = kEndOfStream;
72 return;
73 }
74 switch (errno) {
75 case EFBIG:
76 case EINVAL:
77 case EOVERFLOW:
78 status_ = kSeekError;
79 mount_.reset();
80 break;
81 default:
82 status_ = kUnknownIOError;
83 mount_.reset();
84 break;
85 }
86}
87
88uint64_t PosixFileInputStream::size() {
89 if (status_ != kOk && status_ != kEndOfStream) return 0;
90 struct stat st;
91 if (::fstat(fileno(file_), &st) != 0) {
92 status_ = kUnknownIOError;
93 mount_.reset();
94 return 0;
95 }
96 return st.st_size;
97}
98
99bool PosixFileInputStream::isOpen() const {
100 return status_ == kOk || status_ == kEndOfStream;
101}
102
103void PosixFileInputStream::close() {
104 mount_.reset();
105 if (status_ != kOk && status_ != kEndOfStream) return;
106 if (::fclose(file_) == 0) {
107 status_ = kClosed;
108 file_ = nullptr;
109 return;
110 }
111 switch (errno) {
112 case ENOSPC:
113 status_ = kNoSpaceLeftOnDevice;
114 break;
115 default:
116 status_ = kUnknownIOError;
117 }
118}
119
120} // namespace roo_io
121
122#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
@ kSeekError
Definition status.h:14
@ kClosed
Definition status.h:10
@ kEndOfStream
Definition status.h:9