int HgfsBackdoorSendRequest(HgfsReq *req) // IN/OUT: Request to be sent { char const *replyPacket; size_t packetSize; ASSERT(req->state == HGFS_REQ_SUBMITTED); ASSERT(req->packetSize <= HGFS_PACKET_MAX); bcopy(req->packet, packetBuffer, req->packetSize); packetSize = req->packetSize; DEBUG(VM_DEBUG_COMM, "HgfsBackdoorSendRequest: Sending packet over backdoor\n"); /* * We should attempt to reopen the backdoor channel with every request, * because the HGFS server in the host can be enabled or disabled at any * time. */ if (!HgfsBd_OpenBackdoor(&hgfsRpcOut)) { DEBUG(VM_DEBUG_COMM, "HgfsBackdoorSendRequest: HGFS is disabled in the host\n"); req->state = HGFS_REQ_ERROR; return ENOSYS; } else if (HgfsBd_Dispatch(hgfsRpcOut, packetBuffer, &packetSize, &replyPacket) == 0) { DEBUG(VM_DEBUG_COMM, "HgfsBackdoorSendRequest: backdoor reply received\n"); /* Request was sent successfully. Copy the reply and return to the client. */ ASSERT(packetSize <= HGFS_PACKET_MAX); bcopy(replyPacket, req->packet, packetSize); req->packetSize = packetSize; req->state = HGFS_REQ_COMPLETED; } else { DEBUG(VM_DEBUG_COMM, "HgfsBackdoorSendRequest: backdoor error\n"); /* Pass the error into the request. */ req->state = HGFS_REQ_ERROR; /* * If the channel was previously open, make sure it's dead and gone * now. We do this because subsequent requests deserve a chance to * reopen it. */ HgfsBd_CloseBackdoor(&hgfsRpcOut); } return 0; }
void HgfsBackdoorCleanup(void) { DEBUG(VM_DEBUG_COMM, "HgfsBackdoorCleanup: Closing backdoor\n"); HgfsBd_CloseBackdoor(&hgfsRpcOut); HgfsBd_PutBuf(packetBuffer); }
static void HgfsBdChannelClose(HgfsTransportChannel *channel) // IN: Channel { ASSERT(channel->priv != NULL); HgfsBd_CloseBackdoor((RpcOut **)&channel->priv); ASSERT(channel->priv == NULL); LOG(8, ("VMware hgfs: %s: backdoor closed.\n", __func__)); }
static void HgfsBdChannelCloseInt(HgfsTransportChannel *channel) // IN: Channel { if (channel->status == HGFS_CHANNEL_CONNECTED) { ASSERT(channel->priv != NULL); HgfsBd_CloseBackdoor((RpcOut **)&channel->priv); ASSERT(channel->priv == NULL); channel->status = HGFS_CHANNEL_NOTCONNECTED; } LOG(8, ("Backdoor closed.\n")); }