From: Oliver Kurth Date: Mon, 23 Oct 2017 21:21:19 +0000 (-0700) Subject: Hgfs Protocol: clean up the Hgfs protocol operation capabilities X-Git-Tag: stable-10.3.0~260 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3cb87c817b804e231b0d2aa4c007a61b83999750;p=thirdparty%2Fopen-vm-tools.git Hgfs Protocol: clean up the Hgfs protocol operation capabilities This change cleans up the operation capability and its flags which currently are not clearly associated with the type to which they refer. The name doesn't help in that regard either. The capability and flags are used in the Hgfs session creation by both the server and client to dictate the protocol operation versions to be used during the lifetime of that session. The flags denote which operations are currently used and how they are expected to be used. --- diff --git a/open-vm-tools/lib/hgfsServer/hgfsServer.c b/open-vm-tools/lib/hgfsServer/hgfsServer.c index 5d6660e99..88c533cfc 100644 --- a/open-vm-tools/lib/hgfsServer/hgfsServer.c +++ b/open-vm-tools/lib/hgfsServer/hgfsServer.c @@ -4120,7 +4120,7 @@ HgfsGenerateSessionId(void) Bool HgfsServerSetSessionCapability(HgfsOp op, // IN: operation code - uint32 flags, // IN: flags that describe level of support + HgfsOpCapFlags flags, // IN: flags that describe level of support HgfsSessionInfo *session) // INOUT: session to update { int i; @@ -4683,29 +4683,29 @@ HgfsServerAllocateSession(HgfsTransportSessionInfo *transportSession, // IN: if (transportSession->channelCapabilities.flags & HGFS_CHANNEL_SHARED_MEM) { HgfsServerSetSessionCapability(HGFS_OP_READ_FAST_V4, - HGFS_REQUEST_SUPPORTED, session); + HGFS_OP_CAPFLAG_IS_SUPPORTED, session); HgfsServerSetSessionCapability(HGFS_OP_WRITE_FAST_V4, - HGFS_REQUEST_SUPPORTED, session); + HGFS_OP_CAPFLAG_IS_SUPPORTED, session); if (gHgfsDirNotifyActive) { LOG(8, ("%s: notify is enabled\n", __FUNCTION__)); if (HgfsServerEnumerateSharedFolders()) { HgfsServerSetSessionCapability(HGFS_OP_SET_WATCH_V4, - HGFS_REQUEST_SUPPORTED, session); + HGFS_OP_CAPFLAG_IS_SUPPORTED, session); HgfsServerSetSessionCapability(HGFS_OP_REMOVE_WATCH_V4, - HGFS_REQUEST_SUPPORTED, session); + HGFS_OP_CAPFLAG_IS_SUPPORTED, session); session->flags |= HGFS_SESSION_CHANGENOTIFY_ENABLED; } else { HgfsServerSetSessionCapability(HGFS_OP_SET_WATCH_V4, - HGFS_REQUEST_NOT_SUPPORTED, session); + HGFS_OP_CAPFLAG_NOT_SUPPORTED, session); HgfsServerSetSessionCapability(HGFS_OP_REMOVE_WATCH_V4, - HGFS_REQUEST_NOT_SUPPORTED, session); + HGFS_OP_CAPFLAG_NOT_SUPPORTED, session); } LOG(8, ("%s: session notify capability is %s\n", __FUNCTION__, (session->flags & HGFS_SESSION_CHANGENOTIFY_ENABLED ? "enabled" : "disabled"))); } HgfsServerSetSessionCapability(HGFS_OP_SEARCH_READ_V4, - HGFS_REQUEST_SUPPORTED, session); + HGFS_OP_CAPFLAG_IS_SUPPORTED, session); } *sessionData = session; diff --git a/open-vm-tools/lib/hgfsServer/hgfsServerInt.h b/open-vm-tools/lib/hgfsServer/hgfsServerInt.h index 7aff02459..d95cf6dde 100644 --- a/open-vm-tools/lib/hgfsServer/hgfsServerInt.h +++ b/open-vm-tools/lib/hgfsServer/hgfsServerInt.h @@ -380,7 +380,7 @@ typedef struct HgfsSessionInfo { /** END SEARCH ARRAY ****************************************************/ /* Array of session specific capabiities. */ - HgfsCapability hgfsSessionCapabilities[HGFS_OP_MAX]; + HgfsOpCapability hgfsSessionCapabilities[HGFS_OP_MAX]; uint32 numberOfCapabilities; diff --git a/open-vm-tools/lib/hgfsServer/hgfsServerParameters.c b/open-vm-tools/lib/hgfsServer/hgfsServerParameters.c index c5a442625..c45afd91a 100644 --- a/open-vm-tools/lib/hgfsServer/hgfsServerParameters.c +++ b/open-vm-tools/lib/hgfsServer/hgfsServerParameters.c @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 2010-2016 VMware, Inc. All rights reserved. + * Copyright (C) 2010-2017 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -34,11 +34,11 @@ #include "hgfsServerParameters.h" #ifdef _WIN32 -#define HGFS_REQUEST_WIN32_SUPPORTED HGFS_REQUEST_SUPPORTED -#define HGFS_REQUEST_POSIX_SUPPORTED HGFS_REQUEST_NOT_SUPPORTED +#define HGFS_OP_CAPFLAG_WIN32_IS_SUPPORTED HGFS_OP_CAPFLAG_IS_SUPPORTED +#define HGFS_OP_CAPFLAG_POSIX_IS_SUPPORTED HGFS_OP_CAPFLAG_NOT_SUPPORTED #else -#define HGFS_REQUEST_WIN32_SUPPORTED HGFS_REQUEST_NOT_SUPPORTED -#define HGFS_REQUEST_POSIX_SUPPORTED HGFS_REQUEST_SUPPORTED +#define HGFS_OP_CAPFLAG_WIN32_IS_SUPPORTED HGFS_OP_CAPFLAG_NOT_SUPPORTED +#define HGFS_OP_CAPFLAG_POSIX_IS_SUPPORTED HGFS_OP_CAPFLAG_IS_SUPPORTED #endif #define HGFS_ASSERT_PACK_PARAMS \ @@ -53,73 +53,73 @@ * This is the default/minimal set of capabilities which is supported by every transport. * Every transport and session may have additional capabilities in addition to these. */ -static HgfsCapability hgfsDefaultCapabilityTable[] = +static HgfsOpCapability hgfsDefaultCapabilityTable[] = { - {HGFS_OP_OPEN, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_READ, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_WRITE, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_CLOSE, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SEARCH_OPEN, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SEARCH_READ, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SEARCH_CLOSE, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_GETATTR, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SETATTR, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_CREATE_DIR, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_DELETE_FILE, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_DELETE_DIR, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_RENAME, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_QUERY_VOLUME_INFO, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_OPEN_V2, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_GETATTR_V2, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SETATTR_V2, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SEARCH_READ_V2, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_CREATE_SYMLINK, HGFS_REQUEST_POSIX_SUPPORTED}, - {HGFS_OP_SERVER_LOCK_CHANGE, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_CREATE_DIR_V2, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_DELETE_FILE_V2, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_DELETE_DIR_V2, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_RENAME_V2, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_OPEN_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_READ_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_WRITE_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_CLOSE_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SEARCH_OPEN_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SEARCH_READ_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SEARCH_CLOSE_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_GETATTR_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_SETATTR_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_CREATE_DIR_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_DELETE_FILE_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_DELETE_DIR_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_RENAME_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_QUERY_VOLUME_INFO_V3, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_CREATE_SYMLINK_V3, HGFS_REQUEST_POSIX_SUPPORTED}, - {HGFS_OP_SERVER_LOCK_CHANGE_V3, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_WRITE_WIN32_STREAM_V3, HGFS_REQUEST_WIN32_SUPPORTED}, - {HGFS_OP_CREATE_SESSION_V4, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_DESTROY_SESSION_V4, HGFS_REQUEST_SUPPORTED}, - {HGFS_OP_READ_FAST_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_WRITE_FAST_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_SET_WATCH_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_REMOVE_WATCH_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_NOTIFY_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_SEARCH_READ_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_OPEN_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_ENUMERATE_STREAMS_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_GETATTR_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_SETATTR_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_DELETE_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_LINKMOVE_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_FSCTL_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_ACCESS_CHECK_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_FSYNC_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_QUERY_VOLUME_INFO_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_OPLOCK_ACQUIRE_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_OPLOCK_BREAK_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_LOCK_BYTE_RANGE_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_UNLOCK_BYTE_RANGE_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_QUERY_EAS_V4, HGFS_REQUEST_NOT_SUPPORTED}, - {HGFS_OP_SET_EAS_V4, HGFS_REQUEST_NOT_SUPPORTED}, + {HGFS_OP_OPEN, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_READ, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_WRITE, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_CLOSE, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SEARCH_OPEN, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SEARCH_READ, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SEARCH_CLOSE, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_GETATTR, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SETATTR, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_CREATE_DIR, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_DELETE_FILE, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_DELETE_DIR, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_RENAME, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_QUERY_VOLUME_INFO, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_OPEN_V2, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_GETATTR_V2, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SETATTR_V2, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SEARCH_READ_V2, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_CREATE_SYMLINK, HGFS_OP_CAPFLAG_POSIX_IS_SUPPORTED}, + {HGFS_OP_SERVER_LOCK_CHANGE, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_CREATE_DIR_V2, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_DELETE_FILE_V2, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_DELETE_DIR_V2, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_RENAME_V2, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_OPEN_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_READ_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_WRITE_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_CLOSE_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SEARCH_OPEN_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SEARCH_READ_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SEARCH_CLOSE_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_GETATTR_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_SETATTR_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_CREATE_DIR_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_DELETE_FILE_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_DELETE_DIR_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_RENAME_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_QUERY_VOLUME_INFO_V3, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_CREATE_SYMLINK_V3, HGFS_OP_CAPFLAG_POSIX_IS_SUPPORTED}, + {HGFS_OP_SERVER_LOCK_CHANGE_V3, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_WRITE_WIN32_STREAM_V3, HGFS_OP_CAPFLAG_WIN32_IS_SUPPORTED}, + {HGFS_OP_CREATE_SESSION_V4, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_DESTROY_SESSION_V4, HGFS_OP_CAPFLAG_IS_SUPPORTED}, + {HGFS_OP_READ_FAST_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_WRITE_FAST_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_SET_WATCH_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_REMOVE_WATCH_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_NOTIFY_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_SEARCH_READ_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_OPEN_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_ENUMERATE_STREAMS_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_GETATTR_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_SETATTR_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_DELETE_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_LINKMOVE_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_FSCTL_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_ACCESS_CHECK_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_FSYNC_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_QUERY_VOLUME_INFO_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_OPLOCK_ACQUIRE_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_OPLOCK_BREAK_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_LOCK_BYTE_RANGE_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_UNLOCK_BYTE_RANGE_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_QUERY_EAS_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, + {HGFS_OP_SET_EAS_V4, HGFS_OP_CAPFLAG_NOT_SUPPORTED}, }; @@ -5234,7 +5234,7 @@ HgfsUnpackCreateSessionPayloadV4(const HgfsRequestCreateSessionV4 *requestV4, // if (requestV4->numCapabilities) { if (payloadSize < offsetof(HgfsRequestCreateSessionV4, capabilities) + - requestV4->numCapabilities * sizeof(HgfsCapability)) { + requestV4->numCapabilities * sizeof(HgfsOpCapability)) { LOG(4, ("%s: HGFS packet too small\n", __FUNCTION__)); return FALSE; } @@ -5386,8 +5386,8 @@ HgfsPackDestroySessionReply(HgfsPacket *packet, // IN/OUT: Hgfs Packet */ void -HgfsServerGetDefaultCapabilities(HgfsCapability *capabilities, // OUT: capabilities - uint32 *numberOfCapabilities) // OUT: number of items +HgfsServerGetDefaultCapabilities(HgfsOpCapability *capabilities, // OUT: capabilities + uint32 *numberOfCapabilities) // OUT: number of items { *numberOfCapabilities = ARRAYSIZE(hgfsDefaultCapabilityTable); ASSERT(*numberOfCapabilities <= HGFS_OP_MAX); diff --git a/open-vm-tools/lib/hgfsServer/hgfsServerParameters.h b/open-vm-tools/lib/hgfsServer/hgfsServerParameters.h index 760b1a4d4..983d337a9 100644 --- a/open-vm-tools/lib/hgfsServer/hgfsServerParameters.h +++ b/open-vm-tools/lib/hgfsServer/hgfsServerParameters.h @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 2013-2016 VMware, Inc. All rights reserved. + * Copyright (C) 2013-2017 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -307,7 +307,7 @@ HgfsPackDestroySessionReply(HgfsPacket *packet, // IN/OUT: Hgfs Packet size_t *payloadSize, // OUT: size of packet HgfsSessionInfo *session); // IN: Session Info void -HgfsServerGetDefaultCapabilities(HgfsCapability *capabilities, // OUT: +HgfsServerGetDefaultCapabilities(HgfsOpCapability *capabilities, // OUT: uint32 *numberOfCapabilities); // OUT: Bool HgfsUnpackSetWatchRequest(const void *packet, // IN: HGFS packet diff --git a/open-vm-tools/lib/include/hgfsProto.h b/open-vm-tools/lib/include/hgfsProto.h index 1caa6e810..458d8958b 100644 --- a/open-vm-tools/lib/include/hgfsProto.h +++ b/open-vm-tools/lib/include/hgfsProto.h @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 1998-2016 VMware, Inc. All rights reserved. + * Copyright (C) 1998-2017 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -1699,36 +1699,63 @@ struct HgfsHeader { #include "vmware_pack_end.h" HgfsHeader; +typedef uint32 HgfsOpCapFlags; + +/* + * The operation capability flags. + * + * These flags apply to all operations and occupy the least significant + * 16 bits of the HgfsOpCapFlags type. + */ + /* + * HGFS_OP_CAPFLAG_NOT_SUPPORTED * If no flags are set then the capability is not supported by the host. */ -#define HGFS_REQUEST_NOT_SUPPORTED 0 +#define HGFS_OP_CAPFLAG_NOT_SUPPORTED 0 + /* - * Flag HGFS_REQUEST_SUPPORTED is set for every requests that are supported by the host. + * HGFS_OP_CAPFLAG_IS_SUPPORTED + * Set for each request that is supported by a host or client. + * To be set for an Hgfs session both host and client must have the capability. + */ +#define HGFS_OP_CAPFLAG_IS_SUPPORTED (1 << 0) + +/* + * HGFS_OP_CAPFLAG_ASYNCHRONOUS + * Set for each request that can be handled asynchronously by a host or client. + * By default all operations are handled synchronously but if this flag is set + * by a client and a host then the operation can be handled in an asynchronous manner too. + */ +#define HGFS_OP_CAPFLAG_ASYNCHRONOUS (1 << 1) + +/* + * The operation specific capability flags. + * + * These flags apply only to the operation given by the name and occupy the + * most significant 16 bits of the HgfsOpCapFlags type. */ -#define HGFS_REQUEST_SUPPORTED (1 << 0) /* * Following flags define which optional parameters for file open * requests are supported by the host. - * HGFS_OPENV4_SUPPORTS_EA - host is capable of setting EA when creating - * a new file. - * HGFS_OPENV4_SUPPORTS_ACL - host is capable of setting ACLs when creating - * a new file. - * HGFS_OPENV4_SUPPORTS_NAMED_STREAMS - opening/enumerating named streams - * is supported. - * HGFS_OPENV4_SUPPORTS_SHARED_ACCESS - host supports file sharing restrictions. - * HGFS_OPENV4_SUPPORTS_UNIX_PERMISSIONS - host stores POSIX permissions with - * file. - * HGFS_OPENV4_POSIX_FILE_DELETION - host supports POSIX file deletion semantics. - */ -typedef uint32 HgfsOpenV4Capabilities; -#define HGFS_OPENV4_SUPPORTS_EA (1 << 1) -#define HGFS_OPENV4_SUPPORTS_ACL (1 << 2) -#define HGFS_OPENV4_SUPPORTS_NAMED_STREAMS (1 << 3) -#define HGFS_OPENV4_SUPPORTS_SHARED_ACCESS (1 << 4) -#define HGFS_OPENV4_SUPPORTS_UNIX_PERMISSIONS (1 << 5) -#define HGFS_OPENV4_POSIX_FILE_DELETION (1 << 6) + * HGFS_OP_CAPFLAG_OPENV4_EA - host is capable of setting EA when creating + * a new file. + * HGFS_OP_CAPFLAG_OPENV4_ACL - host is capable of setting ACLs when creating + * a new file. + * HGFS_OP_CAPFLAG_OPENV4_NAMED_STREAMS - opening/enumerating named streams + * is supported. + * HGFS_OP_CAPFLAG_OPENV4_SHARED_ACCESS - host supports file sharing restrictions. + * HGFS_OP_CAPFLAG_OPENV4_UNIX_PERMISSIONS - host stores POSIX permissions with + * file. + * HGFS_OP_CAPFLAG_OPENV4_POSIX_DELETION - host supports POSIX file deletion semantics. + */ +#define HGFS_OP_CAPFLAG_OPENV4_EA (1 << 16) +#define HGFS_OP_CAPFLAG_OPENV4_ACL (1 << 17) +#define HGFS_OP_CAPFLAG_OPENV4_NAMED_STREAMS (1 << 18) +#define HGFS_OP_CAPFLAG_OPENV4_SHARED_ACCESS (1 << 19) +#define HGFS_OP_CAPFLAG_OPENV4_UNIX_PERMISSIONS (1 << 20) +#define HGFS_OP_CAPFLAG_OPENV4_POSIX_DELETION (1 << 21) /* * There is a significant difference in byte range locking semantics between Windows @@ -1746,42 +1773,39 @@ typedef uint32 HgfsOpenV4Capabilities; * Following flags define various capabilities of byte range lock implementation on * the host. * - * HGFS_BYTE_RANGE_LOCKS_SUPPORTS_64 means that server is capable of locking 64 bit - * length ranges. - * HGFS_BYTE_RANGE_LOCKS_SUPPORTS_32 means that server is limited to 32-bit ranges. - * HGFS_BYTE_RANGE_LOCKS_SUPPORTS_MANDATORY means that server is capable of enforcing - * read/write restrictions for locked ranges. - * HGFS_BYTE_RANGE_LOCKS_SUPPORTS_ADVISORY means that server supports advisory locking; - * locks are validated only for other bytes - * range locking and are not enforced - * for read/write operations. - */ -typedef uint32 HgfsByteRangeLockingCapabilities; -#define HGFS_BYTE_RANGE_LOCKS_SUPPORTS_64 (1 << 1) -#define HGFS_BYTE_RANGE_LOCKS_SUPPORTS_32 (1 << 2) -#define HGFS_BYTE_RANGE_LOCKS_SUPPORTS_MANDATORY (1 << 3) -#define HGFS_BYTE_RANGE_LOCKS_SUPPORTS_ADVISORY (1 << 4) + * HGFS_OP_CAPFLAG_BYTE_RANGE_LOCKS_64 means that server is capable of locking 64 bit + * length ranges. + * HGFS_OP_CAPFLAG_BYTE_RANGE_LOCKS_32 means that server is limited to 32-bit ranges. + * HGFS_OP_CAPFLAG_BYTE_RANGE_LOCKS_MANDATORY means that server is capable of enforcing + * read/write restrictions for locked ranges. + * HGFS_OP_CAPFLAG_BYTE_RANGE_LOCKS_ADVISORY means that server supports advisory locking; + * locks are validated only for other bytes + * range locking and are not enforced + * for read/write operations. + */ +#define HGFS_OP_CAPFLAG_BYTE_RANGE_LOCKS_64 (1 << 16) +#define HGFS_OP_CAPFLAG_BYTE_RANGE_LOCKS_32 (1 << 17) +#define HGFS_OP_CAPFLAG_BYTE_RANGE_LOCKS_MANDATORY (1 << 18) +#define HGFS_OP_CAPFLAG_BYTE_RANGE_LOCKS_ADVISORY (1 << 19) /* HGFS_SUPPORTS_HARD_LINKS is set when the host supports hard links. */ -typedef uint32 HgfsLinkMoveCapabilities; -#define HGFS_SUPPORTS_HARD_LINKS (1 << 1) +#define HGFS_OP_CAPFLAG_LINKMOVE_HARD_LINKS (1 << 16) /* * HGFS_SET_WATCH_SUPPORTS_FINE_GRAIN_EVENTS is set when host supports * fine grain event reporting for directory notification. */ -typedef uint32 HgfsSetWatchCapabilities; -#define HGFS_SET_WATCH_SUPPORTS_FINE_GRAIN_EVENTS (1 << 1) +#define HGFS_OP_CAPFLAG_SET_WATCH_FINE_GRAIN_EVENTS (1 << 16) typedef #include "vmware_pack_begin.h" -struct HgfsCapability { - HgfsOp op; /* Op. */ - uint32 flags; /* Flags. */ +struct HgfsOpCapability { + HgfsOp op; /* Op. */ + HgfsOpCapFlags flags; /* Flags. */ } #include "vmware_pack_end.h" -HgfsCapability; +HgfsOpCapability; typedef HgfsFileName HgfsUserName; typedef HgfsFileName HgfsGroupName; @@ -1820,7 +1844,7 @@ struct HgfsRequestCreateSessionV4 { uint32 maxPacketSize; /* Maximum packet size supported. */ HgfsSessionFlags flags; /* Session capability flags. */ uint32 reserved; /* Reserved for future use. */ - HgfsCapability capabilities[1]; /* Array of HgfsCapabilities. */ + HgfsOpCapability capabilities[1]; /* Array of HgfsCapabilities. */ } #include "vmware_pack_end.h" HgfsRequestCreateSessionV4; @@ -1834,7 +1858,7 @@ struct HgfsReplyCreateSessionV4 { uint32 identityOffset; /* Offset to HgfsIdentity or 0 if no identity. */ HgfsSessionFlags flags; /* Flags. */ uint32 reserved; /* Reserved for future use. */ - HgfsCapability capabilities[1]; /* Array of HgfsCapabilities. */ + HgfsOpCapability capabilities[1]; /* Array of HgfsCapabilities. */ } #include "vmware_pack_end.h" HgfsReplyCreateSessionV4;