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

This commit is contained in:
Bernard Xiong 2015-12-22 10:18:36 +08:00
parent 74def7ed72
commit 455daf8e7a
2 changed files with 55 additions and 1 deletions

View File

@ -119,20 +119,29 @@ struct stat;
/* file api*/ /* file api*/
int open(const char *file, int flags, int mode); int open(const char *file, int flags, int mode);
int close(int d); 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 read(int fd, void *buf, size_t len);
int write(int fd, const 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); off_t lseek(int fd, off_t offset, int whence);
int rename(const char *from, const char *to); int rename(const char *from, const char *to);
int unlink(const char *pathname); int unlink(const char *pathname);
int stat(const char *file, struct stat *buf); int stat(const char *file, struct stat *buf);
int fstat(int fildes, 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*/ /* directory api*/
int rmdir(const char *path); int rmdir(const char *path);
int chdir(const char *path); int chdir(const char *path);
char *getcwd(char *buf, size_t size); char *getcwd(char *buf, size_t size);
/* file system api */
int statfs(const char *path, struct statfs *buf);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -123,7 +123,11 @@ RTM_EXPORT(close);
* @return the actual read data buffer length. If the returned value is 0, it * @return the actual read data buffer length. If the returned value is 0, it
* may be reach the end of file, please check errno. * 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) int read(int fd, void *buf, size_t len)
#endif
{ {
int result; int result;
struct dfs_fd *d; struct dfs_fd *d;
@ -163,7 +167,11 @@ RTM_EXPORT(read);
* *
* @return the actual written data buffer length. * @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) int write(int fd, const void *buf, size_t len)
#endif
{ {
int result; int result;
struct dfs_fd *d; struct dfs_fd *d;
@ -405,6 +413,43 @@ int fsync(int fildes)
} }
RTM_EXPORT(fsync); 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 * this function is a POSIX compliant version, which will return the
* information about a mounted file system. * information about a mounted file system.