dirent.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * <dirent.h> wrapper functions.
  3. *
  4. * Authors:
  5. * Jonathan Pryor ([email protected])
  6. *
  7. * Copyright (C) 2004-2005 Jonathan Pryor
  8. */
  9. #include <dirent.h>
  10. #include <errno.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13. #include <limits.h>
  14. #include <unistd.h>
  15. #include "map.h"
  16. #include "mph.h"
  17. #if defined (PATH_MAX) && defined (NAME_MAX)
  18. #define MPH_PATH_MAX MAX(PATH_MAX, NAME_MAX)
  19. #elif defined (PATH_MAX)
  20. #define MPH_PATH_MAX PATH_MAX
  21. #elif defined (NAME_MAX)
  22. #define MPH_PATH_MAX NAME_MAX
  23. #else /* !defined PATH_MAX && !defined NAME_MAX */
  24. #define MPH_PATH_MAX 2048
  25. #endif
  26. G_BEGIN_DECLS
  27. gint32
  28. Mono_Posix_Syscall_seekdir (void *dir, mph_off_t offset)
  29. {
  30. mph_return_if_off_t_overflow (offset);
  31. seekdir ((DIR*) dir, (off_t) offset);
  32. return 0;
  33. }
  34. mph_off_t
  35. Mono_Posix_Syscall_telldir (void *dir)
  36. {
  37. return telldir ((DIR*) dir);
  38. }
  39. static void
  40. copy_dirent (struct Mono_Posix_Syscall__Dirent *to, struct dirent *from)
  41. {
  42. memset (to, 0, sizeof(*to));
  43. to->d_ino = from->d_ino;
  44. to->d_name = strdup (from->d_name);
  45. #ifdef HAVE_STRUCT_DIRENT_D_OFF
  46. to->d_off = from->d_off;
  47. #endif
  48. #ifdef HAVE_STRUCT_DIRENT_D_RECLEN
  49. to->d_reclen = from->d_reclen;
  50. #endif
  51. #ifdef HAVE_STRUCT_DIRENT_D_TYPE
  52. to->d_type = from->d_type;
  53. #endif
  54. }
  55. gint32
  56. Mono_Posix_Syscall_readdir (void *dirp, struct Mono_Posix_Syscall__Dirent *entry)
  57. {
  58. struct dirent *d;
  59. if (entry == NULL) {
  60. errno = EFAULT;
  61. return -1;
  62. }
  63. d = readdir (dirp);
  64. if (d == NULL) {
  65. return -1;
  66. }
  67. copy_dirent (entry, d);
  68. return 0;
  69. }
  70. gint32
  71. Mono_Posix_Syscall_readdir_r (void *dirp, struct Mono_Posix_Syscall__Dirent *entry, void **result)
  72. {
  73. struct dirent *_entry = malloc (sizeof (struct dirent) + MPH_PATH_MAX + 1);
  74. int r;
  75. r = readdir_r (dirp, _entry, (struct dirent**) result);
  76. if (r == 0 && *result != NULL) {
  77. copy_dirent (entry, _entry);
  78. }
  79. free (_entry);
  80. return r;
  81. }
  82. int
  83. Mono_Posix_Syscall_rewinddir (void* dir)
  84. {
  85. rewinddir (dir);
  86. return 0;
  87. }
  88. G_END_DECLS
  89. /*
  90. * vim: noexpandtab
  91. */