Mail Archives: cygwin/2003/06/26/08:26:36
Ah, yes, "the file offset is not changed".. I forgot about that..
Thanks for correcting me :)
rlc
On Thu, 26 Jun 2003, Brian Dessent wrote:
> Ronald Landheer-Cieslak wrote:
> >
> > pread and pwrite are not in Cygwin (or at least are not exported by
> > cygwin1.dll). They are hardly the most portable functions in the world. I
> > suggest you write a wrapper. Something like:
> >
> > <UNTESTED CODE>
> > ssize_t pread(int fd, void *buf, size_t count, off_t offset)
> > {
> > if (lseek(fd, offset, SEEK_SET) == (off_t)-1)
> > {
> > return(-1);
> > }
> > return(read(fd, buf, count));
> > }
> >
> > and
> > ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
> > {
> > if (lseek(fd, offset, SEEK_SET) == (off_t)-1)
> > {
> > return(-1);
> > }
> > return(write(fd, buf, count));
> > }
> > </UNTESTED CODE>
>
> You'll want to save the original file position and restore it after the
> operation, e.g.
>
> ssize_t
> pread(int fd, void *p, size_t n, off_t off)
> {
> off_t ooff;
> int oerrno;
>
> if ((ooff = lseek(fd, off, SEEK_SET)) == -1)
> return -1;
>
> n = read(fd, p, n);
>
> oerrno = errno;
> lseek(fd, ooff, SEEK_SET);
> errno = oerrno;
>
> return n;
> }
>
> ssize_t
> pwrite(int fd, const void *p, size_t n, off_t off)
> {
> off_t ooff;
> int oerrno;
>
> if ((ooff = lseek(fd, off, SEEK_SET)) == -1)
> return -1;
>
> n = write(fd, p, n);
>
> oerrno = errno;
> lseek(fd, ooff, SEEK_SET);
> errno = oerrno;
>
> return n;
> }
>
> --
> Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
> Problem reports: http://cygwin.com/problems.html
> Documentation: http://cygwin.com/docs.html
> FAQ: http://cygwin.com/faq/
>
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -