Exemplo n.º 1
0
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);
}