diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | lib/fchdir.c | 71 |
2 files changed, 46 insertions, 34 deletions
@@ -1,4 +1,13 @@ 2008-10-09 Paolo Bonzini <bonzini@gnu.org> + Bruno Haible <bruno@clisp.org> + + * lib/fchdir.c (_gl_unregister_fd): New functions, extracted from + rpl_close. + (_gl_register_fd): New function, extracted from rpl_open. + (rpl_close, rpl_closedir): Use _gl_unregister_fd. + (rpl_open, rpl_opendir): Use _gl_register_fd. + +2008-10-09 Paolo Bonzini <bonzini@gnu.org> Fix organization of 'open' replacement. * m4/open.m4 (gl_REPLACE_OPEN): New macro. diff --git a/lib/fchdir.c b/lib/fchdir.c index 246987c886..7a30448fb0 100644 --- a/lib/fchdir.c +++ b/lib/fchdir.c @@ -1,5 +1,5 @@ /* fchdir replacement. - Copyright (C) 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2006-2008 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 @@ -75,21 +75,46 @@ ensure_dirs_slot (size_t fd) } } -/* Override open() and close(), to keep track of the open file descriptors. */ +/* Hook into the gnulib replacements for open() and close() to keep track + of the open file descriptors. */ -int -rpl_close (int fd) -#undef close +void +_gl_unregister_fd (int fd) { - int retval = close (fd); - - if (retval >= 0 && fd >= 0 && fd < dirs_allocated) + if (fd >= 0 && fd < dirs_allocated) { if (dirs[fd].name != NULL) free (dirs[fd].name); dirs[fd].name = NULL; dirs[fd].saved_errno = ENOTDIR; } +} + +void +_gl_register_fd (int fd, const char *filename) +{ + struct stat statbuf; + + ensure_dirs_slot (fd); + if (fd < dirs_allocated + && fstat (fd, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode)) + { + dirs[fd].name = canonicalize_file_name (filename); + if (dirs[fd].name == NULL) + dirs[fd].saved_errno = errno; + } +} + +/* Override open() and close(), to keep track of the open file descriptors. */ + +int +rpl_close (int fd) +#undef close +{ + int retval = close (fd); + + if (retval >= 0) + _gl_unregister_fd (fd); return retval; } @@ -122,16 +147,7 @@ rpl_open (const char *filename, int flags, ...) #endif fd = open (filename, flags, mode); if (fd >= 0) - { - ensure_dirs_slot (fd); - if (fd < dirs_allocated - && fstat (fd, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode)) - { - dirs[fd].name = canonicalize_file_name (filename); - if (dirs[fd].name == NULL) - dirs[fd].saved_errno = errno; - } - } + _gl_register_fd (fd, filename); return fd; } @@ -145,13 +161,8 @@ rpl_closedir (DIR *dp) int fd = dirfd (dp); int retval = closedir (dp); - if (retval >= 0 && fd >= 0 && fd < dirs_allocated) - { - if (dirs[fd].name != NULL) - free (dirs[fd].name); - dirs[fd].name = NULL; - dirs[fd].saved_errno = ENOTDIR; - } + if (retval >= 0) + _gl_unregister_fd (fd); return retval; } @@ -166,15 +177,7 @@ rpl_opendir (const char *filename) { int fd = dirfd (dp); if (fd >= 0) - { - ensure_dirs_slot (fd); - if (fd < dirs_allocated) - { - dirs[fd].name = canonicalize_file_name (filename); - if (dirs[fd].name == NULL) - dirs[fd].saved_errno = errno; - } - } + _gl_register_fd (fd, filename); } return dp; } |