[DFS] Add fcntl API (same with ioctl in RT-Thread).
This commit is contained in:
parent
8246da645d
commit
5a95d35626
|
@ -22,6 +22,7 @@
|
||||||
* 2009-05-27 Yi.qiu The first version.
|
* 2009-05-27 Yi.qiu The first version.
|
||||||
* 2010-07-18 Bernard add stat and statfs structure definitions.
|
* 2010-07-18 Bernard add stat and statfs structure definitions.
|
||||||
* 2011-05-16 Yi.qiu Change parameter name of rename, "new" is C++ key word.
|
* 2011-05-16 Yi.qiu Change parameter name of rename, "new" is C++ key word.
|
||||||
|
* 2017-12-27 Bernard Add fcntl API.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DFS_POSIX_H__
|
#ifndef __DFS_POSIX_H__
|
||||||
|
@ -66,6 +67,7 @@ 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 fsync(int fildes);
|
int fsync(int fildes);
|
||||||
|
int fcntl(int fildes, int cmd, void *data);
|
||||||
int ioctl(int fildes, int cmd, void *data);
|
int ioctl(int fildes, int cmd, void *data);
|
||||||
|
|
||||||
/* directory api*/
|
/* directory api*/
|
||||||
|
|
|
@ -173,9 +173,29 @@ int dfs_file_close(struct dfs_fd *fd)
|
||||||
*/
|
*/
|
||||||
int dfs_file_ioctl(struct dfs_fd *fd, int cmd, void *args)
|
int dfs_file_ioctl(struct dfs_fd *fd, int cmd, void *args)
|
||||||
{
|
{
|
||||||
if (fd == NULL || fd->type != FT_REGULAR)
|
if (fd == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* regular file system fd */
|
||||||
|
if (fd->type == FT_REGULAR)
|
||||||
|
{
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case F_GETFL:
|
||||||
|
return fd->flags; /* return flags */
|
||||||
|
case F_SETFL:
|
||||||
|
{
|
||||||
|
int flags = (int)args;
|
||||||
|
int mask = O_NONBLOCK | O_APPEND;
|
||||||
|
|
||||||
|
flags &= mask;
|
||||||
|
fd->flags &= mask;
|
||||||
|
fd->flags |= flags;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (fd->fops->ioctl != NULL)
|
if (fd->fops->ioctl != NULL)
|
||||||
return fd->fops->ioctl(fd, cmd, args);
|
return fd->fops->ioctl(fd, cmd, args);
|
||||||
|
|
||||||
|
|
|
@ -428,28 +428,46 @@ RTM_EXPORT(fsync);
|
||||||
* @return 0 on successful completion. Otherwise, -1 shall be returned and errno
|
* @return 0 on successful completion. Otherwise, -1 shall be returned and errno
|
||||||
* set to indicate the error.
|
* set to indicate the error.
|
||||||
*/
|
*/
|
||||||
int ioctl(int fildes, int cmd, void *data)
|
int fcntl(int fildes, int cmd, void *data)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = -1;
|
||||||
struct dfs_fd *d;
|
struct dfs_fd *d;
|
||||||
|
|
||||||
/* get the fd */
|
/* get the fd */
|
||||||
d = fd_get(fildes);
|
d = fd_get(fildes);
|
||||||
if (d == NULL)
|
if (d)
|
||||||
{
|
{
|
||||||
rt_set_errno(-EBADF);
|
ret = dfs_file_ioctl(d, cmd, data);
|
||||||
return -1;
|
fd_put(d);
|
||||||
}
|
}
|
||||||
|
else ret = -EBADF;
|
||||||
|
|
||||||
ret = dfs_file_ioctl(d, cmd, data);
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
{
|
{
|
||||||
rt_set_errno(ret);
|
rt_set_errno(ret);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
fd_put(d);
|
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
|
}
|
||||||
|
RTM_EXPORT(fcntl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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, int cmd, void *data)
|
||||||
|
{
|
||||||
|
/* we use fcntl for this API. */
|
||||||
|
return fcntl(fildes, cmd, data);
|
||||||
}
|
}
|
||||||
RTM_EXPORT(ioctl);
|
RTM_EXPORT(ioctl);
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,13 @@
|
||||||
#define O_ACCMODE (_O_RDONLY | _O_WRONLY | _O_RDWR)
|
#define O_ACCMODE (_O_RDONLY | _O_WRONLY | _O_RDWR)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef F_GETFL
|
||||||
|
#define F_GETFL 3
|
||||||
|
#endif
|
||||||
|
#ifndef F_SETFL
|
||||||
|
#define F_SETFL 4
|
||||||
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define O_RDONLY 00
|
#define O_RDONLY 00
|
||||||
#define O_WRONLY 01
|
#define O_WRONLY 01
|
||||||
|
|
Loading…
Reference in New Issue