aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2021-06-08 18:06:07 -0400
committerMike Frysinger <vapier@gentoo.org>2024-01-01 18:23:28 -0500
commit3c8e0749b7e7482bf08438b7981ab5f9e60e80cd (patch)
tree4d33944fdaff69d51b73c2a969231cb1c790849f
parente11ccde12b191297c53c6e7a3ec250143c3c7c1f (diff)
downloadgdb-users/vapier/sim/gnulib.zip
gdb-users/vapier/sim/gnulib.tar.gz
gdb-users/vapier/sim/gnulib.tar.bz2
sim: use gnulib to set nonblocking modeusers/vapier/sim/gnulib
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).
-rw-r--r--sim/bfin/dv-bfin_emac.c5
-rw-r--r--sim/common/dv-sockser.c8
-rw-r--r--sim/common/sim-io.c19
-rw-r--r--sim/ppc/main.c20
4 files changed, 19 insertions, 33 deletions
diff --git a/sim/bfin/dv-bfin_emac.c b/sim/bfin/dv-bfin_emac.c
index 1ab7cd6..82a2ef2 100644
--- a/sim/bfin/dv-bfin_emac.c
+++ b/sim/bfin/dv-bfin_emac.c
@@ -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
}
diff --git a/sim/common/dv-sockser.c b/sim/common/dv-sockser.c
index 698cab8..82f45cd 100644
--- a/sim/common/dv-sockser.c
+++ b/sim/common/dv-sockser.c
@@ -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;
}
diff --git a/sim/common/sim-io.c b/sim/common/sim-io.c
index fc0d42f..5a89984 100644
--- a/sim/common/sim-io.c
+++ b/sim/common/sim-io.c
@@ -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
diff --git a/sim/ppc/main.c b/sim/ppc/main.c
index aa1c85e..fb2b1b8b 100644
--- a/sim/ppc/main.c
+++ b/sim/ppc/main.c
@@ -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;