Changeset 82478 in vbox
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/GuestHost/SharedClipboard-transfers.h
r82465 r82478 86 86 87 87 /** Specifies an invalid Shared Clipboard list handle. */ 88 #define SHCLLISTHANDLE_INVALID ((SHCLLISTHANDLE) ~0LL)88 #define SHCLLISTHANDLE_INVALID ((SHCLLISTHANDLE)UINT64_MAX) 89 89 90 90 /** A Shared Clipboard object handle. */ … … 94 94 95 95 /** Specifies an invalid Shared Clipboard object handle. */ 96 #define SHCLOBJHANDLE_INVALID ((SHCLOBJHANDLE) ~0LL)96 #define SHCLOBJHANDLE_INVALID ((SHCLOBJHANDLE)UINT64_MAX) 97 97 98 98 /** @} */ … … 101 101 * @{ 102 102 */ 103 104 103 /** No flags. Initialization value. */ 105 #define SHCL_OBJ_CF_NONE (0x00000000) 106 104 #define SHCL_OBJ_CF_NONE UINT32_C(0x00000000) 105 106 #if 0 /* These probably won't be needed either */ 107 107 /** Lookup only the object, do not return a handle. All other flags are ignored. */ 108 #define SHCL_OBJ_CF_LOOKUP (0x00000001) 109 108 #define SHCL_OBJ_CF_LOOKUP UINT32_C(0x00000001) 110 109 /** Create/open a directory. */ 111 #define SHCL_OBJ_CF_DIRECTORY (0x00000004) 110 #define SHCL_OBJ_CF_DIRECTORY UINT32_C(0x00000004) 111 #endif 112 112 113 113 /** Read/write requested access for the object. */ 114 #define SHCL_OBJ_CF_ACCESS_MASK_RW (0x00001000) 115 114 #define SHCL_OBJ_CF_ACCESS_MASK_RW UINT32_C(0x00001000) 116 115 /** No access requested. */ 117 #define SHCL_OBJ_CF_ACCESS_NONE (0x00000000)116 #define SHCL_OBJ_CF_ACCESS_NONE UINT32_C(0x00000000) 118 117 /** Read access requested. */ 119 #define SHCL_OBJ_CF_ACCESS_READ (0x00001000)118 #define SHCL_OBJ_CF_ACCESS_READ UINT32_C(0x00001000) 120 119 121 120 /** Requested share access for the object. */ 122 #define SHCL_OBJ_CF_ACCESS_MASK_DENY (0x0000C000) 123 121 #define SHCL_OBJ_CF_ACCESS_MASK_DENY UINT32_C(0x00008000) 124 122 /** Allow any access. */ 125 #define SHCL_OBJ_CF_ACCESS_DENYNONE (0x00000000) 126 /** Do not allow read. */ 127 #define SHCL_OBJ_CF_ACCESS_DENYREAD (0x00004000) 123 #define SHCL_OBJ_CF_ACCESS_DENYNONE UINT32_C(0x00000000) 128 124 /** Do not allow write. */ 129 #define SHCL_OBJ_CF_ACCESS_DENYWRITE (0x00008000) 130 /** Do not allow access. */ 131 #define SHCL_OBJ_CF_ACCESS_DENYALL (SHCL_OBJ_CF_ACCESS_DENYREAD | SHCL_OBJ_CF_ACCESS_DENYWRITE) 125 #define SHCL_OBJ_CF_ACCESS_DENYWRITE UINT32_C(0x00008000) 132 126 133 127 /** Requested access to attributes of the object. */ 134 #define SHCL_OBJ_CF_ACCESS_MASK_ATTR (0x00030000) 135 128 #define SHCL_OBJ_CF_ACCESS_MASK_ATTR UINT32_C(0x00010000) 136 129 /** No access requested. */ 137 #define SHCL_OBJ_CF_ACCESS_ATTR_NONE (0x00000000)130 #define SHCL_OBJ_CF_ACCESS_ATTR_NONE UINT32_C(0x00000000) 138 131 /** Read access requested. */ 139 #define SHCL_OBJ_CF_ACCESS_ATTR_READ (0x00010000) 140 132 #define SHCL_OBJ_CF_ACCESS_ATTR_READ UINT32_C(0x00010000) 133 134 /** Valid bits. */ 135 #define SHCL_OBJ_CF_VALID_MASK UINT32_C(0x00018000) 141 136 /** @} */ 142 137 143 /** Result of an open request.144 * Along with handle value the result code145 * identifies what has happened while146 * trying to open the object.147 */148 typedef enum _SHCLCREATERESULT149 {150 SHCL_CREATERESULT_NONE,151 /** Specified path does not exist. */152 SHCL_CREATERESULT_PATH_NOT_FOUND,153 /** Path to file exists, but the last component does not. */154 SHCL_CREATERESULT_FILE_NOT_FOUND,155 /** Blow the type up to 32-bit. */156 SHCL_CREATERESULT_32BIT_HACK = 0x7fffffff157 } SHCLCREATERESULT;158 AssertCompile(SHCL_CREATERESULT_NONE == 0);159 AssertCompileSize(SHCLCREATERESULT, 4);160 161 138 /** 162 139 * The available additional information in a SHCLFSOBJATTR object. 140 * @sa RTFSOBJATTRADD 163 141 */ 164 142 typedef enum _SHCLFSOBJATTRADD … … 191 169 /** 192 170 * Shared Clipboard filesystem object attributes. 193 */ 194 #pragma pack(1) 171 * 172 * @sa RTFSOBJATTR 173 */ 195 174 typedef struct _SHCLFSOBJATTR 196 175 { … … 263 242 RTFOFF cb; 264 243 } EASize; 244 245 /** Padding the structure to a multiple of 8 bytes. */ 246 uint64_t au64Padding[5]; 265 247 } u; 266 248 } SHCLFSOBJATTR; 267 #pragma pack() 268 AssertCompileSize(SHCLFSOBJATTR, 44); 249 AssertCompileSize(SHCLFSOBJATTR, 48); 269 250 /** Pointer to a Shared Clipboard filesystem object attributes structure. */ 270 251 typedef SHCLFSOBJATTR *PSHCLFSOBJATTR; … … 274 255 /** 275 256 * Shared Clipboard file system object information structure. 276 */ 277 #pragma pack(1) 257 * 258 * @sa RTFSOBJINFO 259 */ 278 260 typedef struct _SHCLFSOBJINFO 279 261 { … … 311 293 312 294 } SHCLFSOBJINFO; 313 #pragma pack() 314 AssertCompileSize(SHCLFSOBJINFO, 92); 295 AssertCompileSize(SHCLFSOBJINFO, 96); 315 296 /** Pointer to a Shared Clipboard filesystem object information structure. */ 316 297 typedef SHCLFSOBJINFO *PSHCLFSOBJINFO; … … 319 300 typedef const SHCLFSOBJINFO *PCSHCLFSOBJINFO; 320 301 321 #pragma pack(1)322 302 /** 323 303 * Structure for keeping object open/create parameters. … … 337 317 SHCLFSOBJINFO ObjInfo; 338 318 } SHCLOBJOPENCREATEPARMS, *PSHCLOBJOPENCREATEPARMS; 339 #pragma pack()340 319 341 320 /** … … 537 516 538 517 /** 539 * Class for maintaining a Shared Clipboard area 540 * on the host or guest. This will contain all received files & directories 541 * for a single Shared Clipboard operation. 518 * Class for maintaining a Shared Clipboard area on the host or guest. 519 * 520 * This will contain all received files & directories for a single Shared 521 * Clipboard operation. 542 522 * 543 523 * In case of a failed Shared Clipboard operation this class can also … … 632 612 SHCLTRANSFEROBJSTATE State; 633 613 } SHCLTRANSFEROBJ, *PSHCLTRANSFEROBJ; 634 635 /** Defines a transfer ID. */636 typedef uint16_t SHCLTRANSFERID;637 614 638 615 /** … … 743 720 * This is handed in to the provider implementation callbacks. 744 721 */ 745 typedef struct _SHCLPROVIDERCTX722 typedef struct _SHCLPROVIDERCTX 746 723 { 747 724 /** Pointer to the related Shared Clipboard transfer. */ … … 752 729 753 730 /** @todo r=bird: These macros must go as they do no lend themselves to writing 754 * sane documentation. Use the DECLCALLBACK macro instead, as you731 * sane documentation. Use the DECLCALLBACKMEMBER macro instead, as you 755 732 * probably do not need the function and function pointer typedefs. 756 733 * … … 913 890 /** The node member for using this struct in a RTList. */ 914 891 RTLISTNODE Node; 915 /** Critical section for serializing access. */916 RTCRITSECT CritSect;917 892 /** The transfer's state (for SSM, later). */ 918 893 SHCLTRANSFERSTATE State; 894 /** Absolute path to root entries. */ 895 char *pszPathRootAbs; 919 896 /** Timeout (in ms) for waiting of events. Default is 30s. */ 920 897 RTMSINTERVAL uTimeoutMs; 921 /** Absolute path to root entries. */922 char *pszPathRootAbs;923 898 /** Maximum data chunk size (in bytes) to transfer. Default is 64K. */ 924 899 uint32_t cbMaxChunkSize; … … 961 936 /** Contains thread-related attributes. */ 962 937 SHCLTRANSFERTHREAD Thread; 938 /** Critical section for serializing access. */ 939 RTCRITSECT CritSect; 963 940 } SHCLTRANSFER, *PSHCLTRANSFER; 964 941 -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
r82465 r82478 34 34 static int shClTransferThreadDestroy(PSHCLTRANSFER pTransfer, RTMSINTERVAL uTimeoutMs); 35 35 static PSHCLTRANSFER shClTransferCtxGetTransferInternal(PSHCLTRANSFERCTX pTransferCtx, uint32_t uIdx); 36 static int shClConvertFileCreateFlags( bool fWritable, unsigned fShClFlags, RTFMODE fMode, SHCLOBJHANDLE handleInitial, uint64_t *pfOpen);36 static int shClConvertFileCreateFlags(uint32_t fShClFlags, uint64_t *pfOpen); 37 37 static int shClTransferResolvePathAbs(PSHCLTRANSFER pTransfer, const char *pszPath, uint32_t fFlags, char **ppszResolved); 38 38 … … 796 796 * @param phObj Where to store the handle of transfer object opened on success. 797 797 */ 798 int ShClTransferObjOpen(PSHCLTRANSFER pTransfer, PSHCLOBJOPENCREATEPARMS pOpenCreateParms, 799 PSHCLOBJHANDLE phObj) 798 int ShClTransferObjOpen(PSHCLTRANSFER pTransfer, PSHCLOBJOPENCREATEPARMS pOpenCreateParms, PSHCLOBJHANDLE phObj) 800 799 { 801 800 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 802 801 AssertPtrReturn(pOpenCreateParms, VERR_INVALID_POINTER); 803 802 AssertPtrReturn(phObj, VERR_INVALID_POINTER); 804 805 int rc = VINF_SUCCESS;806 807 803 AssertMsgReturn(pTransfer->pszPathRootAbs, ("Transfer has no root path set\n"), VERR_INVALID_PARAMETER); 808 804 AssertMsgReturn(pOpenCreateParms->pszPath, ("No path in open/create params set\n"), VERR_INVALID_PARAMETER); 809 805 810 if (pTransfer->cObjHandles == pTransfer->cMaxObjHandles)806 if (pTransfer->cObjHandles >= pTransfer->cMaxObjHandles) 811 807 return VERR_SHCLPB_MAX_OBJECTS_REACHED; 812 808 813 809 LogFlowFunc(("pszPath=%s, fCreate=0x%x\n", pOpenCreateParms->pszPath, pOpenCreateParms->fCreate)); 814 810 811 int rc; 815 812 if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL) 816 813 { 817 PSHCLOBJHANDLEINFO pInfo 818 = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO)); 814 PSHCLOBJHANDLEINFO pInfo = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO)); 819 815 if (pInfo) 820 816 { … … 822 818 if (RT_SUCCESS(rc)) 823 819 { 824 825 /* Only if this is a read transfer (locally) we're able to actually write to files826 * (we're reading from the source). */827 const bool fWritable = pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE;828 829 820 uint64_t fOpen; 830 rc = shClConvertFileCreateFlags(fWritable, 831 pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode, 832 SHCLOBJHANDLE_INVALID, &fOpen); 821 rc = shClConvertFileCreateFlags(pOpenCreateParms->fCreate, &fOpen); 833 822 if (RT_SUCCESS(rc)) 834 823 { … … 839 828 rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen); 840 829 if (RT_SUCCESS(rc)) 841 {842 830 LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs)); 843 }844 831 else 845 LogRel(("Shared Clipboard: Error opening file '%s' ,rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));832 LogRel(("Shared Clipboard: Error opening file '%s': rc=%Rrc\n", pInfo->pszPathLocalAbs, rc)); 846 833 } 847 834 } … … 872 859 { 873 860 if (pTransfer->ProviderIface.pfnObjOpen) 874 {875 861 rc = pTransfer->ProviderIface.pfnObjOpen(&pTransfer->ProviderCtx, pOpenCreateParms, phObj); 876 }877 862 else 878 863 rc = VERR_NOT_SUPPORTED; … … 3012 2997 * 3013 2998 * @returns IPRT status code. 3014 * @param fWritable Whether the object is writable. 3015 * @param fShClFlags Shared clipboard create flags. 3016 * @param fMode File attributes. 3017 * @param handleInitial Initial handle. 3018 * @retval pfOpen Where to store the IPRT creation / open flags. 2999 * @param fShClFlags Shared clipboard create flags. 3000 * @param[out] pfOpen Where to store the RTFILE_O_XXX flags for 3001 * RTFileOpen. 3019 3002 * 3020 3003 * @sa Initially taken from vbsfConvertFileOpenFlags(). 3021 3004 */ 3022 static int shClConvertFileCreateFlags(bool fWritable, unsigned fShClFlags, RTFMODE fMode, 3023 SHCLOBJHANDLE handleInitial, uint64_t *pfOpen) 3024 { 3005 static int shClConvertFileCreateFlags(uint32_t fShClFlags, uint64_t *pfOpen) 3006 { 3007 AssertMsgReturnStmt(!(fShClFlags & ~SHCL_OBJ_CF_VALID_MASK), ("%#x4\n", fShClFlags), *pfOpen = 0, VERR_INVALID_FLAGS); 3008 3025 3009 uint64_t fOpen = 0; 3026 int rc = VINF_SUCCESS; 3027 3028 if ( (fMode & RTFS_DOS_MASK) != 0 3029 && (fMode & RTFS_UNIX_MASK) == 0) 3030 { 3031 /* A DOS/Windows guest, make RTFS_UNIX_* from RTFS_DOS_*. 3032 * @todo this is based on rtFsModeNormalize/rtFsModeFromDos. 3033 * May be better to use RTFsModeNormalize here. 3034 */ 3035 fMode |= RTFS_UNIX_IRUSR | RTFS_UNIX_IRGRP | RTFS_UNIX_IROTH; 3036 /* x for directories. */ 3037 if (fMode & RTFS_DOS_DIRECTORY) 3038 fMode |= RTFS_TYPE_DIRECTORY | RTFS_UNIX_IXUSR | RTFS_UNIX_IXGRP | RTFS_UNIX_IXOTH; 3039 /* writable? */ 3040 if (!(fMode & RTFS_DOS_READONLY)) 3041 fMode |= RTFS_UNIX_IWUSR | RTFS_UNIX_IWGRP | RTFS_UNIX_IWOTH; 3042 3043 /* Set the requested mode using only allowed bits. */ 3044 fOpen |= ((fMode & RTFS_UNIX_MASK) << RTFILE_O_CREATE_MODE_SHIFT) & RTFILE_O_CREATE_MODE_MASK; 3045 } 3046 else 3047 { 3048 /* Old linux and solaris additions did not initialize the Info.Attr.fMode field 3049 * and it contained random bits from stack. Detect this using the handle field value 3050 * passed from the guest: old additions set it (incorrectly) to 0, new additions 3051 * set it to SHCLOBJHANDLE_INVALID(~0). 3052 */ 3053 if (handleInitial == 0) 3054 { 3055 /* Old additions. Do nothing, use default mode. */ 3056 } 3057 else 3058 { 3059 /* New additions or Windows additions. Set the requested mode using only allowed bits. 3060 * Note: Windows guest set RTFS_UNIX_MASK bits to 0, which means a default mode 3061 * will be set in fOpen. 3062 */ 3063 fOpen |= ((fMode & RTFS_UNIX_MASK) << RTFILE_O_CREATE_MODE_SHIFT) & RTFILE_O_CREATE_MODE_MASK; 3064 } 3065 } 3066 3067 switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_RW)) 3068 { 3069 default: 3070 RT_FALL_THROUGH(); 3010 3011 switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_RW) 3012 { 3071 3013 case SHCL_OBJ_CF_ACCESS_NONE: 3072 3014 { … … 3087 3029 break; 3088 3030 } 3089 } 3090 3091 switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR)) 3092 { 3031 3093 3032 default: 3094 RT_FALL_THROUGH(); 3033 AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); 3034 } 3035 3036 switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR) 3037 { 3095 3038 case SHCL_OBJ_CF_ACCESS_ATTR_NONE: 3096 3039 { … … 3106 3049 break; 3107 3050 } 3051 3052 default: 3053 AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); 3108 3054 } 3109 3055 3110 3056 /* Sharing mask */ 3111 switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_DENY)) 3112 { 3113 default: 3057 switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_DENY) 3058 { 3114 3059 case SHCL_OBJ_CF_ACCESS_DENYNONE: 3115 3060 fOpen |= RTFILE_O_DENY_NONE; … … 3117 3062 break; 3118 3063 3119 case SHCL_OBJ_CF_ACCESS_DENYREAD:3120 fOpen |= RTFILE_O_DENY_READ;3121 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYREAD\n"));3122 break;3123 3124 3064 case SHCL_OBJ_CF_ACCESS_DENYWRITE: 3125 3065 fOpen |= RTFILE_O_DENY_WRITE; … … 3127 3067 break; 3128 3068 3129 case SHCL_OBJ_CF_ACCESS_DENYALL: 3130 fOpen |= RTFILE_O_DENY_ALL; 3131 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYALL\n")); 3132 break; 3133 } 3134 3135 if (RT_SUCCESS(rc)) 3136 { 3137 if (!fWritable) 3138 fOpen &= ~RTFILE_O_WRITE; 3139 3140 *pfOpen = fOpen; 3141 } 3142 3143 LogFlowFuncLeaveRC(rc); 3144 return rc; 3069 default: 3070 AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); 3071 } 3072 3073 *pfOpen = fOpen; 3074 3075 LogFlowFuncLeaveRC(VINF_SUCCESS); 3076 return VINF_SUCCESS; 3145 3077 } 3146 3078 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp
r82462 r82478 1370 1370 if (!pTransfer) 1371 1371 { 1372 LogFunc(("Transfer with ID %RU 32not found\n", uTransferID));1372 LogFunc(("Transfer with ID %RU16 not found\n", uTransferID)); 1373 1373 rc = VERR_SHCLPB_TRANSFER_ID_NOT_FOUND; 1374 1374 } … … 1615 1615 case VBOX_SHCL_GUEST_FN_OBJ_OPEN: 1616 1616 { 1617 if (cParms != VBOX_SHCL_CPARMS_OBJ_OPEN) 1618 break; 1617 ASSERT_GUEST_STMT_BREAK(cParms == VBOX_SHCL_CPARMS_OBJ_OPEN, VERR_WRONG_PARAMETER_COUNT); 1619 1618 1620 1619 SHCLOBJOPENCREATEPARMS openCreateParms; … … 1622 1621 1623 1622 uint32_t cbPath; 1624 rc = HGCMSvcGetU32(&paParms[2], &cbPath); 1625 if (RT_SUCCESS(rc)) 1626 { 1623 rc = HGCMSvcGetU32(&paParms[2], &cbPath); /** @todo r=bird: This is an pointless parameter. */ 1624 if (RT_SUCCESS(rc)) 1625 { 1626 /** @todo r=bird: This is the wrong way of getting a string! */ 1627 1627 rc = HGCMSvcGetPv(&paParms[3], (void **)&openCreateParms.pszPath, &openCreateParms.cbPath); 1628 1628 if (cbPath != openCreateParms.cbPath)
Note:
See TracChangeset
for help on using the changeset viewer.

