close.c 545 B

12345678910111213141516171819202122232425262728293031323334
  1. #include "lib.h"
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <errno.h>
  5. #include "sys9.h"
  6. int
  7. close(int d)
  8. {
  9. int n;
  10. Fdinfo *f;
  11. n = -1;
  12. f = &_fdinfo[d];
  13. if(d<0 || d>=OPEN_MAX || !(f->flags&FD_ISOPEN))
  14. errno = EBADF;
  15. else{
  16. if(f->flags&(FD_BUFFERED|FD_BUFFEREDX)) {
  17. if(f->flags&FD_BUFFERED)
  18. _closebuf(d);
  19. f->flags &= ~FD_BUFFERED;
  20. }
  21. n = _CLOSE(d);
  22. if(n < 0)
  23. _syserrno();
  24. _fdinfo[d].flags = 0;
  25. _fdinfo[d].oflags = 0;
  26. if(_fdinfo[d].name){
  27. free(_fdinfo[d].name);
  28. _fdinfo[d].name = 0;
  29. }
  30. }
  31. return n;
  32. }