tstVD-2.cpp revision 662d52947eeb3fc8fca3b23991a5eee47077f896
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @file
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
b736c553dbde2c3b2533c93c57d9b7f07714371cvboxsync * Simple VBox HDD container test utility. Only fast tests.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/*
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * available from http://www.virtualbox.org. This file is free software;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * General Public License (GPL) as published by the Free Software
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * additional information or have any questions.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <VBox/err.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <VBox/VBoxHDD.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <iprt/string.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <iprt/stream.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <iprt/file.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <iprt/mem.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <iprt/initterm.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <iprt/rand.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include "stdio.h"
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include "stdlib.h"
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/*******************************************************************************
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync* Global Variables *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync*******************************************************************************/
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync/** The error count. */
d544fe535c163a24bf8cd831b39264da292b8adfvboxsyncunsigned g_cErrors = 0;
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync
d544fe535c163a24bf8cd831b39264da292b8adfvboxsyncstatic struct KeyValuePair {
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync const char *key;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync const char *value;
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync} aCfgNode[] = {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync { "TargetName", "test" },
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync { "LUN", "1" },
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync { "TargetAddress", "address" },
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync { NULL, NULL }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync};
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic bool tstAreKeysValid(void *pvUser, const char *pszzValid)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return true;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync}
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic const char *tstGetValueByKey(const char *pszKey)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync for (int i = 0; aCfgNode[i].key; i++)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (!strcmp(aCfgNode[i].key, pszKey))
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return aCfgNode[i].value;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return NULL;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync}
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic int tstQuerySize(void *pvUser, const char *pszName, size_t *pcbValue)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync const char *pszValue = tstGetValueByKey(pszName);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (!pszValue)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return VERR_CFGM_VALUE_NOT_FOUND;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *pcbValue = strlen(pszValue) + 1;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return VINF_SUCCESS;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync}
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic int tstQuery(void *pvUser, const char *pszName, char *pszValue, size_t cchValue)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync const char *pszTmp = tstGetValueByKey(pszName);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (!pszValue)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return VERR_CFGM_VALUE_NOT_FOUND;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync size_t cchTmp = strlen(pszTmp) + 1;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (cchValue < cchTmp)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return VERR_CFGM_NOT_ENOUGH_SPACE;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync memcpy(pszValue, pszTmp, cchTmp);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return VINF_SUCCESS;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync}
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncVDINTERFACECONFIG icc = {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync sizeof(VDINTERFACECONFIG),
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync VDINTERFACETYPE_CONFIG,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync tstAreKeysValid,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync tstQuerySize,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync tstQuery
9474d83dcac691984017f8255821b95ec7642804vboxsync};
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic int tstVDBackendInfo(void)
9474d83dcac691984017f8255821b95ec7642804vboxsync{
9474d83dcac691984017f8255821b95ec7642804vboxsync int rc;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define MAX_BACKENDS 100
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync VDBACKENDINFO aVDInfo[MAX_BACKENDS];
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync unsigned cEntries;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define CHECK(str) \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync do \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync { \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("%s rc=%Rrc\n", str, rc); \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (RT_FAILURE(rc)) \
9474d83dcac691984017f8255821b95ec7642804vboxsync return rc; \
9474d83dcac691984017f8255821b95ec7642804vboxsync } while (0)
9474d83dcac691984017f8255821b95ec7642804vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsync rc = VDBackendInfo(MAX_BACKENDS, aVDInfo, &cEntries);
9474d83dcac691984017f8255821b95ec7642804vboxsync CHECK("VDBackendInfo()");
9474d83dcac691984017f8255821b95ec7642804vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsync for (unsigned i=0; i < cEntries; i++)
9474d83dcac691984017f8255821b95ec7642804vboxsync {
9474d83dcac691984017f8255821b95ec7642804vboxsync RTPrintf("Backend %u: name=%s capabilities=%#06x extensions=",
9474d83dcac691984017f8255821b95ec7642804vboxsync i, aVDInfo[i].pszBackend, aVDInfo[i].uBackendCaps);
9474d83dcac691984017f8255821b95ec7642804vboxsync if (aVDInfo[i].papszFileExtensions)
9474d83dcac691984017f8255821b95ec7642804vboxsync {
9474d83dcac691984017f8255821b95ec7642804vboxsync const char *const *papsz = aVDInfo[i].papszFileExtensions;
9474d83dcac691984017f8255821b95ec7642804vboxsync while (*papsz != NULL)
9474d83dcac691984017f8255821b95ec7642804vboxsync {
9474d83dcac691984017f8255821b95ec7642804vboxsync if (papsz != aVDInfo[i].papszFileExtensions)
9474d83dcac691984017f8255821b95ec7642804vboxsync RTPrintf(",");
9474d83dcac691984017f8255821b95ec7642804vboxsync RTPrintf("%s", *papsz);
9474d83dcac691984017f8255821b95ec7642804vboxsync papsz++;
9474d83dcac691984017f8255821b95ec7642804vboxsync }
9474d83dcac691984017f8255821b95ec7642804vboxsync if (papsz == aVDInfo[i].papszFileExtensions)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("<EMPTY>");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync else
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("<NONE>");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf(" config=");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (aVDInfo[i].paConfigInfo)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PCVDCONFIGINFO pa = aVDInfo[i].paConfigInfo;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync while (pa->pszKey != NULL)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (pa != aVDInfo[i].paConfigInfo)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf(",");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("(key=%s type=", pa->pszKey);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync switch (pa->enmValueType)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync case VDCFGVALUETYPE_INTEGER:
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("integer");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync break;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync case VDCFGVALUETYPE_STRING:
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("string");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync break;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync case VDCFGVALUETYPE_BYTES:
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("bytes");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync break;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync default:
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("INVALID!");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf(" default=");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (pa->pszDefaultValue)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("%s", pa->pszDefaultValue);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync else
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("<NONE>");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf(" flags=");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (!pa->uKeyFlags)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("none");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync unsigned cFlags = 0;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (pa->uKeyFlags & VD_CFGKEY_MANDATORY)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (cFlags)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf(",");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("mandatory");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync cFlags++;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (pa->uKeyFlags & VD_CFGKEY_EXPERT)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (cFlags)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf(",");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("expert");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync cFlags++;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf(")");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync pa++;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (pa == aVDInfo[i].paConfigInfo)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("<EMPTY>");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync else
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("<NONE>");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("\n");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync VDINTERFACE ic;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync ic.cbSize = sizeof(ic);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync ic.enmInterface = VDINTERFACETYPE_CONFIG;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync ic.pCallbacks = &icc;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync char *pszLocation, *pszName;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync rc = aVDInfo[i].pfnComposeLocation(&ic, &pszLocation);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync CHECK("pfnComposeLocation()");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (pszLocation)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTMemFree(pszLocation);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (aVDInfo[i].uBackendCaps & VD_CAP_FILE)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("Non-NULL location returned for file-based backend!\n");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return VERR_INTERNAL_ERROR;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync rc = aVDInfo[i].pfnComposeName(&ic, &pszName);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync CHECK("pfnComposeName()");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (pszName)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTMemFree(pszName);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (aVDInfo[i].uBackendCaps & VD_CAP_FILE)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("Non-NULL name returned for file-based backend!\n");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return VERR_INTERNAL_ERROR;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#undef CHECK
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return 0;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync}
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsyncint main(int argc, char *argv[])
9474d83dcac691984017f8255821b95ec7642804vboxsync{
9474d83dcac691984017f8255821b95ec7642804vboxsync int rc;
9474d83dcac691984017f8255821b95ec7642804vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsync RTR3Init();
9474d83dcac691984017f8255821b95ec7642804vboxsync RTPrintf("tstVD-2: TESTING...\n");
9474d83dcac691984017f8255821b95ec7642804vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsync rc = tstVDBackendInfo();
9474d83dcac691984017f8255821b95ec7642804vboxsync if (RT_FAILURE(rc))
9474d83dcac691984017f8255821b95ec7642804vboxsync {
9474d83dcac691984017f8255821b95ec7642804vboxsync RTPrintf("tstVD-2: getting backend info test failed! rc=%Rrc\n", rc);
9474d83dcac691984017f8255821b95ec7642804vboxsync g_cErrors++;
9474d83dcac691984017f8255821b95ec7642804vboxsync }
9474d83dcac691984017f8255821b95ec7642804vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsync rc = VDShutdown();
9474d83dcac691984017f8255821b95ec7642804vboxsync if (RT_FAILURE(rc))
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("tstVD-2: unloading backends failed! rc=%Rrc\n", rc);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync g_cErrors++;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync }
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /*
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Summary
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync if (!g_cErrors)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("tstVD-2: SUCCESS\n");
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync else
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTPrintf("tstVD-2: FAILURE - %d errors\n", g_cErrors);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return !!g_cErrors;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync}
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync