xref: /minix/minix/lib/libc/sys/pread.c (revision 7f5f010b)
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