summaryrefslogtreecommitdiff
path: root/source4/include/smb_interfaces.h
diff options
context:
space:
mode:
Diffstat (limited to 'source4/include/smb_interfaces.h')
-rw-r--r--source4/include/smb_interfaces.h1898
1 files changed, 1898 insertions, 0 deletions
diff --git a/source4/include/smb_interfaces.h b/source4/include/smb_interfaces.h
new file mode 100644
index 0000000000..70cff11395
--- /dev/null
+++ b/source4/include/smb_interfaces.h
@@ -0,0 +1,1898 @@
+/*
+ Unix SMB/CIFS implementation.
+ SMB request interface structures
+ Copyright (C) Andrew Tridgell 2003
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+
+typedef SMB_BIG_UINT large_t;
+
+/* Globally Unique ID */
+#define GUID_SIZE 16
+typedef struct guid_info
+{
+ uint8 info[GUID_SIZE];
+} GUID;
+
+/* 64 bit time (100usec) 1601 - cifs6.txt, section 3.5, page 30 */
+typedef struct nttime_info
+{
+ uint32 low;
+ uint32 high;
+} NTTIME;
+
+
+/* this structure is just a wrapper for a string, the only reason we
+ bother with this is that it allows us to check the length provided
+ on the wire in testsuite test code to ensure that we are
+ terminating names in the same way that win2003 is. The *ONLY* time
+ you should ever look at the 'private_length' field in this
+ structure is inside compliance test code, in all cases just use the
+ null terminated char* as the definitive definition of the
+ string
+
+ also note that this structure is only used in packets where there
+ is an explicit length provided on the wire (hence the name). That
+ length is placed in 'private_length'. For packets where the length
+ is always determined by NULL or packet termination a normal char*
+ is used.
+ */
+typedef struct {
+ uint32 private_length;
+ const char *s;
+} WIRE_STRING;
+
+
+/*
+ this header defines the structures and unions used between the SMB
+ parser and the backends.
+*/
+
+/* struct used for SMBlseek call */
+struct smb_seek {
+ struct {
+ uint16 fnum;
+ uint16 mode;
+ int32 offset; /* signed */
+ } in;
+ struct {
+ uint32 offset;
+ } out;
+};
+
+
+/* struct used in unlink() call */
+struct smb_unlink {
+ struct {
+ const char *pattern;
+ uint16 attrib;
+ } in;
+};
+
+
+/* struct used in chkpath() call */
+struct smb_chkpath {
+ struct {
+ const char *path;
+ } in;
+};
+
+enum mkdir_level {RAW_MKDIR_GENERIC, RAW_MKDIR_MKDIR, RAW_MKDIR_T2MKDIR};
+
+/* union used in mkdir() call */
+union smb_mkdir {
+ /* generic level */
+ struct {
+ enum mkdir_level level;
+ } generic;
+
+ struct {
+ enum mkdir_level level;
+ struct {
+ const char *path;
+ } in;
+ } mkdir;
+
+ struct {
+ enum mkdir_level level;
+ struct {
+ const char *path;
+ uint_t num_eas;
+ struct ea_struct *eas;
+ } in;
+ } t2mkdir;
+};
+
+/* struct used in rmdir() call */
+struct smb_rmdir {
+ struct {
+ const char *path;
+ } in;
+};
+
+/* struct used in rename() call */
+struct smb_rename {
+ struct {
+ const char *pattern1;
+ const char *pattern2;
+ uint16 attrib;
+ } in;
+};
+
+enum tcon_level {RAW_TCON_TCON, RAW_TCON_TCONX};
+
+/* union used in tree connect call */
+union smb_tcon {
+ /* generic interface */
+ struct {
+ enum tcon_level level;
+ } generic;
+
+ /* SMBtcon interface */
+ struct {
+ enum tcon_level level;
+
+ struct {
+ const char *service;
+ const char *password;
+ const char *dev;
+ } in;
+ struct {
+ uint16 max_xmit;
+ uint16 cnum;
+ } out;
+ } tcon;
+
+ /* SMBtconX interface */
+ struct {
+ enum tcon_level level;
+
+ struct {
+ uint16 flags;
+ DATA_BLOB password;
+ const char *path;
+ const char *device;
+ } in;
+ struct {
+ uint16 options;
+ char *dev_type;
+ char *fs_type;
+ uint16 cnum;
+ } out;
+ } tconx;
+};
+
+
+enum sesssetup_level {RAW_SESSSETUP_GENERIC, RAW_SESSSETUP_OLD, RAW_SESSSETUP_NT1, RAW_SESSSETUP_SPNEGO};
+
+/* union used in session_setup call */
+union smb_sesssetup {
+
+ /* generic interface - used for auto selecting based on negotiated
+ protocol options */
+ struct {
+ enum sesssetup_level level;
+
+ struct {
+ uint32 sesskey;
+ uint32 capabilities;
+ const char *password;
+ const char *user;
+ const char *domain;
+ } in;
+ struct {
+ uint16 vuid;
+ char *os;
+ char *lanman;
+ char *domain;
+ } out;
+ } generic;
+
+ /* the pre-NT1 interface */
+ struct {
+ enum sesssetup_level level;
+
+ struct {
+ uint16 bufsize;
+ uint16 mpx_max;
+ uint16 vc_num;
+ uint32 sesskey;
+ DATA_BLOB password;
+ const char *user;
+ const char *domain;
+ const char *os;
+ const char *lanman;
+ } in;
+ struct {
+ uint16 action;
+ uint16 vuid;
+ char *os;
+ char *lanman;
+ char *domain;
+ } out;
+ } old;
+
+ /* the NT1 interface */
+ struct {
+ enum sesssetup_level level;
+
+ struct {
+ uint16 bufsize;
+ uint16 mpx_max;
+ uint16 vc_num;
+ uint32 sesskey;
+ uint32 capabilities;
+ DATA_BLOB password1;
+ DATA_BLOB password2;
+ const char *user;
+ const char *domain;
+ const char *os;
+ const char *lanman;
+ } in;
+ struct {
+ uint16 action;
+ uint16 vuid;
+ char *os;
+ char *lanman;
+ char *domain;
+ } out;
+ } nt1;
+
+
+ /* the SPNEGO interface */
+ struct {
+ enum sesssetup_level level;
+
+ struct {
+ uint16 bufsize;
+ uint16 mpx_max;
+ uint16 vc_num;
+ uint32 sesskey;
+ uint32 capabilities;
+ DATA_BLOB secblob;
+ const char *os;
+ const char *lanman;
+ const char *domain;
+ } in;
+ struct {
+ uint16 action;
+ DATA_BLOB secblob;
+ char *os;
+ char *lanman;
+ char *domain;
+ uint16 vuid;
+ } out;
+ } spnego;
+};
+
+/* Note that the specified enum values are identical to the actual info-levels used
+ * on the wire.
+ */
+enum fileinfo_level {RAW_FILEINFO_GENERIC = 0xF000,
+ RAW_FILEINFO_GETATTR, /* SMBgetatr */
+ RAW_FILEINFO_GETATTRE, /* SMBgetattrE */
+ RAW_FILEINFO_STANDARD = SMB_QFILEINFO_STANDARD,
+ RAW_FILEINFO_EA_SIZE = SMB_QFILEINFO_EA_SIZE,
+ RAW_FILEINFO_ALL_EAS = SMB_QFILEINFO_ALL_EAS,
+ RAW_FILEINFO_IS_NAME_VALID = SMB_QFILEINFO_IS_NAME_VALID,
+ RAW_FILEINFO_BASIC_INFO = SMB_QFILEINFO_BASIC_INFO,
+ RAW_FILEINFO_STANDARD_INFO = SMB_QFILEINFO_STANDARD_INFO,
+ RAW_FILEINFO_EA_INFO = SMB_QFILEINFO_EA_INFO,
+ RAW_FILEINFO_NAME_INFO = SMB_QFILEINFO_NAME_INFO,
+ RAW_FILEINFO_ALL_INFO = SMB_QFILEINFO_ALL_INFO,
+ RAW_FILEINFO_ALT_NAME_INFO = SMB_QFILEINFO_ALT_NAME_INFO,
+ RAW_FILEINFO_STREAM_INFO = SMB_QFILEINFO_STREAM_INFO,
+ RAW_FILEINFO_COMPRESSION_INFO = SMB_QFILEINFO_COMPRESSION_INFO,
+ RAW_FILEINFO_UNIX_BASIC = SMB_QFILEINFO_UNIX_BASIC,
+ RAW_FILEINFO_UNIX_LINK = SMB_QFILEINFO_UNIX_LINK,
+ RAW_FILEINFO_BASIC_INFORMATION = SMB_QFILEINFO_BASIC_INFORMATION,
+ RAW_FILEINFO_STANDARD_INFORMATION = SMB_QFILEINFO_STANDARD_INFORMATION,
+ RAW_FILEINFO_INTERNAL_INFORMATION = SMB_QFILEINFO_INTERNAL_INFORMATION,
+ RAW_FILEINFO_EA_INFORMATION = SMB_QFILEINFO_EA_INFORMATION,
+ RAW_FILEINFO_ACCESS_INFORMATION = SMB_QFILEINFO_ACCESS_INFORMATION,
+ RAW_FILEINFO_NAME_INFORMATION = SMB_QFILEINFO_NAME_INFORMATION,
+ RAW_FILEINFO_POSITION_INFORMATION = SMB_QFILEINFO_POSITION_INFORMATION,
+ RAW_FILEINFO_MODE_INFORMATION = SMB_QFILEINFO_MODE_INFORMATION,
+ RAW_FILEINFO_ALIGNMENT_INFORMATION = SMB_QFILEINFO_ALIGNMENT_INFORMATION,
+ RAW_FILEINFO_ALL_INFORMATION = SMB_QFILEINFO_ALL_INFORMATION,
+ RAW_FILEINFO_ALT_NAME_INFORMATION = SMB_QFILEINFO_ALT_NAME_INFORMATION,
+ RAW_FILEINFO_STREAM_INFORMATION = SMB_QFILEINFO_STREAM_INFORMATION,
+ RAW_FILEINFO_COMPRESSION_INFORMATION = SMB_QFILEINFO_COMPRESSION_INFORMATION,
+ RAW_FILEINFO_NETWORK_OPEN_INFORMATION = SMB_QFILEINFO_NETWORK_OPEN_INFORMATION,
+ RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION = SMB_QFILEINFO_ATTRIBUTE_TAG_INFORMATION
+};
+
+
+/* union used in qfileinfo() and qpathinfo() backend calls */
+union smb_fileinfo {
+ /* generic interface:
+ * matches RAW_FILEINFO_GENERIC */
+ struct {
+ enum fileinfo_level level;
+
+ /* each level can be called on either a pathname or a
+ * filename, in either case the return format is
+ * identical */
+ union smb_fileinfo_in {
+ const char *fname;
+ uint16 fnum;
+ } in;
+
+ struct {
+ uint16 attrib;
+ uint32 ea_size;
+ uint_t num_eas;
+ struct ea_struct {
+ uint8 flags;
+ WIRE_STRING name;
+ DATA_BLOB value;
+ } *eas;
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ uint32 ex_attrib;
+ large_t alloc_size;
+ large_t size;
+ uint32 nlink;
+ WIRE_STRING fname;
+ WIRE_STRING alt_fname;
+ uint8 delete_pending;
+ uint8 directory;
+ large_t compressed_size;
+ uint16 format;
+ uint8 unit_shift;
+ uint8 chunk_shift;
+ uint8 cluster_shift;
+ uint32 device;
+ uint32 inode;
+ uint32 access_flags; /* seen 0x001f01ff from w2k3 */
+ large_t position;
+ uint32 mode;
+ uint32 alignment_requirement;
+ uint32 reparse_tag;
+ uint_t num_streams;
+ struct stream_struct {
+ large_t size;
+ large_t alloc_size;
+ WIRE_STRING stream_name;
+ } *streams;
+ } out;
+ } generic;
+
+
+ /* SMBgetatr interface:
+ * matches RAW_FILEINFO_GETATTR */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ uint16 attrib;
+ uint32 size;
+ time_t write_time;
+ } out;
+ } getattr;
+
+ /* SMBgetattrE interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ time_t create_time;
+ time_t access_time;
+ time_t write_time;
+ uint32 size;
+ uint32 alloc_size;
+ uint16 attrib;
+ } out;
+ } getattre;
+
+ /* trans2 RAW_FILEINFO_STANDARD interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ time_t create_time;
+ time_t access_time;
+ time_t write_time;
+ uint32 size;
+ uint32 alloc_size;
+ uint16 attrib;
+ } out;
+ } standard;
+
+ /* trans2 RAW_FILEINFO_EA_SIZE interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ time_t create_time;
+ time_t access_time;
+ time_t write_time;
+ uint32 size;
+ uint32 alloc_size;
+ uint16 attrib;
+ uint32 ea_size;
+ } out;
+ } ea_size;
+
+ /* trans2 RAW_FILEINFO_ALL_EAS interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ /* the ea_size is implied by the list */
+ uint_t num_eas;
+ struct ea_struct *eas;
+ } out;
+ } all_eas;
+
+ /* trans2 qpathinfo RAW_FILEINFO_IS_NAME_VALID interface
+ only valid for a QPATHNAME call - no returned data */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+ } is_name_valid;
+
+ /* RAW_FILEINFO_BASIC_INFO and RAW_FILEINFO_BASIC_INFORMATION interfaces */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ uint32 attrib;
+ } out;
+ } basic_info;
+
+
+ /* RAW_FILEINFO_STANDARD_INFO and RAW_FILEINFO_STANDARD_INFORMATION interfaces */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ large_t alloc_size;
+ large_t size;
+ uint32 nlink;
+ BOOL delete_pending;
+ BOOL directory;
+ } out;
+ } standard_info;
+
+ /* RAW_FILEINFO_EA_INFO and RAW_FILEINFO_EA_INFORMATION interfaces */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ uint32 ea_size;
+ } out;
+ } ea_info;
+
+ /* RAW_FILEINFO_NAME_INFO and RAW_FILEINFO_NAME_INFORMATION interfaces */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ WIRE_STRING fname;
+ } out;
+ } name_info;
+
+ /* RAW_FILEINFO_ALL_INFO and RAW_FILEINFO_ALL_INFORMATION interfaces */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ uint32 attrib;
+ large_t alloc_size;
+ large_t size;
+ uint32 nlink;
+ uint8 delete_pending;
+ uint8 directory;
+ uint32 ea_size;
+ WIRE_STRING fname;
+ } out;
+ } all_info;
+
+ /* RAW_FILEINFO_ALT_NAME_INFO and RAW_FILEINFO_ALT_NAME_INFORMATION interfaces */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ WIRE_STRING fname;
+ } out;
+ } alt_name_info;
+
+ /* RAW_FILEINFO_STREAM_INFO and RAW_FILEINFO_STREAM_INFORMATION interfaces */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ uint_t num_streams;
+ struct stream_struct *streams;
+ } out;
+ } stream_info;
+
+ /* RAW_FILEINFO_COMPRESSION_INFO and RAW_FILEINFO_COMPRESSION_INFORMATION interfaces */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ large_t compressed_size;
+ uint16 format;
+ uint8 unit_shift;
+ uint8 chunk_shift;
+ uint8 cluster_shift;
+ } out;
+ } compression_info;
+
+ /* RAW_FILEINFO_UNIX_BASIC interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ large_t end_of_file;
+ large_t num_bytes;
+ NTTIME status_change_time;
+ NTTIME access_time;
+ NTTIME change_time;
+ large_t uid;
+ large_t gid;
+ uint32 file_type;
+ large_t dev_major;
+ large_t dev_minor;
+ large_t unique_id;
+ large_t permissions;
+ large_t nlink;
+ } out;
+ } unix_basic_info;
+
+ /* RAW_FILEINFO_UNIX_LINK interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ WIRE_STRING link_dest;
+ } out;
+ } unix_link_info;
+
+ /* RAW_FILEINFO_INTERNAL_INFORMATION interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ /* REWRITE: these are very uncertain - we need
+ * to look at this interface */
+ uint32 device;
+ uint32 inode;
+ } out;
+ } internal_information;
+
+ /* RAW_FILEINFO_ACCESS_INFORMATION interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ uint32 access_flags; /* seen 0x001f01ff from w2k3 */
+ } out;
+ } access_information;
+
+ /* RAW_FILEINFO_POSITION_INFORMATION interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ large_t position;
+ } out;
+ } position_information;
+
+ /* RAW_FILEINFO_MODE_INFORMATION interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ uint32 mode;
+ } out;
+ } mode_information;
+
+ /* RAW_FILEINFO_ALIGNMENT_INFORMATION interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ uint32 alignment_requirement;
+ } out;
+ } alignment_information;
+
+ /* RAW_FILEINFO_NETWORK_OPEN_INFORMATION interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ large_t alloc_size;
+ large_t size;
+ uint32 attrib;
+ } out;
+ } network_open_information;
+
+
+ /* RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION interface */
+ struct {
+ enum fileinfo_level level;
+ union smb_fileinfo_in in;
+
+ struct {
+ uint32 attrib;
+ uint32 reparse_tag;
+ } out;
+ } attribute_tag_information;
+};
+
+
+enum setfileinfo_level {
+ RAW_SFILEINFO_GENERIC = 0xF000,
+ RAW_SFILEINFO_SETATTR, /* SMBsetatr */
+ RAW_SFILEINFO_SETATTRE, /* SMBsetattrE */
+ RAW_SFILEINFO_STANDARD = SMB_SFILEINFO_STANDARD,
+ RAW_SFILEINFO_EA_SET = SMB_SFILEINFO_EA_SET,
+ RAW_SFILEINFO_BASIC_INFO = SMB_SFILEINFO_BASIC_INFO,
+ RAW_SFILEINFO_DISPOSITION_INFO = SMB_SFILEINFO_DISPOSITION_INFO,
+ RAW_SFILEINFO_ALLOCATION_INFO = SMB_SFILEINFO_ALLOCATION_INFO,
+ RAW_SFILEINFO_END_OF_FILE_INFO = SMB_SFILEINFO_END_OF_FILE_INFO,
+ RAW_SFILEINFO_UNIX_BASIC = SMB_SFILEINFO_UNIX_BASIC,
+ RAW_SFILEINFO_UNIX_LINK = SMB_SFILEINFO_UNIX_LINK,
+ RAW_SFILEINFO_UNIX_HLINK = SMB_SFILEINFO_UNIX_HLINK,
+ RAW_SFILEINFO_BASIC_INFORMATION = SMB_SFILEINFO_BASIC_INFORMATION,
+ RAW_SFILEINFO_RENAME_INFORMATION = SMB_SFILEINFO_RENAME_INFORMATION,
+ RAW_SFILEINFO_DISPOSITION_INFORMATION = SMB_SFILEINFO_DISPOSITION_INFORMATION,
+ RAW_SFILEINFO_POSITION_INFORMATION = SMB_SFILEINFO_POSITION_INFORMATION,
+ RAW_SFILEINFO_MODE_INFORMATION = SMB_SFILEINFO_MODE_INFORMATION,
+ RAW_SFILEINFO_ALLOCATION_INFORMATION = SMB_SFILEINFO_ALLOCATION_INFORMATION,
+ RAW_SFILEINFO_END_OF_FILE_INFORMATION = SMB_SFILEINFO_END_OF_FILE_INFORMATION,
+ RAW_SFILEINFO_1023 = SMB_SFILEINFO_1023,
+ RAW_SFILEINFO_1025 = SMB_SFILEINFO_1025,
+ RAW_SFILEINFO_1029 = SMB_SFILEINFO_1029,
+ RAW_SFILEINFO_1032 = SMB_SFILEINFO_1032,
+ RAW_SFILEINFO_1039 = SMB_SFILEINFO_1039,
+ RAW_SFILEINFO_1040 = SMB_SFILEINFO_1040
+};
+
+/* union used in setfileinfo() and setpathinfo() calls */
+union smb_setfileinfo {
+ /* generic interface */
+ struct {
+ enum setfileinfo_level level;
+
+ /* we are combining setfileinfo and setpathinfo into one
+ interface */
+ union setfileinfo_file {
+ const char *fname;
+ uint16 fnum;
+ } file;
+ } generic;
+
+ /* RAW_SFILEINFO_SETATTR (SMBsetatr) interface - only via setpathinfo() */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+ struct {
+ uint16 attrib;
+ time_t write_time;
+ } in;
+ } setattr;
+
+ /* RAW_SFILEINFO_SETATTRE (SMBsetattrE) interface - only via setfileinfo() */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+
+ struct {
+ time_t create_time;
+ time_t access_time;
+ time_t write_time;
+ } in;
+ } setattre;
+
+
+ /* RAW_SFILEINFO_STANDARD interface */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+ struct {
+ time_t create_time;
+ time_t access_time;
+ time_t write_time;
+ /* notice that size, alloc_size and attrib are not settable,
+ unlike the corresponding qfileinfo level */
+ } in;
+ } standard;
+
+ /* RAW_SFILEINFO_EA_SET interface */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+ struct {
+ struct ea_struct ea;
+ } in;
+ } ea_set;
+
+ /* RAW_SFILEINFO_BASIC_INFO and
+ RAW_SFILEINFO_BASIC_INFORMATION interfaces */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+
+ struct {
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ uint32 attrib;
+ } in;
+ } basic_info;
+
+ /* RAW_SFILEINFO_DISPOSITION_INFO and
+ RAW_SFILEINFO_DISPOSITION_INFORMATION interfaces */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+
+ struct {
+ BOOL delete_on_close;
+ } in;
+ } disposition_info;
+
+ /* RAW_SFILEINFO_ALLOCATION_INFO and
+ RAW_SFILEINFO_ALLOCATION_INFORMATION interfaces */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+
+ struct {
+ /* w2k3 rounds this up to nearest 4096 */
+ large_t alloc_size;
+ } in;
+ } allocation_info;
+
+ /* RAW_SFILEINFO_END_OF_FILE_INFO and
+ RAW_SFILEINFO_END_OF_FILE_INFORMATION interfaces */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+
+ struct {
+ large_t size;
+ } in;
+ } end_of_file_info;
+
+ /* RAW_SFILEINFO_RENAME_INFORMATION interface */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+
+ struct {
+ uint8 overwrite;
+ uint32 root_fid;
+ const char *new_name;
+ } in;
+ } rename_information;
+
+ /* RAW_SFILEINFO_POSITION_INFORMATION interface */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+
+ struct {
+ large_t position;
+ } in;
+ } position_information;
+
+ /* RAW_SFILEINFO_MODE_INFORMATION interface */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+
+ struct {
+ /* valid values seem to be 0, 2, 4 and 6 */
+ uint32 mode;
+ } in;
+ } mode_information;
+
+
+
+ /* RAW_SFILEINFO_UNIX_BASIC interface */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+ struct {
+ uint32 mode; /* yuck - this field remains to fix compile of libcli/clifile.c */
+ large_t end_of_file;
+ large_t num_bytes;
+ NTTIME status_change_time;
+ NTTIME access_time;
+ NTTIME change_time;
+ large_t uid;
+ large_t gid;
+ uint32 file_type;
+ large_t dev_major;
+ large_t dev_minor;
+ large_t unique_id;
+ large_t permissions;
+ large_t nlink;
+ } in;
+ } unix_basic;
+
+ /* RAW_SFILEINFO_UNIX_LINK, RAW_SFILEINFO_UNIX_HLINK interface */
+ struct {
+ enum setfileinfo_level level;
+ union setfileinfo_file file;
+ struct {
+ const char *link_dest;
+ } in;
+ } unix_link, unix_hlink;
+};
+
+
+enum fsinfo_level {RAW_QFS_GENERIC = 0xF000,
+ RAW_QFS_DSKATTR, /* SMBdskattr */
+ RAW_QFS_ALLOCATION = SMB_QFS_ALLOCATION,
+ RAW_QFS_VOLUME = SMB_QFS_VOLUME,
+ RAW_QFS_VOLUME_INFO = SMB_QFS_VOLUME_INFO,
+ RAW_QFS_SIZE_INFO = SMB_QFS_SIZE_INFO,
+ RAW_QFS_DEVICE_INFO = SMB_QFS_DEVICE_INFO,
+ RAW_QFS_ATTRIBUTE_INFO = SMB_QFS_ATTRIBUTE_INFO,
+ RAW_QFS_UNIX_INFO = SMB_QFS_UNIX_INFO,
+ RAW_QFS_VOLUME_INFORMATION = SMB_QFS_VOLUME_INFORMATION,
+ RAW_QFS_SIZE_INFORMATION = SMB_QFS_SIZE_INFORMATION,
+ RAW_QFS_DEVICE_INFORMATION = SMB_QFS_DEVICE_INFORMATION,
+ RAW_QFS_ATTRIBUTE_INFORMATION = SMB_QFS_ATTRIBUTE_INFORMATION,
+ RAW_QFS_QUOTA_INFORMATION = SMB_QFS_QUOTA_INFORMATION,
+ RAW_QFS_FULL_SIZE_INFORMATION = SMB_QFS_FULL_SIZE_INFORMATION,
+ RAW_QFS_OBJECTID_INFORMATION = SMB_QFS_OBJECTID_INFORMATION};
+
+
+/* union for fsinfo() backend call. Note that there are no in
+ structures, as this call only contains out parameters */
+union smb_fsinfo {
+ /* generic interface */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ uint32 block_size;
+ large_t blocks_total;
+ large_t blocks_free;
+ uint32 fs_id;
+ NTTIME create_time;
+ uint32 serial_number;
+ uint32 fs_attr;
+ uint32 max_file_component_length;
+ uint32 device_type;
+ uint32 device_characteristics;
+ large_t quota_soft;
+ large_t quota_hard;
+ large_t quota_flags;
+ GUID guid;
+ char *volume_name;
+ char *fs_type;
+ } out;
+ } generic;
+
+ /* SMBdskattr interface */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ uint16 units_total;
+ uint16 blocks_per_unit;
+ uint16 block_size;
+ uint16 units_free;
+ } out;
+ } dskattr;
+
+ /* trans2 RAW_QFS_ALLOCATION interface */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ uint32 fs_id;
+ uint32 sectors_per_unit;
+ uint32 total_alloc_units;
+ uint32 avail_alloc_units;
+ uint16 bytes_per_sector;
+ } out;
+ } allocation;
+
+ /* TRANS2 RAW_QFS_VOLUME interface */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ uint32 serial_number;
+ WIRE_STRING volume_name;
+ } out;
+ } volume;
+
+ /* TRANS2 RAW_QFS_VOLUME_INFO and RAW_QFS_VOLUME_INFORMATION interfaces */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ NTTIME create_time;
+ uint32 serial_number;
+ WIRE_STRING volume_name;
+ } out;
+ } volume_info;
+
+ /* trans2 RAW_QFS_SIZE_INFO and RAW_QFS_SIZE_INFORMATION interfaces */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ large_t total_alloc_units;
+ large_t avail_alloc_units; /* maps to call_avail_alloc_units */
+ uint32 sectors_per_unit;
+ uint32 bytes_per_sector;
+ } out;
+ } size_info;
+
+ /* TRANS2 RAW_QFS_DEVICE_INFO and RAW_QFS_DEVICE_INFORMATION interfaces */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ uint32 device_type;
+ uint32 characteristics;
+ } out;
+ } device_info;
+
+
+ /* TRANS2 RAW_QFS_ATTRIBUTE_INFO and RAW_QFS_ATTRIBUTE_INFORMATION interfaces */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ uint32 fs_attr;
+ uint32 max_file_component_length;
+ WIRE_STRING fs_type;
+ } out;
+ } attribute_info;
+
+
+ /* TRANS2 RAW_QFS_UNIX_INFO interface */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ uint16 major_version;
+ uint16 minor_version;
+ large_t capability;
+ } out;
+ } unix_info;
+
+ /* trans2 RAW_QFS_QUOTA_INFORMATION interface */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ large_t unknown[3];
+ large_t quota_soft;
+ large_t quota_hard;
+ large_t quota_flags;
+ } out;
+ } quota_information;
+
+ /* trans2 RAW_QFS_FULL_SIZE_INFORMATION interface */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ large_t total_alloc_units;
+ large_t call_avail_alloc_units;
+ large_t actual_avail_alloc_units;
+ uint32 sectors_per_unit;
+ uint32 bytes_per_sector;
+ } out;
+ } full_size_information;
+
+ /* trans2 RAW_QFS_OBJECTID_INFORMATION interface */
+ struct {
+ enum fsinfo_level level;
+
+ struct {
+ GUID guid;
+ large_t unknown[6];
+ } out;
+ } objectid_information;
+};
+
+
+
+enum open_level {RAW_OPEN_OPEN, RAW_OPEN_OPENX,
+ RAW_OPEN_MKNEW, RAW_OPEN_CTEMP, RAW_OPEN_SPLOPEN,
+ RAW_OPEN_NTCREATEX, RAW_OPEN_T2OPEN};
+
+/* the generic interface is defined to be equal to the NTCREATEX interface */
+#define RAW_OPEN_GENERIC RAW_OPEN_NTCREATEX
+
+/* union for open() backend call */
+union smb_open {
+ /* SMBNTCreateX interface */
+ struct {
+ enum open_level level;
+
+ struct {
+ uint32 flags;
+ uint32 root_fid;
+ uint32 access_mask;
+ large_t alloc_size;
+ uint32 file_attr;
+ uint32 share_access;
+ uint32 open_disposition;
+ uint32 create_options;
+ uint32 impersonation;
+ uint8 security_flags;
+ const char *fname;
+ } in;
+
+ struct {
+ uint8 oplock_level;
+ uint16 fnum;
+ uint32 create_action;
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ uint32 attrib;
+ large_t alloc_size;
+ large_t size;
+ uint16 file_type;
+ uint16 ipc_state;
+ uint8 is_directory;
+ } out;
+ } ntcreatex, generic;
+
+ /* TRANS2_OPEN interface */
+ struct {
+ enum open_level level;
+
+ struct {
+ uint16 flags;
+ uint16 open_mode;
+ uint16 file_attrs;
+ time_t write_time;
+ uint16 open_func;
+ uint32 size;
+ uint32 timeout;
+ const char *fname;
+ uint_t num_eas;
+ struct ea_struct *eas;
+ } in;
+
+ struct {
+ uint16 fnum;
+ uint16 attrib;
+ time_t write_time;
+ uint32 size;
+ uint16 access;
+ uint16 ftype;
+ uint16 devstate;
+ uint16 action;
+ uint32 unknown;
+ } out;
+ } t2open;
+
+ /* SMBopen interface */
+ struct {
+ enum open_level level;
+
+ struct {
+ uint16 flags;
+ uint16 search_attrs;
+ const char *fname;
+ } in;
+ struct {
+ uint16 fnum;
+ uint16 attrib;
+ time_t write_time;
+ uint32 size;
+ uint16 rmode;
+ } out;
+ } open;
+
+ /* SMBopenX interface */
+ struct {
+ enum open_level level;
+
+ struct {
+ uint16 flags;
+ uint16 open_mode;
+ uint16 search_attrs; /* not honoured by win2003 */
+ uint16 file_attrs;
+ time_t write_time; /* not honoured by win2003 */
+ uint16 open_func;
+ uint32 size; /* note that this sets the
+ initial file size, not
+ just allocation size */
+ uint32 timeout; /* not honoured by win2003 */
+ const char *fname;
+ } in;
+ struct {
+ uint16 fnum;
+ uint16 attrib;
+ time_t write_time;
+ uint32 size;
+ uint16 access;
+ uint16 ftype;
+ uint16 devstate;
+ uint16 action;
+ uint32 unique_fid;
+ uint32 access_mask;
+ uint32 unknown;
+ } out;
+ } openx;
+
+ /* SMBmknew interface */
+ struct {
+ enum open_level level;
+
+ struct {
+ uint16 attrib;
+ time_t write_time;
+ const char *fname;
+ } in;
+ struct {
+ uint16 fnum;
+ } out;
+ } mknew;
+
+ /* SMBctemp interface */
+ struct {
+ enum open_level level;
+
+ struct {
+ uint16 attrib;
+ time_t write_time;
+ const char *directory;
+ } in;
+ struct {
+ uint16 fnum;
+ /* temp name, relative to directory */
+ char *name;
+ } out;
+ } ctemp;
+
+ /* SMBsplopen interface */
+ struct {
+ enum open_level level;
+
+ struct {
+ uint16 setup_length;
+ uint16 mode;
+ const char *ident;
+ } in;
+ struct {
+ uint16 fnum;
+ } out;
+ } splopen;
+};
+
+
+
+enum read_level {RAW_READ_GENERIC, RAW_READ_READBRAW, RAW_READ_LOCKREAD, RAW_READ_READ, RAW_READ_READX};
+
+/* union for read() backend call
+
+ note that .infoX.out.data will be allocated before the backend is
+ called. It will be big enough to hold the maximum size asked for
+*/
+union smb_read {
+ /* generic interface */
+ struct {
+ enum read_level level;
+
+ struct {
+ uint16 fnum;
+ SMB_BIG_UINT offset;
+ uint32 size;
+ } in;
+ struct {
+ char *data;
+ uint32 nread;
+ } out;
+ } generic;
+
+
+ /* SMBreadbraw interface */
+ struct {
+ enum read_level level;
+
+ struct {
+ uint16 fnum;
+ SMB_BIG_UINT offset;
+ uint16 maxcnt;
+ uint16 mincnt;
+ uint32 timeout;
+ } in;
+ struct {
+ char *data;
+ uint32 nread;
+ } out;
+ } readbraw;
+
+
+ /* SMBlockandread interface */
+ struct {
+ enum read_level level;
+
+ struct {
+ uint16 fnum;
+ uint16 count;
+ uint32 offset;
+ uint16 remaining;
+ } in;
+ struct {
+ char *data;
+ uint16 nread;
+ } out;
+ } lockread;
+
+ /* SMBread interface */
+ struct {
+ enum read_level level;
+
+ struct {
+ uint16 fnum;
+ uint16 count;
+ uint32 offset;
+ uint16 remaining;
+ } in;
+ struct {
+ char *data;
+ uint16 nread;
+ } out;
+ } read;
+
+ /* SMBreadX interface */
+ struct {
+ enum read_level level;
+
+ struct {
+ uint16 fnum;
+ SMB_BIG_UINT offset;
+ uint16 mincnt;
+ uint16 maxcnt;
+ uint16 remaining;
+ } in;
+ struct {
+ char *data;
+ uint16 remaining;
+ uint16 compaction_mode;
+ uint16 nread;
+ } out;
+ } readx;
+};
+
+
+enum write_level {RAW_WRITE_GENERIC, RAW_WRITE_WRITEUNLOCK, RAW_WRITE_WRITE,
+ RAW_WRITE_WRITEX, RAW_WRITE_WRITECLOSE, RAW_WRITE_SPLWRITE};
+
+/* union for write() backend call
+*/
+union smb_write {
+ /* generic interface */
+ struct {
+ enum write_level level;
+
+ struct {
+ uint16 fnum;
+ SMB_BIG_UINT offset;
+ uint32 count;
+ const char *data;
+ } in;
+ struct {
+ uint32 nwritten;
+ } out;
+ } generic;
+
+
+ /* SMBwriteunlock interface */
+ struct {
+ enum write_level level;
+
+ struct {
+ uint16 fnum;
+ uint16 count;
+ uint32 offset;
+ uint16 remaining;
+ const char *data;
+ } in;
+ struct {
+ uint32 nwritten;
+ } out;
+ } writeunlock;
+
+ /* SMBwrite interface */
+ struct {
+ enum write_level level;
+
+ struct {
+ uint16 fnum;
+ uint16 count;
+ uint32 offset;
+ uint16 remaining;
+ const char *data;
+ } in;
+ struct {
+ uint16 nwritten;
+ } out;
+ } write;
+
+ /* SMBwriteX interface */
+ struct {
+ enum write_level level;
+
+ struct {
+ uint16 fnum;
+ SMB_BIG_UINT offset;
+ uint16 wmode;
+ uint16 remaining;
+ uint32 count;
+ const char *data;
+ } in;
+ struct {
+ uint32 nwritten;
+ uint16 remaining;
+ } out;
+ } writex;
+
+ /* SMBwriteclose interface */
+ struct {
+ enum write_level level;
+
+ struct {
+ uint16 fnum;
+ uint16 count;
+ uint32 offset;
+ time_t mtime;
+ const char *data;
+ } in;
+ struct {
+ uint16 nwritten;
+ } out;
+ } writeclose;
+
+ /* SMBsplwrite interface */
+ struct {
+ enum write_level level;
+
+ struct {
+ uint16 fnum;
+ uint16 count;
+ const char *data;
+ } in;
+ } splwrite;
+};
+
+
+enum lock_level {RAW_LOCK_GENERIC, RAW_LOCK_LOCK, RAW_LOCK_UNLOCK, RAW_LOCK_LOCKX};
+
+/* union for lock() backend call
+*/
+union smb_lock {
+ /* generic interface */
+ struct {
+ enum lock_level level;
+
+ struct {
+
+ } in;
+ } generic;
+
+ /* SMBlock interface */
+ struct {
+ enum lock_level level;
+
+ struct {
+ uint16 fnum;
+ uint32 count;
+ uint32 offset;
+ } in;
+ } lock;
+
+ /* SMBunlock interface */
+ struct {
+ enum lock_level level;
+
+ struct {
+ uint16 fnum;
+ uint32 count;
+ uint32 offset;
+ } in;
+ } unlock;
+
+ /* SMBlockingX interface */
+ struct {
+ enum lock_level level;
+
+ struct {
+ uint16 fnum;
+ uint16 mode;
+ uint32 timeout;
+ uint16 ulock_cnt;
+ uint16 lock_cnt;
+ struct smb_lock_entry {
+ uint16 pid;
+ SMB_BIG_UINT offset;
+ SMB_BIG_UINT count;
+ } *locks; /* unlocks are first in the arrray */
+ } in;
+ } lockx;
+};
+
+
+enum close_enum {RAW_CLOSE_GENERIC, RAW_CLOSE_CLOSE, RAW_CLOSE_SPLCLOSE};
+
+/*
+ union for close() backend call
+*/
+union smb_close {
+ /* generic interface */
+ struct {
+ enum close_enum level;
+
+ struct {
+ uint16 fnum;
+ } in;
+ } generic;
+
+ /* SMBclose interface */
+ struct {
+ enum close_enum level;
+
+ struct {
+ uint16 fnum;
+ time_t write_time;
+ } in;
+ } close;
+
+ /* SMBsplclose interface - empty! */
+ struct {
+ enum close_enum level;
+
+ struct {
+ uint16 fnum;
+ } in;
+ } splclose;
+};
+
+
+enum lpq_level {RAW_LPQ_GENERIC, RAW_LPQ_RETQ};
+
+/*
+ union for lpq() backend
+*/
+union smb_lpq {
+ /* generic interface */
+ struct {
+ enum lpq_level level;
+
+ } generic;
+
+
+ /* SMBsplretq interface */
+ struct {
+ enum lpq_level level;
+
+ struct {
+ uint16 maxcount;
+ uint16 startidx;
+ } in;
+ struct {
+ uint16 count;
+ uint16 restart_idx;
+ struct {
+ time_t time;
+ uint8 status;
+ uint16 job;
+ uint32 size;
+ char *user;
+ } *queue;
+ } out;
+ } retq;
+};
+
+
+/* struct for SMBioctl */
+struct smb_ioctl {
+ struct {
+ uint16 fnum;
+ uint32 request;
+ } in;
+ struct {
+ DATA_BLOB blob;
+ } out;
+};
+
+/* struct for SMBflush */
+struct smb_flush {
+ struct {
+ uint16 fnum;
+ } in;
+};
+
+
+/* struct for SMBcopy */
+struct smb_copy {
+ struct {
+ uint16 tid2;
+ uint16 ofun;
+ uint16 flags;
+ const char *path1;
+ const char *path2;
+ } in;
+ struct {
+ uint16 count;
+ } out;
+};
+
+
+/* struct for transact2 call */
+struct smb_trans2 {
+ struct {
+ uint16 max_param;
+ uint16 max_data;
+ uint8 max_setup;
+ uint16 flags;
+ uint32 timeout;
+ uint8 setup_count;
+ uint16 *setup;
+ DATA_BLOB params;
+ DATA_BLOB data;
+ } in;
+
+ struct {
+ uint8 setup_count;
+ uint16 *setup;
+ DATA_BLOB params;
+ DATA_BLOB data;
+ } out;
+};
+
+/* struct for nttransact2 call */
+struct smb_nttrans {
+ struct {
+ uint8 max_setup;
+ uint32 max_param;
+ uint32 max_data;
+ uint32 setup_count;
+ uint16 function;
+ uint16 *setup;
+ DATA_BLOB params;
+ DATA_BLOB data;
+ } in;
+
+ struct {
+ uint8 setup_count;
+ uint16 *setup;
+ DATA_BLOB params;
+ DATA_BLOB data;
+ } out;
+};
+
+
+/* struct for nttrans change notify call */
+struct smb_notify {
+ struct {
+ uint32 buffer_size;
+ uint32 completion_filter;
+ uint16 fnum;
+ BOOL recursive;
+ } in;
+
+ struct {
+ uint32 num_changes;
+ struct {
+ uint32 action;
+ WIRE_STRING name;
+ } *changes;
+ } out;
+};
+
+/* struct for NT ioctl call */
+struct smb_ntioctl {
+ struct {
+ uint32 function;
+ uint16 fnum;
+ BOOL fsctl;
+ uint8 filter;
+ } in;
+};
+
+
+enum search_level {RAW_SEARCH_GENERIC = 0xF000,
+ RAW_SEARCH_SEARCH, /* SMBsearch */
+ RAW_SEARCH_STANDARD = SMB_FIND_STANDARD,
+ RAW_SEARCH_EA_SIZE = SMB_FIND_EA_SIZE,
+ RAW_SEARCH_DIRECTORY_INFO = SMB_FIND_DIRECTORY_INFO,
+ RAW_SEARCH_FULL_DIRECTORY_INFO = SMB_FIND_FULL_DIRECTORY_INFO,
+ RAW_SEARCH_NAME_INFO = SMB_FIND_NAME_INFO,
+ RAW_SEARCH_BOTH_DIRECTORY_INFO = SMB_FIND_BOTH_DIRECTORY_INFO,
+ RAW_SEARCH_261 = SMB_FIND_261,
+ RAW_SEARCH_262 = SMB_FIND_262,
+ RAW_SEARCH_UNIX_INFO = SMB_FIND_UNIX_INFO};
+
+
+/* union for file search */
+union smb_search_first {
+ struct {
+ enum search_level level;
+ } generic;
+
+ /* search (old) findfirst interface */
+ struct {
+ enum search_level level;
+
+ struct {
+ uint16 max_count;
+ uint16 search_attrib;
+ const char *pattern;
+ } in;
+ struct {
+ int16 count;
+ } out;
+ } search_first;
+
+ /* trans2 findfirst interface */
+ struct {
+ enum search_level level;
+
+ struct {
+ uint16 search_attrib;
+ uint16 max_count;
+ uint16 flags;
+ uint32 storage_type;
+ const char *pattern;
+ } in;
+ struct {
+ uint16 handle;
+ uint16 count;
+ uint16 end_of_search;
+ } out;
+ } t2ffirst;
+};
+
+/* union for file search continue */
+union smb_search_next {
+ struct {
+ enum search_level level;
+ } generic;
+
+ /* search (old) findnext interface */
+ struct {
+ enum search_level level;
+
+ struct {
+ uint16 max_count;
+ uint16 search_attrib;
+ DATA_BLOB search_id;
+ } in;
+ struct {
+ uint16 count;
+ } out;
+ } search_next;
+
+ /* trans2 findnext interface */
+ struct {
+ enum search_level level;
+
+ struct {
+ uint16 handle;
+ uint16 max_count;
+ uint32 resume_key;
+ uint16 flags;
+ const char *last_name;
+ } in;
+ struct {
+ uint16 count;
+ uint16 end_of_search;
+ } out;
+ } t2fnext;
+};
+
+/* union for search reply file data */
+union smb_search_data {
+ /* search (old) findfirst */
+ struct {
+ uint16 attrib;
+ time_t write_time;
+ uint32 size;
+ DATA_BLOB search_id; /* used to resume search from this point */
+ char *name;
+ } search;
+
+ /* trans2 findfirst RAW_SEARCH_STANDARD level */
+ struct {
+ uint32 resume_key;
+ time_t create_time;
+ time_t access_time;
+ time_t write_time;
+ uint32 size;
+ uint32 alloc_size;
+ uint16 attrib;
+ WIRE_STRING name;
+ } standard;
+
+ /* trans2 findfirst RAW_SEARCH_EA_SIZE level */
+ struct {
+ uint32 resume_key;
+ time_t create_time;
+ time_t access_time;
+ time_t write_time;
+ uint32 size;
+ uint32 alloc_size;
+ uint16 attrib;
+ uint32 ea_size;
+ WIRE_STRING name;
+ } ea_size;
+
+ /* RAW_SEARCH_DIRECTORY_INFO interface */
+ struct {
+ uint32 file_index;
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ large_t size;
+ large_t alloc_size;
+ uint32 attrib;
+ WIRE_STRING name;
+ } directory_info;
+
+ /* RAW_SEARCH_FULL_DIRECTORY_INFO interface */
+ struct {
+ uint32 file_index;
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ large_t size;
+ large_t alloc_size;
+ uint32 attrib;
+ uint32 ea_size;
+ WIRE_STRING name;
+ } full_directory_info;
+
+ /* RAW_SEARCH_NAME_INFO interface */
+ struct {
+ uint32 file_index;
+ WIRE_STRING name;
+ } name_info;
+
+ /* RAW_SEARCH_BOTH_DIRECTORY_INFO interface */
+ struct {
+ uint32 file_index;
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ large_t size;
+ large_t alloc_size;
+ uint32 attrib;
+ uint32 ea_size;
+ WIRE_STRING short_name;
+ WIRE_STRING name;
+ } both_directory_info;
+
+ /* RAW_SEARCH_261 interface */
+ struct {
+ uint32 file_index;
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ large_t size;
+ large_t alloc_size;
+ uint32 attrib;
+ uint32 ea_size;
+ uint32 unknown[3];
+ WIRE_STRING name;
+ } level_261;
+
+ /* RAW_SEARCH_262 interface */
+ struct {
+ uint32 file_index;
+ NTTIME create_time;
+ NTTIME access_time;
+ NTTIME write_time;
+ NTTIME change_time;
+ large_t size;
+ large_t alloc_size;
+ uint32 attrib;
+ uint32 ea_size;
+ uint32 unknown[2];
+ WIRE_STRING short_name;
+ WIRE_STRING name;
+ } level_262;
+
+ /* RAW_SEARCH_UNIX_INFO interface */
+ struct {
+ large_t end_of_file;
+ large_t num_bytes;
+ NTTIME status_change_time;
+ NTTIME access_time;
+ NTTIME change_time;
+ large_t uid;
+ large_t gid;
+ uint32 file_type;
+ large_t dev_major;
+ large_t dev_minor;
+ large_t unique_id;
+ large_t permissions;
+ large_t nlink;
+ } unix_info;
+};
+
+
+enum search_close_level {RAW_FINDCLOSE_GENERIC, RAW_FINDCLOSE_CLOSE};
+
+/* union for file search close */
+union smb_search_close {
+ struct {
+ enum search_close_level level;
+ } generic;
+
+ /* SMBfindclose interface */
+ struct {
+ enum search_level level;
+
+ struct {
+ uint16 handle;
+ } in;
+ } findclose;
+};
+