2010-02-25 18:08:08 +01:00
|
|
|
#include <lib.h>
|
|
|
|
#include <unistd.h>
|
2011-11-14 12:53:05 +01:00
|
|
|
#include <minix/u64.h>
|
|
|
|
|
|
|
|
ssize_t pread64(int fd, void *buffer, size_t nbytes, u64_t where)
|
|
|
|
{
|
|
|
|
u64_t here;
|
|
|
|
ssize_t r;
|
|
|
|
|
|
|
|
if (lseek64(fd, make64(0,0), SEEK_CUR, &here) < 0) return(-1);
|
|
|
|
if (lseek64(fd, where, SEEK_SET, NULL) < 0) return(-1);
|
|
|
|
if ((r = read(fd, buffer, nbytes)) < 0) {
|
|
|
|
int e ; errno;
|
|
|
|
lseek64(fd, here, SEEK_SET, NULL);
|
|
|
|
errno = e;
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lseek64(fd, here, SEEK_SET, NULL) < 0) return(-1);
|
|
|
|
|
|
|
|
return(r);
|
|
|
|
}
|
2010-02-25 18:08:08 +01:00
|
|
|
|
|
|
|
ssize_t pread(int fd, void *buffer, size_t nbytes, off_t where)
|
|
|
|
{
|
|
|
|
off_t here;
|
|
|
|
ssize_t r;
|
|
|
|
|
|
|
|
if((here = lseek(fd, 0, SEEK_CUR)) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if(lseek(fd, where, SEEK_SET) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if((r=read(fd, buffer, nbytes)) < 0) {
|
|
|
|
int e = errno;
|
|
|
|
lseek(fd, here, SEEK_SET);
|
|
|
|
errno = e;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(lseek(fd, here, SEEK_SET) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|