readdir.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* $OpenBSD: readdir.c,v 1.9 2014/11/19 20:28:56 miod Exp $ */
  2. /*
  3. * Copyright (c) 1996 Michael Shalayeff
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. * 1. Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  16. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  17. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  19. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. * SUCH DAMAGE.
  26. *
  27. */
  28. #ifndef NO_READDIR
  29. #include <sys/types.h>
  30. #include <sys/stat.h>
  31. #define _KERNEL
  32. #include <sys/fcntl.h>
  33. #undef _KERNEL
  34. #include "stand.h"
  35. int
  36. opendir(const char *name)
  37. {
  38. struct stat sb;
  39. int fd;
  40. if (stat(name, &sb) < 0)
  41. return -1;
  42. if (!S_ISDIR(sb.st_mode)) {
  43. errno = ENOTDIR;
  44. return -1;
  45. }
  46. /* XXX rewind needed for some dirs */
  47. #ifdef __INTERNAL_LIBSA_CREAD
  48. if ((fd = oopen(name, O_RDONLY)) >= 0)
  49. olseek(fd, 0, 0);
  50. #else
  51. if ((fd = open(name, O_RDONLY)) >= 0)
  52. lseek(fd, 0, SEEK_SET);
  53. #endif
  54. return fd;
  55. }
  56. int
  57. readdir(int fd, char *dest)
  58. {
  59. struct open_file *f = &files[fd];
  60. if (fd < 0 || fd >= SOPEN_MAX ||
  61. !((f = &files[fd])->f_flags & F_READ)) {
  62. errno = EBADF;
  63. return (-1);
  64. }
  65. if (f->f_flags & F_RAW) {
  66. errno = EOPNOTSUPP;
  67. return (-1);
  68. }
  69. if ((errno = (f->f_ops->readdir)(f, dest)))
  70. return (-1);
  71. return 0;
  72. }
  73. void
  74. closedir(int fd)
  75. {
  76. #ifdef __INTERNAL_LIBSA_CREAD
  77. oclose(fd);
  78. #else
  79. close(fd);
  80. #endif
  81. }
  82. #endif /* NO_READDIR */