µOS++ IIIe Reference 7.0.0
The third edition of µOS++, a POSIX inspired open source framework, written in C++
Loading...
Searching...
No Matches
io.h
Go to the documentation of this file.
1/*
2 * This file is part of the µOS++ project (https://micro-os-plus.github.io/).
3 * Copyright (c) 2015-2025 Liviu Ionescu. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software
6 * for any purpose is hereby granted, under the terms of the MIT license.
7 *
8 * If a copy of the license was not distributed with this file, it can
9 * be obtained from https://opensource.org/licenses/mit.
10 */
11
12#ifndef CMSIS_PLUS_POSIX_IO_IO_H_
13#define CMSIS_PLUS_POSIX_IO_IO_H_
14
15// ----------------------------------------------------------------------------
16
17#if defined(__cplusplus)
18
19// ----------------------------------------------------------------------------
20
21#if defined(OS_USE_OS_APP_CONFIG_H)
22#include <cmsis-plus/os-app-config.h>
23#endif
24
27
28#include <cstddef>
29#include <cstdarg>
30
31// Needed for ssize_t
32#include <sys/types.h>
33
34// ----------------------------------------------------------------------------
35
36#pragma GCC diagnostic push
37#if defined(__clang__)
38#pragma clang diagnostic ignored "-Wc++98-compat"
39#pragma clang diagnostic ignored "-Wdocumentation-unknown-command"
40#endif
41
42// ----------------------------------------------------------------------------
43
44struct iovec;
45
46namespace os
47{
48 namespace posix
49 {
50 // ------------------------------------------------------------------------
51
52 class io;
53 class io_impl;
54
55 class file_system;
56 class socket;
57
63 // ------------------------------------------------------------------------
64 io*
65 open (const char* path, int oflag, ...);
66
67 io*
68 vopen (const char* path, int oflag, std::va_list args);
69
74 // ========================================================================
80#pragma GCC diagnostic push
81#if defined(__clang__)
82#elif defined(__GNUC__)
83#pragma GCC diagnostic ignored "-Wsuggest-final-methods"
84#endif
85 class io
86 {
87 // ----------------------------------------------------------------------
88
93 friend class file_system;
94 friend class file_descriptors_manager;
95
96 friend io*
97 vopen (const char* path, int oflag, std::va_list args);
98
99#pragma GCC diagnostic push
100#if defined(__clang__)
101#elif defined(__GNUC__)
102#pragma GCC diagnostic ignored "-Wshadow"
103#endif
104 friend /* class */ socket*
105 socket (int domain, int type, int protocol);
106#pragma GCC diagnostic pop
107
112 // ----------------------------------------------------------------------
113 public:
119#pragma GCC diagnostic push
120#if defined(__clang__)
121#elif defined(__GNUC__)
122#pragma GCC diagnostic ignored "-Wshadow"
123#endif
124
125 using type_t = unsigned int;
126 enum class type : type_t
127 {
128 unknown = 0,
129 not_set = 1 << 0,
130 char_device = 1 << 1,
131 block_device = 1 << 2,
132 tty = 1 << 3,
133 file = 1 << 4,
134 socket = 1 << 5
135 };
136
137#pragma GCC diagnostic pop
138
143 // ----------------------------------------------------------------------
149 protected:
150 io (io_impl& impl, type t);
151
156 // The rule of five.
157 io (const io&) = delete;
158 io (io&&) = delete;
159 io&
160 operator= (const io&)
161 = delete;
162 io&
163 operator= (io&&)
164 = delete;
165
170 // ----------------------------------------------------------------------
171 public:
172 virtual ~io ();
173
178 // ----------------------------------------------------------------------
184 public:
185 virtual int
186 close (void);
187
188 virtual ssize_t
189 read (void* buf, std::size_t nbyte);
190
191 virtual ssize_t
192 write (const void* buf, std::size_t nbyte);
193
194 virtual ssize_t
195 writev (const /* struct */ iovec* iov, int iovcnt);
196
197 int
198 fcntl (int cmd, ...);
199
200 virtual int
201 vfcntl (int cmd, std::va_list args);
202
203 int
204 isatty (void);
205
206#pragma GCC diagnostic push
207#if defined(__clang__)
208#elif defined(__GNUC__)
209#pragma GCC diagnostic ignored "-Wredundant-tags"
210#endif
211 virtual int
212 fstat (struct stat* buf);
213#pragma GCC diagnostic pop
214
215 virtual off_t
216 lseek (off_t offset, int whence);
217
218 // ----------------------------------------------------------------------
219 // Support functions.
220
221 type_t
222 get_type (void) const;
223
225 file_descriptor (void) const;
226
227 bool
228 is_opened (void);
229
230 io_impl&
231 impl (void) const;
232
237 // ----------------------------------------------------------------------
243 protected:
244 // ----------------------------------------------------------------------
245 // Support functions.
246
247#if 0
248 // Is called at the end of close, to release objects
249 // acquired from a pool.
250 virtual void
251 do_release (void);
252#endif
253
254 void
256
257 void
259
260 io*
262
267 // ----------------------------------------------------------------------
268 protected:
273 io_impl& impl_;
274
279 // ----------------------------------------------------------------------
280 protected:
285 type_t type_ = static_cast<type_t> (type::not_set);
286
287 file_descriptor_t file_descriptor_ = no_file_descriptor;
288
292 };
293#pragma GCC diagnostic pop
294
295 // ========================================================================
296
297#pragma GCC diagnostic push
298#if defined(__clang__)
299#elif defined(__GNUC__)
300#pragma GCC diagnostic ignored "-Wsuggest-final-methods"
301#pragma GCC diagnostic ignored "-Wsuggest-final-types"
302#endif
304 {
305 // ----------------------------------------------------------------------
306
307 friend class io;
308
314 public:
315 io_impl (void);
316
321 // The rule of five.
322 io_impl (const io_impl&) = delete;
323 io_impl (io_impl&&) = delete;
324 io_impl&
325 operator= (const io_impl&)
326 = delete;
327 io_impl&
328 operator= (io_impl&&)
329 = delete;
330
335 virtual ~io_impl ();
336
341 // ----------------------------------------------------------------------
347 public:
348 // Implementations
349
350 virtual void
351 do_deallocate (void);
352
353 virtual bool
355 = 0;
356
357 virtual bool
358 do_is_connected (void);
359
360 virtual ssize_t
361 do_read (void* buf, std::size_t nbyte)
362 = 0;
363
364 virtual ssize_t
365 do_write (const void* buf, std::size_t nbyte)
366 = 0;
367
368 virtual ssize_t
369 do_writev (const /* struct */ iovec* iov, int iovcnt);
370
371 virtual int
372 do_vfcntl (int cmd, std::va_list args);
373
374 virtual int
375 do_isatty (void);
376
377#pragma GCC diagnostic push
378#if defined(__clang__)
379#elif defined(__GNUC__)
380#pragma GCC diagnostic ignored "-Wredundant-tags"
381#endif
382 virtual int
383 do_fstat (struct stat* buf);
384#pragma GCC diagnostic pop
385
386 virtual off_t
387 do_lseek (off_t offset, int whence)
388 = 0;
389
390 virtual int
391 do_close (void)
392 = 0;
393
394 // ----------------------------------------------------------------------
395 // Support functions.
396
397 off_t
398 offset (void);
399
400 void
401 offset (off_t offset);
402
407 // ----------------------------------------------------------------------
408 protected:
413 off_t offset_ = 0;
414
418 };
419#pragma GCC diagnostic pop
420
421 // ========================================================================
422 } /* namespace posix */
423} /* namespace os */
424
425// ===== Inline & template implementations ====================================
426
427namespace os
428{
429 namespace posix
430 {
431 // ========================================================================
432
433 inline io::type_t
434 io::get_type (void) const
435 {
436 return type_;
437 }
438
439 inline void
441 {
442 file_descriptor_ = fildes;
443 }
444
445 inline void
447 {
448 file_descriptor_ = no_file_descriptor;
449 }
450
451 inline file_descriptor_t
453 {
454 return file_descriptor_;
455 }
456
457 inline bool
459 {
460 return impl ().do_is_opened ();
461 }
462
463 inline io_impl&
464 io::impl (void) const
465 {
466 return impl_;
467 }
468
469 // ========================================================================
470
471 inline off_t
473 {
474 return offset_;
475 }
476
477 inline void
478 io_impl::offset (off_t offset)
479 {
480 offset_ = offset;
481 }
482
483 // ========================================================================
484 } /* namespace posix */
485} /* namespace os */
486
487#pragma GCC diagnostic pop
488
489// ----------------------------------------------------------------------------
490
491#endif /* __cplusplus */
492
493// ----------------------------------------------------------------------------
494
495#endif /* CMSIS_PLUS_POSIX_IO_IO_H_ */
Block device class.
Char device class.
Definition char-device.h:52
File descriptors manager static class.<cmsis-plus/posix-io/file-descriptors-manager....
File system class.
File class.
Definition file.h:64
virtual bool do_is_connected(void)
Definition io.cpp:496
virtual bool do_is_opened(void)=0
off_t offset(void)
Definition io.h:472
virtual int do_close(void)=0
virtual ssize_t do_writev(const iovec *iov, int iovcnt)
Definition io.cpp:502
virtual int do_vfcntl(int cmd, std::va_list args)
Definition io.cpp:525
virtual int do_isatty(void)
Definition io.cpp:532
virtual ssize_t do_write(const void *buf, std::size_t nbyte)=0
virtual ~io_impl()
Definition io.cpp:474
virtual void do_deallocate(void)
Definition io.cpp:482
virtual ssize_t do_read(void *buf, std::size_t nbyte)=0
virtual int do_fstat(struct stat *buf)
Definition io.cpp:539
virtual off_t do_lseek(off_t offset, int whence)=0
Base I/O class.
Definition io.h:86
int isatty(void)
Definition io.cpp:406
virtual ssize_t writev(const iovec *iov, int iovcnt)
Definition io.cpp:321
file_descriptor_t file_descriptor(void) const
Definition io.h:452
unsigned int type_t
Definition io.h:125
virtual off_t lseek(off_t offset, int whence)
Definition io.cpp:447
bool is_opened(void)
Definition io.h:458
io * alloc_file_descriptor(void)
Definition io.cpp:189
io_impl & impl(void) const
Definition io.h:464
virtual int fstat(struct stat *buf)
Definition io.cpp:416
virtual ssize_t write(const void *buf, std::size_t nbyte)
Definition io.cpp:268
int fcntl(int cmd,...)
Definition io.cpp:363
virtual int close(void)
Definition io.cpp:164
void clear_file_descriptor(void)
Definition io.h:446
virtual ssize_t read(void *buf, std::size_t nbyte)
Definition io.cpp:217
virtual ~io()
Definition io.cpp:152
type_t get_type(void) const
Definition io.h:434
virtual int vfcntl(int cmd, std::va_list args)
Definition io.cpp:380
Network socket.
int socket(int domain, int type, int protocol)
io * open(const char *path, int oflag,...)
Definition io.cpp:49
io * vopen(const char *path, int oflag, std::va_list args)
Definition io.cpp:66
int stat(const char *path, struct stat *buf)
int file_descriptor_t
Definition types.h:42
constexpr file_descriptor_t no_file_descriptor
Definition types.h:44
System namespace.
Definition uio.h:40