Bool HgfsChannelGuest_Init(HgfsServerMgrData *mgrData) // IN/OUT: connection manager object { Bool success = FALSE; HgfsChannelData *channel = &gHgfsChannels[0]; // Shared channel (internal RPC) uint32 channelRefCount; ASSERT(NULL != mgrData); ASSERT(NULL == mgrData->connection); /* Currently, the RPC override is not implemented. */ ASSERT(NULL == mgrData->rpc); ASSERT(NULL == mgrData->rpcCallback); ASSERT(NULL != mgrData->appName); Debug("%s: app %s rpc = %p rpc cb = %p.\n", __FUNCTION__, mgrData->appName, mgrData->rpc, mgrData->rpcCallback); if (NULL != mgrData->rpc || NULL != mgrData->rpcCallback) { /* * XXX - Would malloc a new channel here and activate * with the required RPC. */ Debug("%s: Guest channel RPC override not supported.\n", __FUNCTION__); goto exit; } /* * Reference the channel. Initialize only for the first * caller instance, otherwise only reference the channel for * return to the caller. */ channelRefCount = HgfsChannelGetChannel(channel); /* We have referenced the channel, save it for later dereference. */ mgrData->connection = channel; if (0 == channelRefCount) { /* Initialize channels objects. */ if (!HgfsChannelInitChannel(channel, &gHgfsChannelServerInfo)) { Debug("%s: Could not init channel.\n", __FUNCTION__); goto exit; } /* Call the channels initializers. */ if (!HgfsChannelActivateChannel(channel, mgrData->rpc, mgrData->rpcCallback)) { Debug("%s: Could not activate channel.\n", __FUNCTION__); goto exit; } } success = TRUE; exit: if (!success) { HgfsChannelGuest_Exit(mgrData); } return success; }
void HgfsServerManager_Unregister(HgfsServerMgrData *data) // IN: RpcIn channel { ASSERT(data); ASSERT(data->appName != NULL); HgfsChannelGuest_Exit(data); HgfsServerPolicy_Cleanup(); memset(&gHgfsServerManagerGuestData, 0, sizeof gHgfsServerManagerGuestData); }