read.c 767 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <errno.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4. #include "lib.h"
  5. #include "sys9.h"
  6. #include <stdio.h>
  7. ssize_t
  8. read(int d, void *buf, size_t nbytes)
  9. {
  10. int n, noblock, isbuf;
  11. Fdinfo *f;
  12. if(d<0 || d>=OPEN_MAX || !((f = &_fdinfo[d])->flags&FD_ISOPEN)){
  13. errno = EBADF;
  14. return -1;
  15. }
  16. if(nbytes <= 0)
  17. return 0;
  18. if(buf == 0){
  19. errno = EFAULT;
  20. return -1;
  21. }
  22. f = &_fdinfo[d];
  23. noblock = f->oflags&O_NONBLOCK;
  24. isbuf = f->flags&(FD_BUFFERED|FD_BUFFEREDX);
  25. if(noblock || isbuf){
  26. if(f->flags&FD_BUFFEREDX) {
  27. errno = EIO;
  28. return -1;
  29. }
  30. if(!isbuf) {
  31. if(_startbuf(d) != 0) {
  32. errno = EIO;
  33. return -1;
  34. }
  35. }
  36. n = _readbuf(d, buf, nbytes, noblock);
  37. }else{
  38. n = _READ(d, buf, nbytes);
  39. if(n < 0)
  40. _syserrno();
  41. }
  42. return n;
  43. }