writev.c 577 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include <u.h>
  2. #include <libc.h>
  3. static
  4. long
  5. iowritev(int fd, IOchunk *io, int nio, vlong offset)
  6. {
  7. int i;
  8. long 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. p = buf;
  17. for(i=0; i<nio; i++){
  18. memmove(p, io->addr, io->len);
  19. p += io->len;
  20. io++;
  21. }
  22. tot = pwrite(fd, buf, tot, offset);
  23. free(buf);
  24. return tot;
  25. }
  26. long
  27. writev(int fd, IOchunk *io, int nio)
  28. {
  29. return iowritev(fd, io, nio, -1LL);
  30. }
  31. long
  32. pwritev(int fd, IOchunk *io, int nio, vlong off)
  33. {
  34. return iowritev(fd, io, nio, off);
  35. }