sim: use gnulib to set nonblocking mode

Replace various custom ad-hoc fcntl/O_NONBLOCK implementations with
the gnulib nonblocking module.  This makes our code much tidier and
portable to other systems (e.g. Windows).
This commit is contained in:
Mike Frysinger
2021-06-08 18:06:07 -04:00
parent e11ccde12b
commit 3c8e0749b7
4 changed files with 19 additions and 33 deletions

View File

@@ -35,6 +35,8 @@
#include <linux/if_tun.h>
#endif
#include "nonblocking.h"
#ifdef HAVE_LINUX_IF_TUN_H
# define WITH_TUN 1
#else
@@ -567,8 +569,7 @@ bfin_emac_tap_init (struct hw *me)
return;
}
flags = fcntl (emac->tap, F_GETFL);
fcntl (emac->tap, F_SETFL, flags | O_NONBLOCK);
set_nonblocking_flag (emac->tap, true);
#endif
}

View File

@@ -37,6 +37,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <sys/time.h>
#include <sys/types.h>
#include "nonblocking.h"
#include "sim-main.h"
#include "sim-assert.h"
#include "sim-options.h"
@@ -253,17 +255,13 @@ connected_p (SIM_DESC sd)
return 0;
/* Set non-blocking i/o. */
#if defined(F_GETFL) && defined(O_NONBLOCK)
flags = fcntl (sockser_fd, F_GETFL);
flags |= O_NONBLOCK;
if (fcntl (sockser_fd, F_SETFL, flags) == -1)
if (set_nonblocking_flag (sockser_fd, true))
{
sim_io_eprintf (sd, "unable to set nonblocking i/o");
close (sockser_fd);
sockser_fd = -1;
return 0;
}
#endif
return 1;
}

View File

@@ -33,6 +33,8 @@
#undef open
#include "nonblocking.h"
#include "sim-main.h"
#include "sim-io.h"
#include "sim/callback.h"
@@ -347,23 +349,20 @@ sim_io_poll_read (SIM_DESC sd,
char *buf,
int sizeof_buf)
{
#if defined(O_NONBLOCK) && defined(F_GETFL) && defined(F_SETFL)
int fd = STATE_CALLBACK (sd)->fdmap[sim_io_fd];
int flags;
int status;
int nr_read;
int result;
STATE_CALLBACK (sd)->last_errno = 0;
/* get the old status */
flags = fcntl (fd, F_GETFL, 0);
if (flags == -1)
status = get_nonblocking_flag (fd);
if (status == -1)
{
perror ("sim_io_poll_read");
perror ("sim_io_read_stdin");
return 0;
}
/* temp, disable blocking IO */
status = fcntl (fd, F_SETFL, flags | O_NONBLOCK);
if (status == -1)
if (status == 0 && set_nonblocking_flag (fd, true) == -1)
{
perror ("sim_io_read_stdin");
return 0;
@@ -381,16 +380,12 @@ sim_io_poll_read (SIM_DESC sd,
STATE_CALLBACK (sd)->last_errno = errno;
}
/* return to regular vewing */
status = fcntl (fd, F_SETFL, flags);
if (status == -1)
if (status == 0 && set_nonblocking_flag (fd, false) == -1)
{
perror ("sim_io_read_stdin");
/* return 0; */
}
return result;
#else
return sim_io_read (sd, sim_io_fd, buf, sizeof_buf);
#endif
}
int

View File

@@ -26,6 +26,8 @@
#include <signal.h>
#include "nonblocking.h"
#include "psim.h"
#include "options.h"
#include "device.h" /* FIXME: psim should provide the interface */
@@ -42,11 +44,6 @@
#include "environ.h"
#if !defined(O_NONBLOCK) || !defined(F_GETFL) || !defined(F_SETFL)
#undef WITH_STDIO
#define WITH_STDIO DO_USE_STDIO
#endif
static psim *simulation = NULL;
@@ -150,22 +147,19 @@ sim_io_read_stdin(char *buf,
return sim_io_eof;
break;
case DONT_USE_STDIO:
#if defined(O_NONBLOCK) && defined(F_GETFL) && defined(F_SETFL)
{
/* check for input */
int flags;
int status;
int nr_read;
int result;
/* get the old status */
flags = fcntl(0, F_GETFL, 0);
if (flags == -1) {
status = get_nonblocking_flag (0);
if (status == -1) {
perror("sim_io_read_stdin");
return sim_io_eof;
}
/* temp, disable blocking IO */
status = fcntl(0, F_SETFL, flags | O_NONBLOCK);
if (status == -1) {
if (status == 0 && set_nonblocking_flag (0, true) == -1) {
perror("sim_io_read_stdin");
return sim_io_eof;
}
@@ -183,15 +177,13 @@ sim_io_read_stdin(char *buf,
result = sim_io_eof;
}
/* return to regular vewing */
status = fcntl(0, F_SETFL, flags);
if (status == -1) {
if (status == 0 && set_nonblocking_flag (0, false) == -1) {
perror("sim_io_read_stdin");
return sim_io_eof;
}
return result;
}
break;
#endif
default:
error("sim_io_read_stdin: invalid switch\n");
break;