Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions arch/arm/src/common/arm_hostfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,11 @@ int host_ioctl(int fd, int request, unsigned long arg)
return -ENOSYS;
}

int host_fcntl(int fd, int cmd, ...)
{
return -ENOTTY;
}

void host_sync(int fd)
{
}
Expand Down
5 changes: 5 additions & 0 deletions arch/arm64/src/common/arm64_hostfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,11 @@ int host_ioctl(int fd, int request, unsigned long arg)
return -ENOSYS;
}

int host_fcntl(int fd, int cmd, ...)
{
return -ENOTTY;
}

void host_sync(int fd)
{
}
Expand Down
5 changes: 5 additions & 0 deletions arch/risc-v/src/common/riscv_hostfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,11 @@ int host_ioctl(int fd, int request, unsigned long arg)
return -ENOSYS;
}

int host_fcntl(int fd, int cmd, ...)
{
return -ENOTTY;
}

void host_sync(int fd)
{
}
Expand Down
330 changes: 265 additions & 65 deletions arch/sim/src/sim/posix/sim_hostfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <stdarg.h>

#include "hostfs.h"
#include "sim_internal.h"
Expand All @@ -43,6 +44,186 @@
* Private Functions
****************************************************************************/

/****************************************************************************
* Name: host_oflags_convert
****************************************************************************/

static int host_oflags_convert(int flags)
{
int mapflags = 0;

switch (flags & NUTTX_O_ACCMODE)
{
case NUTTX_O_RDONLY:
mapflags = O_RDONLY;
break;

case NUTTX_O_WRONLY:
mapflags = O_WRONLY;
break;

case NUTTX_O_RDWR:
mapflags = O_RDWR;
break;
}

if (flags & NUTTX_O_APPEND)
{
mapflags |= O_APPEND;
}

if (flags & NUTTX_O_CREAT)
{
mapflags |= O_CREAT;
}

if (flags & NUTTX_O_EXCL)
{
mapflags |= O_EXCL;
}

if (flags & NUTTX_O_TRUNC)
{
mapflags |= O_TRUNC;
}

if (flags & NUTTX_O_NONBLOCK)
{
mapflags |= O_NONBLOCK;
}

if (flags & NUTTX_O_SYNC)
{
mapflags |= O_SYNC;
}

#ifdef O_DIRECT
if (flags & NUTTX_O_DIRECT)
{
mapflags |= O_DIRECT;
}
#endif

if (flags & NUTTX_O_CLOEXEC)
{
mapflags |= O_CLOEXEC;
}

if (flags & NUTTX_O_DIRECTORY)
{
mapflags |= O_DIRECTORY;
}

return mapflags;
}

/****************************************************************************
* Name: host_oflags_revert
****************************************************************************/

static int host_oflags_revert(int flags)
{
int mapflags = 0;

switch (flags & O_ACCMODE)
{
case O_RDONLY:
mapflags = NUTTX_O_RDONLY;
break;

case O_WRONLY:
mapflags = NUTTX_O_WRONLY;
break;

case O_RDWR:
mapflags = NUTTX_O_RDWR;
break;
}

if (flags & O_APPEND)
{
mapflags |= NUTTX_O_APPEND;
}

if (flags & O_CREAT)
{
mapflags |= NUTTX_O_CREAT;
}

if (flags & O_EXCL)
{
mapflags |= NUTTX_O_EXCL;
}

if (flags & O_TRUNC)
{
mapflags |= NUTTX_O_TRUNC;
}

if (flags & O_NONBLOCK)
{
mapflags |= NUTTX_O_NONBLOCK;
}

if (flags & O_SYNC)
{
mapflags |= NUTTX_O_SYNC;
}

#ifdef O_DIRECT
if (flags & O_DIRECT)
{
mapflags |= NUTTX_O_DIRECT;
}
#endif

if (flags & O_CLOEXEC)
{
mapflags |= NUTTX_O_CLOEXEC;
}

if (flags & O_DIRECTORY)
{
mapflags |= NUTTX_O_DIRECTORY;
}

return mapflags;
}

/****************************************************************************
* Name: host_fcntl_cmd_convert
****************************************************************************/

static int host_fcntl_cmd_convert(int cmd)
{
switch (cmd)
{
case NUTTX_F_DUPFD:
return F_DUPFD;

case NUTTX_F_GETFD:
return F_GETFD;

case NUTTX_F_GETFL:
return F_GETFL;

case NUTTX_F_GETLK:
return F_GETLK;

case NUTTX_F_SETFD:
return F_SETFD;

case NUTTX_F_SETFL:
return F_SETFL;

case NUTTX_F_SETLK:
return F_SETLK;

default:
return -EINVAL;
}
}

/****************************************************************************
* Name: host_stat_convert
****************************************************************************/
Expand Down Expand Up @@ -130,71 +311,7 @@ static void host_stat_convert(struct stat *hostbuf, struct nuttx_stat_s *buf)

int host_open(const char *pathname, int flags, int mode)
{
int mapflags = 0;

/* Perform flag mapping */

switch (flags & NUTTX_O_ACCMODE)
{
case NUTTX_O_RDONLY:
mapflags = O_RDONLY;
break;

case NUTTX_O_WRONLY:
mapflags = O_WRONLY;
break;

case NUTTX_O_RDWR:
mapflags = O_RDWR;
break;
}

if (flags & NUTTX_O_APPEND)
{
mapflags |= O_APPEND;
}

if (flags & NUTTX_O_CREAT)
{
mapflags |= O_CREAT;
}

if (flags & NUTTX_O_EXCL)
{
mapflags |= O_EXCL;
}

if (flags & NUTTX_O_TRUNC)
{
mapflags |= O_TRUNC;
}

if (flags & NUTTX_O_NONBLOCK)
{
mapflags |= O_NONBLOCK;
}

if (flags & NUTTX_O_SYNC)
{
mapflags |= O_SYNC;
}

#ifdef O_DIRECT
if (flags & NUTTX_O_DIRECT)
{
mapflags |= O_DIRECT;
}
#endif

if (flags & NUTTX_O_CLOEXEC)
{
mapflags |= O_CLOEXEC;
}

if (flags & NUTTX_O_DIRECTORY)
{
mapflags |= O_DIRECTORY;
}
int mapflags = host_oflags_convert(flags);

int ret = open(pathname, mapflags, mode);
if (ret == -1)
Expand Down Expand Up @@ -274,6 +391,89 @@ nuttx_off_t host_lseek(int fd, nuttx_off_t pos, nuttx_off_t offset,
return ret;
}

/****************************************************************************
* Name: host_fcntl
****************************************************************************/

int host_fcntl(int fd, int cmd, ...)
{
struct nuttx_flock_s *lock;
struct flock hostlock;
int hostcmd;
va_list ap;
int arg;
int ret;

hostcmd = host_fcntl_cmd_convert(cmd);
if (hostcmd < 0)
{
return hostcmd;
}

va_start(ap, cmd);

switch (cmd)
{
case NUTTX_F_GETFD:
ret = fcntl(fd, hostcmd);
break;

case NUTTX_F_GETFL:
ret = fcntl(fd, hostcmd);
if (ret >= 0)
{
ret = host_oflags_revert(ret);
}

break;

case NUTTX_F_DUPFD:
case NUTTX_F_SETFD:
case NUTTX_F_SETFL:
arg = va_arg(ap, int);
if (cmd == NUTTX_F_SETFL)
{
arg = host_oflags_convert(arg);
}

ret = fcntl(fd, hostcmd, arg);
break;

case NUTTX_F_GETLK:
case NUTTX_F_SETLK:
lock = va_arg(ap, struct nuttx_flock_s *);
hostlock.l_type = lock->l_type;
hostlock.l_whence = lock->l_whence;
hostlock.l_start = lock->l_start;
hostlock.l_len = lock->l_len;
hostlock.l_pid = lock->l_pid;

ret = fcntl(fd, hostcmd, &hostlock);
if (ret >= 0)
{
lock->l_type = hostlock.l_type;
lock->l_whence = hostlock.l_whence;
lock->l_start = hostlock.l_start;
lock->l_len = hostlock.l_len;
lock->l_pid = hostlock.l_pid;
}
break;

default:
ret = -1;
errno = EINVAL;
break;
}

va_end(ap);
if (ret < 0)
{
ret = host_errno_convert(-errno);
}

return ret;
}

/****************************************************************************
* Name: host_ioctl
****************************************************************************/
Expand Down
Loading
Loading