X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=inline;f=lib%2Ffchdir.c;h=94c4e71871b830a5509830af85c8fa662a4de970;hb=ef127178789143d8a9817b81bc5c3c86fe744b50;hp=4cc0f33ce49ab1794898ab213d2a50b40e933afb;hpb=2966d0d21fdc455b705e1b477dfe7e1b37f5f8e9;p=gnulib.git diff --git a/lib/fchdir.c b/lib/fchdir.c index 4cc0f33ce..94c4e7187 100644 --- a/lib/fchdir.c +++ b/lib/fchdir.c @@ -1,5 +1,5 @@ /* fchdir replacement. - Copyright (C) 2006-2009 Free Software Foundation, Inc. + Copyright (C) 2006-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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; @@ -165,10 +168,7 @@ _gl_register_fd (int fd, const char *filename) and fcntl. Both arguments must be valid and distinct file descriptors. Close NEWFD and return -1 if OLDFD is tracking a directory, but there is insufficient memory to track the same - directory in NEWFD; otherwise return NEWFD. - - FIXME: Need to implement rpl_fcntl in gnulib, and have it call - this. */ + directory in NEWFD; otherwise return NEWFD. */ int _gl_register_dup (int oldfd, int newfd) { @@ -213,18 +213,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(). */