1/* SPDX-License-Identifier: MIT */
2/*
3 * VirtualBox Shared Folders: host interface definition.
4 *
5 * Copyright (C) 2006-2018 Oracle Corporation
6 */
7
8#ifndef SHFL_HOSTINTF_H
9#define SHFL_HOSTINTF_H
10
11#include <linux/vbox_vmmdev_types.h>
12
13/* The max in/out buffer size for a FN_READ or FN_WRITE call */
14#define SHFL_MAX_RW_COUNT           (16 * SZ_1M)
15
16/*
17 * Structures shared between guest and the service
18 * can be relocated and use offsets to point to variable
19 * length parts.
20 *
21 * Shared folders protocol works with handles.
22 * Before doing any action on a file system object,
23 * one have to obtain the object handle via a SHFL_FN_CREATE
24 * request. A handle must be closed with SHFL_FN_CLOSE.
25 */
26
27enum {
28	SHFL_FN_QUERY_MAPPINGS = 1,	/* Query mappings changes. */
29	SHFL_FN_QUERY_MAP_NAME = 2,	/* Query map name. */
30	SHFL_FN_CREATE = 3,		/* Open/create object. */
31	SHFL_FN_CLOSE = 4,		/* Close object handle. */
32	SHFL_FN_READ = 5,		/* Read object content. */
33	SHFL_FN_WRITE = 6,		/* Write new object content. */
34	SHFL_FN_LOCK = 7,		/* Lock/unlock a range in the object. */
35	SHFL_FN_LIST = 8,		/* List object content. */
36	SHFL_FN_INFORMATION = 9,	/* Query/set object information. */
37	/* Note function number 10 is not used! */
38	SHFL_FN_REMOVE = 11,		/* Remove object */
39	SHFL_FN_MAP_FOLDER_OLD = 12,	/* Map folder (legacy) */
40	SHFL_FN_UNMAP_FOLDER = 13,	/* Unmap folder */
41	SHFL_FN_RENAME = 14,		/* Rename object */
42	SHFL_FN_FLUSH = 15,		/* Flush file */
43	SHFL_FN_SET_UTF8 = 16,		/* Select UTF8 filename encoding */
44	SHFL_FN_MAP_FOLDER = 17,	/* Map folder */
45	SHFL_FN_READLINK = 18,		/* Read symlink dest (as of VBox 4.0) */
46	SHFL_FN_SYMLINK = 19,		/* Create symlink (as of VBox 4.0) */
47	SHFL_FN_SET_SYMLINKS = 20,	/* Ask host to show symlinks (4.0+) */
48};
49
50/* Root handles for a mapping are of type u32, Root handles are unique. */
51#define SHFL_ROOT_NIL		UINT_MAX
52
53/* Shared folders handle for an opened object are of type u64. */
54#define SHFL_HANDLE_NIL		ULLONG_MAX
55
56/* Hardcoded maximum length (in chars) of a shared folder name. */
57#define SHFL_MAX_LEN         (256)
58/* Hardcoded maximum number of shared folder mapping available to the guest. */
59#define SHFL_MAX_MAPPINGS    (64)
60
61/** Shared folder string buffer structure. */
62struct shfl_string {
63	/** Allocated size of the string member in bytes. */
64	u16 size;
65
66	/** Length of string without trailing nul in bytes. */
67	u16 length;
68
69	/** UTF-8 or UTF-16 string. Nul terminated. */
70	union {
71		u8 legacy_padding[2];
72		DECLARE_FLEX_ARRAY(u8, utf8);
73		DECLARE_FLEX_ARRAY(u16, utf16);
74	} string;
75};
76VMMDEV_ASSERT_SIZE(shfl_string, 6);
77
78/* The size of shfl_string w/o the string part. */
79#define SHFLSTRING_HEADER_SIZE  4
80
81/* Calculate size of the string. */
82static inline u32 shfl_string_buf_size(const struct shfl_string *string)
83{
84	return string ? SHFLSTRING_HEADER_SIZE + string->size : 0;
85}
86
87/* Set user id on execution (S_ISUID). */
88#define SHFL_UNIX_ISUID             0004000U
89/* Set group id on execution (S_ISGID). */
90#define SHFL_UNIX_ISGID             0002000U
91/* Sticky bit (S_ISVTX / S_ISTXT). */
92#define SHFL_UNIX_ISTXT             0001000U
93
94/* Owner readable (S_IRUSR). */
95#define SHFL_UNIX_IRUSR             0000400U
96/* Owner writable (S_IWUSR). */
97#define SHFL_UNIX_IWUSR             0000200U
98/* Owner executable (S_IXUSR). */
99#define SHFL_UNIX_IXUSR             0000100U
100
101/* Group readable (S_IRGRP). */
102#define SHFL_UNIX_IRGRP             0000040U
103/* Group writable (S_IWGRP). */
104#define SHFL_UNIX_IWGRP             0000020U
105/* Group executable (S_IXGRP). */
106#define SHFL_UNIX_IXGRP             0000010U
107
108/* Other readable (S_IROTH). */
109#define SHFL_UNIX_IROTH             0000004U
110/* Other writable (S_IWOTH). */
111#define SHFL_UNIX_IWOTH             0000002U
112/* Other executable (S_IXOTH). */
113#define SHFL_UNIX_IXOTH             0000001U
114
115/* Named pipe (fifo) (S_IFIFO). */
116#define SHFL_TYPE_FIFO              0010000U
117/* Character device (S_IFCHR). */
118#define SHFL_TYPE_DEV_CHAR          0020000U
119/* Directory (S_IFDIR). */
120#define SHFL_TYPE_DIRECTORY         0040000U
121/* Block device (S_IFBLK). */
122#define SHFL_TYPE_DEV_BLOCK         0060000U
123/* Regular file (S_IFREG). */
124#define SHFL_TYPE_FILE              0100000U
125/* Symbolic link (S_IFLNK). */
126#define SHFL_TYPE_SYMLINK           0120000U
127/* Socket (S_IFSOCK). */
128#define SHFL_TYPE_SOCKET            0140000U
129/* Whiteout (S_IFWHT). */
130#define SHFL_TYPE_WHITEOUT          0160000U
131/* Type mask (S_IFMT). */
132#define SHFL_TYPE_MASK              0170000U
133
134/* Checks the mode flags indicate a directory (S_ISDIR). */
135#define SHFL_IS_DIRECTORY(m)   (((m) & SHFL_TYPE_MASK) == SHFL_TYPE_DIRECTORY)
136/* Checks the mode flags indicate a symbolic link (S_ISLNK). */
137#define SHFL_IS_SYMLINK(m)     (((m) & SHFL_TYPE_MASK) == SHFL_TYPE_SYMLINK)
138
139/** The available additional information in a shfl_fsobjattr object. */
140enum shfl_fsobjattr_add {
141	/** No additional information is available / requested. */
142	SHFLFSOBJATTRADD_NOTHING = 1,
143	/**
144	 * The additional unix attributes (shfl_fsobjattr::u::unix_attr) are
145	 *  available / requested.
146	 */
147	SHFLFSOBJATTRADD_UNIX,
148	/**
149	 * The additional extended attribute size (shfl_fsobjattr::u::size) is
150	 *  available / requested.
151	 */
152	SHFLFSOBJATTRADD_EASIZE,
153	/**
154	 * The last valid item (inclusive).
155	 * The valid range is SHFLFSOBJATTRADD_NOTHING thru
156	 * SHFLFSOBJATTRADD_LAST.
157	 */
158	SHFLFSOBJATTRADD_LAST = SHFLFSOBJATTRADD_EASIZE,
159
160	/** The usual 32-bit hack. */
161	SHFLFSOBJATTRADD_32BIT_SIZE_HACK = 0x7fffffff
162};
163
164/**
165 * Additional unix Attributes, these are available when
166 * shfl_fsobjattr.additional == SHFLFSOBJATTRADD_UNIX.
167 */
168struct shfl_fsobjattr_unix {
169	/**
170	 * The user owning the filesystem object (st_uid).
171	 * This field is ~0U if not supported.
172	 */
173	u32 uid;
174
175	/**
176	 * The group the filesystem object is assigned (st_gid).
177	 * This field is ~0U if not supported.
178	 */
179	u32 gid;
180
181	/**
182	 * Number of hard links to this filesystem object (st_nlink).
183	 * This field is 1 if the filesystem doesn't support hardlinking or
184	 * the information isn't available.
185	 */
186	u32 hardlinks;
187
188	/**
189	 * The device number of the device which this filesystem object resides
190	 * on (st_dev). This field is 0 if this information is not available.
191	 */
192	u32 inode_id_device;
193
194	/**
195	 * The unique identifier (within the filesystem) of this filesystem
196	 * object (st_ino). Together with inode_id_device, this field can be
197	 * used as a OS wide unique id, when both their values are not 0.
198	 * This field is 0 if the information is not available.
199	 */
200	u64 inode_id;
201
202	/**
203	 * User flags (st_flags).
204	 * This field is 0 if this information is not available.
205	 */
206	u32 flags;
207
208	/**
209	 * The current generation number (st_gen).
210	 * This field is 0 if this information is not available.
211	 */
212	u32 generation_id;
213
214	/**
215	 * The device number of a char. or block device type object (st_rdev).
216	 * This field is 0 if the file isn't a char. or block device or when
217	 * the OS doesn't use the major+minor device idenfication scheme.
218	 */
219	u32 device;
220} __packed;
221
222/** Extended attribute size. */
223struct shfl_fsobjattr_easize {
224	/** Size of EAs. */
225	s64 cb;
226} __packed;
227
228/** Shared folder filesystem object attributes. */
229struct shfl_fsobjattr {
230	/** Mode flags (st_mode). SHFL_UNIX_*, SHFL_TYPE_*, and SHFL_DOS_*. */
231	u32 mode;
232
233	/** The additional attributes available. */
234	enum shfl_fsobjattr_add additional;
235
236	/**
237	 * Additional attributes.
238	 *
239	 * Unless explicitly specified to an API, the API can provide additional
240	 * data as it is provided by the underlying OS.
241	 */
242	union {
243		struct shfl_fsobjattr_unix unix_attr;
244		struct shfl_fsobjattr_easize size;
245	} __packed u;
246} __packed;
247VMMDEV_ASSERT_SIZE(shfl_fsobjattr, 44);
248
249struct shfl_timespec {
250	s64 ns_relative_to_unix_epoch;
251};
252
253/** Filesystem object information structure. */
254struct shfl_fsobjinfo {
255	/**
256	 * Logical size (st_size).
257	 * For normal files this is the size of the file.
258	 * For symbolic links, this is the length of the path name contained
259	 * in the symbolic link.
260	 * For other objects this fields needs to be specified.
261	 */
262	s64 size;
263
264	/** Disk allocation size (st_blocks * DEV_BSIZE). */
265	s64 allocated;
266
267	/** Time of last access (st_atime). */
268	struct shfl_timespec access_time;
269
270	/** Time of last data modification (st_mtime). */
271	struct shfl_timespec modification_time;
272
273	/**
274	 * Time of last status change (st_ctime).
275	 * If not available this is set to modification_time.
276	 */
277	struct shfl_timespec change_time;
278
279	/**
280	 * Time of file birth (st_birthtime).
281	 * If not available this is set to change_time.
282	 */
283	struct shfl_timespec birth_time;
284
285	/** Attributes. */
286	struct shfl_fsobjattr attr;
287
288} __packed;
289VMMDEV_ASSERT_SIZE(shfl_fsobjinfo, 92);
290
291/**
292 * result of an open/create request.
293 * Along with handle value the result code
294 * identifies what has happened while
295 * trying to open the object.
296 */
297enum shfl_create_result {
298	SHFL_NO_RESULT,
299	/** Specified path does not exist. */
300	SHFL_PATH_NOT_FOUND,
301	/** Path to file exists, but the last component does not. */
302	SHFL_FILE_NOT_FOUND,
303	/** File already exists and either has been opened or not. */
304	SHFL_FILE_EXISTS,
305	/** New file was created. */
306	SHFL_FILE_CREATED,
307	/** Existing file was replaced or overwritten. */
308	SHFL_FILE_REPLACED
309};
310
311/* No flags. Initialization value. */
312#define SHFL_CF_NONE                  (0x00000000)
313
314/*
315 * Only lookup the object, do not return a handle. When this is set all other
316 * flags are ignored.
317 */
318#define SHFL_CF_LOOKUP                (0x00000001)
319
320/*
321 * Open parent directory of specified object.
322 * Useful for the corresponding Windows FSD flag
323 * and for opening paths like \\dir\\*.* to search the 'dir'.
324 */
325#define SHFL_CF_OPEN_TARGET_DIRECTORY (0x00000002)
326
327/* Create/open a directory. */
328#define SHFL_CF_DIRECTORY             (0x00000004)
329
330/*
331 *  Open/create action to do if object exists
332 *  and if the object does not exists.
333 *  REPLACE file means atomically DELETE and CREATE.
334 *  OVERWRITE file means truncating the file to 0 and
335 *  setting new size.
336 *  When opening an existing directory REPLACE and OVERWRITE
337 *  actions are considered invalid, and cause returning
338 *  FILE_EXISTS with NIL handle.
339 */
340#define SHFL_CF_ACT_MASK_IF_EXISTS      (0x000000f0)
341#define SHFL_CF_ACT_MASK_IF_NEW         (0x00000f00)
342
343/* What to do if object exists. */
344#define SHFL_CF_ACT_OPEN_IF_EXISTS      (0x00000000)
345#define SHFL_CF_ACT_FAIL_IF_EXISTS      (0x00000010)
346#define SHFL_CF_ACT_REPLACE_IF_EXISTS   (0x00000020)
347#define SHFL_CF_ACT_OVERWRITE_IF_EXISTS (0x00000030)
348
349/* What to do if object does not exist. */
350#define SHFL_CF_ACT_CREATE_IF_NEW       (0x00000000)
351#define SHFL_CF_ACT_FAIL_IF_NEW         (0x00000100)
352
353/* Read/write requested access for the object. */
354#define SHFL_CF_ACCESS_MASK_RW          (0x00003000)
355
356/* No access requested. */
357#define SHFL_CF_ACCESS_NONE             (0x00000000)
358/* Read access requested. */
359#define SHFL_CF_ACCESS_READ             (0x00001000)
360/* Write access requested. */
361#define SHFL_CF_ACCESS_WRITE            (0x00002000)
362/* Read/Write access requested. */
363#define SHFL_CF_ACCESS_READWRITE	(0x00003000)
364
365/* Requested share access for the object. */
366#define SHFL_CF_ACCESS_MASK_DENY        (0x0000c000)
367
368/* Allow any access. */
369#define SHFL_CF_ACCESS_DENYNONE         (0x00000000)
370/* Do not allow read. */
371#define SHFL_CF_ACCESS_DENYREAD         (0x00004000)
372/* Do not allow write. */
373#define SHFL_CF_ACCESS_DENYWRITE        (0x00008000)
374/* Do not allow access. */
375#define SHFL_CF_ACCESS_DENYALL          (0x0000c000)
376
377/* Requested access to attributes of the object. */
378#define SHFL_CF_ACCESS_MASK_ATTR        (0x00030000)
379
380/* No access requested. */
381#define SHFL_CF_ACCESS_ATTR_NONE        (0x00000000)
382/* Read access requested. */
383#define SHFL_CF_ACCESS_ATTR_READ        (0x00010000)
384/* Write access requested. */
385#define SHFL_CF_ACCESS_ATTR_WRITE       (0x00020000)
386/* Read/Write access requested. */
387#define SHFL_CF_ACCESS_ATTR_READWRITE   (0x00030000)
388
389/*
390 * The file is opened in append mode.
391 * Ignored if SHFL_CF_ACCESS_WRITE is not set.
392 */
393#define SHFL_CF_ACCESS_APPEND           (0x00040000)
394
395/** Create parameters buffer struct for SHFL_FN_CREATE call */
396struct shfl_createparms {
397	/** Returned handle of opened object. */
398	u64 handle;
399
400	/** Returned result of the operation */
401	enum shfl_create_result result;
402
403	/** SHFL_CF_* */
404	u32 create_flags;
405
406	/**
407	 * Attributes of object to create and
408	 * returned actual attributes of opened/created object.
409	 */
410	struct shfl_fsobjinfo info;
411} __packed;
412
413/** Shared Folder directory information */
414struct shfl_dirinfo {
415	/** Full information about the object. */
416	struct shfl_fsobjinfo info;
417	/**
418	 * The length of the short field (number of UTF16 chars).
419	 * It is 16-bit for reasons of alignment.
420	 */
421	u16 short_name_len;
422	/**
423	 * The short name for 8.3 compatibility.
424	 * Empty string if not available.
425	 */
426	u16 short_name[14];
427	struct shfl_string name;
428};
429
430/** Shared folder filesystem properties. */
431struct shfl_fsproperties {
432	/**
433	 * The maximum size of a filesystem object name.
434	 * This does not include the '\\0'.
435	 */
436	u32 max_component_len;
437
438	/**
439	 * True if the filesystem is remote.
440	 * False if the filesystem is local.
441	 */
442	bool remote;
443
444	/**
445	 * True if the filesystem is case sensitive.
446	 * False if the filesystem is case insensitive.
447	 */
448	bool case_sensitive;
449
450	/**
451	 * True if the filesystem is mounted read only.
452	 * False if the filesystem is mounted read write.
453	 */
454	bool read_only;
455
456	/**
457	 * True if the filesystem can encode unicode object names.
458	 * False if it can't.
459	 */
460	bool supports_unicode;
461
462	/**
463	 * True if the filesystem is compresses.
464	 * False if it isn't or we don't know.
465	 */
466	bool compressed;
467
468	/**
469	 * True if the filesystem compresses of individual files.
470	 * False if it doesn't or we don't know.
471	 */
472	bool file_compression;
473};
474VMMDEV_ASSERT_SIZE(shfl_fsproperties, 12);
475
476struct shfl_volinfo {
477	s64 total_allocation_bytes;
478	s64 available_allocation_bytes;
479	u32 bytes_per_allocation_unit;
480	u32 bytes_per_sector;
481	u32 serial;
482	struct shfl_fsproperties properties;
483};
484
485
486/** SHFL_FN_MAP_FOLDER Parameters structure. */
487struct shfl_map_folder {
488	/**
489	 * pointer, in:
490	 * Points to struct shfl_string buffer.
491	 */
492	struct vmmdev_hgcm_function_parameter path;
493
494	/**
495	 * pointer, out: SHFLROOT (u32)
496	 * Root handle of the mapping which name is queried.
497	 */
498	struct vmmdev_hgcm_function_parameter root;
499
500	/**
501	 * pointer, in: UTF16
502	 * Path delimiter
503	 */
504	struct vmmdev_hgcm_function_parameter delimiter;
505
506	/**
507	 * pointer, in: SHFLROOT (u32)
508	 * Case senstive flag
509	 */
510	struct vmmdev_hgcm_function_parameter case_sensitive;
511
512};
513
514/* Number of parameters */
515#define SHFL_CPARMS_MAP_FOLDER (4)
516
517
518/** SHFL_FN_UNMAP_FOLDER Parameters structure. */
519struct shfl_unmap_folder {
520	/**
521	 * pointer, in: SHFLROOT (u32)
522	 * Root handle of the mapping which name is queried.
523	 */
524	struct vmmdev_hgcm_function_parameter root;
525
526};
527
528/* Number of parameters */
529#define SHFL_CPARMS_UNMAP_FOLDER (1)
530
531
532/** SHFL_FN_CREATE Parameters structure. */
533struct shfl_create {
534	/**
535	 * pointer, in: SHFLROOT (u32)
536	 * Root handle of the mapping which name is queried.
537	 */
538	struct vmmdev_hgcm_function_parameter root;
539
540	/**
541	 * pointer, in:
542	 * Points to struct shfl_string buffer.
543	 */
544	struct vmmdev_hgcm_function_parameter path;
545
546	/**
547	 * pointer, in/out:
548	 * Points to struct shfl_createparms buffer.
549	 */
550	struct vmmdev_hgcm_function_parameter parms;
551
552};
553
554/* Number of parameters */
555#define SHFL_CPARMS_CREATE (3)
556
557
558/** SHFL_FN_CLOSE Parameters structure. */
559struct shfl_close {
560	/**
561	 * pointer, in: SHFLROOT (u32)
562	 * Root handle of the mapping which name is queried.
563	 */
564	struct vmmdev_hgcm_function_parameter root;
565
566	/**
567	 * value64, in:
568	 * SHFLHANDLE (u64) of object to close.
569	 */
570	struct vmmdev_hgcm_function_parameter handle;
571
572};
573
574/* Number of parameters */
575#define SHFL_CPARMS_CLOSE (2)
576
577
578/** SHFL_FN_READ Parameters structure. */
579struct shfl_read {
580	/**
581	 * pointer, in: SHFLROOT (u32)
582	 * Root handle of the mapping which name is queried.
583	 */
584	struct vmmdev_hgcm_function_parameter root;
585
586	/**
587	 * value64, in:
588	 * SHFLHANDLE (u64) of object to read from.
589	 */
590	struct vmmdev_hgcm_function_parameter handle;
591
592	/**
593	 * value64, in:
594	 * Offset to read from.
595	 */
596	struct vmmdev_hgcm_function_parameter offset;
597
598	/**
599	 * value64, in/out:
600	 * Bytes to read/How many were read.
601	 */
602	struct vmmdev_hgcm_function_parameter cb;
603
604	/**
605	 * pointer, out:
606	 * Buffer to place data to.
607	 */
608	struct vmmdev_hgcm_function_parameter buffer;
609
610};
611
612/* Number of parameters */
613#define SHFL_CPARMS_READ (5)
614
615
616/** SHFL_FN_WRITE Parameters structure. */
617struct shfl_write {
618	/**
619	 * pointer, in: SHFLROOT (u32)
620	 * Root handle of the mapping which name is queried.
621	 */
622	struct vmmdev_hgcm_function_parameter root;
623
624	/**
625	 * value64, in:
626	 * SHFLHANDLE (u64) of object to write to.
627	 */
628	struct vmmdev_hgcm_function_parameter handle;
629
630	/**
631	 * value64, in:
632	 * Offset to write to.
633	 */
634	struct vmmdev_hgcm_function_parameter offset;
635
636	/**
637	 * value64, in/out:
638	 * Bytes to write/How many were written.
639	 */
640	struct vmmdev_hgcm_function_parameter cb;
641
642	/**
643	 * pointer, in:
644	 * Data to write.
645	 */
646	struct vmmdev_hgcm_function_parameter buffer;
647
648};
649
650/* Number of parameters */
651#define SHFL_CPARMS_WRITE (5)
652
653
654/*
655 * SHFL_FN_LIST
656 * Listing information includes variable length RTDIRENTRY[EX] structures.
657 */
658
659#define SHFL_LIST_NONE			0
660#define SHFL_LIST_RETURN_ONE		1
661
662/** SHFL_FN_LIST Parameters structure. */
663struct shfl_list {
664	/**
665	 * pointer, in: SHFLROOT (u32)
666	 * Root handle of the mapping which name is queried.
667	 */
668	struct vmmdev_hgcm_function_parameter root;
669
670	/**
671	 * value64, in:
672	 * SHFLHANDLE (u64) of object to be listed.
673	 */
674	struct vmmdev_hgcm_function_parameter handle;
675
676	/**
677	 * value32, in:
678	 * List flags SHFL_LIST_*.
679	 */
680	struct vmmdev_hgcm_function_parameter flags;
681
682	/**
683	 * value32, in/out:
684	 * Bytes to be used for listing information/How many bytes were used.
685	 */
686	struct vmmdev_hgcm_function_parameter cb;
687
688	/**
689	 * pointer, in/optional
690	 * Points to struct shfl_string buffer that specifies a search path.
691	 */
692	struct vmmdev_hgcm_function_parameter path;
693
694	/**
695	 * pointer, out:
696	 * Buffer to place listing information to. (struct shfl_dirinfo)
697	 */
698	struct vmmdev_hgcm_function_parameter buffer;
699
700	/**
701	 * value32, in/out:
702	 * Indicates a key where the listing must be resumed.
703	 * in: 0 means start from begin of object.
704	 * out: 0 means listing completed.
705	 */
706	struct vmmdev_hgcm_function_parameter resume_point;
707
708	/**
709	 * pointer, out:
710	 * Number of files returned
711	 */
712	struct vmmdev_hgcm_function_parameter file_count;
713};
714
715/* Number of parameters */
716#define SHFL_CPARMS_LIST (8)
717
718
719/** SHFL_FN_READLINK Parameters structure. */
720struct shfl_readLink {
721	/**
722	 * pointer, in: SHFLROOT (u32)
723	 * Root handle of the mapping which name is queried.
724	 */
725	struct vmmdev_hgcm_function_parameter root;
726
727	/**
728	 * pointer, in:
729	 * Points to struct shfl_string buffer.
730	 */
731	struct vmmdev_hgcm_function_parameter path;
732
733	/**
734	 * pointer, out:
735	 * Buffer to place data to.
736	 */
737	struct vmmdev_hgcm_function_parameter buffer;
738
739};
740
741/* Number of parameters */
742#define SHFL_CPARMS_READLINK (3)
743
744
745/* SHFL_FN_INFORMATION */
746
747/* Mask of Set/Get bit. */
748#define SHFL_INFO_MODE_MASK    (0x1)
749/* Get information */
750#define SHFL_INFO_GET          (0x0)
751/* Set information */
752#define SHFL_INFO_SET          (0x1)
753
754/* Get name of the object. */
755#define SHFL_INFO_NAME         (0x2)
756/* Set size of object (extend/trucate); only applies to file objects */
757#define SHFL_INFO_SIZE         (0x4)
758/* Get/Set file object info. */
759#define SHFL_INFO_FILE         (0x8)
760/* Get volume information. */
761#define SHFL_INFO_VOLUME       (0x10)
762
763/** SHFL_FN_INFORMATION Parameters structure. */
764struct shfl_information {
765	/**
766	 * pointer, in: SHFLROOT (u32)
767	 * Root handle of the mapping which name is queried.
768	 */
769	struct vmmdev_hgcm_function_parameter root;
770
771	/**
772	 * value64, in:
773	 * SHFLHANDLE (u64) of object to be listed.
774	 */
775	struct vmmdev_hgcm_function_parameter handle;
776
777	/**
778	 * value32, in:
779	 * SHFL_INFO_*
780	 */
781	struct vmmdev_hgcm_function_parameter flags;
782
783	/**
784	 * value32, in/out:
785	 * Bytes to be used for information/How many bytes were used.
786	 */
787	struct vmmdev_hgcm_function_parameter cb;
788
789	/**
790	 * pointer, in/out:
791	 * Information to be set/get (shfl_fsobjinfo or shfl_string). Do not
792	 * forget to set the shfl_fsobjinfo::attr::additional for a get
793	 * operation as well.
794	 */
795	struct vmmdev_hgcm_function_parameter info;
796
797};
798
799/* Number of parameters */
800#define SHFL_CPARMS_INFORMATION (5)
801
802
803/* SHFL_FN_REMOVE */
804
805#define SHFL_REMOVE_FILE        (0x1)
806#define SHFL_REMOVE_DIR         (0x2)
807#define SHFL_REMOVE_SYMLINK     (0x4)
808
809/** SHFL_FN_REMOVE Parameters structure. */
810struct shfl_remove {
811	/**
812	 * pointer, in: SHFLROOT (u32)
813	 * Root handle of the mapping which name is queried.
814	 */
815	struct vmmdev_hgcm_function_parameter root;
816
817	/**
818	 * pointer, in:
819	 * Points to struct shfl_string buffer.
820	 */
821	struct vmmdev_hgcm_function_parameter path;
822
823	/**
824	 * value32, in:
825	 * remove flags (file/directory)
826	 */
827	struct vmmdev_hgcm_function_parameter flags;
828
829};
830
831#define SHFL_CPARMS_REMOVE  (3)
832
833
834/* SHFL_FN_RENAME */
835
836#define SHFL_RENAME_FILE                (0x1)
837#define SHFL_RENAME_DIR                 (0x2)
838#define SHFL_RENAME_REPLACE_IF_EXISTS   (0x4)
839
840/** SHFL_FN_RENAME Parameters structure. */
841struct shfl_rename {
842	/**
843	 * pointer, in: SHFLROOT (u32)
844	 * Root handle of the mapping which name is queried.
845	 */
846	struct vmmdev_hgcm_function_parameter root;
847
848	/**
849	 * pointer, in:
850	 * Points to struct shfl_string src.
851	 */
852	struct vmmdev_hgcm_function_parameter src;
853
854	/**
855	 * pointer, in:
856	 * Points to struct shfl_string dest.
857	 */
858	struct vmmdev_hgcm_function_parameter dest;
859
860	/**
861	 * value32, in:
862	 * rename flags (file/directory)
863	 */
864	struct vmmdev_hgcm_function_parameter flags;
865
866};
867
868#define SHFL_CPARMS_RENAME  (4)
869
870
871/** SHFL_FN_SYMLINK Parameters structure. */
872struct shfl_symlink {
873	/**
874	 * pointer, in: SHFLROOT (u32)
875	 * Root handle of the mapping which name is queried.
876	 */
877	struct vmmdev_hgcm_function_parameter root;
878
879	/**
880	 * pointer, in:
881	 * Points to struct shfl_string of path for the new symlink.
882	 */
883	struct vmmdev_hgcm_function_parameter new_path;
884
885	/**
886	 * pointer, in:
887	 * Points to struct shfl_string of destination for symlink.
888	 */
889	struct vmmdev_hgcm_function_parameter old_path;
890
891	/**
892	 * pointer, out:
893	 * Information about created symlink.
894	 */
895	struct vmmdev_hgcm_function_parameter info;
896
897};
898
899#define SHFL_CPARMS_SYMLINK  (4)
900
901#endif
902