# HG changeset patch # User Paolo Bonzini # Date 1223551876 -7200 # Node ID 11748e38ea785db0be78f2c3cfee3135652914b5 # Parent 4613c2261af1d2fbfe867bc0ca1bed6e371fb6c8 Reduce code duplication. diff -r 4613c2261af1 -r 11748e38ea78 ChangeLog --- a/ChangeLog Thu Oct 09 13:20:03 2008 +0200 +++ b/ChangeLog Thu Oct 09 13:31:16 2008 +0200 @@ -1,3 +1,12 @@ +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. diff -r 4613c2261af1 -r 11748e38ea78 lib/fchdir.c --- a/lib/fchdir.c Thu Oct 09 13:20:03 2008 +0200 +++ b/lib/fchdir.c Thu Oct 09 13:31:16 2008 +0200 @@ -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,6 +75,36 @@ } } +/* Hook into the gnulib replacements for open() and close() to keep track + of the open file descriptors. */ + +void +_gl_unregister_fd (int fd) +{ + 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 @@ -83,13 +113,8 @@ { int retval = close (fd); - 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; } @@ -122,16 +147,7 @@ #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 @@ 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 @@ { 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; }