From: Paolo Bonzini Date: Thu, 9 Oct 2008 11:31:16 +0000 (+0200) Subject: Reduce code duplication. X-Git-Tag: v0.1~6876 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=1e60b920564d9b30c65c53553a4293b1c76863d8;p=gnulib.git Reduce code duplication. --- diff --git a/ChangeLog b/ChangeLog index 6e92ab63c..8800eb339 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,13 @@ 2008-10-09 Paolo Bonzini + Bruno Haible + + * 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 Fix organization of 'open' replacement. * m4/open.m4 (gl_REPLACE_OPEN): New macro. diff --git a/lib/fchdir.c b/lib/fchdir.c index 246987c88..7a30448fb 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; }