/* Serial port emulation using sockets.
- Copyright (C) 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1998-2017 Free Software Foundation, Inc.
Contributed by Cygnus Solutions.
This program is free software; you can redistribute it and/or modify
/* FIXME: will obviously need to evolve.
- connectionless sockets might be more appropriate. */
+#include "config.h"
#include "sim-main.h"
#ifdef HAVE_STRING_H
}
sockser_listen_fd = socket (PF_INET, SOCK_STREAM, 0);
- if (sockser_listen_fd < 0)
+ if (sockser_listen_fd == -1)
{
sim_io_eprintf (sd, "sockser init: unable to get socket: %s\n",
strerror (errno));
}
sockaddr.sin_family = PF_INET;
- sockaddr.sin_port = htons(port);
+ sockaddr.sin_port = htons (port);
memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
sizeof (struct in_addr));
tmp = 1;
- if (setsockopt (sockser_listen_fd, SOL_SOCKET, SO_REUSEADDR, (void*)& tmp, sizeof(tmp)) < 0)
+ if (setsockopt (sockser_listen_fd, SOL_SOCKET, SO_REUSEADDR, (void*)& tmp, sizeof (tmp)) < 0)
{
sim_io_eprintf (sd, "sockser init: unable to set SO_REUSEADDR: %s\n",
strerror (errno));
addrlen = sizeof (sockaddr);
sockser_fd = accept (sockser_listen_fd, &sockaddr, &addrlen);
- if (sockser_fd < 0)
+ if (sockser_fd == -1)
return 0;
/* Set non-blocking i/o. */
fd_set readfds,writefds;
/* status to return if the socket isn't set up, or select fails */
- status = DV_SOCKSER_INPUT_EMPTY | DV_SOCKSER_OUTPUT_EMPTY;
+ status = DV_SOCKSER_INPUT_EMPTY | DV_SOCKSER_OUTPUT_EMPTY |
+ DV_SOCKSER_DISCONNECTED;
if (! connected_p (sd))
return status;
}
int
-dv_sockser_write (SIM_DESC sd, unsigned char c)
+dv_sockser_write_buffer (SIM_DESC sd, const unsigned char *buffer,
+ unsigned nr_bytes)
{
int n;
if (! connected_p (sd))
return -1;
- n = write (sockser_fd, &c, 1);
+ n = write (sockser_fd, buffer, nr_bytes);
if (n == -1)
{
if (errno == EPIPE)
}
return -1;
}
- if (n != 1)
+ if (n != nr_bytes)
return -1;
- return 1;
+ return nr_bytes;
+}
+
+int
+dv_sockser_write (SIM_DESC sd, unsigned char c)
+{
+ return dv_sockser_write_buffer (sd, &c, 1);
}
int