5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync/** @file
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync *
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync * VirtualBox API client session crash token handling
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync/*
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * Copyright (C) 2004-2013 Oracle Corporation
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync *
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * available from http://www.virtualbox.org. This file is free software;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * you can redistribute it and/or modify it under the terms of the GNU
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * General Public License (GPL) as published by the Free Software
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include <iprt/asm.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include <iprt/assert.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include <iprt/log.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include <iprt/semaphore.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include <iprt/process.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#ifdef VBOX_WITH_SYS_V_IPC_SESSION_WATCHER
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# include <errno.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# include <sys/types.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# include <sys/stat.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# include <sys/ipc.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# include <sys/sem.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#endif
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include <VBox/com/defs.h>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include <vector>
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include "VirtualBoxBase.h"
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include "AutoCaller.h"
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include "ClientToken.h"
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#include "MachineImpl.h"
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsyncMachine::ClientToken::ClientToken()
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync{
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertReleaseFailed();
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync}
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsyncMachine::ClientToken::~ClientToken()
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync{
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#if defined(RT_OS_WINDOWS)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (mClientToken)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ::CloseHandle(mClientToken);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#elif defined(RT_OS_OS2)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (mClientToken != NULLHANDLE)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ::DosCloseMutexSem(mClientToken);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (mClientToken >= 0)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ::semctl(mClientToken, 0, IPC_RMID);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# ifdef VBOX_WITH_NEW_SYS_V_KEYGEN
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientTokenId = "0";
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# endif /* VBOX_WITH_NEW_SYS_V_KEYGEN */
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync#elif defined(VBOX_WITH_GENERIC_SESSION_WATCHER)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync /* release the token, uses reference counting */
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync if (mClientToken)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync {
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync if (!mClientTokenPassed)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientToken->Release();
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientToken = NULL;
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync }
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#else
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# error "Port me!"
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#endif
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientToken = CTTOKENARG;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync}
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsyncMachine::ClientToken::ClientToken(const ComObjPtr<Machine> &pMachine,
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync SessionMachine *pSessionMachine) :
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mMachine(pMachine)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync{
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#if defined(RT_OS_WINDOWS)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync NOREF(pSessionMachine);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync Bstr tokenId = pMachine->mData->m_strConfigFileFull;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync for (size_t i = 0; i < tokenId.length(); i++)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (tokenId.raw()[i] == '\\')
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync tokenId.raw()[i] = '/';
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientToken = ::CreateMutex(NULL, FALSE, tokenId.raw());
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientTokenId = tokenId;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertMsg(mClientToken,
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ("Cannot create token '%s', err=%d",
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientTokenId.c_str(), ::GetLastError()));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#elif defined(RT_OS_OS2)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync NOREF(pSessionMachine);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync Utf8Str ipcSem = Utf8StrFmt("\\SEM32\\VBOX\\VM\\{%RTuuid}",
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync pMachine->mData->mUuid.raw());
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientTokenId = ipcSem;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync APIRET arc = ::DosCreateMutexSem((PSZ)ipcSem.c_str(), &mClientToken, 0, FALSE);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertMsg(arc == NO_ERROR,
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ("Cannot create token '%s', arc=%ld",
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ipcSem.c_str(), arc));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync NOREF(pSessionMachine);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# ifdef VBOX_WITH_NEW_SYS_V_KEYGEN
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# if defined(RT_OS_FREEBSD) && (HC_ARCH_BITS == 64)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync /** @todo Check that this still works correctly. */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertCompileSize(key_t, 8);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# else
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertCompileSize(key_t, 4);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# endif
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync key_t key;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientToken = -1;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientTokenId = "0";
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync for (uint32_t i = 0; i < 1 << 24; i++)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync {
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync key = ((uint32_t)'V' << 24) | i;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync int sem = ::semget(key, 1, S_IRUSR | S_IWUSR | IPC_CREAT | IPC_EXCL);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (sem >= 0 || (errno != EEXIST && errno != EACCES))
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync {
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientToken = sem;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (sem >= 0)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientTokenId = BstrFmt("%u", key);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync break;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync }
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync }
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# else /* !VBOX_WITH_NEW_SYS_V_KEYGEN */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync Utf8Str semName = pMachine->mData->m_strConfigFileFull;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync char *pszSemName = NULL;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync RTStrUtf8ToCurrentCP(&pszSemName, semName);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync key_t key = ::ftok(pszSemName, 'V');
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync RTStrFree(pszSemName);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientToken = ::semget(key, 1, S_IRWXU | S_IRWXG | S_IRWXO | IPC_CREAT);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# endif /* !VBOX_WITH_NEW_SYS_V_KEYGEN */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync int errnoSave = errno;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (mClientToken < 0 && errnoSave == ENOSYS)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync {
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mMachine->setError(E_FAIL,
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync tr("Cannot create IPC semaphore. Most likely your host kernel lacks "
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync "support for SysV IPC. Check the host kernel configuration for "
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync "CONFIG_SYSVIPC=y"));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientToken = CTTOKENARG;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync return;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync }
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync /* ENOSPC can also be the result of VBoxSVC crashes without properly freeing
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync * the token */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (mClientToken < 0 && errnoSave == ENOSPC)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync {
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#ifdef RT_OS_LINUX
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mMachine->setError(E_FAIL,
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync tr("Cannot create IPC semaphore because the system limit for the "
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync "maximum number of semaphore sets (SEMMNI), or the system wide "
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync "maximum number of semaphores (SEMMNS) would be exceeded. The "
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync "current set of SysV IPC semaphores can be determined from "
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync "the file /proc/sysvipc/sem"));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#else
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mMachine->setError(E_FAIL,
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync tr("Cannot create IPC semaphore because the system-imposed limit "
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync "on the maximum number of allowed semaphores or semaphore "
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync "identifiers system-wide would be exceeded"));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#endif
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientToken = CTTOKENARG;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync return;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync }
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertMsgReturnVoid(mClientToken >= 0, ("Cannot create token, errno=%d", errnoSave));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync /* set the initial value to 1 */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync int rv = ::semctl(mClientToken, 0, SETVAL, 1);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync errnoSave = errno;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (rv != 0)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync {
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ::semctl(mClientToken, 0, IPC_RMID);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync mClientToken = CTTOKENARG;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertMsgFailedReturnVoid(("Cannot init token, errno=%d", errnoSave));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync }
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync#elif defined(VBOX_WITH_GENERIC_SESSION_WATCHER)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync ComObjPtr<MachineToken> pToken;
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync HRESULT rc = pToken.createObject();
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync if (SUCCEEDED(rc))
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync {
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync rc = pToken->init(pSessionMachine);
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync if (SUCCEEDED(rc))
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync {
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientToken = pToken;
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync if (mClientToken)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync {
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync rc = mClientToken->AddRef();
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync if (FAILED(rc))
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientToken = NULL;
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync }
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync }
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync }
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync pToken.setNull();
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientTokenPassed = false;
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync /* mClientTokenId isn't really used */
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientTokenId = pMachine->mData->m_strConfigFileFull;
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync AssertMsg(mClientToken,
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync ("Cannot create token '%s', rc=%Rhrc",
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientTokenId.c_str(), rc));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#else
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# error "Port me!"
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#endif
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync}
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsyncbool Machine::ClientToken::isReady()
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync{
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync return mClientToken != CTTOKENARG;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync}
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsyncvoid Machine::ClientToken::getId(Utf8Str &strId)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync{
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync strId = mClientTokenId;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync}
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsyncCTTOKENTYPE Machine::ClientToken::getToken()
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync{
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync#ifdef VBOX_WITH_GENERIC_SESSION_WATCHER
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientTokenPassed = true;
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync#endif /* VBOX_WITH_GENERIC_SESSION_WATCHER */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync return mClientToken;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync}
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync#ifndef VBOX_WITH_GENERIC_SESSION_WATCHER
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsyncbool Machine::ClientToken::release()
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync{
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync bool terminated = false;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#if defined(RT_OS_WINDOWS)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertMsg(mClientToken, ("semaphore must be created"));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync /* release the token */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ::ReleaseMutex(mClientToken);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync terminated = true;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#elif defined(RT_OS_OS2)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertMsg(mClientToken, ("semaphore must be created"));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync /* release the token */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync ::DosReleaseMutexSem(mClientToken);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync terminated = true;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync AssertMsg(mClientToken >= 0, ("semaphore must be created"));
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync int val = ::semctl(mClientToken, 0, GETVAL);
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync if (val > 0)
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync {
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync /* the semaphore is signaled, meaning the session is terminated */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync terminated = true;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync }
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync#elif defined(VBOX_WITH_GENERIC_SESSION_WATCHER)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync /** @todo r=klaus never tested, this code is not reached */
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync AssertMsg(mClientToken, ("token must be created"));
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync /* release the token, uses reference counting */
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync if (mClientToken)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync {
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync if (!mClientTokenPassed)
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientToken->Release();
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync mClientToken = NULL;
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync }
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync terminated = true;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#else
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync# error "Port me!"
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync#endif
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync return terminated;
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync}
8157dba118de0fdf8d1a2c7664edd82cc69dcf4fvboxsync#endif /* !VBOX_WITH_GENERIC_SESSION_WATCHER */
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync
5637660ed0c2a4a3a114e6d2d4c8294f2fd5f18fvboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */