27
27
#define G_LOG_DOMAIN "hgfsd"
30
#include "hgfsServerPolicy.h"
31
#include "hgfsServer.h"
32
#include "hgfsChannel.h"
30
#include "hgfsServerManager.h"
33
31
#include "vm_assert.h"
34
32
#include "vmware/guestrpc/tclodefs.h"
35
33
#include "vmware/tools/plugin.h"
36
34
#include "vmware/tools/utils.h"
38
37
#if !defined(__APPLE__)
39
38
#include "embed_version.h"
40
39
#include "vmtoolsd_version.h"
46
* Sets up the channel for HGFS.
48
* NOTE: Initialize the Hgfs server for only for now.
49
* This will move into a separate file when full interface implemented.
51
* @param[in] data Unused RPC request data.
53
* @return TRUE on success, FALSE on error.
57
HgfsChannel_Init(void *data) // IN: Unused data
59
HgfsServerSessionCallbacks *serverCBTable = NULL;
60
return HgfsServer_InitState(&serverCBTable, NULL);
65
* Close up the channel for HGFS.
67
* NOTE: Close open sessions in the HGFS server currently.
68
* This will move into a separate file when full interface implemented.
70
* @param[in] data Unused RPC request data.
76
HgfsChannel_Exit(void *data)
79
HgfsServer_ExitState();
45
* Clean up internal state on shutdown.
47
* @param[in] src The source object.
48
* @param[in] ctx Unused.
49
* @param[in] plugin Plugin registration data.
53
HgfsServerShutdown(gpointer src,
55
ToolsPluginData *plugin)
57
HgfsServerMgrData *mgrData = plugin->_private;
58
HgfsServerManager_Unregister(mgrData);
92
HgfsServerRpcInDispatch(RpcInData *data)
72
HgfsServerRpcDispatch(RpcInData *data)
95
static char packet[HGFS_LARGE_PACKET_MAX];
98
ASSERT(data->clientData == NULL);
74
HgfsServerMgrData *mgrData;
76
static char reply[HGFS_LARGE_PACKET_MAX];
79
ASSERT(data->clientData != NULL);
80
mgrData = data->clientData;
100
82
if (data->argsSize == 0) {
101
83
return RPCIN_SETRETVALS(data, "1 argument required", FALSE);
104
packetSize = data->argsSize - 1;
105
HgfsServer_ProcessPacket(data->args + 1, packet, &packetSize);
86
replySize = sizeof reply;
87
HgfsServerManager_ProcessPacket(mgrData, data->args + 1, data->argsSize - 1, reply, &replySize);
107
data->result = packet;
108
data->resultLen = packetSize;
90
data->resultLen = replySize;
135
117
} else if (strcmp(ctx->name, VMTOOLS_USER_SERVICE) == 0) {
136
118
appName = TOOLS_DND_NAME;
138
g_error("Shouldn't reach this.\n");
141
123
msg = g_strdup_printf("tools.capability.hgfs_server %s %d",
186
* Passing NULL here is safe because the shares maintained by the guest
187
* policy server never change, invalidating the need for an invalidate
190
if (!HgfsServerPolicy_Init(NULL)) {
191
g_warning("HgfsServerPolicy_Init() failed, aborting HGFS server init.\n");
168
mgrData = g_malloc0(sizeof *mgrData);
169
HgfsServerManager_DataInit(mgrData,
171
NULL, // rpc channel unused
172
NULL); // no rpc callback
195
if (!HgfsChannel_Init(NULL)) {
174
if (!HgfsServerManager_Register(mgrData)) {
196
175
g_warning("HgfsServer_InitState() failed, aborting HGFS server init.\n");
197
HgfsServerPolicy_Cleanup();
202
181
RpcChannelCallback rpcs[] = {
203
{ HGFS_SYNC_REQREP_CMD, HgfsServerRpcInDispatch, NULL, NULL, NULL, 0 }
182
{ HGFS_SYNC_REQREP_CMD, HgfsServerRpcDispatch, mgrData, NULL, NULL, 0 }
205
184
ToolsPluginSignalCb sigs[] = {
206
{ TOOLS_CORE_SIG_CAPABILITIES, HgfsServerCapReg, ®Data }
185
{ TOOLS_CORE_SIG_CAPABILITIES, HgfsServerCapReg, ®Data },
186
{ TOOLS_CORE_SIG_SHUTDOWN, HgfsServerShutdown, ®Data }
208
188
ToolsAppReg regs[] = {
209
189
{ TOOLS_APP_GUESTRPC, VMTools_WrapArray(rpcs, sizeof *rpcs, ARRAYSIZE(rpcs)) },