summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--lib/fchdir.c71
2 files changed, 46 insertions, 34 deletions
diff --git a/ChangeLog b/ChangeLog
index 6e92ab63c3..8800eb3395 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}