1/*
2** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3** Distributed under the terms of the Haiku License.
4*/
5
6
7#include <syscalls.h>
8
9#include <sys/uio.h>
10#include <errno.h>
11
12#include <errno_private.h>
13
14
15#define RETURN_AND_SET_ERRNO(err) \
16	if (err < 0) { \
17		__set_errno(err); \
18		return -1; \
19	} \
20	return err;
21
22
23ssize_t
24readv(int fd, const struct iovec *vecs, size_t count)
25{
26	ssize_t bytes = _kern_readv(fd, -1, vecs, count);
27
28	RETURN_AND_SET_ERRNO(bytes);
29}
30
31
32ssize_t
33readv_pos(int fd, off_t pos, const struct iovec *vecs, size_t count)
34{
35	ssize_t bytes;
36	if (pos < 0) {
37		__set_errno(B_BAD_VALUE);
38		return -1;
39	}
40	bytes = _kern_readv(fd, pos, vecs, count);
41
42	RETURN_AND_SET_ERRNO(bytes);
43}
44
45
46ssize_t
47writev(int fd, const struct iovec *vecs, size_t count)
48{
49	ssize_t bytes = _kern_writev(fd, -1, vecs, count);
50
51	RETURN_AND_SET_ERRNO(bytes);
52}
53
54
55ssize_t
56writev_pos(int fd, off_t pos, const struct iovec *vecs, size_t count)
57{
58	ssize_t bytes;
59	if (pos < 0) {
60		__set_errno(B_BAD_VALUE);
61		return -1;
62	}
63	bytes = _kern_writev(fd, pos, vecs, count);
64
65	RETURN_AND_SET_ERRNO(bytes);
66}
67
68