X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Fdirent.c;h=bc1b3e238e16730ad5113258b05eb174ec214b6f;hb=01df432af43ed3dd9a225b13e0ebcce9a8a34a5a;hp=d0d73dc5243e0e57a877521fd97928ba988d0024;hpb=c5a868627ae20dbf597bb9ab6d8bcd64ac16cac0;p=mono.git diff --git a/support/dirent.c b/support/dirent.c index d0d73dc5243..bc1b3e238e1 100644 --- a/support/dirent.c +++ b/support/dirent.c @@ -11,13 +11,25 @@ #include #include #include +#include #include #include "map.h" #include "mph.h" +#if defined (PATH_MAX) && defined (NAME_MAX) + #define MPH_PATH_MAX MAX(PATH_MAX, NAME_MAX) +#elif defined (PATH_MAX) + #define MPH_PATH_MAX PATH_MAX +#elif defined (NAME_MAX) + #define MPH_PATH_MAX NAME_MAX +#else /* !defined PATH_MAX && !defined NAME_MAX */ + #define MPH_PATH_MAX 2048 +#endif + G_BEGIN_DECLS +#if HAVE_SEEKDIR gint32 Mono_Posix_Syscall_seekdir (void *dir, mph_off_t offset) { @@ -27,12 +39,15 @@ Mono_Posix_Syscall_seekdir (void *dir, mph_off_t offset) return 0; } +#endif /* def HAVE_SEEKDIR */ +#if HAVE_TELLDIR mph_off_t Mono_Posix_Syscall_telldir (void *dir) { return telldir ((DIR*) dir); } +#endif /* def HAVE_TELLDIR */ static void copy_dirent (struct Mono_Posix_Syscall__Dirent *to, struct dirent *from) @@ -63,6 +78,7 @@ Mono_Posix_Syscall_readdir (void *dirp, struct Mono_Posix_Syscall__Dirent *entry return -1; } + errno = 0; d = readdir (dirp); if (d == NULL) { @@ -77,15 +93,17 @@ Mono_Posix_Syscall_readdir (void *dirp, struct Mono_Posix_Syscall__Dirent *entry gint32 Mono_Posix_Syscall_readdir_r (void *dirp, struct Mono_Posix_Syscall__Dirent *entry, void **result) { - struct dirent _entry; + struct dirent *_entry = malloc (sizeof (struct dirent) + MPH_PATH_MAX + 1); int r; - r = readdir_r (dirp, &_entry, (struct dirent**) result); + r = readdir_r (dirp, _entry, (struct dirent**) result); - if (r == 0 && result != NULL) { - copy_dirent (entry, &_entry); + if (r == 0 && *result != NULL) { + copy_dirent (entry, _entry); } + free (_entry); + return r; }