From 455daf8e7aa277ad8009c3151b308a176a5476b5 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Tue, 22 Dec 2015 10:18:36 +0800 Subject: [PATCH] Add ioctl API and fix the read/write conflict issue with newlib's API. --- components/dfs/include/dfs_posix.h | 11 +++++++- components/dfs/src/dfs_posix.c | 45 ++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/components/dfs/include/dfs_posix.h b/components/dfs/include/dfs_posix.h index 2d08ec71fa..f3da7b5530 100644 --- a/components/dfs/include/dfs_posix.h +++ b/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 diff --git a/components/dfs/src/dfs_posix.c b/components/dfs/src/dfs_posix.c index 52a9139d80..006b5f9b03 100644 --- a/components/dfs/src/dfs_posix.c +++ b/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. -- GitLab