fixed wrong O_NONBLOCK handling in mod-sys.c

This commit is contained in:
hyung-hwan 2020-09-08 16:08:28 +00:00
parent a097bb71fe
commit c15966a0f4

View File

@ -852,15 +852,21 @@ static int fnc_dup (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
#else #else
if (oflags) if (oflags)
{ {
int nflags = 0; int xflags;
#if defined(O_CLOEXEC) && defined(FD_CLOEXEC) #if defined(O_CLOEXEC) && defined(FD_CLOEXEC)
if (oflags & O_CLOEXEC) nflags |= FD_CLOEXEC; if (oflags & O_CLOEXEC)
{
xflags = fcntl(fd, F_GETFD);
if (xflags >= 0) fcntl(fd, F_SETFD, xflags | FD_CLOEXEC);
}
#endif #endif
#if defined(O_NONBLOCK) && defined(FD_NONBLOCK) #if defined(O_NONBLOCK)
/*if (oflags & O_NONBLOCK) nflags |= FD_NONBLOCK; dup3() doesn't seem to support NONBLOCK. */ /*if (oflags & O_NONBLOCK)
{
xflags = fcntl(fd, F_GETFL);
if (xflags >= 0) fcntl(fd, F_SETFL, xflags | O_NONBLOCK);
} dup3() doesn't seem to support NONBLOCK. */
#endif #endif
if (nflags) fcntl (fd, F_SETFD, nflags);
} }
#endif #endif
/* dup2 or dup3 closes the descriptor sys_node2_.ctx.u.file.fd implicitly /* dup2 or dup3 closes the descriptor sys_node2_.ctx.u.file.fd implicitly
@ -1485,22 +1491,26 @@ static int fnc_pipe (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
#else #else
if (flags > 0) if (flags > 0)
{ {
int nflags = 0; int xflags;
/* needs translation from O_XXXX to FD_XXXX */
#if defined(O_CLOEXEC) && defined(FD_CLOEXEC) #if defined(O_CLOEXEC) && defined(FD_CLOEXEC)
if (flags & O_CLOEXEC) nflags |= FD_CLOEXEC; if (flags & O_CLOEXEC)
#endif
#if defined(O_NONBLOCK) && defined(FD_NONBLOCK)
if (flags & O_NONBLOCK) nflags |= FD_NONBLOCK;
#endif
if (nflags > 0)
{ {
/* don't care about failure */ xflags = fcntl(fds[0], F_GETFD);
fcntl (fds[0], F_SETFD, nflags); if (xflags >= 0) fcntl(fds[0], F_SETFD, xflags | FD_CLOEXEC);
fcntl (fds[1], F_SETFD, nflags); xflags = fcntl(fds[1], F_GETFD);
if (xflags >= 0) fcntl(fds[1], F_SETFD, xflags | FD_CLOEXEC);
} }
#endif
#if defined(O_NONBLOCK)
if (flags & O_NONBLOCK)
{
xflags = fcntl(fds[0], F_GETFL);
if (xflags >= 0) fcntl(fds[0], F_SETFL, xflags | O_NONBLOCK);
xflags = fcntl(fds[1], F_GETFL);
if (xflags >= 0) fcntl(fds[1], F_SETFL, xflags | O_NONBLOCK);
}
#endif
} }
#endif #endif
node1 = new_sys_node_fd(rtx, sys_list, fds[0]); node1 = new_sys_node_fd(rtx, sys_list, fds[0]);