]> Zhao Yanbai Git Server - minix.git/commitdiff
VFS: fix select again
authorThomas Veerman <thomas@minix3.org>
Fri, 25 Jan 2013 17:42:36 +0000 (17:42 +0000)
committerThomas Veerman <thomas@minix3.org>
Fri, 25 Jan 2013 17:42:36 +0000 (17:42 +0000)
Change-Id: Ia5e26cdbfe38e3fb293dd57269a76b15c1fe236b

servers/vfs/pipe.c
servers/vfs/select.c

index 0ad1c471b0c6c749c04bbc3000cdd5953fd48c1e..4a61e7e754bc77c1e9bff90531d0d7f9148235aa 100644 (file)
@@ -190,10 +190,14 @@ int notouch               /* check only */
   int r = OK;
 
   /* Reads start at the beginning; writes append to pipes */
-  if (rw_flag == READING)
+  if (notouch) /* In this case we don't actually care whether data transfer
+               * would succeed. See POSIX 1003.1-2008 */
        pos = 0;
-  else
+  else if (rw_flag == READING)
+       pos = 0;
+  else {
        pos = vp->v_size;
+  }
 
   /* If reading, check for empty pipe. */
   if (rw_flag == READING) {
index d2c14e947c70817dc84db67c79b0269d931bc005..3fc08dac3d35d4d3b747a102823714ebf9ede6e5 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include "fs.h"
+#include <sys/fcntl.h>
 #include <sys/time.h>
 #include <sys/select.h>
 #include <sys/stat.h>
@@ -452,7 +453,8 @@ static int select_request_pipe(struct filp *f, int *ops, int block)
 
   if ((*ops & (SEL_RD|SEL_ERR))) {
        /* Check if we can read 1 byte */
-       err = pipe_check(f->filp_vno, READING, f->filp_flags, 1, 1 /* Check only */);
+       err = pipe_check(f->filp_vno, READING, f->filp_flags & ~O_NONBLOCK, 1,
+                        1 /* Check only */);
 
        if (err != SUSPEND)
                r |= SEL_RD;
@@ -468,7 +470,8 @@ static int select_request_pipe(struct filp *f, int *ops, int block)
 
   if ((*ops & (SEL_WR|SEL_ERR))) {
        /* Check if we can write 1 byte */
-       err = pipe_check(f->filp_vno, WRITING, f->filp_flags, 1, 1 /* Check only */);
+       err = pipe_check(f->filp_vno, WRITING, f->filp_flags & ~O_NONBLOCK, 1,
+                        1 /* Check only */);
 
        if (err != SUSPEND)
                r |= SEL_WR;