VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxAutostart/VBoxAutostartUtils.cpp@ 86590

Last change on this file since 86590 was 83797, checked in by vboxsync, 5 years ago

VBoxAutostart: VC++ 14.1 adjustments. Removed some unnecessary stdc++ headers and eliminated one silly std::string usage. bugref:8489

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1/* $Id: VBoxAutostartUtils.cpp 83797 2020-04-18 13:52:37Z vboxsync $ */
2/** @file
3 * VBoxAutostart - VirtualBox Autostart service, start machines during system boot.
4 * Utils used by the windows and posix frontends.
5 */
6
7/*
8 * Copyright (C) 2012-2020 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#include <VBox/com/com.h>
20#include <VBox/com/string.h>
21#include <VBox/com/Guid.h>
22#include <VBox/com/array.h>
23#include <VBox/com/ErrorInfo.h>
24#include <VBox/com/errorprint.h>
25
26#include <VBox/err.h>
27
28#include <iprt/message.h>
29#include <iprt/thread.h>
30#include <iprt/stream.h>
31#include <iprt/log.h>
32#include <iprt/path.h> /* RTPATH_MAX */
33
34#include "VBoxAutostart.h"
35
36using namespace com;
37
38DECLHIDDEN(const char *) machineStateToName(MachineState_T machineState, bool fShort)
39{
40 switch (machineState)
41 {
42 case MachineState_PoweredOff:
43 return fShort ? "poweroff" : "powered off";
44 case MachineState_Saved:
45 return "saved";
46 case MachineState_Teleported:
47 return "teleported";
48 case MachineState_Aborted:
49 return "aborted";
50 case MachineState_Running:
51 return "running";
52 case MachineState_Paused:
53 return "paused";
54 case MachineState_Stuck:
55 return fShort ? "gurumeditation" : "guru meditation";
56 case MachineState_Teleporting:
57 return "teleporting";
58 case MachineState_LiveSnapshotting:
59 return fShort ? "livesnapshotting" : "live snapshotting";
60 case MachineState_Starting:
61 return "starting";
62 case MachineState_Stopping:
63 return "stopping";
64 case MachineState_Saving:
65 return "saving";
66 case MachineState_Restoring:
67 return "restoring";
68 case MachineState_TeleportingPausedVM:
69 return fShort ? "teleportingpausedvm" : "teleporting paused vm";
70 case MachineState_TeleportingIn:
71 return fShort ? "teleportingin" : "teleporting (incoming)";
72 case MachineState_DeletingSnapshotOnline:
73 return fShort ? "deletingsnapshotlive" : "deleting snapshot live";
74 case MachineState_DeletingSnapshotPaused:
75 return fShort ? "deletingsnapshotlivepaused" : "deleting snapshot live paused";
76 case MachineState_OnlineSnapshotting:
77 return fShort ? "onlinesnapshotting" : "online snapshotting";
78 case MachineState_RestoringSnapshot:
79 return fShort ? "restoringsnapshot" : "restoring snapshot";
80 case MachineState_DeletingSnapshot:
81 return fShort ? "deletingsnapshot" : "deleting snapshot";
82 case MachineState_SettingUp:
83 return fShort ? "settingup" : "setting up";
84 case MachineState_Snapshotting:
85 return "snapshotting";
86 default:
87 break;
88 }
89 return "unknown";
90}
91
92DECLHIDDEN(RTEXITCODE) autostartSvcLogErrorV(const char *pszFormat, va_list va)
93{
94 if (*pszFormat)
95 {
96 char *pszMsg = NULL;
97 if (RTStrAPrintfV(&pszMsg, pszFormat, va) != -1)
98 {
99 autostartSvcOsLogStr(pszMsg, AUTOSTARTLOGTYPE_ERROR);
100 RTStrFree(pszMsg);
101 }
102 else
103 autostartSvcOsLogStr(pszFormat, AUTOSTARTLOGTYPE_ERROR);
104 }
105 return RTEXITCODE_FAILURE;
106}
107
108DECLHIDDEN(RTEXITCODE) autostartSvcLogError(const char *pszFormat, ...)
109{
110 va_list va;
111 va_start(va, pszFormat);
112 autostartSvcLogErrorV(pszFormat, va);
113 va_end(va);
114 return RTEXITCODE_FAILURE;
115}
116
117DECLHIDDEN(void) autostartSvcLogVerboseV(const char *pszFormat, va_list va)
118{
119 if (*pszFormat)
120 {
121 char *pszMsg = NULL;
122 if (RTStrAPrintfV(&pszMsg, pszFormat, va) != -1)
123 {
124 autostartSvcOsLogStr(pszMsg, AUTOSTARTLOGTYPE_VERBOSE);
125 RTStrFree(pszMsg);
126 }
127 else
128 autostartSvcOsLogStr(pszFormat, AUTOSTARTLOGTYPE_VERBOSE);
129 }
130}
131
132DECLHIDDEN(void) autostartSvcLogVerbose(const char *pszFormat, ...)
133{
134 va_list va;
135 va_start(va, pszFormat);
136 autostartSvcLogVerboseV(pszFormat, va);
137 va_end(va);
138}
139
140DECLHIDDEN(void) autostartSvcLogWarningV(const char *pszFormat, va_list va)
141{
142 if (*pszFormat)
143 {
144 char *pszMsg = NULL;
145 if (RTStrAPrintfV(&pszMsg, pszFormat, va) != -1)
146 {
147 autostartSvcOsLogStr(pszMsg, AUTOSTARTLOGTYPE_WARNING);
148 RTStrFree(pszMsg);
149 }
150 else
151 autostartSvcOsLogStr(pszFormat, AUTOSTARTLOGTYPE_WARNING);
152 }
153}
154
155DECLHIDDEN(void) autostartSvcLogInfo(const char *pszFormat, ...)
156{
157 va_list va;
158 va_start(va, pszFormat);
159 autostartSvcLogInfoV(pszFormat, va);
160 va_end(va);
161}
162
163DECLHIDDEN(void) autostartSvcLogInfoV(const char *pszFormat, va_list va)
164{
165 if (*pszFormat)
166 {
167 char *pszMsg = NULL;
168 if (RTStrAPrintfV(&pszMsg, pszFormat, va) != -1)
169 {
170 autostartSvcOsLogStr(pszMsg, AUTOSTARTLOGTYPE_INFO);
171 RTStrFree(pszMsg);
172 }
173 else
174 autostartSvcOsLogStr(pszFormat, AUTOSTARTLOGTYPE_INFO);
175 }
176}
177
178DECLHIDDEN(void) autostartSvcLogWarning(const char *pszFormat, ...)
179{
180 va_list va;
181 va_start(va, pszFormat);
182 autostartSvcLogWarningV(pszFormat, va);
183 va_end(va);
184}
185
186DECLHIDDEN(RTEXITCODE) autostartSvcLogGetOptError(const char *pszAction, int rc, int argc, char **argv, int iArg, PCRTGETOPTUNION pValue)
187{
188 NOREF(pValue);
189 autostartSvcLogError("%s - RTGetOpt failure, %Rrc (%d): %s",
190 pszAction, rc, rc, iArg < argc ? argv[iArg] : "<null>");
191 return RTEXITCODE_FAILURE;
192}
193
194DECLHIDDEN(RTEXITCODE) autostartSvcLogTooManyArgsError(const char *pszAction, int argc, char **argv, int iArg)
195{
196 Assert(iArg < argc);
197 autostartSvcLogError("%s - Too many arguments: %s", pszAction, argv[iArg]);
198 for ( ; iArg < argc; iArg++)
199 LogRel(("arg#%i: %s\n", iArg, argv[iArg]));
200 return RTEXITCODE_FAILURE;
201}
202
203DECLHIDDEN(RTEXITCODE) autostartSvcDisplayErrorV(const char *pszFormat, va_list va)
204{
205 RTStrmPrintf(g_pStdErr, "VBoxSupSvc error: ");
206 RTStrmPrintfV(g_pStdErr, pszFormat, va);
207 Log(("autostartSvcDisplayErrorV: %s", pszFormat)); /** @todo format it! */
208 return RTEXITCODE_FAILURE;
209}
210
211DECLHIDDEN(RTEXITCODE) autostartSvcDisplayError(const char *pszFormat, ...)
212{
213 va_list va;
214 va_start(va, pszFormat);
215 autostartSvcDisplayErrorV(pszFormat, va);
216 va_end(va);
217 return RTEXITCODE_FAILURE;
218}
219
220DECLHIDDEN(RTEXITCODE) autostartSvcDisplayGetOptError(const char *pszAction, int rc, PCRTGETOPTUNION pValue)
221{
222 char szMsg[4096];
223 RTGetOptFormatError(szMsg, sizeof(szMsg), rc, pValue);
224 autostartSvcDisplayError("%s - %s", pszAction, szMsg);
225 return RTEXITCODE_SYNTAX;
226}
227
228DECLHIDDEN(int) autostartSetup()
229{
230 autostartSvcOsLogStr("Setting up ...\n", AUTOSTARTLOGTYPE_VERBOSE);
231
232 /*
233 * Initialize COM.
234 */
235 using namespace com;
236 HRESULT hrc = com::Initialize();
237# ifdef VBOX_WITH_XPCOM
238 if (hrc == NS_ERROR_FILE_ACCESS_DENIED)
239 {
240 char szHome[RTPATH_MAX] = "";
241 com::GetVBoxUserHomeDirectory(szHome, sizeof(szHome));
242 return RTMsgErrorExit(RTEXITCODE_FAILURE,
243 "Failed to initialize COM because the global settings directory '%s' is not accessible!", szHome);
244 }
245# endif
246 if (FAILED(hrc))
247 return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to initialize COM (%Rhrc)!", hrc);
248
249 hrc = g_pVirtualBoxClient.createInprocObject(CLSID_VirtualBoxClient);
250 if (FAILED(hrc))
251 {
252 RTMsgError("Failed to create the VirtualBoxClient object (%Rhrc)!", hrc);
253 com::ErrorInfo info;
254 if (!info.isFullAvailable() && !info.isBasicAvailable())
255 {
256 com::GluePrintRCMessage(hrc);
257 RTMsgError("Most likely, the VirtualBox COM server is not running or failed to start.");
258 }
259 else
260 com::GluePrintErrorInfo(info);
261 return RTEXITCODE_FAILURE;
262 }
263
264 /*
265 * Setup VirtualBox + session interfaces.
266 */
267 HRESULT rc = g_pVirtualBoxClient->COMGETTER(VirtualBox)(g_pVirtualBox.asOutParam());
268 if (SUCCEEDED(rc))
269 {
270 rc = g_pSession.createInprocObject(CLSID_Session);
271 if (FAILED(rc))
272 RTMsgError("Failed to create a session object (rc=%Rhrc)!", rc);
273 }
274 else
275 RTMsgError("Failed to get VirtualBox object (rc=%Rhrc)!", rc);
276
277 if (FAILED(rc))
278 return VERR_COM_OBJECT_NOT_FOUND;
279
280 return VINF_SUCCESS;
281}
282
283DECLHIDDEN(void) autostartShutdown()
284{
285 autostartSvcOsLogStr("Shutting down ...\n", AUTOSTARTLOGTYPE_VERBOSE);
286
287 g_pSession.setNull();
288 g_pVirtualBox.setNull();
289 g_pVirtualBoxClient.setNull();
290 com::Shutdown();
291}
292
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette