73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync/* $Id$ */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync/** @file
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * VirtualBox Main - Autostart implementation.
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2009-2012 Oracle Corporation
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync *
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * available from http://www.virtualbox.org. This file is free software;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * you can redistribute it and/or modify it under the terms of the GNU
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * General Public License (GPL) as published by the Free Software
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include <VBox/err.h>
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include <VBox/log.h>
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include <iprt/assert.h>
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include <iprt/process.h>
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include <iprt/path.h>
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include <iprt/mem.h>
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include <iprt/file.h>
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include <iprt/string.h>
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#include "AutostartDb.h"
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#if defined(RT_OS_LINUX)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync/**
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * Modifies the autostart database.
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync *
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * @returns VBox status code.
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * @param fAutostart Flag whether the autostart or autostop database is modified.
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * @param fAddVM Flag whether a VM is added or removed from the database.
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync */
dc077b46399b3ef751ebd282053f0e9725518e1evboxsyncint AutostartDb::autostartModifyDb(bool fAutostart, bool fAddVM)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync{
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync int rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync char *pszUser = NULL;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync /* Check if the path is set. */
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync if (!m_pszAutostartDbPath)
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync return VERR_PATH_NOT_FOUND;
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync
8c445fc3caadda324a8225aeff14e69d576d9122vboxsync rc = RTProcQueryUsernameA(RTProcSelf(), &pszUser);
8c445fc3caadda324a8225aeff14e69d576d9122vboxsync if (RT_SUCCESS(rc))
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync char *pszFile;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync uint64_t fOpen = RTFILE_O_DENY_ALL | RTFILE_O_READWRITE;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTFILE hAutostartFile;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
8c445fc3caadda324a8225aeff14e69d576d9122vboxsync AssertPtr(pszUser);
8c445fc3caadda324a8225aeff14e69d576d9122vboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (fAddVM)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync fOpen |= RTFILE_O_OPEN_CREATE;
943753b96ed892c047b92ff6eb00bb100de8d6d2vboxsync else
943753b96ed892c047b92ff6eb00bb100de8d6d2vboxsync fOpen |= RTFILE_O_OPEN;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = RTStrAPrintf(&pszFile, "%s/%s.%s",
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync m_pszAutostartDbPath, pszUser, fAutostart ? "start" : "stop");
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (RT_SUCCESS(rc))
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = RTFileOpen(&hAutostartFile, pszFile, fOpen);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (RT_SUCCESS(rc))
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync uint64_t cbFile;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /*
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * Files with more than 16 bytes are rejected because they just contain
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * a number of the amount of VMs with autostart configured, so they
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * should be really really small. Anything else is bogus.
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = RTFileGetSize(hAutostartFile, &cbFile);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if ( RT_SUCCESS(rc)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync && cbFile <= 16)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync char abBuf[16 + 1]; /* trailing \0 */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync uint32_t cAutostartVms = 0;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
94d8af34a7773eba6a53e3dcbf2b363a6639d867vboxsync RT_ZERO(abBuf);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Check if the file was just created. */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (cbFile)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = RTFileRead(hAutostartFile, abBuf, cbFile, NULL);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (RT_SUCCESS(rc))
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = RTStrToUInt32Ex(abBuf, NULL, 10 /* uBase */, &cAutostartVms);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if ( rc == VWRN_TRAILING_CHARS
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync || rc == VWRN_TRAILING_SPACES)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (RT_SUCCESS(rc))
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync size_t cbBuf;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Modify VM counter and write back. */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (fAddVM)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync cAutostartVms++;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync else
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync cAutostartVms--;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (cAutostartVms > 0)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync cbBuf = RTStrPrintf(abBuf, sizeof(abBuf), "%u", cAutostartVms);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = RTFileSetSize(hAutostartFile, cbBuf);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (RT_SUCCESS(rc))
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = RTFileWriteAt(hAutostartFile, 0, abBuf, cbBuf, NULL);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync else
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync {
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Just delete the file if there are no VMs left. */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTFileClose(hAutostartFile);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTFileDelete(pszFile);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync hAutostartFile = NIL_RTFILE;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync else if (RT_SUCCESS(rc))
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VERR_FILE_TOO_BIG;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (hAutostartFile != NIL_RTFILE)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTFileClose(hAutostartFile);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTStrFree(pszFile);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
8c445fc3caadda324a8225aeff14e69d576d9122vboxsync
8c445fc3caadda324a8225aeff14e69d576d9122vboxsync RTStrFree(pszUser);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync }
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync return rc;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync}
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsyncAutostartDb::AutostartDb()
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync{
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#ifdef RT_OS_LINUX
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync int rc = RTCritSectInit(&this->CritSect);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(rc);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync m_pszAutostartDbPath = NULL;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync}
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsyncAutostartDb::~AutostartDb()
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync{
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#ifdef RT_OS_LINUX
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectDelete(&this->CritSect);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync if (m_pszAutostartDbPath)
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync RTStrFree(m_pszAutostartDbPath);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync#endif
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync}
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync
dc077b46399b3ef751ebd282053f0e9725518e1evboxsyncint AutostartDb::setAutostartDbPath(const char *pszAutostartDbPathNew)
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync{
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync#if defined(RT_OS_LINUX)
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync char *pszAutostartDbPathTmp = NULL;
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync if (pszAutostartDbPathNew)
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync {
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync pszAutostartDbPathTmp = RTStrDup(pszAutostartDbPathNew);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync if (!pszAutostartDbPathTmp)
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync return VERR_NO_MEMORY;
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync }
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync RTCritSectEnter(&this->CritSect);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync if (m_pszAutostartDbPath)
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync RTStrFree(m_pszAutostartDbPath);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync m_pszAutostartDbPath = pszAutostartDbPathTmp;
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync RTCritSectLeave(&this->CritSect);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync return VINF_SUCCESS;
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync#else
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync NOREF(pszAutostartDbPathNew);
18241d54e51ea1bf7390d5ca6eea3d3a88a2f9bcvboxsync return VERR_NOT_SUPPORTED;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync}
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsyncint AutostartDb::addAutostartVM(const char *pszVMId)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync{
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync int rc = VERR_NOT_SUPPORTED;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#if defined(RT_OS_LINUX)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId); /* Not needed */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectEnter(&this->CritSect);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = autostartModifyDb(true /* fAutostart */, true /* fAddVM */);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectLeave(&this->CritSect);
395d92a7732aad3c0b9baecedfabba5113b84485vboxsync#elif defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId); /* Not needed */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#else
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VERR_NOT_SUPPORTED;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync return rc;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync}
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsyncint AutostartDb::removeAutostartVM(const char *pszVMId)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync{
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync int rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#if defined(RT_OS_LINUX)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId); /* Not needed */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectEnter(&this->CritSect);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = autostartModifyDb(true /* fAutostart */, false /* fAddVM */);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectLeave(&this->CritSect);
395d92a7732aad3c0b9baecedfabba5113b84485vboxsync#elif defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId); /* Not needed */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#else
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VERR_NOT_SUPPORTED;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync return rc;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync}
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsyncint AutostartDb::addAutostopVM(const char *pszVMId)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync{
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync int rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#if defined(RT_OS_LINUX)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId); /* Not needed */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectEnter(&this->CritSect);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = autostartModifyDb(false /* fAutostart */, true /* fAddVM */);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectLeave(&this->CritSect);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#elif defined(RT_OS_DARWIN)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId); /* Not needed */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#else
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VERR_NOT_SUPPORTED;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync return rc;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync}
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsyncint AutostartDb::removeAutostopVM(const char *pszVMId)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync{
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync int rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#if defined(RT_OS_LINUX)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId); /* Not needed */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectEnter(&this->CritSect);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = autostartModifyDb(false /* fAutostart */, false /* fAddVM */);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RTCritSectLeave(&this->CritSect);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#elif defined(RT_OS_DARWIN)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId); /* Not needed */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VINF_SUCCESS;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#else
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync NOREF(pszVMId);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync rc = VERR_NOT_SUPPORTED;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync return rc;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync}
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync