6#include "dawn/io/fileio.hxx"
18static const char g_prefix_data[] =
"/data/";
19static const char g_prefix_tmp[] =
"/tmp/";
20static const char g_prefix_dev[] = CONFIG_DAWN_IO_FILE_DEV_PREFIX;
24static bool pathIsDev(
const char *path)
26 return sizeof(g_prefix_dev) > 1 &&
27 std::strncmp(path, g_prefix_dev,
sizeof(g_prefix_dev) - 1) == 0;
37 for (i = 0; i < desc.
getSize(); i++)
49 DAWNERR(
"unsupported fileio cfg 0x%08" PRIx32
"\n", item->
cfgid.
v);
59 if (nbytes >= PATH_MAX)
61 DAWNERR(
"file path too long: %zu bytes\n", nbytes);
65 std::memcpy(path, &item->
data, nbytes);
68 if (std::strstr(path,
"..") !=
nullptr)
70 DAWNERR(
"path traversal not allowed: %s\n", path);
74 if (std::strncmp(path, g_prefix_data,
sizeof(g_prefix_data) - 1) != 0 &&
75 std::strncmp(path, g_prefix_tmp,
sizeof(g_prefix_tmp) - 1) != 0 &&
78 DAWNERR(
"path not in allowed directory: %s\n", path);
88 const uint8_t *tmp =
reinterpret_cast<const uint8_t *
>(&item->
data);
94 DAWNERR(
"invalid file permission: %u\n", (
unsigned)perm);
104 DAWNERR(
"unsupported fileio cfg 0x%08" PRIx32
"\n", item->
cfgid.
v);
124 ret = configureDesc(
getDesc());
130 writeOnceLocked =
false;
140 flags = O_WRONLY | O_CREAT;
146 flags = O_RDWR | O_CREAT;
149 fd = open(path, flags, 0666);
152 DAWNERR(
"failed to open %s: %d\n", path, errno);
156 ret = fstat(fd, &st);
159 DAWNERR(
"fstat failed for %s: %d\n", path, errno);
167 devNode = S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode);
169 if (!devNode && pathIsDev(path))
171 DAWNERR(
"not a device node: %s\n", path);
180 fsize = (size_t)st.st_size;
182 if (fsize == 0 && devNode)
184 off_t end = lseek(fd, 0, SEEK_END);
190 lseek(fd, 0, SEEK_SET);
208int CIOFile::truncateFile()
219 ret = ftruncate(fd, 0);
222 DAWNERR(
"ftruncate failed: %d\n", errno);
254 if (lseek(fd, 0, SEEK_SET) < 0)
256 DAWNERR(
"lseek failed: %d\n", errno);
263 DAWNERR(
"read failed: %d\n", errno);
277 DAWNERR(
"write-once file already written: %s\n", path);
281 ret = truncateFile();
287 if (lseek(fd, 0, SEEK_SET) < 0)
289 DAWNERR(
"lseek failed: %d\n", errno);
296 DAWNERR(
"write failed: %d\n", errno);
304 fsize = (size_t)nwritten;
309 writeOnceLocked =
true;
329 if (lseek(fd, (off_t)offset, SEEK_SET) < 0)
331 DAWNERR(
"lseek failed: %d\n", errno);
338 DAWNERR(
"read failed: %d\n", errno);
353 DAWNERR(
"write-once file already written: %s\n", path);
359 ret = truncateFile();
366 if (lseek(fd, (off_t)offset, SEEK_SET) < 0)
368 DAWNERR(
"lseek failed: %d\n", errno);
375 DAWNERR(
"write failed: %d\n", errno);
379 endpos = offset + (size_t)nwritten;
380 if (!devNode && (offset == 0 || endpos > fsize))
387 writeOnceLocked =
true;
393#ifdef CONFIG_DAWN_IO_NOTIFY
Descriptor wrapper for individual object configuration.
size_t getSize() const
Get number of configuration items for this object.
SObjectCfg::SObjectCfgItem * objectCfgItemAtOffset(size_t offset) const
Get configuration item at specified offset.
virtual int getFd() const
Get file descriptor for notifications.
size_t cfgCmnOffset(const SObjectCfg::SObjectCfgItem *cfg)
Get offset of configuration item in descriptor.
@ IO_CLASS_ANY
Any I/O class.
@ IO_CLASS_FILE
File system I/O.
int setDataImpl(IODataCmn &data)
Set data implementation (override in derived classes).
@ IO_FILE_PERM_RW
Read-write.
@ IO_FILE_PERM_WRITE
Write-only.
@ IO_FILE_PERM_WRITE_ONCE
Write-once (per session on device nodes)
@ IO_FILE_PERM_READ
Read-only.
int getDataImpl(IODataCmn &data, size_t len)
Get data implementation (override in derived classes).
size_t getDataDim() const
Get data vector dimension.
int getDataAtImpl(IODataCmn &data, size_t len, size_t offset)
Get data at byte offset (override in seekable IOs).
int deinit()
De-initialize object.
@ IO_FILE_CFG_PATH
File path (null-terminated string, DTYPE_CHAR).
@ IO_FILE_CFG_PERM
Permission mode (EIOFilePerm, DTYPE_UINT8).
size_t getDataSize() const
Get data size in bytes.
bool isWrite() const
Check if IO supports write operations.
bool isRead() const
Check if IO supports read operations.
int setDataAtImpl(IODataCmn &data, size_t offset)
Set data at byte offset (override in seekable IOs).
int configure()
Configure object from descriptor data.
CDescObject & getDesc()
Get descriptor object for this object.
Out-of-tree user-extension hooks for Dawn.
Base interface for I/O data buffers (static and dynamic).
virtual void * getDataPtr(size_t batch=0)=0
Get pointer to data only (skips timestamp if present).
virtual size_t getDataSize()=0
Get data size in bytes.
Single configuration item within object.
ObjectCfgData_t data[]
Configuration data array (flexible, size from cfgid.s.size).
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
uint32_t cls
Object class (bits 21-29, max 511).
uint32_t id
Configuration identifier (bits 0-4, max 31).
uint32_t size
Configuration data size in 32-bit words (bits 5-14, max 1023).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.