fix stat for romfs directories

This commit is contained in:
Dave Murphy 2020-05-27 13:48:14 +01:00 committed by fincs
parent 573e2f772c
commit db795f42ad

View File

@ -560,9 +560,6 @@ static int navigateToDir(romfs_mount *mount, romfs_dir** ppDir, const char** pPa
return ret;
}
if (!isDir && !**pPath)
return EILSEQ;
return 0;
}
@ -721,17 +718,35 @@ off_t romfs_seek(struct _reent *r, void *fd, off_t pos, int dir)
return file->pos;
}
int romfs_fstat(struct _reent *r, void *fd, struct stat *st)
static void fillDir(struct stat *st, romfs_mount *mount, romfs_dir *dir)
{
romfs_fileobj* file = (romfs_fileobj*)fd;
memset(st, 0, sizeof(struct stat));
st->st_ino = file_inode(file->mount, file->file);
st->st_mode = romFS_file_mode;
st->st_nlink = 1;
st->st_size = (off_t)file->file->dataSize;
memset(st, 0, sizeof(*st));
st->st_ino = dir_inode(mount, dir);
st->st_mode = romFS_dir_mode;
st->st_nlink = dir_nlink(mount, dir);
st->st_size = dir_size(dir);
st->st_blksize = 512;
st->st_blocks = (st->st_blksize + 511) / 512;
st->st_atime = st->st_mtime = st->st_ctime = file->mount->mtime;
st->st_atime = st->st_mtime = st->st_ctime = mount->mtime;
}
static void fillFile (struct stat *st, romfs_mount *mount, romfs_file *file)
{
memset(st, 0, sizeof(struct stat));
st->st_ino = file_inode(mount, file);
st->st_mode = romFS_file_mode;
st->st_nlink = 1;
st->st_size = (off_t)file->dataSize;
st->st_blksize = 512;
st->st_blocks = (st->st_blksize + 511) / 512;
st->st_atime = st->st_mtime = st->st_ctime = mount->mtime;
}
int romfs_fstat(struct _reent *r, void *fd, struct stat *st)
{
romfs_fileobj* fileobj = (romfs_fileobj*)fd;
fillFile(st, fileobj->mount, fileobj->file);
return 0;
}
@ -744,6 +759,12 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st)
if(r->_errno != 0)
return -1;
if(!*path)
{
fillDir(st,mount,curDir);
return 0;
}
romfs_dir* dir = NULL;
int ret=0;
ret = searchForDir(mount, curDir, (uint8_t*)path, strlen(path), &dir);
@ -754,14 +775,7 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st)
}
if(ret == 0)
{
memset(st, 0, sizeof(*st));
st->st_ino = dir_inode(mount, dir);
st->st_mode = romFS_dir_mode;
st->st_nlink = dir_nlink(mount, dir);
st->st_size = dir_size(dir);
st->st_blksize = 512;
st->st_blocks = (st->st_blksize + 511) / 512;
st->st_atime = st->st_mtime = st->st_ctime = mount->mtime;
fillDir(st,mount,dir);
return 0;
}
@ -775,15 +789,7 @@ int romfs_stat(struct _reent *r, const char *path, struct stat *st)
}
if(ret == 0)
{
memset(st, 0, sizeof(*st));
st->st_ino = file_inode(mount, file);
st->st_mode = romFS_file_mode;
st->st_nlink = 1;
st->st_size = file->dataSize;
st->st_blksize = 512;
st->st_blocks = (st->st_blksize + 511) / 512;
st->st_atime = st->st_mtime = st->st_ctime = mount->mtime;
fillFile(st,mount,file);
return 0;
}