35 lines
		
	
	
		
			519 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			519 B
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <sys/cdefs.h>
 | |
| #include "namespace.h"
 | |
| 
 | |
| #include <errno.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| #ifdef __weak_alias
 | |
| __weak_alias(pread, _pread)
 | |
| #endif
 | |
| 
 | |
| 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;
 | |
| }
 | |
| 
 | 
