readv.c 645 B

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