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); } state->capsRegistered = TRUE; free(confPath); return RPCIN_SETRETVALS(data, "", TRUE); }
void ToolsCore_UnloadPlugins(ToolsServiceState *state) { guint i; if (state->plugins == NULL) { return; } if (state->capsRegistered) { GArray *pcaps = NULL; g_signal_emit_by_name(state->ctx.serviceObj, TOOLS_CORE_SIG_CAPABILITIES, &state->ctx, FALSE, &pcaps); if (pcaps != NULL) { if (state->ctx.rpc) { ToolsCore_SetCapabilities(state->ctx.rpc, pcaps, FALSE); } g_array_free(pcaps, TRUE); } } /* * Stop all app providers, and free the memory we allocated for the * internal app providers. */ for (i = 0; state->providers != NULL && i < state->providers->len; i++) { ToolsAppProviderReg *preg = &g_array_index(state->providers, ToolsAppProviderReg, i); if (preg->prov->shutdown != NULL && preg->state == TOOLS_PROVIDER_ACTIVE) { preg->prov->shutdown(&state->ctx, preg->prov); } if (preg->prov->regType == TOOLS_APP_GUESTRPC || preg->prov->regType == TOOLS_APP_SIGNALS || preg->prov->regType == TOOLS_APP_PROVIDER || preg->prov->regType == TOOLS_SVC_PROPERTY) { g_free(preg->prov); } } g_signal_emit_by_name(state->ctx.serviceObj, TOOLS_CORE_SIG_SHUTDOWN, &state->ctx); while (state->plugins->len > 0) { ToolsPlugin *plugin = g_ptr_array_index(state->plugins, state->plugins->len - 1); GArray *regs = (plugin->data != NULL) ? plugin->data->regs : NULL; g_message("Unloading plugin '%s'.\n", plugin->data->name); if (regs != NULL) { guint i; for (i = 0; i < regs->len; i++) { ToolsAppReg *reg = &g_array_index(regs, ToolsAppReg, i); if (reg->data != NULL) { g_array_free(reg->data, TRUE); } } g_array_free(regs, TRUE); } g_ptr_array_remove_index(state->plugins, state->plugins->len - 1); ToolsCoreFreePlugin(plugin); } if (state->providers != NULL) { g_array_free(state->providers, TRUE); state->providers = NULL; } g_ptr_array_free(state->plugins, TRUE); state->plugins = NULL; }