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