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> #include <linux/if_tun.h>
#endif #endif
#include "nonblocking.h"
#ifdef HAVE_LINUX_IF_TUN_H #ifdef HAVE_LINUX_IF_TUN_H
# define WITH_TUN 1 # define WITH_TUN 1
#else #else
@@ -567,8 +569,7 @@ bfin_emac_tap_init (struct hw *me)
return; return;
} }
flags = fcntl (emac->tap, F_GETFL); set_nonblocking_flag (emac->tap, true);
fcntl (emac->tap, F_SETFL, flags | O_NONBLOCK);
#endif #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/time.h>
#include <sys/types.h> #include <sys/types.h>
#include "nonblocking.h"
#include "sim-main.h" #include "sim-main.h"
#include "sim-assert.h" #include "sim-assert.h"
#include "sim-options.h" #include "sim-options.h"
@@ -253,17 +255,13 @@ connected_p (SIM_DESC sd)
return 0; return 0;
/* Set non-blocking i/o. */ /* Set non-blocking i/o. */
#if defined(F_GETFL) && defined(O_NONBLOCK) if (set_nonblocking_flag (sockser_fd, true))
flags = fcntl (sockser_fd, F_GETFL);
flags |= O_NONBLOCK;
if (fcntl (sockser_fd, F_SETFL, flags) == -1)
{ {
sim_io_eprintf (sd, "unable to set nonblocking i/o"); sim_io_eprintf (sd, "unable to set nonblocking i/o");
close (sockser_fd); close (sockser_fd);
sockser_fd = -1; sockser_fd = -1;
return 0; return 0;
} }
#endif
return 1; return 1;
} }

View File

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

View File

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