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