From d4c03d07cf5e722c32df372c17f625153acabc4b Mon Sep 17 00:00:00 2001 From: "bernard.xiong@gmail.com" Date: Wed, 17 Nov 2010 23:36:33 +0000 Subject: [PATCH] add fstat implementation. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1057 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/dfs/filesystems/elmfat/dfs_elm.c | 1 - components/dfs/include/dfs_posix.h | 1 + components/dfs/src/dfs_posix.c | 41 ++++++++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/components/dfs/filesystems/elmfat/dfs_elm.c b/components/dfs/filesystems/elmfat/dfs_elm.c index d798c5bbdb..c720c42279 100644 --- a/components/dfs/filesystems/elmfat/dfs_elm.c +++ b/components/dfs/filesystems/elmfat/dfs_elm.c @@ -220,7 +220,6 @@ int dfs_elm_open(struct dfs_fd* file) } } - /* open directory */ dir = (DIR *)rt_malloc(sizeof(DIR)); if (dir == RT_NULL) diff --git a/components/dfs/include/dfs_posix.h b/components/dfs/include/dfs_posix.h index 7897893bef..b4b87b0a11 100644 --- a/components/dfs/include/dfs_posix.h +++ b/components/dfs/include/dfs_posix.h @@ -99,6 +99,7 @@ off_t lseek(int fd, off_t offset, int whence); int rename(const char* old, const char* new ); int unlink(const char *pathname); int stat(const char *file, struct stat *buf); +int fstat(int fildes, struct stat *buf); int statfs(const char *path, struct statfs *buf); /* directory api*/ diff --git a/components/dfs/src/dfs_posix.c b/components/dfs/src/dfs_posix.c index 26395aafc6..f1c01605f9 100644 --- a/components/dfs/src/dfs_posix.c +++ b/components/dfs/src/dfs_posix.c @@ -257,7 +257,7 @@ int unlink(const char *pathname) * this function is a POSIX compliant version, which will get file information. * * @param file the file name - * @param buf the the data buffer to save stat description. + * @param buf the data buffer to save stat description. * * @return 0 on successful, -1 on failed. */ @@ -274,6 +274,45 @@ int stat(const char *file, struct stat *buf) return result; } +/** + * this function is a POSIX compliant version, which will get file status. + * + * @param fildes the file description + * @param buf the data buffer to save stat description. + */ +int fstat(int fildes, struct stat *buf) +{ + int result; + struct dfs_fd* d; + + /* get the fd */ + d = fd_get(fildes); + if (d == RT_NULL) + { + rt_set_errno(-RT_ERROR); + return -1; + } + + /* it's the root directory */ + buf->st_dev = 0; + + buf->st_mode = DFS_S_IFREG | DFS_S_IRUSR | DFS_S_IRGRP | DFS_S_IROTH | + DFS_S_IWUSR | DFS_S_IWGRP | DFS_S_IWOTH; + if (d->type == FT_DIRECTORY) + { + buf->st_mode &= ~DFS_S_IFREG; + buf->st_mode |= DFS_S_IFDIR | DFS_S_IXUSR | DFS_S_IXGRP | DFS_S_IXOTH; + } + + buf->st_size = d->size; + buf->st_mtime = 0; + buf->st_blksize = 512; + + fd_put(d); + + return DFS_STATUS_OK; +} + /** * this function is a POSIX compliant version, which will return the * information about a mounted file system. -- GitLab