xref: /minix3/minix/lib/libc/sys/pwrite.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1 #include <sys/cdefs.h>
2 #include "namespace.h"
3 
4 #include <errno.h>
5 #include <unistd.h>
6 
7 #ifdef __weak_alias
__weak_alias(pwrite,_pwrite)8 __weak_alias(pwrite, _pwrite)
9 #endif
10 
11 ssize_t pwrite(int fd, const void *buffer, size_t nbytes, off_t where)
12 {
13 	off_t here;
14 	ssize_t w;
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((w=write(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 w;
33 }
34