forked from Imagelibrary/binutils-gdb
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:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user