X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffchdir.c;h=5930940bd6f07e4cda1c8f42d2cecfc623de3a57;hb=fdf6b0ba132b0f8cfacf2ad5d31e366757c7ac34;hp=54bbc623dbc18e8fdfd7b0362c14823d056661b7;hpb=657fb89d3276465fcf756392f10aa268ca451136;p=gnulib.git diff --git a/lib/fchdir.c b/lib/fchdir.c index 54bbc623d..5930940bd 100644 --- a/lib/fchdir.c +++ b/lib/fchdir.c @@ -38,6 +38,7 @@ # define HAVE_CANONICALIZE_FILE_NAME 1 # else # define HAVE_CANONICALIZE_FILE_NAME 0 +# define canonicalize_file_name(name) NULL # endif #endif @@ -49,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. */ @@ -59,23 +60,26 @@ 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; new_allocated = 2 * dirs_allocated + 1; if (new_allocated <= fd) - new_allocated = fd + 1; + new_allocated = fd + 1; new_dirs = - (dirs != NULL - ? (dir_info_t *) realloc (dirs, new_allocated * sizeof *dirs) - : (dir_info_t *) malloc (new_allocated * sizeof *dirs)); + (dirs != NULL + ? (dir_info_t *) realloc (dirs, new_allocated * sizeof *dirs) + : (dir_info_t *) malloc (new_allocated * sizeof *dirs)); if (new_dirs == NULL) return false; memset (new_dirs + dirs_allocated, 0, @@ -94,19 +98,20 @@ get_name (char const *dir) if (REPLACE_OPEN_DIRECTORY || !HAVE_CANONICALIZE_FILE_NAME) { /* The function canonicalize_file_name has not yet been ported - to mingw, with all its drive letter and backslash quirks. - Fortunately, getcwd is reliable in this case, but we ensure - we can get back to where we started before using it. Treat - "." as a special case, as it is frequently encountered. */ + to mingw, with all its drive letter and backslash quirks. + Fortunately, getcwd is reliable in this case, but we ensure + we can get back to where we started before using it. Treat + "." as a special case, as it is frequently encountered. */ char *cwd = getcwd (NULL, 0); int saved_errno; if (dir[0] == '.' && dir[1] == '\0') - return cwd; + return cwd; if (chdir (cwd)) - return NULL; + return NULL; result = chdir (dir) ? NULL : getcwd (NULL, 0); saved_errno = errno; - chdir (cwd); + if (chdir (cwd)) + abort (); free (cwd); errno = saved_errno; } @@ -211,10 +216,11 @@ _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. */ -#if REPLACE_OPEN_DIRECTORY +# undef fstat int rpl_fstat (int fd, struct stat *statbuf) {