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