Przeglądaj źródła

Add ioctl API and fix the read/write conflict issue with newlib's API.

Bernard Xiong 9 lat temu
rodzic
commit
455daf8e7a
2 zmienionych plików z 55 dodań i 1 usunięć
  1. 10 1
      components/dfs/include/dfs_posix.h
  2. 45 0
      components/dfs/src/dfs_posix.c

+ 10 - 1
components/dfs/include/dfs_posix.h

@@ -119,20 +119,29 @@ struct stat;
 /* file api*/
 int open(const char *file, int flags, int mode);
 int close(int d);
+#ifdef RT_USING_NEWLIB
+_READ_WRITE_RETURN_TYPE _EXFUN(read, (int __fd, void *__buf, size_t __nbyte));
+_READ_WRITE_RETURN_TYPE _EXFUN(write, (int __fd, const void *__buf, size_t __nbyte));
+#else
 int read(int fd, void *buf, size_t len);
 int write(int fd, const void *buf, size_t len);
+#endif
 off_t lseek(int fd, off_t offset, int whence);
 int rename(const char *from, const char *to);
 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);
+int fsync(int fildes);
+int ioctl(int fildes, unsigned long cmd, void *data);
 
 /* directory api*/
 int rmdir(const char *path);
 int chdir(const char *path);
 char *getcwd(char *buf, size_t size);
 
+/* file system api */
+int statfs(const char *path, struct statfs *buf);
+
 #ifdef __cplusplus
 }
 #endif

+ 45 - 0
components/dfs/src/dfs_posix.c

@@ -123,7 +123,11 @@ RTM_EXPORT(close);
  * @return the actual read data buffer length. If the returned value is 0, it
  * may be reach the end of file, please check errno.
  */
+#ifdef RT_USING_NEWLIB
+_READ_WRITE_RETURN_TYPE _EXFUN(read, (int fd, void *buf, size_t len))
+#else
 int read(int fd, void *buf, size_t len)
+#endif
 {
     int result;
     struct dfs_fd *d;
@@ -163,7 +167,11 @@ RTM_EXPORT(read);
  *
  * @return the actual written data buffer length.
  */
+#ifdef RT_USING_NEWLIB
+_READ_WRITE_RETURN_TYPE _EXFUN(write, (int fd, const void *buf, size_t len))
+#else
 int write(int fd, const void *buf, size_t len)
+#endif
 {
     int result;
     struct dfs_fd *d;
@@ -405,6 +413,43 @@ int fsync(int fildes)
 }
 RTM_EXPORT(fsync);
 
+/**
+ * this function is a POSIX compliant version, which shall perform a variety of 
+ * control functions on devices. 
+ *
+ * @param fildes the file description
+ * @param cmd the specified command
+ * @param data represents the additional information that is needed by this 
+ * specific device to perform the requested function.
+ *
+ * @return 0 on successful completion. Otherwise, -1 shall be returned and errno 
+ * set to indicate the error. 
+ */
+int ioctl(int fildes, unsigned long cmd, void *data)
+{
+	int ret;
+    struct dfs_fd *d;
+
+    /* get the fd */
+    d = fd_get(fildes);
+    if (d == RT_NULL)
+    {
+        rt_set_errno(-DFS_STATUS_EBADF);
+        return -1;
+    }
+
+	ret = dfs_file_ioctl(d, cmd, data);
+	if (ret != DFS_STATUS_OK)
+	{
+		rt_set_errno(ret);
+		ret = -1;
+	}
+    fd_put(d);
+
+	return ret;
+}
+RTM_EXPORT(ioctl);
+
 /**
  * this function is a POSIX compliant version, which will return the 
  * information about a mounted file system.