dir-posix.cpp revision bc57d7ed1ae5b66aa39acfd75e49f17e72a98bed
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/* $Id$ */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** @file
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * IPRT - Directory manipulation, POSIX.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * available from http://www.virtualbox.org. This file is free software;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * you can redistribute it and/or modify it under the terms of the GNU
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * General Public License (GPL) as published by the Free Software
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * The contents of this file may alternatively be used under the terms
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * of the Common Development and Distribution License Version 1.0
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * VirtualBox OSE distribution, in which case the provisions of the
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * CDDL are applicable instead of those of the GPL.
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync *
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync * You may elect to license modified versions of this file under the
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync * terms and conditions of either the GPL or the CDDL or both.
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync *
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * additional information or have any questions.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/*******************************************************************************
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync* Header Files *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync*******************************************************************************/
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#define LOG_GROUP RTLOGGROUP_DIR
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <errno.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <unistd.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <sys/types.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <sys/stat.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <dirent.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <stdio.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/dir.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/path.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/alloc.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/alloca.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/string.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/assert.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/err.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include <iprt/log.h>
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include "internal/dir.h"
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#include "internal/fs.h"
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#include "internal/path.h"
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#if !defined(RT_OS_SOLARIS)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync# define HAVE_DIRENT_D_TYPE 1
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
acca7ab818eb8c2832aa27e27ce53133fba927dbvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncRTDECL(bool) RTDirExists(const char *pszPath)
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync{
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync bool fRc = false;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync char *pszNativePath;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync int rc = rtPathToNative(&pszNativePath, pszPath);
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync if (RT_SUCCESS(rc))
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync struct stat s;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync fRc = !stat(pszNativePath, &s)
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync && S_ISDIR(s.st_mode);
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync rtPathFreeNative(pszNativePath);
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync }
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync LogFlow(("RTDirExists(%p={%s}): returns %RTbool\n", pszPath, pszPath, fRc));
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync return fRc;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync}
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsyncRTDECL(int) RTDirCreate(const char *pszPath, RTFMODE fMode)
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync{
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync int rc;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync fMode = rtFsModeNormalize(fMode, pszPath, 0);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (rtFsModeIsValidPermissions(fMode))
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync char *pszNativePath;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = rtPathToNative(&pszNativePath, pszPath);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (RT_SUCCESS(rc))
5eb36887f6970e0033f63fa135f3bb8fbfd6059bvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (mkdir(pszNativePath, fMode & RTFS_UNIX_MASK))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = errno;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef RT_OS_SOLARIS
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * mkdir on nfs mount points has been/is busted in various
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * during the Nevada development cycle. We've observed:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * - Build 111b (2009.06) returns EACCES.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * - Build ca. 70-80 returns ENOSYS.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if ( rc == ENOSYS
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync || rc == EACCES)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync struct stat st;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (!stat(pszNativePath, &st))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = EEXIST;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = RTErrConvertFromErrno(rc);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync rtPathFreeNative(pszNativePath);
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync }
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync else
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync {
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync AssertMsgFailed(("Invalid file mode! %RTfmode\n", fMode));
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync rc = VERR_INVALID_FMODE;
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync }
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync LogFlow(("RTDirCreate(%p={%s}, %RTfmode): returns %Rrc\n", pszPath, pszPath, fMode, rc));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return rc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncRTDECL(int) RTDirRemove(const char *pszPath)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync char *pszNativePath;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int rc = rtPathToNative(&pszNativePath, pszPath);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (RT_SUCCESS(rc))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (rmdir(pszNativePath))
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync rc = RTErrConvertFromErrno(errno);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync rtPathFreeNative(pszNativePath);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync LogFlow(("RTDirRemove(%p={%s}): returns %Rrc\n", pszPath, pszPath, rc));
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync return rc;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncint rtOpenDirNative(PRTDIR pDir, char *pszPathBuf)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Convert to a native path and try opendir.
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync */
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync char *pszNativePath;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int rc = rtPathToNative(&pszNativePath, pDir->pszPath);
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync if (RT_SUCCESS(rc))
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync pDir->pDir = opendir(pszNativePath);
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync if (pDir->pDir)
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Init data.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDir->fDataUnread = false;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync memset(&pDir->Data, 0, RT_OFFSETOF(RTDIR, Data.d_name)); /* not strictly necessary */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync memset(&pDir->Data.d_name[0], 0, pDir->cbMaxName);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = RTErrConvertFromErrno(errno);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rtPathFreeNative(pszNativePath);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return rc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncRTDECL(int) RTDirClose(PRTDIR pDir)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Validate input.
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (!pDir)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return VERR_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pDir->u32Magic != RTDIR_MAGIC)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync AssertMsgFailed(("Invalid pDir=%p\n", pDir));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return VERR_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Close the handle.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int rc = VINF_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDir->u32Magic = RTDIR_MAGIC_DEAD;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (closedir(pDir->pDir))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = RTErrConvertFromErrno(errno);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgFailed(("closedir(%p) -> errno=%d (%Rrc)\n", pDir->pDir, errno, rc));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTMemFree(pDir);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return rc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Ensure that there is unread data in the buffer
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * and that there is a converted filename hanging around.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @returns IPRT status code.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pDir the open directory. Fully validated.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncstatic int rtDirReadMore(PRTDIR pDir)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /** @todo try avoid the rematching on buffer overflow errors. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync for (;;)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Fetch data?
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (!pDir->fDataUnread)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync struct dirent *pResult = NULL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int rc = readdir_r(pDir->pDir, &pDir->Data, &pResult);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (rc)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = RTErrConvertFromErrno(rc);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertRC(rc);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return rc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (!pResult)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return VERR_NO_MORE_FILES;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifndef RT_DONT_CONVERT_FILENAMES
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Convert the filename to UTF-8.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (!pDir->pszName)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int rc = rtPathFromNativeEx(&pDir->pszName, pDir->Data.d_name, pDir->pszPath);
7755c0a4b7b215f612d9d27848c2584ffafe7a66vboxsync if (RT_FAILURE(rc))
7755c0a4b7b215f612d9d27848c2584ffafe7a66vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDir->pszName = NULL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return rc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
316572fd6bf59ec1038f0476f6536fc10163beebvboxsync pDir->cchName = strlen(pDir->pszName);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if ( !pDir->pfnFilter
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync || pDir->pfnFilter(pDir, pDir->pszName))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTStrFree(pDir->pszName);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDir->pszName = NULL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#else
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync if ( !pDir->pfnFilter
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync || pDir->pfnFilter(pDir, pDir->Data.d_name))
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync break;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync#endif
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync pDir->fDataUnread = false;
602e0e27740395dba64bee2e0a8aef023ebd7650vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDir->fDataUnread = true;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return VINF_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef HAVE_DIRENT_D_TYPE
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Converts the d_type field to IPRT directory entry type.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @returns IPRT directory entry type.
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync * @param Unix
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsyncstatic RTDIRENTRYTYPE rtDirType(int iType)
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync{
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync switch (iType)
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_UNKNOWN: return RTDIRENTRYTYPE_UNKNOWN;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_FIFO: return RTDIRENTRYTYPE_FIFO;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_CHR: return RTDIRENTRYTYPE_DEV_CHAR;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_DIR: return RTDIRENTRYTYPE_DIRECTORY;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_BLK: return RTDIRENTRYTYPE_DEV_BLOCK;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_REG: return RTDIRENTRYTYPE_FILE;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_LNK: return RTDIRENTRYTYPE_SYMLINK;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_SOCK: return RTDIRENTRYTYPE_SOCKET;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case DT_WHT: return RTDIRENTRYTYPE_WHITEOUT;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync default:
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync AssertMsgFailed(("iType=%d\n", iType));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return RTDIRENTRYTYPE_UNKNOWN;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif /*HAVE_DIRENT_D_TYPE */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
78df65edff21c11c537f38e736707ea434ab5623vboxsyncRTDECL(int) RTDirRead(PRTDIR pDir, PRTDIRENTRY pDirEntry, size_t *pcbDirEntry)
78df65edff21c11c537f38e736707ea434ab5623vboxsync{
78df65edff21c11c537f38e736707ea434ab5623vboxsync /*
78df65edff21c11c537f38e736707ea434ab5623vboxsync * Validate and digest input.
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync if (!rtDirValidHandle(pDir))
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync return VERR_INVALID_PARAMETER;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync AssertMsgReturn(VALID_PTR(pDirEntry), ("%p\n", pDirEntry), VERR_INVALID_POINTER);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync size_t cbDirEntry = sizeof(*pDirEntry);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync if (pcbDirEntry)
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync {
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync AssertMsgReturn(VALID_PTR(pcbDirEntry), ("%p\n", pcbDirEntry), VERR_INVALID_POINTER);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync cbDirEntry = *pcbDirEntry;
78df65edff21c11c537f38e736707ea434ab5623vboxsync AssertMsgReturn(cbDirEntry >= RT_UOFFSETOF(RTDIRENTRY, szName[2]),
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync ("Invalid *pcbDirEntry=%d (min %d)\n", *pcbDirEntry, RT_OFFSETOF(RTDIRENTRYEX, szName[2])),
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync VERR_INVALID_PARAMETER);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync }
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
78df65edff21c11c537f38e736707ea434ab5623vboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Fetch more data if necessary and/or convert the name.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int rc = rtDirReadMore(pDir);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (RT_SUCCESS(rc))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /*
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync * Check if we've got enough space to return the data.
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#ifdef RT_DONT_CONVERT_FILENAMES
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync const char *pszName = pDir->Data.d_name;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync const size_t cchName = strlen(pszName);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync const char *pszName = pDir->pszName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync const size_t cchName = pDir->cchName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync const size_t cbRequired = RT_OFFSETOF(RTDIRENTRY, szName[1]) + cchName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pcbDirEntry)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *pcbDirEntry = cbRequired;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbRequired <= cbDirEntry)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Setup the returned data.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->INodeId = pDir->Data.d_ino; /* may need #ifdefing later */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef HAVE_DIRENT_D_TYPE
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->enmType = rtDirType(pDir->Data.d_type);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#else
78df65edff21c11c537f38e736707ea434ab5623vboxsync pDirEntry->enmType = RTDIRENTRYTYPE_UNKNOWN;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->cbName = (uint16_t)cchName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Assert(pDirEntry->cbName == cchName);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync memcpy(pDirEntry->szName, pszName, cchName + 1);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync /* free cached data */
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync pDir->fDataUnread = false;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync#ifndef RT_DONT_CONVERT_FILENAMES
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync RTStrFree(pDir->pszName);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pDir->pszName = NULL;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#endif
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync }
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync else
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync rc = VERR_BUFFER_OVERFLOW;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync }
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync LogFlow(("RTDirRead(%p:{%s}, %p:{%s}, %p:{%u}): returns %Rrc\n",
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pDir, pDir->pszPath, pDirEntry, RT_SUCCESS(rc) ? pDirEntry->szName : "<failed>",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pcbDirEntry, pcbDirEntry ? *pcbDirEntry : 0, rc));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return rc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/**
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Fills dummy info into the info structure.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This function is called if we cannot stat the file.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param pInfo The struct in question.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * @param
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncstatic void rtDirSetDummyInfo(PRTFSOBJINFO pInfo, RTDIRENTRYTYPE enmType)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->cbObject = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->cbAllocated = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTTimeSpecSetNano(&pInfo->AccessTime, 0);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTTimeSpecSetNano(&pInfo->ModificationTime, 0);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTTimeSpecSetNano(&pInfo->ChangeTime, 0);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RTTimeSpecSetNano(&pInfo->BirthTime, 0);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync memset(&pInfo->Attr, 0, sizeof(pInfo->Attr));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->Attr.enmAdditional = RTFSOBJATTRADD_NOTHING;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync switch (enmType)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync default:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_UNKNOWN: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_FIFO: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_FIFO;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_DEV_CHAR: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_DEV_CHAR;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_DIRECTORY: pInfo->Attr.fMode = RTFS_DOS_DIRECTORY | RTFS_TYPE_DIRECTORY;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_DEV_BLOCK: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_DEV_BLOCK;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_FILE: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_FILE;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_SYMLINK: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_SYMLINK;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_SOCKET: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_SOCKET;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case RTDIRENTRYTYPE_WHITEOUT: pInfo->Attr.fMode = RTFS_DOS_NT_NORMAL | RTFS_TYPE_WHITEOUT;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncRTDECL(int) RTDirReadEx(PRTDIR pDir, PRTDIRENTRYEX pDirEntry, size_t *pcbDirEntry, RTFSOBJATTRADD enmAdditionalAttribs)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Validate and digest input.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (!rtDirValidHandle(pDir))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return VERR_INVALID_PARAMETER;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync AssertMsgReturn(VALID_PTR(pDirEntry), ("%p\n", pDirEntry), VERR_INVALID_POINTER);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgReturn( enmAdditionalAttribs >= RTFSOBJATTRADD_NOTHING
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync && enmAdditionalAttribs <= RTFSOBJATTRADD_LAST,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ("Invalid enmAdditionalAttribs=%p\n", enmAdditionalAttribs),
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VERR_INVALID_PARAMETER);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync size_t cbDirEntry = sizeof(*pDirEntry);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pcbDirEntry)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgReturn(VALID_PTR(pcbDirEntry), ("%p\n", pcbDirEntry), VERR_INVALID_POINTER);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbDirEntry = *pcbDirEntry;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgReturn(cbDirEntry >= (unsigned)RT_OFFSETOF(RTDIRENTRYEX, szName[2]),
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ("Invalid *pcbDirEntry=%d (min %d)\n", *pcbDirEntry, RT_OFFSETOF(RTDIRENTRYEX, szName[2])),
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VERR_INVALID_PARAMETER);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Fetch more data if necessary and/or convert the name.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int rc = rtDirReadMore(pDir);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (RT_SUCCESS(rc))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Check if we've got enough space to return the data.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef RT_DONT_CONVERT_FILENAMES
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync const char *pszName = pDir->Data.d_name;
48807baed22246206b9855f41d1fd106f0679b3avboxsync const size_t cchName = strlen(pszName);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync const char *pszName = pDir->pszName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync const size_t cchName = pDir->cchName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync const size_t cbRequired = RT_OFFSETOF(RTDIRENTRYEX, szName[1]) + cchName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pcbDirEntry)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *pcbDirEntry = cbRequired;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbRequired <= cbDirEntry)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Setup the returned data.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->cwcShortName = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->wszShortName[0] = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->cbName = (uint16_t)cchName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Assert(pDirEntry->cbName == cchName);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync memcpy(pDirEntry->szName, pszName, cchName + 1);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* get the info data */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync size_t cch = cchName + pDir->cchPath + 1;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync char *pszNamePath = (char *)alloca(cch);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pszNamePath)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync memcpy(pszNamePath, pDir->pszPath, pDir->cchPath);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync memcpy(pszNamePath + pDir->cchPath, pszName, cchName + 1);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = RTPathQueryInfo(pszNamePath, &pDirEntry->Info, enmAdditionalAttribs);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync rc = VERR_NO_MEMORY;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (RT_FAILURE(rc))
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#ifdef HAVE_DIRENT_D_TYPE
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rtDirSetDummyInfo(&pDirEntry->Info, rtDirType(pDir->Data.d_type));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#else
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync rtDirSetDummyInfo(&pDirEntry->Info, RTDIRENTRYTYPE_UNKNOWN);
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync#endif
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync rc = VWRN_NO_DIRENT_INFO;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* free cached data */
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync pDir->fDataUnread = false;
090c459b9e90ca46e2ce2b8c81533ade3b23f3e9vboxsync#ifndef RT_DONT_CONVERT_FILENAMES
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync RTStrFree(pDir->pszName);
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync pDir->pszName = NULL;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync#endif
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync }
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync else
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync rc = VERR_BUFFER_OVERFLOW;
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync }
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync return rc;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync}
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsyncRTDECL(int) RTDirRename(const char *pszSrc, const char *pszDst, unsigned fRename)
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync{
090c459b9e90ca46e2ce2b8c81533ade3b23f3e9vboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Validate input.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgReturn(VALID_PTR(pszSrc), ("%p\n", pszSrc), VERR_INVALID_POINTER);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgReturn(VALID_PTR(pszDst), ("%p\n", pszDst), VERR_INVALID_POINTER);
090c459b9e90ca46e2ce2b8c81533ade3b23f3e9vboxsync AssertMsgReturn(*pszSrc, ("%p\n", pszSrc), VERR_INVALID_PARAMETER);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgReturn(*pszDst, ("%p\n", pszDst), VERR_INVALID_PARAMETER);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgReturn(!(fRename & ~RTPATHRENAME_FLAGS_REPLACE), ("%#x\n", fRename), VERR_INVALID_PARAMETER);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Take common cause with RTPathRename.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int rc = rtPathPosixRename(pszSrc, pszDst, fRename, RTFS_TYPE_DIRECTORY);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync LogFlow(("RTDirRename(%p:{%s}, %p:{%s}): returns %Rrc\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pszSrc, pszSrc, pszDst, pszDst, rc));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return rc;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync