Mail Archives: cygwin/2003/06/26/06:10:48
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/
- Raw text -