X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffchdir.c;h=5930940bd6f07e4cda1c8f42d2cecfc623de3a57;hb=fdf6b0ba132b0f8cfacf2ad5d31e366757c7ac34;hp=4cc0f33ce49ab1794898ab213d2a50b40e933afb;hpb=2966d0d21fdc455b705e1b477dfe7e1b37f5f8e9;p=gnulib.git diff --git a/lib/fchdir.c b/lib/fchdir.c index 4cc0f33ce..5930940bd 100644 --- a/lib/fchdir.c +++ b/lib/fchdir.c @@ -50,8 +50,8 @@ descriptor, since mingw refuses to rename any in-use file system object. */ -/* Array of file descriptors opened. If it points to a directory, it stores - info about this directory. */ +/* Array of file descriptors opened. If REPLACE_OPEN_DIRECTORY or if it points + to a directory, it stores info about this directory. */ typedef struct { char *name; /* Absolute name of the directory, or NULL. */ @@ -60,12 +60,15 @@ typedef struct static dir_info_t *dirs; static size_t dirs_allocated; -/* Try to ensure dirs has enough room for a slot at index fd. Return - false and set errno to ENOMEM on allocation failure. */ +/* Try to ensure dirs has enough room for a slot at index fd; free any + contents already in that slot. Return false and set errno to + ENOMEM on allocation failure. */ static bool ensure_dirs_slot (size_t fd) { - if (fd >= dirs_allocated) + if (fd < dirs_allocated) + free (dirs[fd].name); + else { size_t new_allocated; dir_info_t *new_dirs; @@ -213,18 +216,19 @@ _gl_directory_name (int fd) return NULL; } +#if REPLACE_OPEN_DIRECTORY /* Return stat information about FD in STATBUF. Needed when rpl_open() used a dummy file to work around an open() that can't normally visit directories. */ -#undef fstat +# undef fstat int rpl_fstat (int fd, struct stat *statbuf) { - if (REPLACE_OPEN_DIRECTORY - && 0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL) + if (0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL) return stat (dirs[fd].name, statbuf); return fstat (fd, statbuf); } +#endif /* Override opendir() and closedir(), to keep track of the open file descriptors. Needed because there is a function dirfd(). */