gboolean X11Lock_Init(ToolsAppCtx *ctx, ToolsPluginData *pdata) { int argc = 0; char *argv[] = { NULL, NULL }; if (strcmp(ctx->name, VMTOOLS_USER_SERVICE) != 0) { VMTOOLSAPP_ERROR(ctx, EXIT_FAILURE); return FALSE; } /* * We depend on the window title when performing (primitive) vmware-user * session detection, and unfortunately for us, GTK has a nasty habit of * retitling toplevel windows. That said, we can control GTK's default * title by setting Glib's application or program name. * * XXX Consider using g_set_application_name("VMware User Agent") or * similar. */ g_set_prgname(VMUSER_TITLE); argv[0] = VMUSER_TITLE; /* XXX: is calling gtk_init() multiple times safe? */ gtk_init(&argc, (char ***) &argv); if (!AcquireDisplayLock()) { g_warning("Another instance of vmware-user already running. Exiting.\n"); VMTOOLSAPP_ERROR(ctx, EXIT_FAILURE); return FALSE; } return TRUE; }
static gboolean RpcDebugDispatch(gpointer _chan) { gboolean ret; RpcChannel *chan = _chan; DbgChannelData *cdata = chan->_private; RpcDebugPlugin *plugin = cdata->plugin; RpcInData data; RpcDebugMsgMapping rpcdata; memset(&data, 0, sizeof data); memset(&rpcdata, 0, sizeof rpcdata); if (plugin->sendFn == NULL || !plugin->sendFn(&rpcdata)) { RpcDebug_DecRef(cdata->ctx); cdata->hasLibRef = FALSE; return FALSE; } else if (rpcdata.message == NULL) { /* * Nothing to send. Maybe the debug plugin is waiting for something to * happen before sending another message. */ return TRUE; } data.clientData = chan; data.appCtx = cdata->ctx; data.args = rpcdata.message; data.argsSize = rpcdata.messageLen; ret = RpcChannel_Dispatch(&data); if (rpcdata.validateFn != NULL) { ret = rpcdata.validateFn(&data, ret); } else if (!ret) { g_debug("RpcChannel_Dispatch returned error for RPC.\n"); } if (data.freeResult) { vm_free(data.result); } if (rpcdata.freeMsg) { vm_free(rpcdata.message); } if (!ret) { VMTOOLSAPP_ERROR(cdata->ctx, 1); RpcDebug_DecRef(cdata->ctx); cdata->hasLibRef = FALSE; return FALSE; } return TRUE; }
static void ToolsCoreCheckReset(struct RpcChannel *chan, gboolean success, gpointer _state) { ToolsServiceState *state = _state; ASSERT(state != NULL); if (success) { const gchar *app; gchar *msg; app = ToolsCore_GetTcloName(state); if (app == NULL) { app = state->name; } msg = g_strdup_printf("vmx.capability.unified_loop %s", app); if (!RpcChannel_Send(state->ctx.rpc, msg, strlen(msg) + 1, NULL, NULL)) { g_warning("VMX doesn't support the Tools unified loop.\n" "Some functionality (like setting options) may not work.\n"); } g_free(msg); /* * Log the Tools build number to the VMX log file. We don't really care * if sending the message fails. */ msg = g_strdup_printf("log %s: Version: %s", app, BUILD_NUMBER); RpcChannel_Send(state->ctx.rpc, msg, strlen(msg) + 1, NULL, NULL); g_free(msg); g_signal_emit_by_name(state->ctx.serviceObj, TOOLS_CORE_SIG_RESET, &state->ctx); } else { VMTOOLSAPP_ERROR(&state->ctx, EXIT_FAILURE); } }