Jelajahi Sumber

add fstat implementation.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1057 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong@gmail.com 14 tahun lalu
induk
melakukan
d4c03d07cf

+ 0 - 1
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)

+ 1 - 0
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*/

+ 40 - 1
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.