1a84601801d5bd045712787a3ef59313795389a1vboxsync/** $Id$ */
1a84601801d5bd045712787a3ef59313795389a1vboxsync/** @file
1a84601801d5bd045712787a3ef59313795389a1vboxsync * VBoxClient - User specific services, Darwin.
1a84601801d5bd045712787a3ef59313795389a1vboxsync */
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/*
1a84601801d5bd045712787a3ef59313795389a1vboxsync * Copyright (C) 2007-2013 Oracle Corporation
1a84601801d5bd045712787a3ef59313795389a1vboxsync *
1a84601801d5bd045712787a3ef59313795389a1vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1a84601801d5bd045712787a3ef59313795389a1vboxsync * available from http://www.virtualbox.org. This file is free software;
1a84601801d5bd045712787a3ef59313795389a1vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1a84601801d5bd045712787a3ef59313795389a1vboxsync * General Public License (GPL) as published by the Free Software
1a84601801d5bd045712787a3ef59313795389a1vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1a84601801d5bd045712787a3ef59313795389a1vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1a84601801d5bd045712787a3ef59313795389a1vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1a84601801d5bd045712787a3ef59313795389a1vboxsync */
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/*******************************************************************************
1a84601801d5bd045712787a3ef59313795389a1vboxsync* Header Files *
1a84601801d5bd045712787a3ef59313795389a1vboxsync*******************************************************************************/
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <stdio.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <signal.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <unistd.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <stdlib.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <VBox/log.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <VBox/VBoxGuestLib.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <iprt/stream.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <iprt/initterm.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <iprt/message.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <iprt/process.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include <iprt/string.h>
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync#include "VBoxClientInternal.h"
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/*******************************************************************************
1a84601801d5bd045712787a3ef59313795389a1vboxsync* Glogal Variables *
1a84601801d5bd045712787a3ef59313795389a1vboxsync*******************************************************************************/
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic int g_cVerbosity = 0;
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic PRTLOGGER g_pLogger = NULL;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic VBOXCLIENTSERVICE g_aServices[] =
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
fefd4ef184631cd9ae3d4b2e5ec1997b77c71687vboxsync g_ClipboardService
1a84601801d5bd045712787a3ef59313795389a1vboxsync};
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/**
1a84601801d5bd045712787a3ef59313795389a1vboxsync * Create default logger in order to print output to the specified file.
1a84601801d5bd045712787a3ef59313795389a1vboxsync *
1a84601801d5bd045712787a3ef59313795389a1vboxsync * @return IPRT status code.
1a84601801d5bd045712787a3ef59313795389a1vboxsync */
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic int vbclInitLogger(char *szLogFileName)
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
1a84601801d5bd045712787a3ef59313795389a1vboxsync int rc;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync uint32_t fFlags = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG;
1a84601801d5bd045712787a3ef59313795389a1vboxsync static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
1a84601801d5bd045712787a3ef59313795389a1vboxsync uint32_t fDestFlags = RTLOGDEST_STDOUT;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync rc = RTLogCreateEx(&g_pLogger,
1a84601801d5bd045712787a3ef59313795389a1vboxsync fFlags, /* Logger instance flags, a combination of the RTLOGFLAGS_* values */
1a84601801d5bd045712787a3ef59313795389a1vboxsync "all", /* The initial group settings */
1a84601801d5bd045712787a3ef59313795389a1vboxsync "VBOXCLIENT_RELEASE_LOG", /* Base name for the environment variables for this instance */
1a84601801d5bd045712787a3ef59313795389a1vboxsync RT_ELEMENTS(s_apszGroups), /* Number of groups in the array */
1a84601801d5bd045712787a3ef59313795389a1vboxsync s_apszGroups, /* Pointer to array of groups. This must stick around for the life of the logger instance */
1a84601801d5bd045712787a3ef59313795389a1vboxsync fDestFlags, /* The destination flags */
1a84601801d5bd045712787a3ef59313795389a1vboxsync NULL, /* Callback function for starting logging and for ending or starting a new file for log history rotation */
1a84601801d5bd045712787a3ef59313795389a1vboxsync szLogFileName ? 10 : 0, /* Number of old log files to keep when performing log history rotation */
1a84601801d5bd045712787a3ef59313795389a1vboxsync szLogFileName ? 100 * _1M : 0, /* Maximum size of log file when performing history rotation */
1a84601801d5bd045712787a3ef59313795389a1vboxsync szLogFileName ? RT_SEC_1DAY : 0, /* Maximum time interval per log file when performing history rotation */
1a84601801d5bd045712787a3ef59313795389a1vboxsync 0, /* A buffer which is filled with an error message if something fails */
1a84601801d5bd045712787a3ef59313795389a1vboxsync 0, /* The size of the error message buffer */
1a84601801d5bd045712787a3ef59313795389a1vboxsync szLogFileName /* Log filename format string */
1a84601801d5bd045712787a3ef59313795389a1vboxsync );
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync AssertReturn(RT_SUCCESS(rc), rc);
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync /* Register this logger as the release logger */
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTLogRelSetDefaultInstance(g_pLogger);
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync /* Explicitly flush the log in case of VBOXCLIENT_RELEASE_LOG=buffered. */
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTLogFlush(g_pLogger);
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync return rc;
1a84601801d5bd045712787a3ef59313795389a1vboxsync}
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/**
1a84601801d5bd045712787a3ef59313795389a1vboxsync * Destroy logger.
1a84601801d5bd045712787a3ef59313795389a1vboxsync */
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic void vbclTermLogger(char *szLogFileName)
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
1a84601801d5bd045712787a3ef59313795389a1vboxsync // Why SIGBUS here?
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTLogDestroy(RTLogRelSetDefaultInstance(NULL));
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (szLogFileName)
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTStrFree(szLogFileName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync}
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/**
1a84601801d5bd045712787a3ef59313795389a1vboxsync * Displays a verbose message.
1a84601801d5bd045712787a3ef59313795389a1vboxsync *
1a84601801d5bd045712787a3ef59313795389a1vboxsync * @param iLevel Minimum log level required to display this message.
1a84601801d5bd045712787a3ef59313795389a1vboxsync * @param pszFormat The message text.
1a84601801d5bd045712787a3ef59313795389a1vboxsync * @param ... Format arguments.
1a84601801d5bd045712787a3ef59313795389a1vboxsync */
1a84601801d5bd045712787a3ef59313795389a1vboxsyncvoid VBoxClientVerbose(int iLevel, const char *pszFormat, ...)
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (iLevel > g_cVerbosity)
1a84601801d5bd045712787a3ef59313795389a1vboxsync return;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync va_list args;
1a84601801d5bd045712787a3ef59313795389a1vboxsync va_start(args, pszFormat);
1a84601801d5bd045712787a3ef59313795389a1vboxsync char *psz = NULL;
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTStrAPrintfV(&psz, pszFormat, args);
1a84601801d5bd045712787a3ef59313795389a1vboxsync va_end(args);
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync AssertPtr(psz);
1a84601801d5bd045712787a3ef59313795389a1vboxsync LogRel(("%s", psz));
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTStrFree(psz);
1a84601801d5bd045712787a3ef59313795389a1vboxsync}
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/**
1a84601801d5bd045712787a3ef59313795389a1vboxsync * Wait for signals in order to safely terminate process.
1a84601801d5bd045712787a3ef59313795389a1vboxsync */
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic void vbclWait(void)
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
1a84601801d5bd045712787a3ef59313795389a1vboxsync sigset_t signalMask;
1a84601801d5bd045712787a3ef59313795389a1vboxsync int iSignal;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync /* Register signals that we are waiting for */
1a84601801d5bd045712787a3ef59313795389a1vboxsync sigemptyset(&signalMask);
1a84601801d5bd045712787a3ef59313795389a1vboxsync sigaddset(&signalMask, SIGHUP);
1a84601801d5bd045712787a3ef59313795389a1vboxsync sigaddset(&signalMask, SIGINT);
1a84601801d5bd045712787a3ef59313795389a1vboxsync sigaddset(&signalMask, SIGQUIT);
1a84601801d5bd045712787a3ef59313795389a1vboxsync sigaddset(&signalMask, SIGABRT);
1a84601801d5bd045712787a3ef59313795389a1vboxsync sigaddset(&signalMask, SIGTERM);
1a84601801d5bd045712787a3ef59313795389a1vboxsync pthread_sigmask(SIG_BLOCK, &signalMask, NULL);
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync /* Ignoring return status */
1a84601801d5bd045712787a3ef59313795389a1vboxsync sigwait(&signalMask, &iSignal);
1a84601801d5bd045712787a3ef59313795389a1vboxsync}
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/**
1a84601801d5bd045712787a3ef59313795389a1vboxsync * Start registered services.
1a84601801d5bd045712787a3ef59313795389a1vboxsync *
1a84601801d5bd045712787a3ef59313795389a1vboxsync * @return IPRT status code.
1a84601801d5bd045712787a3ef59313795389a1vboxsync */
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic int vbclStartServices(void)
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
1a84601801d5bd045712787a3ef59313795389a1vboxsync int rc;
1a84601801d5bd045712787a3ef59313795389a1vboxsync unsigned int iServiceId = 0;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "Starting services...\n");
1a84601801d5bd045712787a3ef59313795389a1vboxsync for (iServiceId = 0; iServiceId < RT_ELEMENTS(g_aServices); iServiceId++)
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "Starting service: %s\n", g_aServices[iServiceId].pszName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync rc = (g_aServices[iServiceId].pfnStart)();
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_FAILURE(rc))
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "unable to start service: %s (%Rrc)\n", g_aServices[iServiceId].pszName, rc);
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "Rolling back..\n");
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync /* Stop running services */
1a84601801d5bd045712787a3ef59313795389a1vboxsync do
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "Stopping service: %s\n", g_aServices[iServiceId].pszName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync int rcStop = (g_aServices[iServiceId].pfnStop)();
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_FAILURE(rcStop))
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "unable to stop service: %s (%Rrc)\n", g_aServices[iServiceId].pszName, rcStop);
1a84601801d5bd045712787a3ef59313795389a1vboxsync } while (--iServiceId != 0);
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync break;
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_SUCCESS(rc))
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "Services start completed.\n");
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync return rc;
1a84601801d5bd045712787a3ef59313795389a1vboxsync}
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync/**
1a84601801d5bd045712787a3ef59313795389a1vboxsync * Stop registered services.
1a84601801d5bd045712787a3ef59313795389a1vboxsync *
1a84601801d5bd045712787a3ef59313795389a1vboxsync * @return IPRT status code.
1a84601801d5bd045712787a3ef59313795389a1vboxsync */
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic void vbclStopServices(void)
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
1a84601801d5bd045712787a3ef59313795389a1vboxsync unsigned int iServiceId = 0;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "Stopping services...\n");
1a84601801d5bd045712787a3ef59313795389a1vboxsync for (iServiceId = 0; iServiceId < RT_ELEMENTS(g_aServices); iServiceId++)
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "Stopping service: %s\n", g_aServices[iServiceId].pszName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync int rc = (g_aServices[iServiceId].pfnStop)();
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_FAILURE(rc))
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "unable to stop service: %s (%Rrc)\n", g_aServices[iServiceId].pszName, rc);
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync VBoxClientVerbose(1, "Services stop completed\n");
1a84601801d5bd045712787a3ef59313795389a1vboxsync}
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsyncstatic void usage(char *sProgName)
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf("usage: %s [-fvl]\n", sProgName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf(" -f\tRun in foreground (default: no)\n", sProgName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf(" -v\tIncrease verbosity level (default: no verbosity)\n", sProgName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf(" -l\tSpecify log file name (default: no log file)\n", sProgName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync exit(1);
1a84601801d5bd045712787a3ef59313795389a1vboxsync}
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsyncint main(int argc, char *argv[])
1a84601801d5bd045712787a3ef59313795389a1vboxsync{
1a84601801d5bd045712787a3ef59313795389a1vboxsync int rc;
1a84601801d5bd045712787a3ef59313795389a1vboxsync int c;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync bool fDemonize = true;
1a84601801d5bd045712787a3ef59313795389a1vboxsync static char *szLogFileName = NULL;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync /* Parse command line */
1a84601801d5bd045712787a3ef59313795389a1vboxsync while((c = getopt(argc, argv, "fvl:")) != -1)
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync switch(c)
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync case 'f':
1a84601801d5bd045712787a3ef59313795389a1vboxsync fDemonize = false;
1a84601801d5bd045712787a3ef59313795389a1vboxsync break;
1a84601801d5bd045712787a3ef59313795389a1vboxsync case 'v':
1a84601801d5bd045712787a3ef59313795389a1vboxsync g_cVerbosity++;
1a84601801d5bd045712787a3ef59313795389a1vboxsync break;
1a84601801d5bd045712787a3ef59313795389a1vboxsync case 'l':
1a84601801d5bd045712787a3ef59313795389a1vboxsync szLogFileName = RTStrDup(optarg);
1a84601801d5bd045712787a3ef59313795389a1vboxsync break;
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync default : usage(argv[0]);
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync /* No more arguments allowed */
1a84601801d5bd045712787a3ef59313795389a1vboxsync if ((argc - optind) != 0)
1a84601801d5bd045712787a3ef59313795389a1vboxsync usage(argv[0]);
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (fDemonize)
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync rc = RTProcDaemonizeUsingFork(true /* fNoChDir */, false /* fNoClose */, NULL);
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_FAILURE(rc))
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf("failed to run into background\n");
1a84601801d5bd045712787a3ef59313795389a1vboxsync return 1;
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync rc = RTR3InitExe(argc, &argv, 0);
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_FAILURE(rc))
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf("RTR3InitExe() failed: (%Rrc)\n", rc);
1a84601801d5bd045712787a3ef59313795389a1vboxsync return RTMsgInitFailure(rc);
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync rc = VbglR3Init();
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_SUCCESS(rc))
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync rc = vbclInitLogger(szLogFileName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_SUCCESS(rc))
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync rc = vbclStartServices();
1a84601801d5bd045712787a3ef59313795389a1vboxsync if (RT_SUCCESS(rc))
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync vbclWait();
1a84601801d5bd045712787a3ef59313795389a1vboxsync vbclStopServices();
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync else
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf("failed to start services: (%Rrc)\n", rc);
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync vbclTermLogger(szLogFileName);
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync else
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf("failed to start logger: (%Rrc)\n", rc);
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync VbglR3Term();
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync else
1a84601801d5bd045712787a3ef59313795389a1vboxsync {
1a84601801d5bd045712787a3ef59313795389a1vboxsync RTPrintf("failed to initialize guest library: (%Rrc)\n", rc);
1a84601801d5bd045712787a3ef59313795389a1vboxsync }
1a84601801d5bd045712787a3ef59313795389a1vboxsync
1a84601801d5bd045712787a3ef59313795389a1vboxsync return 0;
1a84601801d5bd045712787a3ef59313795389a1vboxsync}