summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pfinet/glue-include/linux/poll.h2
-rw-r--r--pfinet/io-ops.c13
2 files changed, 10 insertions, 5 deletions
diff --git a/pfinet/glue-include/linux/poll.h b/pfinet/glue-include/linux/poll.h
index b21c3c71..c785ea74 100644
--- a/pfinet/glue-include/linux/poll.h
+++ b/pfinet/glue-include/linux/poll.h
@@ -9,7 +9,7 @@
#define POLLWRNORM SELECT_WRITE
#define POLLWRBAND SELECT_WRITE
#define POLLPRI SELECT_URG
-#define POLLERR SELECT_READ | SELECT_WRITE
+#define POLLERR 0x1000
#define POLLHUP SELECT_READ
typedef struct poll_table_struct { } poll_table;
diff --git a/pfinet/io-ops.c b/pfinet/io-ops.c
index 0236c594..5f3b1e90 100644
--- a/pfinet/io-ops.c
+++ b/pfinet/io-ops.c
@@ -23,6 +23,7 @@
#include <linux/wait.h>
#include <linux/socket.h>
#include <linux/net.h>
+#include <linux/poll.h>
#include <net/sock.h>
#include "io_S.h"
@@ -256,8 +257,9 @@ S_io_select (struct sock_user *user,
mach_msg_type_name_t reply_type,
int *select_type)
{
- const int want = *select_type;
+ const int want = *select_type | POLLERR;
int avail;
+ int ret = 0;
if (!user)
return EOPNOTSUPP;
@@ -293,12 +295,15 @@ S_io_select (struct sock_user *user,
while ((avail & want) == 0);
}
- /* We got something. */
- *select_type = avail;
+ if (avail & POLLERR)
+ ret = EIO;
+ else
+ /* We got something. */
+ *select_type = avail;
pthread_mutex_unlock (&global_lock);
- return 0;
+ return ret;
}
error_t