static void ToolsCoreCleanup(ToolsServiceState *state) { ToolsCorePool_Shutdown(&state->ctx); ToolsCore_UnloadPlugins(state); if (state->ctx.rpc != NULL) { RpcChannel_Destroy(state->ctx.rpc); state->ctx.rpc = NULL; } g_key_file_free(state->ctx.config); g_main_loop_unref(state->ctx.mainLoop); #if defined(G_PLATFORM_WIN32) if (state->ctx.comInitialized) { CoUninitialize(); state->ctx.comInitialized = FALSE; } #endif #if !defined(_WIN32) if (state->ctx.envp) { System_FreeNativeEnviron(state->ctx.envp); state->ctx.envp = NULL; } #endif g_object_set(state->ctx.serviceObj, TOOLS_CORE_PROP_CTX, NULL, NULL); g_object_unref(state->ctx.serviceObj); state->ctx.serviceObj = NULL; state->ctx.config = NULL; state->ctx.mainLoop = NULL; }
gboolean RpcChannel_SendOneRaw(const char *data, size_t dataLen, char **result, size_t *resultLen) { RpcChannel *chan; gboolean status; status = FALSE; chan = RpcChannel_New(); if (chan == NULL) { if (result != NULL) { *result = Util_SafeStrdup("RpcChannel: Unable to create " "the RpcChannel object"); if (resultLen != NULL) { *resultLen = strlen(*result); } } goto sent; } else if (!RpcChannel_Start(chan)) { if (result != NULL) { *result = Util_SafeStrdup("RpcChannel: Unable to open the " "communication channel"); if (resultLen != NULL) { *resultLen = strlen(*result); } } goto sent; } else if (!RpcChannel_Send(chan, data, dataLen, result, resultLen)) { /* We already have the description of the error */ goto sent; } status = TRUE; sent: Debug(LGPFX "Request %s: reqlen=%"FMTSZ"u, replyLen=%"FMTSZ"u\n", status ? "OK" : "FAILED", dataLen, resultLen ? *resultLen : 0); if (chan) { RpcChannel_Stop(chan); RpcChannel_Destroy(chan); } return status; }
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; }