#include "idl_types.h" /* IDL structures for xattr file attributes this has nothing to do with RPC, we are just using our NDR/IDL infrastructure as a convenient way to store linearised information about a file in a architecture independent manner */ interface xattr { const string XATTR_DOSATTRIB_NAME = "user.DosAttrib"; const string XATTR_DOSATTRIB_ESTIMATED_SIZE = 64; /* we store basic dos attributes in a DosAttrib xattr. By using a union we can cope with new version of this structure more easily */ typedef struct { uint32 attrib; uint32 ea_size; uint64 size; uint64 alloc_size; NTTIME create_time; NTTIME change_time; } xattr_DosInfo1; typedef union { [case(1)] xattr_DosInfo1 info1; } xattr_DosInfo; typedef [public] struct { uint16 version; [switch_is(version)] xattr_DosInfo info; } xattr_DosAttrib; /* we store DOS style extended attributes in a DosEAs xattr */ const string XATTR_DOSEAS_NAME = "user.DosEAs"; typedef struct { utf8string name; DATA_BLOB value; } xattr_EA; typedef [public] struct { uint16 num_eas; [size_is(num_eas)] xattr_EA *eas; } xattr_DosEAs; /* we store stream information in this xattr structure. Then the streams themselves are stored in user.DosStream.STREAMNAME or in external files, according to the flags */ const string XATTR_DOSSTREAMS_NAME = "user.DosStreams"; const int XATTR_STREAM_FLAG_INTERNAL = 0x00000001; /* stream data is stored in attributes with the given prefix */ const string XATTR_DOSSTREAM_PREFIX = "user.DosStream."; const int XATTR_MAX_STREAM_SIZE = 0x4000; typedef struct { uint32 flags; uint64 size; uint64 alloc_size; utf8string name; } xattr_DosStream; typedef [public] struct { uint32 num_streams; [size_is(num_streams)] xattr_DosStream *streams; } xattr_DosStreams; }