1 #include <sys/cdefs.h> 2 #include "namespace.h" 3 4 #include <errno.h> 5 #include <unistd.h> 6 7 #ifdef __weak_alias 8 __weak_alias(pread, _pread) 9 #endif 10 11 ssize_t pread(int fd, void *buffer, size_t nbytes, off_t where) 12 { 13 off_t here; 14 ssize_t r; 15 16 if((here = lseek(fd, 0, SEEK_CUR)) < 0) 17 return -1; 18 19 if(lseek(fd, where, SEEK_SET) < 0) 20 return -1; 21 22 if((r=read(fd, buffer, nbytes)) < 0) { 23 int e = errno; 24 lseek(fd, here, SEEK_SET); 25 errno = e; 26 return -1; 27 } 28 29 if(lseek(fd, here, SEEK_SET) < 0) 30 return -1; 31 32 return r; 33 } 34 35