dir-posix.cpp revision 078be063a5450fff88881d9e194befe904d4e4e4
af84459fbf938e508fd10b01cb8d699c79083813takashi/* $Id$ */
af84459fbf938e508fd10b01cb8d699c79083813takashi/** @file
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd * IPRT - Directory manipulation, POSIX.
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd */
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd
af84459fbf938e508fd10b01cb8d699c79083813takashi/*
af84459fbf938e508fd10b01cb8d699c79083813takashi * Copyright (C) 2006-2010 Oracle Corporation
af84459fbf938e508fd10b01cb8d699c79083813takashi *
af84459fbf938e508fd10b01cb8d699c79083813takashi * This file is part of VirtualBox Open Source Edition (OSE), as
96ad5d81ee4a2cc66a4ae19893efc8aa6d06fae7jailletc * available from http://www.virtualbox.org. This file is free software;
af84459fbf938e508fd10b01cb8d699c79083813takashi * you can redistribute it and/or modify it under the terms of the GNU
af84459fbf938e508fd10b01cb8d699c79083813takashi * General Public License (GPL) as published by the Free Software
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * Foundation, in version 2 as it comes in the "COPYING" file of the
2e545ce2450a9953665f701bb05350f0d3f26275nd * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen *
af84459fbf938e508fd10b01cb8d699c79083813takashi * The contents of this file may alternatively be used under the terms
af84459fbf938e508fd10b01cb8d699c79083813takashi * of the Common Development and Distribution License Version 1.0
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
3f08db06526d6901aa08c110b5bc7dde6bc39905nd * VirtualBox OSE distribution, in which case the provisions of the
af84459fbf938e508fd10b01cb8d699c79083813takashi * CDDL are applicable instead of those of the GPL.
af84459fbf938e508fd10b01cb8d699c79083813takashi *
af84459fbf938e508fd10b01cb8d699c79083813takashi * You may elect to license modified versions of this file under the
3f08db06526d6901aa08c110b5bc7dde6bc39905nd * terms and conditions of either the GPL or the CDDL or both.
af84459fbf938e508fd10b01cb8d699c79083813takashi */
af84459fbf938e508fd10b01cb8d699c79083813takashi
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung
af84459fbf938e508fd10b01cb8d699c79083813takashi/*******************************************************************************
0a05fab9aadd37834734ffe106fc8ad4488fb3e3rbowen* Header Files *
0a05fab9aadd37834734ffe106fc8ad4488fb3e3rbowen*******************************************************************************/
af84459fbf938e508fd10b01cb8d699c79083813takashi#define LOG_GROUP RTLOGGROUP_DIR
af84459fbf938e508fd10b01cb8d699c79083813takashi#include <errno.h>
af84459fbf938e508fd10b01cb8d699c79083813takashi#include <unistd.h>
af84459fbf938e508fd10b01cb8d699c79083813takashi#include <sys/types.h>
3c13a815670b54d1c17bf02954f7d2b066cde95cnd#include <sys/stat.h>
3c13a815670b54d1c17bf02954f7d2b066cde95cnd#include <sys/fcntl.h>
2d39a41e98476f5235b7c37ce745a4aa0904b1cbrbowen#include <fcntl.h>
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#include <dirent.h>
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#include <stdio.h>
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#include <iprt/dir.h>
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#include "internal/iprt.h"
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#include <iprt/alloca.h>
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen#include <iprt/assert.h>
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#include <iprt/err.h>
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#include <iprt/log.h>
af84459fbf938e508fd10b01cb8d699c79083813takashi#include <iprt/mem.h>
af84459fbf938e508fd10b01cb8d699c79083813takashi#include <iprt/param.h>
af84459fbf938e508fd10b01cb8d699c79083813takashi#include <iprt/path.h>
af84459fbf938e508fd10b01cb8d699c79083813takashi#include <iprt/string.h>
af84459fbf938e508fd10b01cb8d699c79083813takashi#include "internal/dir.h"
af84459fbf938e508fd10b01cb8d699c79083813takashi#include "internal/fs.h"
af84459fbf938e508fd10b01cb8d699c79083813takashi#include "internal/path.h"
af84459fbf938e508fd10b01cb8d699c79083813takashi
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen#if !defined(RT_OS_SOLARIS)
af84459fbf938e508fd10b01cb8d699c79083813takashi# define HAVE_DIRENT_D_TYPE 1
af84459fbf938e508fd10b01cb8d699c79083813takashi#endif
af84459fbf938e508fd10b01cb8d699c79083813takashi
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
af84459fbf938e508fd10b01cb8d699c79083813takashiRTDECL(bool) RTDirExists(const char *pszPath)
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh{
af84459fbf938e508fd10b01cb8d699c79083813takashi bool fRc = false;
af84459fbf938e508fd10b01cb8d699c79083813takashi char const *pszNativePath;
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen int rc = rtPathToNative(&pszNativePath, pszPath, NULL);
af84459fbf938e508fd10b01cb8d699c79083813takashi if (RT_SUCCESS(rc))
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe struct stat s;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe fRc = !stat(pszNativePath, &s)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe && S_ISDIR(s.st_mode);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe rtPathFreeNative(pszNativePath, pszPath);
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe LogFlow(("RTDirExists(%p={%s}): returns %RTbool\n", pszPath, pszPath, fRc));
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe return fRc;
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen}
78f97ce162b66a0dbfd7af4dcd9984f162569b04minfrin
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wroweRTDECL(int) RTDirCreate(const char *pszPath, RTFMODE fMode)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe{
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe int rc;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe fMode = rtFsModeNormalize(fMode, pszPath, 0);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe if (rtFsModeIsValidPermissions(fMode))
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe char const *pszNativePath;
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen rc = rtPathToNative(&pszNativePath, pszPath, NULL);
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen if (RT_SUCCESS(rc))
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe if (mkdir(pszNativePath, fMode & RTFS_UNIX_MASK))
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe rc = errno;
4bebf996eb7002ebfe897d46a0e0572390604a77nd#ifdef RT_OS_SOLARIS
4bebf996eb7002ebfe897d46a0e0572390604a77nd /*
4bebf996eb7002ebfe897d46a0e0572390604a77nd * mkdir on nfs mount points has been/is busted in various
4bebf996eb7002ebfe897d46a0e0572390604a77nd * during the Nevada development cycle. We've observed:
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * - Build 111b (2009.06) returns EACCES.
4bebf996eb7002ebfe897d46a0e0572390604a77nd * - Build ca. 70-80 returns ENOSYS.
9534272616b71aaea50aeec4162e749a96aebd7fsf */
4bebf996eb7002ebfe897d46a0e0572390604a77nd if ( rc == ENOSYS
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe || rc == EACCES)
af84459fbf938e508fd10b01cb8d699c79083813takashi {
af84459fbf938e508fd10b01cb8d699c79083813takashi struct stat st;
af84459fbf938e508fd10b01cb8d699c79083813takashi if (!stat(pszNativePath, &st))
af84459fbf938e508fd10b01cb8d699c79083813takashi rc = EEXIST;
af84459fbf938e508fd10b01cb8d699c79083813takashi }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#endif
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe rc = RTErrConvertFromErrno(rc);
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe rtPathFreeNative(pszNativePath, pszPath);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe else
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen AssertMsgFailed(("Invalid file mode! %RTfmode\n", fMode));
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe rc = VERR_INVALID_FMODE;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe LogFlow(("RTDirCreate(%p={%s}, %RTfmode): returns %Rrc\n", pszPath, pszPath, fMode, rc));
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe return rc;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe}
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
57c845e03570b3641fbf41d4f139e2a9b49e406andRTDECL(int) RTDirRemove(const char *pszPath)
57c845e03570b3641fbf41d4f139e2a9b49e406and{
57c845e03570b3641fbf41d4f139e2a9b49e406and char const *pszNativePath;
57c845e03570b3641fbf41d4f139e2a9b49e406and int rc = rtPathToNative(&pszNativePath, pszPath, NULL);
57c845e03570b3641fbf41d4f139e2a9b49e406and if (RT_SUCCESS(rc))
57c845e03570b3641fbf41d4f139e2a9b49e406and {
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf if (rmdir(pszNativePath))
57c845e03570b3641fbf41d4f139e2a9b49e406and rc = RTErrConvertFromErrno(errno);
7e9d90004f580231e0376880710dc25408950ab9rbowen
7e9d90004f580231e0376880710dc25408950ab9rbowen rtPathFreeNative(pszNativePath, pszPath);
7e9d90004f580231e0376880710dc25408950ab9rbowen }
7e9d90004f580231e0376880710dc25408950ab9rbowen
7e9d90004f580231e0376880710dc25408950ab9rbowen LogFlow(("RTDirRemove(%p={%s}): returns %Rrc\n", pszPath, pszPath, rc));
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe return rc;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe}
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wroweRTDECL(int) RTDirFlush(const char *pszPath)
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen{
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe /*
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * Linux: The fsync() man page hints at this being required for ensuring
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * consistency between directory and file in case of a crash.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe *
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * Solaris: No mentioned is made of directories on the fsync man page.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * While rename+fsync will do what we want on ZFS, the code needs more
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * careful studying wrt whether the directory entry of a new file is
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * implicitly synced when the file is synced (it's very likely for ZFS).
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe *
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * FreeBSD: The FFS fsync code seems to flush the directory entry as well
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * in some cases. Don't know exactly what's up with rename, but from the
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * look of things fsync(dir) should work.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe */
4aa603e6448b99f9371397d439795c91a93637eand int rc;
4aa603e6448b99f9371397d439795c91a93637eand#ifdef O_DIRECTORY
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh int fd = open(pszPath, O_RDONLY | O_DIRECTORY, 0);
20f499565e77defe9dab24dd85c02f38a1175855nd#else
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh int fd = open(pszPath, O_RDONLY, 0);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe#endif
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe if (fd >= 0)
4aa603e6448b99f9371397d439795c91a93637eand {
4aa603e6448b99f9371397d439795c91a93637eand if (fsync(fd) == 0)
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh rc = VINF_SUCCESS;
20f499565e77defe9dab24dd85c02f38a1175855nd else
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh rc = RTErrConvertFromErrno(errno);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe close(fd);
f039cf01b271a31e317d5b84f24cb135f1c1b6d7nd }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe else
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe rc = RTErrConvertFromErrno(errno);
4aa603e6448b99f9371397d439795c91a93637eand return rc;
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh}
4aa603e6448b99f9371397d439795c91a93637eand
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh
20f499565e77defe9dab24dd85c02f38a1175855ndint rtDirNativeOpen(PRTDIR pDir, char *pszPathBuf)
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh{
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe /*
af84459fbf938e508fd10b01cb8d699c79083813takashi * Convert to a native path and try opendir.
af84459fbf938e508fd10b01cb8d699c79083813takashi */
2d39a41e98476f5235b7c37ce745a4aa0904b1cbrbowen char const *pszNativePath;
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen int rc = rtPathToNative(&pszNativePath, pDir->pszPath, NULL);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe if (RT_SUCCESS(rc))
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe pDir->pDir = opendir(pszNativePath);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe if (pDir->pDir)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe /*
c8c717fafa0a09ed13469a603a178921b851dd22igalic * Init data.
c8c717fafa0a09ed13469a603a178921b851dd22igalic */
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic pDir->fDataUnread = false;
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic memset(&pDir->Data, 0, RT_OFFSETOF(RTDIR, Data.d_name)); /* not strictly necessary */
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic memset(&pDir->Data.d_name[0], 0, pDir->cbMaxName);
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic }
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic else
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic rc = RTErrConvertFromErrno(errno);
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic rtPathFreeNative(pszNativePath, pDir->pszPath);
b7f8d802ecaed65eada1fc31472d06d8460d5528igalic }
7c7e501f542451bf7225b23cb299ee4228bfe15dgryzor
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe return rc;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe}
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wroweRTDECL(int) RTDirClose(PRTDIR pDir)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe{
acf65805923cf80834c39689cc0e2a8e7201c186sf /*
acf65805923cf80834c39689cc0e2a8e7201c186sf * Validate input.
acf65805923cf80834c39689cc0e2a8e7201c186sf */
c8c717fafa0a09ed13469a603a178921b851dd22igalic if (!pDir)
7c7e501f542451bf7225b23cb299ee4228bfe15dgryzor return VERR_INVALID_PARAMETER;
4bebf996eb7002ebfe897d46a0e0572390604a77nd if (pDir->u32Magic != RTDIR_MAGIC)
4bebf996eb7002ebfe897d46a0e0572390604a77nd {
4bebf996eb7002ebfe897d46a0e0572390604a77nd AssertMsgFailed(("Invalid pDir=%p\n", pDir));
8559a67073808d84d85bb5dd552d4247caafe709sf return VERR_INVALID_PARAMETER;
8559a67073808d84d85bb5dd552d4247caafe709sf }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe /*
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * Close the handle.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe */
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe int rc = VINF_SUCCESS;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe pDir->u32Magic = RTDIR_MAGIC_DEAD;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe if (closedir(pDir->pDir))
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe rc = RTErrConvertFromErrno(errno);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe AssertMsgFailed(("closedir(%p) -> errno=%d (%Rrc)\n", pDir->pDir, errno, rc));
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe RTMemFree(pDir);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe return rc;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe}
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
8559a67073808d84d85bb5dd552d4247caafe709sf
fed47023e9be04c612b5f6d4a5ee2b8e7c587181rbowen/**
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * Ensure that there is unread data in the buffer
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * and that there is a converted filename hanging around.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe *
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * @returns IPRT status code.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * @param pDir the open directory. Fully validated.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe */
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowestatic int rtDirReadMore(PRTDIR pDir)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe{
253547fb9cc7986e84ff68aef076f664fc4169dctakashi /** @todo try avoid the rematching on buffer overflow errors. */
253547fb9cc7986e84ff68aef076f664fc4169dctakashi for (;;)
253547fb9cc7986e84ff68aef076f664fc4169dctakashi {
253547fb9cc7986e84ff68aef076f664fc4169dctakashi /*
253547fb9cc7986e84ff68aef076f664fc4169dctakashi * Fetch data?
253547fb9cc7986e84ff68aef076f664fc4169dctakashi */
8559a67073808d84d85bb5dd552d4247caafe709sf if (!pDir->fDataUnread)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe struct dirent *pResult = NULL;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe int rc = readdir_r(pDir->pDir, &pDir->Data, &pResult);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe if (rc)
c8c717fafa0a09ed13469a603a178921b851dd22igalic {
c8c717fafa0a09ed13469a603a178921b851dd22igalic rc = RTErrConvertFromErrno(rc);
8559a67073808d84d85bb5dd552d4247caafe709sf //AssertRC(rc);
c8c717fafa0a09ed13469a603a178921b851dd22igalic return rc;
c8c717fafa0a09ed13469a603a178921b851dd22igalic }
c8c717fafa0a09ed13469a603a178921b851dd22igalic if (!pResult)
8559a67073808d84d85bb5dd552d4247caafe709sf return VERR_NO_MORE_FILES;
8559a67073808d84d85bb5dd552d4247caafe709sf }
8559a67073808d84d85bb5dd552d4247caafe709sf
8559a67073808d84d85bb5dd552d4247caafe709sf /*
8559a67073808d84d85bb5dd552d4247caafe709sf * Convert the filename to UTF-8.
8559a67073808d84d85bb5dd552d4247caafe709sf */
8559a67073808d84d85bb5dd552d4247caafe709sf if (!pDir->pszName)
8559a67073808d84d85bb5dd552d4247caafe709sf {
8559a67073808d84d85bb5dd552d4247caafe709sf int rc = rtPathFromNative(&pDir->pszName, pDir->Data.d_name, pDir->pszPath);
8559a67073808d84d85bb5dd552d4247caafe709sf if (RT_FAILURE(rc))
8559a67073808d84d85bb5dd552d4247caafe709sf {
8559a67073808d84d85bb5dd552d4247caafe709sf pDir->pszName = NULL;
8559a67073808d84d85bb5dd552d4247caafe709sf return rc;
8559a67073808d84d85bb5dd552d4247caafe709sf }
8559a67073808d84d85bb5dd552d4247caafe709sf pDir->cchName = strlen(pDir->pszName);
8559a67073808d84d85bb5dd552d4247caafe709sf }
8559a67073808d84d85bb5dd552d4247caafe709sf if ( !pDir->pfnFilter
8559a67073808d84d85bb5dd552d4247caafe709sf || pDir->pfnFilter(pDir, pDir->pszName))
8559a67073808d84d85bb5dd552d4247caafe709sf break;
8559a67073808d84d85bb5dd552d4247caafe709sf rtPathFreeIprt(pDir->pszName, pDir->Data.d_name);
a55680cd56cecad4f2d7d41b576aa63f0e008916rjung pDir->pszName = NULL;
8559a67073808d84d85bb5dd552d4247caafe709sf pDir->fDataUnread = false;
8559a67073808d84d85bb5dd552d4247caafe709sf }
8559a67073808d84d85bb5dd552d4247caafe709sf
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf pDir->fDataUnread = true;
4bebf996eb7002ebfe897d46a0e0572390604a77nd return VINF_SUCCESS;
4bebf996eb7002ebfe897d46a0e0572390604a77nd}
4bebf996eb7002ebfe897d46a0e0572390604a77nd
4bebf996eb7002ebfe897d46a0e0572390604a77nd
4bebf996eb7002ebfe897d46a0e0572390604a77nd#ifdef HAVE_DIRENT_D_TYPE
4bebf996eb7002ebfe897d46a0e0572390604a77nd/**
4bebf996eb7002ebfe897d46a0e0572390604a77nd * Converts the d_type field to IPRT directory entry type.
4bebf996eb7002ebfe897d46a0e0572390604a77nd *
4bebf996eb7002ebfe897d46a0e0572390604a77nd * @returns IPRT directory entry type.
4bebf996eb7002ebfe897d46a0e0572390604a77nd * @param Unix
4bebf996eb7002ebfe897d46a0e0572390604a77nd */
4bebf996eb7002ebfe897d46a0e0572390604a77ndstatic RTDIRENTRYTYPE rtDirType(int iType)
65a611af7093423efb91e5794b8887a527d4cf63trawick{
65a611af7093423efb91e5794b8887a527d4cf63trawick switch (iType)
65a611af7093423efb91e5794b8887a527d4cf63trawick {
65a611af7093423efb91e5794b8887a527d4cf63trawick case DT_UNKNOWN: return RTDIRENTRYTYPE_UNKNOWN;
65a611af7093423efb91e5794b8887a527d4cf63trawick case DT_FIFO: return RTDIRENTRYTYPE_FIFO;
253547fb9cc7986e84ff68aef076f664fc4169dctakashi case DT_CHR: return RTDIRENTRYTYPE_DEV_CHAR;
253547fb9cc7986e84ff68aef076f664fc4169dctakashi case DT_DIR: return RTDIRENTRYTYPE_DIRECTORY;
253547fb9cc7986e84ff68aef076f664fc4169dctakashi case DT_BLK: return RTDIRENTRYTYPE_DEV_BLOCK;
253547fb9cc7986e84ff68aef076f664fc4169dctakashi case DT_REG: return RTDIRENTRYTYPE_FILE;
253547fb9cc7986e84ff68aef076f664fc4169dctakashi case DT_LNK: return RTDIRENTRYTYPE_SYMLINK;
253547fb9cc7986e84ff68aef076f664fc4169dctakashi case DT_SOCK: return RTDIRENTRYTYPE_SOCKET;
253547fb9cc7986e84ff68aef076f664fc4169dctakashi case DT_WHT: return RTDIRENTRYTYPE_WHITEOUT;
253547fb9cc7986e84ff68aef076f664fc4169dctakashi default:
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe AssertMsgFailed(("iType=%d\n", iType));
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe return RTDIRENTRYTYPE_UNKNOWN;
af84459fbf938e508fd10b01cb8d699c79083813takashi }
af84459fbf938e508fd10b01cb8d699c79083813takashi}
af84459fbf938e508fd10b01cb8d699c79083813takashi#endif /*HAVE_DIRENT_D_TYPE */
af84459fbf938e508fd10b01cb8d699c79083813takashi
af84459fbf938e508fd10b01cb8d699c79083813takashi
cd34a6fbf0a2619544a72eadb73f309370bf6682wroweRTDECL(int) RTDirRead(PRTDIR pDir, PRTDIRENTRY pDirEntry, size_t *pcbDirEntry)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe{
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe /*
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * Validate and digest input.
8e9c6d6438af1ccb46adaa60d34caa3ac98f3851igalic */
8e9c6d6438af1ccb46adaa60d34caa3ac98f3851igalic if (!rtDirValidHandle(pDir))
8e9c6d6438af1ccb46adaa60d34caa3ac98f3851igalic return VERR_INVALID_PARAMETER;
8e9c6d6438af1ccb46adaa60d34caa3ac98f3851igalic AssertMsgReturn(VALID_PTR(pDirEntry), ("%p\n", pDirEntry), VERR_INVALID_POINTER);
9534272616b71aaea50aeec4162e749a96aebd7fsf
7159c12b7697fe9f5ab3a533cc6dfc3d57803053igalic size_t cbDirEntry = sizeof(*pDirEntry);
7159c12b7697fe9f5ab3a533cc6dfc3d57803053igalic if (pcbDirEntry)
7159c12b7697fe9f5ab3a533cc6dfc3d57803053igalic {
7159c12b7697fe9f5ab3a533cc6dfc3d57803053igalic AssertMsgReturn(VALID_PTR(pcbDirEntry), ("%p\n", pcbDirEntry), VERR_INVALID_POINTER);
7159c12b7697fe9f5ab3a533cc6dfc3d57803053igalic cbDirEntry = *pcbDirEntry;
8e9c6d6438af1ccb46adaa60d34caa3ac98f3851igalic AssertMsgReturn(cbDirEntry >= RT_UOFFSETOF(RTDIRENTRY, szName[2]),
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe ("Invalid *pcbDirEntry=%d (min %d)\n", *pcbDirEntry, RT_OFFSETOF(RTDIRENTRYEX, szName[2])),
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe VERR_INVALID_PARAMETER);
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen }
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen /*
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen * Fetch more data if necessary and/or convert the name.
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen */
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen int rc = rtDirReadMore(pDir);
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen if (RT_SUCCESS(rc))
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen {
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen /*
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen * Check if we've got enough space to return the data.
1d45c1463a8bc69bab1c07a4729269ec7333e713rbowen */
4126704c4950bfd46d32ad54e3b106ac6d868a73sf const char *pszName = pDir->pszName;
4126704c4950bfd46d32ad54e3b106ac6d868a73sf const size_t cchName = pDir->cchName;
4126704c4950bfd46d32ad54e3b106ac6d868a73sf const size_t cbRequired = RT_OFFSETOF(RTDIRENTRY, szName[1]) + cchName;
4126704c4950bfd46d32ad54e3b106ac6d868a73sf if (pcbDirEntry)
4126704c4950bfd46d32ad54e3b106ac6d868a73sf *pcbDirEntry = cbRequired;
4126704c4950bfd46d32ad54e3b106ac6d868a73sf if (cbRequired <= cbDirEntry)
4126704c4950bfd46d32ad54e3b106ac6d868a73sf {
4126704c4950bfd46d32ad54e3b106ac6d868a73sf /*
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh * Setup the returned data.
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh */
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh pDirEntry->INodeId = pDir->Data.d_ino; /* may need #ifdefing later */
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh#ifdef HAVE_DIRENT_D_TYPE
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh pDirEntry->enmType = rtDirType(pDir->Data.d_type);
888cb40bdeec5abf452bd85d6bf63b26d5913d4chumbedooh#else
a1ceb0cd0152edea3c72f4d9dcb352bae6ef273fjorton pDirEntry->enmType = RTDIRENTRYTYPE_UNKNOWN;
a1ceb0cd0152edea3c72f4d9dcb352bae6ef273fjorton#endif
a1ceb0cd0152edea3c72f4d9dcb352bae6ef273fjorton pDirEntry->cbName = (uint16_t)cchName;
a1ceb0cd0152edea3c72f4d9dcb352bae6ef273fjorton Assert(pDirEntry->cbName == cchName);
253547fb9cc7986e84ff68aef076f664fc4169dctakashi memcpy(pDirEntry->szName, pszName, cchName + 1);
a1ceb0cd0152edea3c72f4d9dcb352bae6ef273fjorton
a1ceb0cd0152edea3c72f4d9dcb352bae6ef273fjorton /* free cached data */
a1ceb0cd0152edea3c72f4d9dcb352bae6ef273fjorton pDir->fDataUnread = false;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe rtPathFreeIprt(pDir->pszName, pDir->Data.d_name);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe pDir->pszName = NULL;
af84459fbf938e508fd10b01cb8d699c79083813takashi }
af84459fbf938e508fd10b01cb8d699c79083813takashi else
af84459fbf938e508fd10b01cb8d699c79083813takashi rc = VERR_BUFFER_OVERFLOW;
af84459fbf938e508fd10b01cb8d699c79083813takashi }
af84459fbf938e508fd10b01cb8d699c79083813takashi
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe LogFlow(("RTDirRead(%p:{%s}, %p:{%s}, %p:{%u}): returns %Rrc\n",
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe pDir, pDir->pszPath, pDirEntry, RT_SUCCESS(rc) ? pDirEntry->szName : "<failed>",
af84459fbf938e508fd10b01cb8d699c79083813takashi pcbDirEntry, pcbDirEntry ? *pcbDirEntry : 0, rc));
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe return rc;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe}
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe/**
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * Fills dummy info into the info structure.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * This function is called if we cannot stat the file.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe *
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * @param pInfo The struct in question.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * @param
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe */
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowestatic void rtDirSetDummyInfo(PRTFSOBJINFO pInfo, RTDIRENTRYTYPE enmType)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe{
c8c717fafa0a09ed13469a603a178921b851dd22igalic pInfo->cbObject = 0;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe pInfo->cbAllocated = 0;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe RTTimeSpecSetNano(&pInfo->AccessTime, 0);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe RTTimeSpecSetNano(&pInfo->ModificationTime, 0);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe RTTimeSpecSetNano(&pInfo->ChangeTime, 0);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe RTTimeSpecSetNano(&pInfo->BirthTime, 0);
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe memset(&pInfo->Attr, 0, sizeof(pInfo->Attr));
c8c717fafa0a09ed13469a603a178921b851dd22igalic pInfo->Attr.enmAdditional = RTFSOBJATTRADD_NOTHING;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe switch (enmType)
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe {
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe default:
7ffcb32836c716e53b7f4b856ee16d9139b8d3bdsf case RTDIRENTRYTYPE_UNKNOWN: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL;
7ffcb32836c716e53b7f4b856ee16d9139b8d3bdsf case RTDIRENTRYTYPE_FIFO: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_FIFO;
7ffcb32836c716e53b7f4b856ee16d9139b8d3bdsf case RTDIRENTRYTYPE_DEV_CHAR: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_DEV_CHAR;
7ffcb32836c716e53b7f4b856ee16d9139b8d3bdsf case RTDIRENTRYTYPE_DIRECTORY: pInfo->Attr.fMode = RTFS_DOS_DIRECTORY | RTFS_TYPE_DIRECTORY;
7ffcb32836c716e53b7f4b856ee16d9139b8d3bdsf case RTDIRENTRYTYPE_DEV_BLOCK: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_DEV_BLOCK;
7ffcb32836c716e53b7f4b856ee16d9139b8d3bdsf case RTDIRENTRYTYPE_FILE: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_FILE;
7ffcb32836c716e53b7f4b856ee16d9139b8d3bdsf case RTDIRENTRYTYPE_SYMLINK: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_SYMLINK;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe case RTDIRENTRYTYPE_SOCKET: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_SOCKET;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe case RTDIRENTRYTYPE_WHITEOUT: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_WHITEOUT;
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe }
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe}
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sfRTDECL(int) RTDirReadEx(PRTDIR pDir, PRTDIRENTRYEX pDirEntry, size_t *pcbDirEntry, RTFSOBJATTRADD enmAdditionalAttribs, uint32_t fFlags)
acf65805923cf80834c39689cc0e2a8e7201c186sf{
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe /*
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe * Validate and digest input.
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe */
af84459fbf938e508fd10b01cb8d699c79083813takashi if (!rtDirValidHandle(pDir))
af84459fbf938e508fd10b01cb8d699c79083813takashi return VERR_INVALID_PARAMETER;
af84459fbf938e508fd10b01cb8d699c79083813takashi AssertMsgReturn(VALID_PTR(pDirEntry), ("%p\n", pDirEntry), VERR_INVALID_POINTER);
af84459fbf938e508fd10b01cb8d699c79083813takashi AssertMsgReturn( enmAdditionalAttribs >= RTFSOBJATTRADD_NOTHING
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung && enmAdditionalAttribs <= RTFSOBJATTRADD_LAST,
727872d18412fc021f03969b8641810d8896820bhumbedooh ("Invalid enmAdditionalAttribs=%p\n", enmAdditionalAttribs),
0d0ba3a410038e179b695446bb149cce6264e0abnd VERR_INVALID_PARAMETER);
727872d18412fc021f03969b8641810d8896820bhumbedooh AssertMsgReturn(RTPATH_F_IS_VALID(fFlags, 0), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh size_t cbDirEntry = sizeof(*pDirEntry);
0d0ba3a410038e179b695446bb149cce6264e0abnd if (pcbDirEntry)
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh {
727872d18412fc021f03969b8641810d8896820bhumbedooh AssertMsgReturn(VALID_PTR(pcbDirEntry), ("%p\n", pcbDirEntry), VERR_INVALID_POINTER);
0d0ba3a410038e179b695446bb149cce6264e0abnd cbDirEntry = *pcbDirEntry;
0d0ba3a410038e179b695446bb149cce6264e0abnd AssertMsgReturn(cbDirEntry >= (unsigned)RT_OFFSETOF(RTDIRENTRYEX, szName[2]),
0d0ba3a410038e179b695446bb149cce6264e0abnd ("Invalid *pcbDirEntry=%d (min %d)\n", *pcbDirEntry, RT_OFFSETOF(RTDIRENTRYEX, szName[2])),
ac082aefa89416cbdc9a1836eaf3bed9698201c8humbedooh VERR_INVALID_PARAMETER);
0d0ba3a410038e179b695446bb149cce6264e0abnd }
0d0ba3a410038e179b695446bb149cce6264e0abnd
0d0ba3a410038e179b695446bb149cce6264e0abnd /*
727872d18412fc021f03969b8641810d8896820bhumbedooh * Fetch more data if necessary and/or convert the name.
0d0ba3a410038e179b695446bb149cce6264e0abnd */
0d0ba3a410038e179b695446bb149cce6264e0abnd int rc = rtDirReadMore(pDir);
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh if (RT_SUCCESS(rc))
205f749042ed530040a4f0080dbcb47ceae8a374rjung {
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen /*
0d0ba3a410038e179b695446bb149cce6264e0abnd * Check if we've got enough space to return the data.
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd */
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd const char *pszName = pDir->pszName;
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd const size_t cchName = pDir->cchName;
43365cc9aaf2bea5be539bea80c5eb7c926ce148humbedooh const size_t cbRequired = RT_OFFSETOF(RTDIRENTRYEX, szName[1]) + cchName;
if (pcbDirEntry)
*pcbDirEntry = cbRequired;
if (cbRequired <= cbDirEntry)
{
/*
* Setup the returned data.
*/
pDirEntry->cwcShortName = 0;
pDirEntry->wszShortName[0] = 0;
pDirEntry->cbName = (uint16_t)cchName;
Assert(pDirEntry->cbName == cchName);
memcpy(pDirEntry->szName, pszName, cchName + 1);
/* get the info data */
size_t cch = cchName + pDir->cchPath + 1;
char *pszNamePath = (char *)alloca(cch);
if (pszNamePath)
{
memcpy(pszNamePath, pDir->pszPath, pDir->cchPath);
memcpy(pszNamePath + pDir->cchPath, pszName, cchName + 1);
rc = RTPathQueryInfoEx(pszNamePath, &pDirEntry->Info, enmAdditionalAttribs, fFlags);
}
else
rc = VERR_NO_MEMORY;
if (RT_FAILURE(rc))
{
#ifdef HAVE_DIRENT_D_TYPE
rtDirSetDummyInfo(&pDirEntry->Info, rtDirType(pDir->Data.d_type));
#else
rtDirSetDummyInfo(&pDirEntry->Info, RTDIRENTRYTYPE_UNKNOWN);
#endif
rc = VWRN_NO_DIRENT_INFO;
}
/* free cached data */
pDir->fDataUnread = false;
rtPathFreeIprt(pDir->pszName, pDir->Data.d_name);
pDir->pszName = NULL;
}
else
rc = VERR_BUFFER_OVERFLOW;
}
return rc;
}
RTDECL(int) RTDirRename(const char *pszSrc, const char *pszDst, unsigned fRename)
{
/*
* Validate input.
*/
AssertMsgReturn(VALID_PTR(pszSrc), ("%p\n", pszSrc), VERR_INVALID_POINTER);
AssertMsgReturn(VALID_PTR(pszDst), ("%p\n", pszDst), VERR_INVALID_POINTER);
AssertMsgReturn(*pszSrc, ("%p\n", pszSrc), VERR_INVALID_PARAMETER);
AssertMsgReturn(*pszDst, ("%p\n", pszDst), VERR_INVALID_PARAMETER);
AssertMsgReturn(!(fRename & ~RTPATHRENAME_FLAGS_REPLACE), ("%#x\n", fRename), VERR_INVALID_PARAMETER);
/*
* Take common cause with RTPathRename.
*/
int rc = rtPathPosixRename(pszSrc, pszDst, fRename, RTFS_TYPE_DIRECTORY);
LogFlow(("RTDirRename(%p:{%s}, %p:{%s}): returns %Rrc\n",
pszSrc, pszSrc, pszDst, pszDst, rc));
return rc;
}