97a22e235416469499b353dfec11fc90c79df178vboxsync/* $Id$ */
97a22e235416469499b353dfec11fc90c79df178vboxsync/** @file
97a22e235416469499b353dfec11fc90c79df178vboxsync * IPRT - RTFileModeToFlags.
97a22e235416469499b353dfec11fc90c79df178vboxsync */
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync/*
97a22e235416469499b353dfec11fc90c79df178vboxsync * Copyright (C) 2013 Oracle Corporation
97a22e235416469499b353dfec11fc90c79df178vboxsync *
97a22e235416469499b353dfec11fc90c79df178vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
97a22e235416469499b353dfec11fc90c79df178vboxsync * available from http://www.virtualbox.org. This file is free software;
97a22e235416469499b353dfec11fc90c79df178vboxsync * you can redistribute it and/or modify it under the terms of the GNU
97a22e235416469499b353dfec11fc90c79df178vboxsync * General Public License (GPL) as published by the Free Software
97a22e235416469499b353dfec11fc90c79df178vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
97a22e235416469499b353dfec11fc90c79df178vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
97a22e235416469499b353dfec11fc90c79df178vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
97a22e235416469499b353dfec11fc90c79df178vboxsync *
97a22e235416469499b353dfec11fc90c79df178vboxsync * The contents of this file may alternatively be used under the terms
97a22e235416469499b353dfec11fc90c79df178vboxsync * of the Common Development and Distribution License Version 1.0
97a22e235416469499b353dfec11fc90c79df178vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
97a22e235416469499b353dfec11fc90c79df178vboxsync * VirtualBox OSE distribution, in which case the provisions of the
97a22e235416469499b353dfec11fc90c79df178vboxsync * CDDL are applicable instead of those of the GPL.
97a22e235416469499b353dfec11fc90c79df178vboxsync *
97a22e235416469499b353dfec11fc90c79df178vboxsync * You may elect to license modified versions of this file under the
97a22e235416469499b353dfec11fc90c79df178vboxsync * terms and conditions of either the GPL or the CDDL or both.
97a22e235416469499b353dfec11fc90c79df178vboxsync */
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync/*******************************************************************************
97a22e235416469499b353dfec11fc90c79df178vboxsync* Header Files *
97a22e235416469499b353dfec11fc90c79df178vboxsync*******************************************************************************/
97a22e235416469499b353dfec11fc90c79df178vboxsync#include <iprt/assert.h>
97a22e235416469499b353dfec11fc90c79df178vboxsync#include <iprt/err.h>
97a22e235416469499b353dfec11fc90c79df178vboxsync#include <iprt/file.h>
97a22e235416469499b353dfec11fc90c79df178vboxsync#include <iprt/string.h>
97a22e235416469499b353dfec11fc90c79df178vboxsync#include "internal/iprt.h"
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsyncRTR3DECL(int) RTFileModeToFlags(const char *pszMode, uint64_t *puMode)
97a22e235416469499b353dfec11fc90c79df178vboxsync{
97a22e235416469499b353dfec11fc90c79df178vboxsync AssertPtrReturn(pszMode, VERR_INVALID_POINTER);
97a22e235416469499b353dfec11fc90c79df178vboxsync AssertPtrReturn(puMode, VERR_INVALID_POINTER);
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync int rc = VINF_SUCCESS;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync const char *pszCur = pszMode;
97a22e235416469499b353dfec11fc90c79df178vboxsync uint64_t uMode = 0;
97a22e235416469499b353dfec11fc90c79df178vboxsync char chPrev = 0;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync if (*pszCur == '\0')
97a22e235416469499b353dfec11fc90c79df178vboxsync return VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync while ( pszCur
97a22e235416469499b353dfec11fc90c79df178vboxsync && *pszCur != '\0')
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync bool fSkip = false;
97a22e235416469499b353dfec11fc90c79df178vboxsync switch (*pszCur)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync /* Opens an existing file for writing and places the
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync * file pointer at the end of the file. The file is
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync * created if it does not exist. */
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'a':
97a22e235416469499b353dfec11fc90c79df178vboxsync if ((uMode & RTFILE_O_ACTION_MASK) == 0)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync uMode |= RTFILE_O_OPEN_CREATE
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync | RTFILE_O_WRITE
97a22e235416469499b353dfec11fc90c79df178vboxsync | RTFILE_O_APPEND;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync else
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'b': /* Binary mode. */
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Just skip as being valid. */
97a22e235416469499b353dfec11fc90c79df178vboxsync fSkip = true;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Creates a file or open an existing one for
97a22e235416469499b353dfec11fc90c79df178vboxsync * writing only. The file pointer will be placed
97a22e235416469499b353dfec11fc90c79df178vboxsync * at the beginning of the file.*/
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'c':
97a22e235416469499b353dfec11fc90c79df178vboxsync if ((uMode & RTFILE_O_ACTION_MASK) == 0)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_OPEN_CREATE
97a22e235416469499b353dfec11fc90c79df178vboxsync | RTFILE_O_WRITE;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync else
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Opens an existing file for reading and places the
97a22e235416469499b353dfec11fc90c79df178vboxsync * file pointer at the beginning of the file. If the
97a22e235416469499b353dfec11fc90c79df178vboxsync * file does not exist an error will be returned. */
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'r':
97a22e235416469499b353dfec11fc90c79df178vboxsync if ((uMode & RTFILE_O_ACTION_MASK) == 0)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_OPEN
97a22e235416469499b353dfec11fc90c79df178vboxsync | RTFILE_O_READ;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync else
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 't': /* Text mode. */
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Just skip as being valid. */
97a22e235416469499b353dfec11fc90c79df178vboxsync fSkip = true;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Creates a new file or replaces an existing one
97a22e235416469499b353dfec11fc90c79df178vboxsync * for writing. Places the file pointer at the beginning.
97a22e235416469499b353dfec11fc90c79df178vboxsync * An existing file will be truncated to 0 bytes. */
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'w':
97a22e235416469499b353dfec11fc90c79df178vboxsync if ((uMode & RTFILE_O_ACTION_MASK) == 0)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_CREATE_REPLACE
97a22e235416469499b353dfec11fc90c79df178vboxsync | RTFILE_O_WRITE
97a22e235416469499b353dfec11fc90c79df178vboxsync | RTFILE_O_TRUNCATE;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync else
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Creates a new file and opens it for writing. Places
97a22e235416469499b353dfec11fc90c79df178vboxsync * the file pointer at the beginning. If the file
97a22e235416469499b353dfec11fc90c79df178vboxsync * exists an error will be returned. */
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'x':
97a22e235416469499b353dfec11fc90c79df178vboxsync if ((uMode & RTFILE_O_ACTION_MASK) == 0)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_CREATE
97a22e235416469499b353dfec11fc90c79df178vboxsync | RTFILE_O_WRITE;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync else
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case '+':
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync switch (chPrev)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync case 'a':
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'c':
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'w':
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'x':
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Also open / create file with read access. */
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_READ;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'r':
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Also open / create file with write access. */
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_WRITE;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'b':
97a22e235416469499b353dfec11fc90c79df178vboxsync case 't':
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Silently eat skipped parameters. */
97a22e235416469499b353dfec11fc90c79df178vboxsync fSkip = true;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 0: /* No previous character yet. */
97a22e235416469499b353dfec11fc90c79df178vboxsync case '+':
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Eat plusses which don't belong to a command. */
97a22e235416469499b353dfec11fc90c79df178vboxsync fSkip = true;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync default:
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync default:
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync if (RT_FAILURE(rc))
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync if (!fSkip)
97a22e235416469499b353dfec11fc90c79df178vboxsync chPrev = *pszCur;
97a22e235416469499b353dfec11fc90c79df178vboxsync pszCur++;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /* No action mask set? */
d32bfbceca9cace1f83aebb98cc0f3f0f49f2832vboxsync if ( RT_SUCCESS(rc)
d32bfbceca9cace1f83aebb98cc0f3f0f49f2832vboxsync && (uMode & RTFILE_O_ACTION_MASK) == 0)
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync
d32bfbceca9cace1f83aebb98cc0f3f0f49f2832vboxsync /** @todo Handle sharing mode. */
d32bfbceca9cace1f83aebb98cc0f3f0f49f2832vboxsync uMode |= RTFILE_O_DENY_NONE;
d32bfbceca9cace1f83aebb98cc0f3f0f49f2832vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync if (RT_SUCCESS(rc))
97a22e235416469499b353dfec11fc90c79df178vboxsync *puMode = uMode;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync return rc;
97a22e235416469499b353dfec11fc90c79df178vboxsync}
97a22e235416469499b353dfec11fc90c79df178vboxsyncRT_EXPORT_SYMBOL(RTFileModeToFlags);
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsyncRTR3DECL(int) RTFileModeToFlagsEx(const char *pszAccess, const char *pszDisposition,
97a22e235416469499b353dfec11fc90c79df178vboxsync const char *pszSharing, uint64_t *puMode)
97a22e235416469499b353dfec11fc90c79df178vboxsync{
97a22e235416469499b353dfec11fc90c79df178vboxsync AssertPtrReturn(pszAccess, VERR_INVALID_POINTER);
97a22e235416469499b353dfec11fc90c79df178vboxsync AssertPtrReturn(pszDisposition, VERR_INVALID_POINTER);
97a22e235416469499b353dfec11fc90c79df178vboxsync /* pszSharing is not used yet. */
97a22e235416469499b353dfec11fc90c79df178vboxsync AssertPtrReturn(puMode, VERR_INVALID_POINTER);
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync int rc = VINF_SUCCESS;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync const char *pszCur = pszAccess;
97a22e235416469499b353dfec11fc90c79df178vboxsync uint64_t uMode = 0;
97a22e235416469499b353dfec11fc90c79df178vboxsync char chPrev = 0;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync if (*pszCur == '\0')
97a22e235416469499b353dfec11fc90c79df178vboxsync return VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /*
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync * Handle access mode.
97a22e235416469499b353dfec11fc90c79df178vboxsync */
97a22e235416469499b353dfec11fc90c79df178vboxsync while ( pszCur
97a22e235416469499b353dfec11fc90c79df178vboxsync && *pszCur != '\0')
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync bool fSkip = false;
97a22e235416469499b353dfec11fc90c79df178vboxsync switch (*pszCur)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'b': /* Binary mode. */
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Just skip as being valid. */
97a22e235416469499b353dfec11fc90c79df178vboxsync fSkip = true;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'r': /* Read. */
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_READ;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 't': /* Text mode. */
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Just skip as being valid. */
97a22e235416469499b353dfec11fc90c79df178vboxsync fSkip = true;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'w': /* Write. */
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_WRITE;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case '+':
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync switch (chPrev)
97a22e235416469499b353dfec11fc90c79df178vboxsync {
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'w':
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Also use read access in write mode. */
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_READ;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'r':
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Also use write access in read mode. */
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_WRITE;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 'b':
97a22e235416469499b353dfec11fc90c79df178vboxsync case 't':
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Silently eat skipped parameters. */
97a22e235416469499b353dfec11fc90c79df178vboxsync fSkip = true;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync case 0: /* No previous character yet. */
97a22e235416469499b353dfec11fc90c79df178vboxsync case '+':
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Eat plusses which don't belong to a command. */
97a22e235416469499b353dfec11fc90c79df178vboxsync fSkip = true;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync default:
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync default:
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync if (RT_FAILURE(rc))
97a22e235416469499b353dfec11fc90c79df178vboxsync break;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync if (!fSkip)
97a22e235416469499b353dfec11fc90c79df178vboxsync chPrev = *pszCur;
97a22e235416469499b353dfec11fc90c79df178vboxsync pszCur++;
97a22e235416469499b353dfec11fc90c79df178vboxsync }
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync if (RT_FAILURE(rc))
97a22e235416469499b353dfec11fc90c79df178vboxsync return rc;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /*
97a22e235416469499b353dfec11fc90c79df178vboxsync * Handle disposition.
97a22e235416469499b353dfec11fc90c79df178vboxsync */
97a22e235416469499b353dfec11fc90c79df178vboxsync pszCur = pszDisposition;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Create a new file, always, overwrite an existing file. */
97a22e235416469499b353dfec11fc90c79df178vboxsync if (!RTStrCmp(pszCur, "ca"))
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_CREATE_REPLACE;
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Create a new file if it does not exist, fail if exist. */
97a22e235416469499b353dfec11fc90c79df178vboxsync else if (!RTStrCmp(pszCur, "ce"))
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_CREATE;
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Open existing file, create file if does not exist. */
97a22e235416469499b353dfec11fc90c79df178vboxsync else if (!RTStrCmp(pszCur, "oc"))
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_OPEN_CREATE;
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync /* Open existing file and place the file pointer at
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync * the end of the file, if opened with write access.
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync * Create the file if does not exist. */
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync else if (!RTStrCmp(pszCur, "oa"))
306d9cb84eb3658ab739a7d25c4ceca11482ace2vboxsync uMode |= RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND;
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Open existing, fail if does not exist. */
97a22e235416469499b353dfec11fc90c79df178vboxsync else if (!RTStrCmp(pszCur, "oe"))
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_OPEN;
97a22e235416469499b353dfec11fc90c79df178vboxsync /* Open and truncate existing, fail of not exist. */
97a22e235416469499b353dfec11fc90c79df178vboxsync else if (!RTStrCmp(pszCur, "ot"))
97a22e235416469499b353dfec11fc90c79df178vboxsync uMode |= RTFILE_O_OPEN | RTFILE_O_TRUNCATE;
ea4e4a67ff01ace0be2ee49b63302d8d1dd301devboxsync else
ea4e4a67ff01ace0be2ee49b63302d8d1dd301devboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /* No action mask set? */
ea4e4a67ff01ace0be2ee49b63302d8d1dd301devboxsync if ( RT_SUCCESS(rc)
ea4e4a67ff01ace0be2ee49b63302d8d1dd301devboxsync && (uMode & RTFILE_O_ACTION_MASK) == 0)
97a22e235416469499b353dfec11fc90c79df178vboxsync rc = VERR_INVALID_PARAMETER;
97a22e235416469499b353dfec11fc90c79df178vboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync /** @todo Handle sharing mode. */
d32bfbceca9cace1f83aebb98cc0f3f0f49f2832vboxsync uMode |= RTFILE_O_DENY_NONE;
97a22e235416469499b353dfec11fc90c79df178vboxsync
ea4e4a67ff01ace0be2ee49b63302d8d1dd301devboxsync if (RT_SUCCESS(rc))
ea4e4a67ff01ace0be2ee49b63302d8d1dd301devboxsync *puMode = uMode;
ea4e4a67ff01ace0be2ee49b63302d8d1dd301devboxsync
97a22e235416469499b353dfec11fc90c79df178vboxsync return rc;
97a22e235416469499b353dfec11fc90c79df178vboxsync}
97a22e235416469499b353dfec11fc90c79df178vboxsyncRT_EXPORT_SYMBOL(RTFileModeToFlagsEx);
97a22e235416469499b353dfec11fc90c79df178vboxsync