@@ -15,6 +15,7 @@ inline const char* FS_NAME_MEM = "FileSystemMemory";
1515 */
1616struct 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
0 commit comments