linux/fs/vboxsf/shfl_hostintf.h
<<
>>
Prefs
   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 utf8[2];
  72                u16 utf16[1];
  73                u16 ucs2[1]; /* misnomer, use 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