RpcChannel * RpcChannel_New(void) { RpcChannel *chan; #if (defined(__linux__) && !defined(USERWORLD)) || defined(_WIN32) chan = gUseBackdoorOnly ? BackdoorChannel_New() : VSockChannel_New(); #else chan = BackdoorChannel_New(); #endif if (chan) { g_static_mutex_init(&chan->outLock); } return chan; }
gboolean ToolsCore_InitRpc(ToolsServiceState *state) { static RpcChannelCallback rpcs[] = { { "Capabilities_Register", ToolsCoreRpcCapReg, NULL, NULL, NULL, 0 }, { "Set_Option", ToolsCoreRpcSetOption, NULL, NULL, NULL, 0 }, }; size_t i; const gchar *app; GMainContext *mainCtx = g_main_loop_get_context(state->ctx.mainLoop); ASSERT(state->ctx.rpc == NULL); if (state->debugPlugin != NULL) { app = "debug"; state->ctx.rpc = state->debugData->newDebugChannel(&state->ctx, state->debugData); } else { /* * Currently we try to bring up an RpcIn channel, which will only run * inside a Virtual Machine. Some plugins may still want to launch and at * least begin even in not in a VM (typically because the installation is dual * purposed between a VM and Bootcamp) - plugins may wish to undo some state * if not in a VM. * * XXX: this should be relaxed when we try to bring up a VMCI or TCP channel. */ if (!state->ctx.isVMware) { g_warning("The %s service needs to run inside a virtual machine.\n", state->name); state->ctx.rpc = NULL; } else { state->ctx.rpc = BackdoorChannel_New(); } app = ToolsCore_GetTcloName(state); if (app == NULL) { g_warning("Trying to start RPC channel for invalid %s container.", state->name); return FALSE; } } if (state->ctx.rpc) { RpcChannel_Setup(state->ctx.rpc, app, mainCtx, &state->ctx, ToolsCoreCheckReset, state); /* Register the "built in" RPCs. */ for (i = 0; i < ARRAYSIZE(rpcs); i++) { RpcChannelCallback *rpc = &rpcs[i]; rpc->clientData = state; RpcChannel_RegisterCallback(state->ctx.rpc, rpc); } } return TRUE; }
gboolean ToolsCmd_SendRPC(const char *rpc, // IN size_t rpcLen, // IN char **result, // OUT size_t *resultLen) // OUT { char *lrpc = (char *) rpc; RpcChannel *chan = BackdoorChannel_New(); gboolean ret = RpcChannel_Start(chan); if (!ret) { g_warning("Error starting RPC channel."); goto exit; } ret = RpcChannel_Send(chan, lrpc, rpcLen, result, resultLen); exit: RpcChannel_Destroy(chan); return ret; }