#include <string.h>
#include <sys/poll.h>
#include <sys/ioctl.h>
+#include <errno.h>
#include <glib.h>
+/* This is for FIONREAD on solaris */
+#if defined(sun)
+#include <sys/filio.h>
+#endif
+
/* This is a copy of System.IO.Ports.Handshake */
typedef enum {
NoneHandshake = 0,
}
gint32
-get_bytes_in_buffer (int fd, gboolean input, gint32 *error)
+get_bytes_in_buffer (int fd, gboolean input)
{
gint32 retval;
- *error = 0;
if (ioctl (fd, input ? FIONREAD : TIOCOUTQ, &retval) == -1) {
- *error = -1;
return -1;
}
}
gboolean
-poll_serial (int fd, gint32 *error)
+poll_serial (int fd, gint32 *error, int timeout)
{
struct pollfd pinfo;
pinfo.events = POLLIN;
pinfo.revents = 0;
- if (poll (&pinfo, 1, 0) == -1) {
+ if (poll (&pinfo, 1, timeout) == -1) {
+ /* EINTR is an OK condition, we should not throw in the upper layer an IOException */
+ if (errno == EINTR)
+ return FALSE;
*error = -1;
return FALSE;
}