From e7cfbde4fc1a29fa5edad3a526802d8281acfa10 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Fri, 6 Jun 2008 14:43:19 +0200 Subject: [PATCH] Move and rename para_opendir(). --- fd.c | 64 ----------------------------------------------------- fd.h | 1 - fsck.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 67 deletions(-) diff --git a/fd.c b/fd.c index 17d5665..0dc3f29 100644 --- a/fd.c +++ b/fd.c @@ -118,70 +118,6 @@ out: return ret; } -/** - * Wrapper for chdir(2). - * - * \param path The specified directory. - * - * \return Standard. - */ -_static_inline_ int __chdir(const char *path) -{ - if (chdir(path) >= 0) - return 1; - return -ERRNO_TO_ERROR(errno); -} - -/** - * Save the cwd and open a given directory. - * - * \param dirname Path to the directory to open. - * \param dir Result pointer. - * \param cwd File descriptor of the current working directory. - * - * \return Standard. - * - * Opening the current directory (".") and calling fchdir() to return is - * usually faster and more reliable than saving cwd in some buffer and calling - * chdir() afterwards. - * - * If \a cwd is not \p NULL "." is opened and the resulting file descriptor is - * stored in \a cwd. If the function returns success, and \a cwd is not \p - * NULL, the caller must close this file descriptor (probably after calling - * fchdir(*cwd)). - * - * On errors, the function undos everything, so the caller needs neither close - * any files, nor change back to the original working directory. - * - * \sa getcwd(3). - * - */ -int para_opendir(const char *dirname, DIR **dir, int *cwd) -{ - int ret; - - if (cwd) { - ret = osl_open(".", O_RDONLY, 0); - if (ret < 0) - return ret; - *cwd = ret; - } - ret = __chdir(dirname); - if (ret < 0) - goto close_cwd; - *dir = opendir("."); - if (*dir) - return 1; - ret = -ERRNO_TO_ERROR(errno); -/* Ignore return value of fchdir() and close(). We're busted anyway. */ - if (cwd) - fchdir(*cwd); -close_cwd: - if (cwd) - close(*cwd); - return ret; -} - /** * Open a file and map it into memory. * diff --git a/fd.h b/fd.h index 45d08b3..536e3c8 100644 --- a/fd.h +++ b/fd.h @@ -7,7 +7,6 @@ /** \file fd.h exported symbols from fd.c */ int osl_open(const char *path, int flags, mode_t mode); -int para_opendir(const char *dirname, DIR **dir, int *cwd); int mmap_full_file(const char *filename, int open_mode, void **map, size_t *size, int *fd_ptr); int osl_munmap(void *start, size_t length); diff --git a/fsck.c b/fsck.c index b5e4fdb..6f13671 100644 --- a/fsck.c +++ b/fsck.c @@ -222,6 +222,72 @@ static inline int __fchdir(int fd) return 1; } +/** + * Wrapper for chdir(2). + * + * \param path The specified directory. + * + * \return Standard. + */ +_static_inline_ int __chdir(const char *path) +{ + if (chdir(path) >= 0) + return 1; + return -ERRNO_TO_ERROR(errno); +} + +/** + * Save the cwd and open a given directory. + * + * \param dirname Path to the directory to open. + * \param dir Result pointer. + * \param cwd File descriptor of the current working directory. + * + * \return Standard. + * + * Opening the current directory (".") and calling fchdir() to return is + * usually faster and more reliable than saving cwd in some buffer and calling + * chdir() afterwards. + * + * If \a cwd is not \p NULL "." is opened and the resulting file descriptor is + * stored in \a cwd. If the function returns success, and \a cwd is not \p + * NULL, the caller must close this file descriptor (probably after calling + * fchdir(*cwd)). + * + * On errors, the function undos everything, so the caller needs neither close + * any files, nor change back to the original working directory. + * + * \sa getcwd(3). + * + */ +static int fsck_opendir(const char *dirname, DIR **dir, int *cwd) +{ + int ret; + + if (cwd) { + ret = osl_open(".", O_RDONLY, 0); + if (ret < 0) + return ret; + *cwd = ret; + } + ret = __chdir(dirname); + if (ret < 0) + goto close_cwd; + *dir = opendir("."); + if (*dir) + return 1; + ret = -ERRNO_TO_ERROR(errno); +/* Ignore return value of fchdir() and close(). We're busted anyway. */ + if (cwd) + fchdir(*cwd); +close_cwd: + if (cwd) + close(*cwd); + return ret; +} + + + /** * Traverse the given directory recursively. * @@ -241,7 +307,7 @@ static int for_each_file_in_dir(const char *dirname, { DIR *dir; struct dirent *entry; - int cwd_fd, ret2, ret = para_opendir(dirname, &dir, &cwd_fd); + int cwd_fd, ret2, ret = fsck_opendir(dirname, &dir, &cwd_fd); if (ret < 0) return ret == -ERRNO_TO_ERROR(EACCES)? 1 : ret; @@ -1119,7 +1185,7 @@ static int check_all_tables(char *db_dir) { DIR *dir; struct dirent *entry; - int cwd_fd, ret2, ret = para_opendir(db_dir, &dir, &cwd_fd); + int cwd_fd, ret2, ret = fsck_opendir(db_dir, &dir, &cwd_fd); if (ret < 0) return ret; -- 2.39.5