static Bool VmBackupPrivSendMsg(gchar *msg, char **result, size_t *resultLen) { Bool success; unsigned int oldLevel; ASSERT(gBackupState != NULL); g_debug("*** %s\n", __FUNCTION__); oldLevel = Iopl_Get(); g_debug("Raising the IOPL, oldLevel=%u\n", oldLevel); if (iopl(3) < 0) { g_warning("Error raising the IOPL, %s\n", strerror(errno)); } success = RpcChannel_Send(gBackupState->ctx->rpc, msg, strlen(msg) + 1, result, resultLen); if (iopl(oldLevel) < 0) { g_warning("Error restoring the IOPL, %s\n", strerror(errno)); } return success; }
static gboolean ToolsCoreRpcCapReg(RpcInData *data) { char *confPath = GuestApp_GetConfPath(); gchar *msg; GArray *pcaps = NULL; ToolsServiceState *state = data->clientData; g_signal_emit_by_name(state->ctx.serviceObj, TOOLS_CORE_SIG_CAPABILITIES, &state->ctx, TRUE, &pcaps); if (pcaps != NULL) { ToolsCore_SetCapabilities(state->ctx.rpc, pcaps, TRUE); g_array_free(pcaps, TRUE); } /* Tell the host the location of the conf directory. */ msg = g_strdup_printf("tools.capability.guest_conf_directory %s", confPath); if (!RpcChannel_Send(state->ctx.rpc, msg, strlen(msg) + 1, NULL, NULL)) { g_debug("Unable to register guest conf directory capability.\n"); } g_free(msg); msg = NULL; /* Send the tools version to the VMX. */ if (state->mainService) { uint32 version; char *result = NULL; size_t resultLen; gchar *toolsVersion; #if defined(OPEN_VM_TOOLS) version = TOOLS_VERSION_UNMANAGED; #else gboolean disableVersion; disableVersion = g_key_file_get_boolean(state->ctx.config, "vmtools", CONFNAME_DISABLETOOLSVERSION, NULL); version = disableVersion ? TOOLS_VERSION_UNMANAGED : TOOLS_VERSION_CURRENT; #endif toolsVersion = g_strdup_printf("tools.set.version %u", version); if (!RpcChannel_Send(state->ctx.rpc, toolsVersion, strlen(toolsVersion) + 1, &result, &resultLen)) { g_debug("Error setting tools version: %s.\n", result); } vm_free(result); g_free(toolsVersion); } #if defined (__linux__) /* Send the IOPL elevation capability to VMX. */ if (state->mainService) { unsigned int oldLevel; char *result = NULL; size_t resultLen; const char ioplElev[] = "tools.capability.iopl_elevation"; oldLevel = Iopl_Get(); g_debug("%s: old IOPL = %u\n", __FUNCTION__, oldLevel); if (iopl(3) < 0) { g_debug("Error raising the IOPL, %s", strerror(errno)); } g_debug("%s: new IOPL = %u\n", __FUNCTION__, Iopl_Get()); if (!RpcChannel_Send(state->ctx.rpc, ioplElev, sizeof ioplElev, &result, &resultLen)) { g_debug("Error setting tools iopl elevation capability: %s\n", result); vm_free(result); } if (iopl(oldLevel) < 0) { g_debug("Error restoring the IOPL, %s", strerror(errno)); } } #endif state->capsRegistered = TRUE; free(confPath); return RPCIN_SETRETVALS(data, "", TRUE); }