Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-12-14 18:54:33 +0300
committerCorinna Vinschen <corinna@vinschen.de>2005-12-14 18:54:33 +0300
commite3d14af155fb84890a32fad7f7706967ac5bc7d9 (patch)
tree05df3064a2c24a1542e182a3aa2d5ff4e3df8f56 /winsup/cygwin/fhandler_raw.cc
parent10cba930d401056aed4b2fb360b5e084d61ecabb (diff)
* fhandler.cc (fhandler_base::open_9x): Handle O_SYNC and O_DIRECT
flags. (fhandler_base::open): Ditto. * fhandler_floppy.cc (fhandler_dev_floppy::open): Don't allocate devbuf in O_DIRECT case. * fhandler_raw.cc (fhandler_dev_raw::ioctl): Don't allow buffer changes in O_DIRECT case. Allow returning a buffer size 0, which indicates O_DIRECT. * fhandler_tape.cc (fhandler_dev_tape::open): Use O_SYNC flag to hand down the !buffer_writes case. Don't allocate devbuf in O_DIRECT case. (fhandler_dev_tape::raw_read): Don't mess with devbuf if it's NULL. * include/fcntl.h: Define _FDIRECT, O_DIRECT, O_DSYNC and O_RSYNC. * include/cygwin/version.h: Bump API minor version.
Diffstat (limited to 'winsup/cygwin/fhandler_raw.cc')
-rw-r--r--winsup/cygwin/fhandler_raw.cc8
1 files changed, 5 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc
index 00d023e7e..0cfb51e6c 100644
--- a/winsup/cygwin/fhandler_raw.cc
+++ b/winsup/cygwin/fhandler_raw.cc
@@ -159,12 +159,14 @@ fhandler_dev_raw::ioctl (unsigned int cmd, void *buf)
}
else if ((devbuf && ((op->rd_parm <= 1 && (devbufend - devbufstart))
|| op->rd_parm < devbufend - devbufstart))
- || (op->rd_parm > 1 && (op->rd_parm % 512)))
+ || (op->rd_parm > 1 && (op->rd_parm % 512))
+ || (get_flags () & O_DIRECT))
/* The conditions for a *valid* parameter are these:
- If there's still data in the current buffer, it must
fit in the new buffer.
- The new size is either 0 or 1, both indicating unbufferd
- I/O, or the new buffersize must be a multiple of 512. */
+ I/O, or the new buffersize must be a multiple of 512.
+ - In the O_DIRECT case, the whole request is invalid. */
ret = ERROR_INVALID_PARAMETER;
else if (!devbuf || op->rd_parm != devbufsiz)
{
@@ -198,7 +200,7 @@ fhandler_dev_raw::ioctl (unsigned int cmd, void *buf)
if (!get)
ret = ERROR_INVALID_PARAMETER;
else
- get->bufsiz = devbufsiz ?: 1L;
+ get->bufsiz = devbufsiz;
}
else
return fhandler_base::ioctl (cmd, buf);