On Tue, 2003-10-21 at 11:50, Andreas Jaekel wrote:
that's a bit annoying since either you have to do it always (unnecessary nearly always) or add some extra kludgy checks. You could also be just reading with mmap() or pread() but I'm not sure if it's a good idea to rely on them either.
Well, always seeking on input and output works, (I tried) except it breaks APPEND, which reads from a socket, which fails seeking, which I have no clean way of knowing since it's all hidden behind the stream wrappers.
There's fstream->file which tells if it's a regular file :)
I think a clean way may be to change the stream wrappers so they remember which streams are dup()s of other streams.
They're not dup()ed, they just use the same file descriptors. But .. hmm. that would be possible, but that's still quite a lot of code for cases which are rarely needed..
Another possible solution is to change output to always use pwrite(), avoiding the need for seeks completly.
Changing ostream to use pwrite() would require replacing the one writev() call too with multiple pwrite()s, not nice .. :) How about: diff -u -r1.9 istream-file.c --- istream-file.c 26 Aug 2003 21:18:16 -0000 1.9 +++ istream-file.c 21 Oct 2003 10:11:25 -0000 @@ -2,6 +2,8 @@ /* @UNSAFE: whole file */ +#define _XOPEN_SOURCE 500 /* for pread() / Linux */ + #include "lib.h" #include "alarm-hup.h" #include "istream-internal.h" @@ -169,7 +171,15 @@ return -1; } - ret = read(stream->fd, stream->w_buffer + stream->pos, size); + if (fstream->file) { + ret = pread(stream->fd, + stream->w_buffer + stream->pos, size, + stream->istream.start_offset + + stream->istream.v_offset); + } else { + ret = read(stream->fd, + stream->w_buffer + stream->pos, size); + } if (ret == 0) { /* EOF */ stream->istream.stream_errno = 0;