summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2013-03-09 22:33:24 +0100
committerAndy Wingo <wingo@pobox.com>2013-03-09 22:33:24 +0100
commit629987edfb1d03bcbdb6bf7f15d1ec0ff928e6f8 (patch)
tree8768acb901b0b0e3edca44b75610f664dcaa8037
parentba59471eeeeb6738f87e1c9c4050ce4698a7c9d8 (diff)
downloadguile-629987edfb1d03bcbdb6bf7f15d1ec0ff928e6f8.tar.gz
fports uses gnulib's select
* libguile/fports.c: Reorder includes to put system includes first; fixes windows/winsock2 include error problem. Rely on Gnulib's select module. (fport_input_waiting): Use select instead of scm_std_select.
-rw-r--r--libguile/fports.c50
1 files changed, 21 insertions, 29 deletions
diff --git a/libguile/fports.c b/libguile/fports.c
index cdb9f99a9..e0b99b520 100644
--- a/libguile/fports.c
+++ b/libguile/fports.c
@@ -28,15 +28,6 @@
#include <stdio.h>
#include <fcntl.h>
-#include "libguile/_scm.h"
-#include "libguile/strings.h"
-#include "libguile/validate.h"
-#include "libguile/gc.h"
-#include "libguile/posix.h"
-#include "libguile/dynwind.h"
-#include "libguile/hashtab.h"
-
-#include "libguile/fports.h"
#ifdef HAVE_STRING_H
#include <string.h>
@@ -56,11 +47,20 @@
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
-
-#include "libguile/iselect.h"
+#include <sys/select.h>
#include <full-write.h>
+#include "libguile/_scm.h"
+#include "libguile/strings.h"
+#include "libguile/validate.h"
+#include "libguile/gc.h"
+#include "libguile/posix.h"
+#include "libguile/dynwind.h"
+#include "libguile/hashtab.h"
+
+#include "libguile/fports.h"
+
#if SIZEOF_OFF_T == SIZEOF_INT
#define OFF_T_MAX INT_MAX
#define OFF_T_MIN INT_MIN
@@ -558,37 +558,29 @@ fport_input_waiting (SCM port)
return pollfd.revents & POLLIN ? 1 : 0;
-#elif defined(HAVE_SELECT)
+#else
struct timeval timeout;
- SELECT_TYPE read_set;
- SELECT_TYPE write_set;
- SELECT_TYPE except_set;
+ fd_set read_set;
+ fd_set write_set;
+ fd_set except_set;
FD_ZERO (&read_set);
FD_ZERO (&write_set);
FD_ZERO (&except_set);
- FD_SET (fdes, &read_set);
-
+ if (fdes < FD_SETSIZE)
+ FD_SET (fdes, &read_set);
+ else
+ scm_out_of_range ("fport_input_waiting", scm_from_int (fdes));
+
timeout.tv_sec = 0;
timeout.tv_usec = 0;
- if (select (SELECT_SET_SIZE,
+ if (select (fdes + 1,
&read_set, &write_set, &except_set, &timeout)
< 0)
scm_syserror ("fport_input_waiting");
return FD_ISSET (fdes, &read_set) ? 1 : 0;
-
-#elif HAVE_IOCTL && defined (FIONREAD)
- int fdes = SCM_FSTREAM (port)->fdes;
- int remir;
- ioctl(fdes, FIONREAD, &remir);
- return remir;
-
-#else
- scm_misc_error ("fport_input_waiting",
- "Not fully implemented on this platform",
- SCM_EOL);
#endif
}