xref: /plan9/sys/src/libc/9sys/readv.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 #include <u.h>
2 #include <libc.h>
3 
4 static
5 long
ioreadv(int fd,IOchunk * io,int nio,vlong offset)6 ioreadv(int fd, IOchunk *io, int nio, vlong offset)
7 {
8 	int i;
9 	long m, n, tot;
10 	char *buf, *p;
11 
12 	tot = 0;
13 	for(i=0; i<nio; i++)
14 		tot += io[i].len;
15 	buf = malloc(tot);
16 	if(buf == nil)
17 		return -1;
18 
19 	tot = pread(fd, buf, tot, offset);
20 
21 	p = buf;
22 	n = tot;
23 	for(i=0; i<nio; i++){
24 		if(n <= 0)
25 			break;
26 		m = io->len;
27 		if(m > n)
28 			m = n;
29 		memmove(io->addr, p, m);
30 		n -= m;
31 		p += m;
32 		io++;
33 	}
34 
35 	free(buf);
36 	return tot;
37 }
38 
39 long
readv(int fd,IOchunk * io,int nio)40 readv(int fd, IOchunk *io, int nio)
41 {
42 	return ioreadv(fd, io, nio, -1LL);
43 }
44 
45 long
preadv(int fd,IOchunk * io,int nio,vlong off)46 preadv(int fd, IOchunk *io, int nio, vlong off)
47 {
48 	return ioreadv(fd, io, nio, off);
49 }
50