6885
6901
size_t fileNameSize;
6886
6902
HgfsSharedFolderHandle sharedFolder = HGFS_INVALID_FOLDER_HANDLE;
6904
LOG(8, ("%s: entered\n", __FUNCTION__));
6888
6906
ASSERT(watchId != NULL);
6890
6908
if (HgfsHandle2NotifyInfo(dir, input->session, &fileName, &fileNameSize,
6891
6909
&sharedFolder)) {
6892
6910
*watchId = HgfsNotify_AddSubscriber(sharedFolder, fileName, events, watchTree,
6893
Hgfs_NotificationCallback, input->session);
6911
HgfsServerDirWatchEvent, input->session);
6894
6912
status = (HGFS_INVALID_SUBSCRIBER_HANDLE == *watchId) ? HGFS_ERROR_INTERNAL :
6895
6913
HGFS_ERROR_SUCCESS;
6897
6915
status = HGFS_ERROR_INTERNAL;
6899
6917
free(fileName);
6918
LOG(8, ("%s: exit %u\n", __FUNCTION__, status));
8387
8415
*-----------------------------------------------------------------------------
8391
Hgfs_NotificationCallback(HgfsSharedFolderHandle sharedFolder, // IN: shared folder
8392
HgfsSubscriberHandle subscriber, // IN: subsciber
8393
char* fileName, // IN: name of the file
8394
uint32 mask, // IN: event type
8395
struct HgfsSessionInfo *session) // IN: session info
8419
HgfsServerDirWatchEvent(HgfsSharedFolderHandle sharedFolder, // IN: shared folder
8420
HgfsSubscriberHandle subscriber, // IN: subsciber
8421
char* fileName, // IN: name of the file
8422
uint32 mask, // IN: event type
8423
struct HgfsSessionInfo *session) // IN: session info
8425
HgfsPacket *packet = NULL;
8426
HgfsHeader *packetHeader = NULL;
8427
char *shareName = NULL;
8428
size_t shareNameLen;
8398
8429
size_t sizeNeeded;
8400
size_t shareNameLen;
8401
HgfsHeader *packetHeader;
8404
if (HgfsServerGetShareName(sharedFolder, &shareNameLen, &shareName)) {
8406
sizeNeeded = HgfsPackCalculateNotificationSize(shareName, fileName);
8408
packetHeader = Util_SafeCalloc(1, sizeNeeded);
8409
packet = Util_SafeCalloc(1, sizeof *packet);
8410
packet->guestInitiated = FALSE;
8411
packet->metaPacketSize = sizeNeeded;
8412
packet->metaPacket = packetHeader;
8413
packet->dataPacketIsAllocated = TRUE;
8415
if (mask & HGFS_NOTIFY_EVENTS_DROPPED) {
8416
flags |= HGFS_NOTIFY_FLAG_OVERFLOW;
8419
HgfsPackChangeNotificationRequest(packetHeader, subscriber, shareName, fileName, mask,
8420
flags, session, &sizeNeeded);
8421
if (!HgfsPacketSend(packet, (char *)packetHeader, sizeNeeded, session->transportSession, 0)) {
8422
LOG(4, ("%s: failed to send notification to the host\n", __FUNCTION__));
8425
LOG(4, ("%s: notification for folder: %d index: %d file name %s "
8426
" mask %x\n", __FUNCTION__, sharedFolder,
8427
(int)subscriber, fileName, mask));
8432
LOG(4, ("%s:Entered shr hnd %u hnd %"FMT64"x file %s mask %u\n",
8433
__FUNCTION__, sharedFolder, subscriber, fileName, mask));
8435
if (!HgfsServerGetShareName(sharedFolder, &shareNameLen, &shareName)) {
8430
8436
LOG(4, ("%s: failed to find shared folder for a handle %x\n",
8431
8437
__FUNCTION__, sharedFolder));
8441
sizeNeeded = HgfsPackCalculateNotificationSize(shareName, fileName);
8443
packetHeader = Util_SafeCalloc(1, sizeNeeded);
8444
packet = Util_SafeCalloc(1, sizeof *packet);
8445
packet->guestInitiated = FALSE;
8446
packet->metaPacketSize = sizeNeeded;
8447
packet->metaPacket = packetHeader;
8448
packet->dataPacketIsAllocated = TRUE;
8450
if (mask & HGFS_NOTIFY_EVENTS_DROPPED) {
8451
flags |= HGFS_NOTIFY_FLAG_OVERFLOW;
8454
if (!HgfsPackChangeNotificationRequest(packetHeader, subscriber, shareName, fileName, mask,
8455
flags, session, &sizeNeeded)) {
8456
LOG(4, ("%s: failed to pack notification request\n", __FUNCTION__));
8460
if (!HgfsPacketSend(packet, (char *)packetHeader, sizeNeeded, session->transportSession, 0)) {
8461
LOG(4, ("%s: failed to send notification to the host\n", __FUNCTION__));
8465
/* The transport will call the server send complete callback to release the packets. */
8467
packetHeader = NULL;
8469
LOG(4, ("%s: Sent notify for: %u index: %"FMT64"u file name %s mask %x\n",
8470
__FUNCTION__, sharedFolder, subscriber, fileName, mask));