cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync/* $Id$ */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync/** @file
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * IPRT - Path Manipulation, POSIX, Part 2 - RTPathQueryInfo.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync/*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Copyright (C) 2006-2010 Oracle Corporation
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync *
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * available from http://www.virtualbox.org. This file is free software;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * General Public License (GPL) as published by the Free Software
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync *
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * The contents of this file may alternatively be used under the terms
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * of the Common Development and Distribution License Version 1.0
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * VirtualBox OSE distribution, in which case the provisions of the
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * CDDL are applicable instead of those of the GPL.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync *
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * You may elect to license modified versions of this file under the
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * terms and conditions of either the GPL or the CDDL or both.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync/*******************************************************************************
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync* Header Files *
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync*******************************************************************************/
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#define LOG_GROUP RTLOGGROUP_PATH
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <stdlib.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <limits.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <errno.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <unistd.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <sys/stat.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <sys/time.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <stdio.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <sys/types.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <iprt/path.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <iprt/env.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <iprt/assert.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <iprt/string.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <iprt/err.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include <iprt/log.h>
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include "internal/path.h"
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include "internal/process.h"
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#include "internal/fs.h"
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsyncRTR3DECL(int) RTPathQueryInfo(const char *pszPath, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync{
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync return RTPathQueryInfoEx(pszPath, pObjInfo, enmAdditionalAttribs, RTPATH_F_ON_LINK);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync}
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsyncRTR3DECL(int) RTPathQueryInfoEx(const char *pszPath, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs, uint32_t fFlags)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync{
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Validate input.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertReturn(*pszPath, VERR_INVALID_PARAMETER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertPtrReturn(pObjInfo, VERR_INVALID_POINTER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertMsgReturn( enmAdditionalAttribs >= RTFSOBJATTRADD_NOTHING
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync && enmAdditionalAttribs <= RTFSOBJATTRADD_LAST,
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync ("Invalid enmAdditionalAttribs=%p\n", enmAdditionalAttribs),
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync VERR_INVALID_PARAMETER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertMsgReturn(RTPATH_F_IS_VALID(fFlags, 0), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Convert the filename.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync char const *pszNativePath;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync int rc = rtPathToNative(&pszNativePath, pszPath, NULL);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_SUCCESS(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync struct stat Stat;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (fFlags & RTPATH_F_FOLLOW_LINK)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = stat(pszNativePath, &Stat);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = lstat(pszNativePath, &Stat); /** @todo how doesn't have lstat again? */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (!rc)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rtFsConvertStatToObjInfo(pObjInfo, &Stat, pszPath, 0);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync switch (enmAdditionalAttribs)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync case RTFSOBJATTRADD_NOTHING:
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync case RTFSOBJATTRADD_UNIX:
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync Assert(pObjInfo->Attr.enmAdditional == RTFSOBJATTRADD_UNIX);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync break;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync case RTFSOBJATTRADD_UNIX_OWNER:
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rtFsObjInfoAttrSetUnixOwner(pObjInfo, Stat.st_uid);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync break;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync case RTFSOBJATTRADD_UNIX_GROUP:
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rtFsObjInfoAttrSetUnixGroup(pObjInfo, Stat.st_gid);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync break;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync case RTFSOBJATTRADD_EASIZE:
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /** @todo Use SGI extended attribute interface to query EA info. */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_EASIZE;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pObjInfo->Attr.u.EASize.cb = 0;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync break;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync default:
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertMsgFailed(("Impossible!\n"));
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync return VERR_INTERNAL_ERROR;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTErrConvertFromErrno(errno);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rtPathFreeNative(pszNativePath, pszPath);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync LogFlow(("RTPathQueryInfoEx(%p:{%s}, pObjInfo=%p, %d): returns %Rrc\n",
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pszPath, pszPath, pObjInfo, enmAdditionalAttribs, rc));
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync return rc;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync}
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsyncRTR3DECL(int) RTPathSetTimes(const char *pszPath, PCRTTIMESPEC pAccessTime, PCRTTIMESPEC pModificationTime,
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync PCRTTIMESPEC pChangeTime, PCRTTIMESPEC pBirthTime)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync{
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync return RTPathSetTimesEx(pszPath, pAccessTime, pModificationTime, pChangeTime, pBirthTime, RTPATH_F_ON_LINK);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync}
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsyncRTR3DECL(int) RTPathSetTimesEx(const char *pszPath, PCRTTIMESPEC pAccessTime, PCRTTIMESPEC pModificationTime,
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync PCRTTIMESPEC pChangeTime, PCRTTIMESPEC pBirthTime, uint32_t fFlags)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync{
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Validate input.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertReturn(*pszPath, VERR_INVALID_PARAMETER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertPtrNullReturn(pAccessTime, VERR_INVALID_POINTER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertPtrNullReturn(pModificationTime, VERR_INVALID_POINTER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertPtrNullReturn(pChangeTime, VERR_INVALID_POINTER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertPtrNullReturn(pBirthTime, VERR_INVALID_POINTER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertMsgReturn(RTPATH_F_IS_VALID(fFlags, 0), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Convert the paths.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync char const *pszNativePath;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync int rc = rtPathToNative(&pszNativePath, pszPath, NULL);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_SUCCESS(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync RTFSOBJINFO ObjInfo;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * If it's a no-op, we'll only verify the existance of the file.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (!pAccessTime && !pModificationTime)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTPathQueryInfoEx(pszPath, &ObjInfo, RTFSOBJATTRADD_NOTHING, fFlags);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Convert the input to timeval, getting the missing one if necessary,
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * and call the API which does the change.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync struct timeval aTimevals[2];
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (pAccessTime && pModificationTime)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync RTTimeSpecGetTimeval(pAccessTime, &aTimevals[0]);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync RTTimeSpecGetTimeval(pModificationTime, &aTimevals[1]);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTPathQueryInfoEx(pszPath, &ObjInfo, RTFSOBJATTRADD_UNIX, fFlags);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_SUCCESS(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync RTTimeSpecGetTimeval(pAccessTime ? pAccessTime : &ObjInfo.AccessTime, &aTimevals[0]);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync RTTimeSpecGetTimeval(pModificationTime ? pModificationTime : &ObjInfo.ModificationTime, &aTimevals[1]);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync Log(("RTPathSetTimes('%s',%p,%p,,): RTPathQueryInfo failed with %Rrc\n",
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pszPath, pAccessTime, pModificationTime, rc));
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_SUCCESS(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (fFlags & RTPATH_F_FOLLOW_LINK)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (utimes(pszNativePath, aTimevals))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTErrConvertFromErrno(errno);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#if (defined(RT_OS_DARWIN) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) \
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync || defined(RT_OS_FREEBSD) \
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync || defined(RT_OS_LINUX) \
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync || defined(RT_OS_OS2) /** @todo who really has lutimes? */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (lutimes(pszNativePath, aTimevals))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTErrConvertFromErrno(errno);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (pAccessTime && pModificationTime)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTPathQueryInfoEx(pszPath, &ObjInfo, RTFSOBJATTRADD_UNIX, fFlags);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_SUCCESS(rc) && RTFS_IS_SYMLINK(ObjInfo.Attr.fMode))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = VERR_NS_SYMLINK_SET_TIME;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else if (RT_SUCCESS(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (utimes(pszNativePath, aTimevals))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTErrConvertFromErrno(errno);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#endif
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_FAILURE(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync Log(("RTPathSetTimes('%s',%p,%p,,): failed with %Rrc and errno=%d\n",
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pszPath, pAccessTime, pModificationTime, rc, errno));
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rtPathFreeNative(pszNativePath, pszPath);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync LogFlow(("RTPathSetTimes(%p:{%s}, %p:{%RDtimespec}, %p:{%RDtimespec}, %p:{%RDtimespec}, %p:{%RDtimespec}): return %Rrc\n",
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pszPath, pszPath, pAccessTime, pAccessTime, pModificationTime, pModificationTime,
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pChangeTime, pChangeTime, pBirthTime, pBirthTime, rc));
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync return rc;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync}
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsyncRTR3DECL(int) RTPathSetOwner(const char *pszPath, uint32_t uid, uint32_t gid)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync{
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync return RTPathSetOwnerEx(pszPath, uid, gid, RTPATH_F_ON_LINK);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync}
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsyncRTR3DECL(int) RTPathSetOwnerEx(const char *pszPath, uint32_t uid, uint32_t gid, uint32_t fFlags)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync{
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Validate input.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertReturn(*pszPath, VERR_INVALID_PARAMETER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertMsgReturn(RTPATH_F_IS_VALID(fFlags, 0), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
523f2a6676210ab8601d3fdb2fdabe7dcdea7d4cvboxsync uid_t uidNative = uid != NIL_RTUID ? (uid_t)uid : (uid_t)-1;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertReturn(uid == uidNative, VERR_INVALID_PARAMETER);
523f2a6676210ab8601d3fdb2fdabe7dcdea7d4cvboxsync gid_t gidNative = gid != NIL_RTGID ? (gid_t)gid : (uid_t)-1;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync AssertReturn(gid == gidNative, VERR_INVALID_PARAMETER);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync /*
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync * Convert the path.
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync */
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync char const *pszNativePath;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync int rc = rtPathToNative(&pszNativePath, pszPath, NULL);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_SUCCESS(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (fFlags & RTPATH_F_FOLLOW_LINK)
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (chown(pszNativePath, uidNative, gidNative))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTErrConvertFromErrno(errno);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#if 1
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (lchown(pszNativePath, uidNative, gidNative))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTErrConvertFromErrno(errno);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync RTFSOBJINFO ObjInfo;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTPathQueryInfoEx(pszPath, &ObjInfo, RTFSOBJATTRADD_UNIX, fFlags);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_SUCCESS(rc) && RTFS_IS_SYMLINK(ObjInfo.Attr.fMode))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = VERR_NS_SYMLINK_CHANGE_OWNER;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync else if (RT_SUCCESS(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync {
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (lchown(pszNativePath, uidNative, gidNative))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rc = RTErrConvertFromErrno(errno);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync#endif
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync if (RT_FAILURE(rc))
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync Log(("RTPathSetOwnerEx('%s',%d,%d): failed with %Rrc and errno=%d\n",
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pszPath, uid, gid, rc, errno));
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync rtPathFreeNative(pszNativePath, pszPath);
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync }
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync LogFlow(("RTPathSetOwnerEx(%p:{%s}, uid, gid): return %Rrc\n",
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync pszPath, pszPath, uid, gid, rc));
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync return rc;
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync}
cb058427ba3e482de214d42efdd8effaa2b670c7vboxsync