#include "idl_types.h" import "server_id.idl"; import "security.idl"; import "file_id.idl"; import "smb2_lease_struct.idl"; import "misc.idl"; [ pointer_default(unique) ] interface open_files { typedef [public,flag(NDR_PAHEX)] struct { GUID client_guid; smb2_lease_key lease_key; smb2_lease_state current_state; /* * 'breaking' indicates that we're waiting * for a lease break ack from the client * and breaking_to_requested and breaking_to_required * have a meaning. * * breaking_to_requested is the value already sent to * the client, the client needs to ack to this (or less). * * breaking_to_required is the internal value that needs to * be reached before we can reset breaking = false, this * may requires multiple roundtrips to the client, e.g. * when the lease broken to a more reduced value, while * the lease break is still in progress. * * The following can be assumed (if breaking == true): * * current_state > breaking_to_requested >= breaking_to_required */ boolean8 breaking; smb2_lease_state breaking_to_requested; smb2_lease_state breaking_to_required; uint16 lease_version; uint16 epoch; } share_mode_lease; typedef [public] struct { server_id pid; hyper op_mid; uint16 op_type; uint32 lease_idx; uint32 access_mask; uint32 share_access; uint32 private_options; timeval time; file_id id; udlong share_file_id; uint32 uid; uint16 flags; uint32 name_hash; /* * In-memory flag indicating a non-existing pid. We don't want * to store this share_mode_entry on disk. */ [skip] boolean8 stale; [skip] share_mode_lease *lease; } share_mode_entry; typedef [public] struct { uint32 name_hash; security_token *delete_nt_token; security_unix_token *delete_token; } delete_token; typedef [public] struct { [string,charset(UTF8)] char *servicepath; [string,charset(UTF8)] char *base_name; [string,charset(UTF8)] char *stream_name; uint32 num_share_modes; [size_is(num_share_modes)] share_mode_entry share_modes[]; uint32 num_leases; [size_is(num_leases)] share_mode_lease leases[]; uint32 num_delete_tokens; [size_is(num_delete_tokens)] delete_token delete_tokens[]; timespec old_write_time; timespec changed_write_time; [skip] boolean8 fresh; [skip] boolean8 modified; [ignore] db_record *record; } share_mode_data; /* these are 0x30 (48) characters */ const string VFS_DEFAULT_DURABLE_COOKIE_MAGIC = "VFS_DEFAULT_DURABLE_COOKIE_MAGIC "; const uint32 VFS_DEFAULT_DURABLE_COOKIE_VERSION = 0; /* this corresponds to struct stat_ex (SMB_STRUCT_STAT) */ typedef struct { hyper st_ex_dev; hyper st_ex_ino; hyper st_ex_mode; hyper st_ex_nlink; hyper st_ex_uid; hyper st_ex_gid; hyper st_ex_rdev; hyper st_ex_size; timespec st_ex_atime; timespec st_ex_mtime; timespec st_ex_ctime; timespec st_ex_btime; boolean8 st_ex_calculated_birthtime; hyper st_ex_blksize; hyper st_ex_blocks; uint32 st_ex_flags; uint32 st_ex_mask; } vfs_default_durable_stat; typedef [public] struct { [value(VFS_DEFAULT_DURABLE_COOKIE_MAGIC),charset(DOS)] uint8 magic[0x30]; [value(VFS_DEFAULT_DURABLE_COOKIE_VERSION)] uint32 version; boolean8 allow_reconnect; file_id id; [string,charset(UTF8)] char *servicepath; [string,charset(UTF8)] char *base_name; hyper initial_allocation_size; hyper position_information; boolean8 update_write_time_triggered; boolean8 update_write_time_on_close; boolean8 write_time_forced; timespec close_write_time; vfs_default_durable_stat stat_info; } vfs_default_durable_cookie; }