xref: /freebsd/contrib/file/src/pread.c (revision 898496ee09ed2b7d25f6807edc4515628196ec0a)
1b6cee71dSXin LI #include "file.h"
2b6cee71dSXin LI #ifndef lint
3*898496eeSXin LI FILE_RCSID("@(#)$File: pread.c,v 1.5 2022/09/24 20:30:13 christos Exp $")
4b6cee71dSXin LI #endif  /* lint */
5b6cee71dSXin LI #include <fcntl.h>
6b6cee71dSXin LI #include <unistd.h>
7b6cee71dSXin LI 
8b6cee71dSXin LI ssize_t
pread(int fd,void * buf,size_t len,off_t off)9b6cee71dSXin LI pread(int fd, void *buf, size_t len, off_t off) {
10c2931133SXin LI 	off_t old;
11c2931133SXin LI 	ssize_t rv;
12c2931133SXin LI 
13c2931133SXin LI 	if ((old = lseek(fd, off, SEEK_SET)) == -1)
14b6cee71dSXin LI 		return -1;
15b6cee71dSXin LI 
16c2931133SXin LI 	if ((rv = read(fd, buf, len)) == -1)
17c2931133SXin LI 		return -1;
18c2931133SXin LI 
19c2931133SXin LI 	if (lseek(fd, old, SEEK_SET) == -1)
20c2931133SXin LI 		return -1;
21c2931133SXin LI 
22c2931133SXin LI 	return rv;
23b6cee71dSXin LI }
24