Skip to content

Commit 9608c6a

Browse files
committed
file not found errors
1 parent c6f5756 commit 9608c6a

File tree

3 files changed

+80
-32
lines changed

3 files changed

+80
-32
lines changed

src/FileSystems/FileSystemMemory.h

Lines changed: 72 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ inline const char* FS_NAME_MEM = "FileSystemMemory";
1515
*/
1616
struct DIR_EXT : public DIR_BASE {
1717
DIR_EXT() { magic_id = MAGIC_DIR_EXT; }
18+
const char* dir;
1819
/// dirent related to this DIR
1920
dirent actual_dirent;
2021
/// all unprocessed files: only used by FileSystemMemory!
@@ -125,7 +126,8 @@ class FileSystemMemory : public FileSystem {
125126

126127
/// adds a in memory file
127128
bool add(const char *name, const void *data, size_t len) {
128-
FS_LOGI("add: name='%s' len=%d", name, len);
129+
const char *name_internal = name+filenameOffset();
130+
FS_LOGD("add: name='%s' len=%d", name_internal, len);
129131
if (&DefaultRegistry.fileSystem(name) != this) {
130132
FS_LOGE("File %s not vaid for %s in %s", name, this->pathPrefix(),
131133
DefaultRegistry.fileSystem(name).name());
@@ -138,7 +140,7 @@ class FileSystemMemory : public FileSystem {
138140
content->data = (uint8_t *)data;
139141
content->size = len;
140142
// setup entry
141-
entry->file_name = name;
143+
entry->file_name = name_internal;
142144
entry->content = content;
143145
files.push_back(entry);
144146
FS_LOGD("files: %d", files.size());
@@ -155,10 +157,10 @@ class FileSystemMemory : public FileSystem {
155157

156158
/// file operations
157159
int open(const char *path, int flags, int mode) override {
158-
FS_TRACED();
160+
FS_LOGD("open: path='%s' ", path);
159161
RegEntry &mem_entry = get(path);
160162
if (!mem_entry) {
161-
FS_LOGW("open: mem_entry invalid %s", path);
163+
FS_LOGW("open: file '%s' does not exist", path);
162164
return -1;
163165
}
164166
RegEntry &entry = DefaultRegistry.openFile(path, *this);
@@ -178,7 +180,7 @@ class FileSystemMemory : public FileSystem {
178180
};
179181

180182
ssize_t read(int fd, void *data, size_t size) override {
181-
FS_TRACED();
183+
FS_LOGD("read: fd='%d' size=%d", fd, (int)size);
182184
if (size == 0) {
183185
return 0;
184186
}
@@ -189,6 +191,9 @@ class FileSystemMemory : public FileSystem {
189191
return 0;
190192
}
191193
int pos = p_memory->current_pos;
194+
if(pos>=p_memory->size){
195+
return 0;
196+
}
192197
int len = min(size, p_memory->size - pos);
193198
p_memory->current_pos += len;
194199
memmove(data, p_memory->data + pos, len);
@@ -197,43 +202,42 @@ class FileSystemMemory : public FileSystem {
197202
}
198203

199204
int close(int fd) override {
200-
FS_TRACED();
205+
FS_LOGD("close: fd='%d' ", fd);
201206
DefaultRegistry.closeFile(fd);
202207
return 0;
203208
}
204209

205210
int fstat(int fd, struct stat *st) override {
206-
FS_TRACED();
211+
FS_LOGD("fstat: fd='%d' ", fd);
207212
RegEntry &entry = DefaultRegistry.getEntry(fd);
208213
RegContentMemory *p_memory = getContent(entry);
209214
if (p_memory == nullptr || !*p_memory) {
210215
return -1;
211216
}
212-
// st->st_ino = entry.fileID;
213-
st->st_size = p_memory->size;
214-
// st->st_mode = entry->isDir() ? S_IFDIR : S_IFREG;
215-
st->st_mode = S_IFREG;
216-
FS_LOGD("=> fstat fd=%d -> size=%d ", fd, st->st_size);
217-
return 0;
217+
return statContent(false, entry.file_name,p_memory, st);
218218
}
219219

220220
int stat(const char *path, struct stat *st){
221+
FS_LOGD("stat: path='%s' ", path);
222+
// find file in registry
221223
RegEntry &mem_entry = get(path);
224+
// if not found it might be a directory
225+
bool is_dir = false;
226+
RegContentMemory *p_memory=nullptr;
222227
if (!mem_entry) {
223-
FS_LOGW("mem_entry invalid");
224-
return -1;
228+
is_dir = isDir(path);
229+
if (!is_dir){
230+
FS_LOGW("stat: '%s' does not exist", path);
231+
return -1;
232+
}
233+
} else {
234+
p_memory = getContent(mem_entry);
225235
}
226-
RegContentMemory *p_memory = getContent(mem_entry);
227-
// st->st_ino = entry.fileID;
228-
st->st_size = p_memory->size;
229-
// st->st_mode = entry->isDir() ? S_IFDIR : S_IFREG;
230-
st->st_mode = S_IFREG;
231-
FS_LOGD("=> stat path=%s -> size=%d ", path, st->st_size);
232-
return 0;
236+
return statContent(is_dir, path, p_memory, st);
233237
}
234238

235239
off_t lseek(int fd, off_t offset, int whence) override {
236-
FS_TRACED();
240+
FS_LOGD("lseek: fd='%%' ", fd);
237241
RegEntry &entry = DefaultRegistry.getEntry(fd);
238242
RegContentMemory *p_memory = getContent(entry);
239243
if (p_memory == nullptr) {
@@ -269,9 +273,10 @@ class FileSystemMemory : public FileSystem {
269273

270274
// directory operations
271275
DIR *opendir(const char *name) override {
272-
FS_LOGD("FileSystemMemory::opendir(%s)", name);
276+
FS_LOGD("opendir(%s)", name);
273277
DIR_EXT *result = new DIR_EXT();
274278
result->p_file_system = this;
279+
result->dir = name;
275280

276281
// find matching files
277282
for (RegEntry *entry : files) {
@@ -299,11 +304,18 @@ class FileSystemMemory : public FileSystem {
299304
}
300305
RegEntry *entry = p_dir->files[p_dir->pos];
301306
p_dir->pos++;
307+
308+
// we return only the file name w/o path
309+
int len = strlen(p_dir->dir);
310+
if (entry->file_name[len]=='/'){
311+
len++;
312+
}
313+
const char* result_name = (entry->file_name)+len;
314+
302315
// copy filname to dirent
303-
strncpy(p_dir->actual_dirent.d_name, entry->file_name + filenameOffset(),
304-
MAXNAMLEN);
316+
strncpy(p_dir->actual_dirent.d_name, result_name, MAXNAMLEN);
305317
FS_LOGD("==> readdir: pos=%d size=%d %s", p_dir->pos, p_dir->files.size(),
306-
entry->file_name + filenameOffset());
318+
result_name);
307319
return &(p_dir->actual_dirent);
308320
}
309321

@@ -322,10 +334,11 @@ class FileSystemMemory : public FileSystem {
322334
}
323335

324336
virtual void* mem_map(const char* path,size_t *p_size) {
325-
const char* start = path+filenameOffset();
326-
RegEntry &entry = get(start);
337+
const char* name_internal = path+filenameOffset();
338+
FS_LOGD("mem_map(%s)", name_internal);
339+
RegEntry &entry = get(name_internal);
327340
if (!entry){
328-
FS_LOGW("mem_map: %s not found", path);
341+
FS_LOGW("mem_map: %s not found", name_internal);
329342
return nullptr;
330343
}
331344
RegContentMemory *p_memory = getContent(entry);
@@ -354,14 +367,26 @@ class FileSystemMemory : public FileSystem {
354367
// gets a file entry by name
355368
RegEntry &getEntry(const char *fileName) {
356369
for (auto e : files) {
357-
const char *entry_file_name = e->file_name + filenameOffset();
370+
const char *entry_file_name = e->file_name;
358371
if (Str(fileName).equals(entry_file_name)) {
359372
return *e;
360373
}
361374
}
362375
return NoRegEntry;
363376
}
364377

378+
bool isDir(const char *fileName) {
379+
int len = strlen(fileName);
380+
for (auto e : files) {
381+
const char *entry_file_name = e->file_name;
382+
Str str_entry_file_name(entry_file_name);
383+
if (str_entry_file_name.startsWith(fileName) && str_entry_file_name.length()>len) {
384+
return true;
385+
}
386+
}
387+
return false;
388+
}
389+
365390
RegContentMemory *getContent(RegEntry &entry) {
366391
FS_TRACED();
367392
RegContentMemory *result = nullptr;
@@ -371,6 +396,22 @@ class FileSystemMemory : public FileSystem {
371396
}
372397
return result;
373398
}
399+
400+
// provide stat result
401+
int statContent(bool isDir, const char *fileName, RegContentMemory *p_memory, struct stat *st) {
402+
if (p_memory==nullptr && isDir){
403+
// return directory
404+
st->st_size = 0;
405+
st->st_mode = S_IFDIR;
406+
} else {
407+
st->st_size = p_memory->size;
408+
st->st_mode = S_IFREG;
409+
}
410+
FS_LOGD("=> stat path=%s -> size=%d ", fileName, st->st_size);
411+
return 0;
412+
}
413+
414+
374415
};
375416

376417
} // namespace file_systems

src/FileSystems/FileSystemSD.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,13 @@ class FileSystemSD : public FileSystem {
110110
return 0;
111111
}
112112

113+
int stat(const char *path, struct stat *st){
114+
File file = getFS().open(path, getMode(flags));
115+
st->st_size = p_f->size();
116+
st->st_mode = p_f->isDirectory() ? S_IFDIR : S_IFREG;
117+
file.close();
118+
}
119+
113120
off_t lseek(int fd, off_t offset, int mode) {
114121
FS_TRACED();
115122
// SeekMode { SeekSet = 0, SeekCur = 1, SeekEnd = 2};

src/FileSystems/Registry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ class Registry {
159159
new_entry->fileID = size();
160160
open_files.push_back(new_entry);
161161
}
162-
FS_LOGE("=> total open files %d", size());
162+
FS_LOGD("=> total open files %d", size());
163163
return *new_entry;
164164
}
165165

0 commit comments

Comments
 (0)