diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2007-12-22 13:26:47 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2007-12-22 13:26:47 +0000 |
commit | 04cb518d64b68cc33024f33e5227d49ccf1afbf5 (patch) | |
tree | ea36f719bfbf0732df85de6ca199572569a313c1 /winsup/cygwin/fhandler_random.cc | |
parent | ec62ba9577e69bbecd6e8bfc20e5b9b049ed654d (diff) | |
download | cygnal-04cb518d64b68cc33024f33e5227d49ccf1afbf5.tar.gz cygnal-04cb518d64b68cc33024f33e5227d49ccf1afbf5.tar.bz2 cygnal-04cb518d64b68cc33024f33e5227d49ccf1afbf5.zip |
* fhandler.h (class fhandler_dev_random): Add dummy_offset member.
* fhandler_random.cc (fhandler_dev_random::lseek): Fake seeking
capability as on Linux.
Diffstat (limited to 'winsup/cygwin/fhandler_random.cc')
-rw-r--r-- | winsup/cygwin/fhandler_random.cc | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/winsup/cygwin/fhandler_random.cc b/winsup/cygwin/fhandler_random.cc index eecbe65bf..b8784b075 100644 --- a/winsup/cygwin/fhandler_random.cc +++ b/winsup/cygwin/fhandler_random.cc @@ -12,6 +12,7 @@ details. */ #include "winsup.h" #include <limits.h> +#include <unistd.h> #include "cygerrno.h" #include "security.h" #include "path.h" @@ -34,6 +35,7 @@ fhandler_dev_random::open (int flags, mode_t) set_flags ((flags & ~O_TEXT) | O_BINARY); nohandle (true); set_open_status (); + dummy_offset = 0; return 1; } @@ -140,9 +142,31 @@ fhandler_dev_random::read (void *ptr, size_t& len) } _off64_t -fhandler_dev_random::lseek (_off64_t, int) +fhandler_dev_random::lseek (_off64_t off, int whence) { - return 0; + /* As on Linux, fake being able to set an offset. The fact that neither + reading nor writing changes the dummy offset is also the same as on + Linux (tested with kernel 2.6.23). */ + _off64_t new_off; + + switch (whence) + { + case SEEK_SET: + new_off = off; + break; + case SEEK_CUR: + new_off = dummy_offset + off; + break; + default: + set_errno (EINVAL); + return (_off64_t) -1; + } + if (new_off < 0) + { + set_errno (EINVAL); + return (_off64_t) -1; + } + return dummy_offset = new_off; } int |