b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * VBoxAutostart - VirtualBox Autostart service, start machines during system boot.
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * Copyright (C) 2012 Oracle Corporation
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * available from http://www.virtualbox.org. This file is free software;
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * General Public License (GPL) as published by the Free Software
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsyncusing namespace com;
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * VM list entry.
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync /** ID of the VM to start. */
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync /** Startup delay of the VM. */
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsyncstatic DECLCALLBACK(bool) autostartVMCmp(const AUTOSTARTVM &vm1, const AUTOSTARTVM &vm2)
91b827c98a305956e75cb1618af6ae17e450fb88vboxsyncDECLHIDDEN(RTEXITCODE) autostartStartMain(PCFGAST pCfgAst)
91b827c98a305956e75cb1618af6ae17e450fb88vboxsync pCfgAst = autostartConfigAstGetByName(pCfgAst, "startup_delay");
91b827c98a305956e75cb1618af6ae17e450fb88vboxsync vrc = RTStrToUInt32Full(pCfgAst->u.KeyValue.aszValue, 10, &uStartupDelay);
91b827c98a305956e75cb1618af6ae17e450fb88vboxsync return RTMsgErrorExit(RTEXITCODE_FAILURE, "'startup_delay' must be an unsigned number");
b6013430932520fe58eba109db1dfce66a7cad88vboxsync autostartSvcLogVerbose("Delay starting for %d seconds ...\n", uStartupDelay);
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * Build a list of all VMs we need to autostart first, apply the overrides
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * from the configuration and start the VMs afterwards.
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync HRESULT rc = g_pVirtualBox->COMGETTER(Machines)(ComSafeArrayAsOutParam(machines));
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync * Iterate through the collection
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync CHECK_ERROR_BREAK(machines[i], COMGETTER(Accessible)(&fAccessible));
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync CHECK_ERROR_BREAK(machines[i], COMGETTER(AutostartEnabled)(&fAutostart));
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync CHECK_ERROR_BREAK(machines[i], COMGETTER(Id)(autostartVM.strId.asOutParam()));
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync CHECK_ERROR_BREAK(machines[i], COMGETTER(AutostartDelay)(&autostartVM.uStartupDelay));
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync /* Sort by startup delay and apply base override. */
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync for (it = listVM.begin(); it != listVM.end(); it++)
b6013430932520fe58eba109db1dfce66a7cad88vboxsync autostartSvcLogVerbose("Delay starting of the next VMs for %d seconds ...\n",
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync RTThreadSleep(((*it).uStartupDelay - uDelayCurr) * 1000);
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync CHECK_ERROR_BREAK(g_pVirtualBox, FindMachine((*it).strId.raw(),
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync CHECK_ERROR_BREAK(machine, LaunchVMProcess(g_pSession, Bstr("headless").raw(),
b6013430932520fe58eba109db1dfce66a7cad88vboxsync autostartSvcLogVerbose("Waiting for VM \"%ls\" to power on...\n", (*it).strId.raw());
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync CHECK_ERROR(progress, COMGETTER(Completed)(&completed));
b56ca3f25c9c141f3c0855b656f8f64bbfa19496vboxsync CHECK_ERROR(progress, COMGETTER(ResultCode)(&iRc));
b6013430932520fe58eba109db1dfce66a7cad88vboxsync autostartSvcLogVerbose("VM \"%ls\" has been successfully started.\n", (*it).strId.raw());