From d3bcaf66a8568fc19a3013f9dc974fb08ee3a39a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 23 Feb 2006 12:44:21 +0000 Subject: r13654: Move some more stuff out of include/ (This used to be commit 2ec7bba03a2edf713004941e9ed74798f5cf8d32) --- source4/build/smb_build/header.pm | 95 ++ source4/build/smb_build/main.pl | 4 +- source4/build/smb_build/smb_build_h.pm | 95 -- source4/include/includes.h | 2 +- source4/include/mutex.h | 69 -- source4/include/pstring.h | 7 +- source4/include/safe_string.h | 5 - source4/include/smb_interfaces.h | 2035 -------------------------------- source4/include/smb_macros.h | 2 +- source4/lib/mutex.h | 69 ++ source4/libcli/raw/interfaces.h | 2035 ++++++++++++++++++++++++++++++++ 11 files changed, 2209 insertions(+), 2209 deletions(-) create mode 100644 source4/build/smb_build/header.pm delete mode 100644 source4/build/smb_build/smb_build_h.pm delete mode 100644 source4/include/mutex.h delete mode 100644 source4/include/smb_interfaces.h create mode 100644 source4/lib/mutex.h create mode 100644 source4/libcli/raw/interfaces.h (limited to 'source4') diff --git a/source4/build/smb_build/header.pm b/source4/build/smb_build/header.pm new file mode 100644 index 0000000000..456c29368a --- /dev/null +++ b/source4/build/smb_build/header.pm @@ -0,0 +1,95 @@ +# SMB Build System +# - create output for build.h +# +# Copyright (C) Stefan (metze) Metzmacher 2004 +# Released under the GNU GPL + +package header; +use strict; + +sub _add_define_section($) +{ + my $DEFINE = shift; + my $output = ""; + + $output .= " +/* $DEFINE->{COMMENT} */ +#define $DEFINE->{KEY} $DEFINE->{VAL} +"; + + return $output; +} + +sub _prepare_build_h($) +{ + my $depend = shift; + my @defines = (); + my $output = ""; + + foreach my $key (values %{$depend}) { + my $DEFINE = (); + next if ($key->{TYPE} ne "LIBRARY" and $key->{TYPE} ne "SUBSYSTEM"); + next unless defined($key->{INIT_FUNCTIONS}); + + $DEFINE->{COMMENT} = "$key->{TYPE} $key->{NAME} INIT"; + $DEFINE->{KEY} = "STATIC_$key->{NAME}_MODULES"; + $DEFINE->{VAL} = "{ \\\n"; + foreach (@{$key->{INIT_FUNCTIONS}}) { + $DEFINE->{VAL} .= "\t$_, \\\n"; + $output .= "NTSTATUS $_(void);\n"; + } + + $DEFINE->{VAL} .= "\tNULL \\\n }"; + + push(@defines,$DEFINE); + } + + # + # Shared modules + # + foreach my $key (values %{$depend}) { + next if $key->{TYPE} ne "MODULE"; + next if $key->{ENABLE} ne "YES"; + next if $key->{OUTPUT_TYPE} ne "SHARED_LIBRARY"; + + my $name = $key->{NAME}; + next if not defined($key->{INIT_FUNCTION}); + + my $DEFINE = (); + + $DEFINE->{COMMENT} = "$name is built shared"; + $DEFINE->{KEY} = $key->{INIT_FUNCTION}; + $DEFINE->{VAL} = "init_module"; + + push(@defines,$DEFINE); + } + + # + # loop over all BUILD_H define sections + # + foreach (@defines) { $output .= _add_define_section($_); } + + return $output; +} + +########################################################### +# This function creates include/build.h from the SMB_BUILD +# context +# +# create_build_h($SMB_BUILD_CTX) +# +# $SMB_BUILD_CTX - the global SMB_BUILD context +# +# $output - the resulting output buffer +sub create_smb_build_h($$) +{ + my ($CTX, $file) = @_; + + open(BUILD_H,">$file") || die ("Can't open `$file'\n"); + print BUILD_H "/* autogenerated by build/smb_build/main.pl */\n"; + print BUILD_H _prepare_build_h($CTX); + close(BUILD_H); + + print __FILE__.": creating $file\n"; +} +1; diff --git a/source4/build/smb_build/main.pl b/source4/build/smb_build/main.pl index 2b6594d809..bec1be791c 100644 --- a/source4/build/smb_build/main.pl +++ b/source4/build/smb_build/main.pl @@ -6,7 +6,7 @@ # Released under the GNU GPL use smb_build::makefile; -use smb_build::smb_build_h; +use smb_build::header; use smb_build::input; use smb_build::config_mk; use smb_build::output; @@ -79,6 +79,6 @@ foreach my $key (values %$OUTPUT) { } $mkenv->write("Makefile"); -smb_build_h::create_smb_build_h($OUTPUT, "include/smb_build.h"); +header::create_smb_build_h($OUTPUT, "include/build.h"); 1; diff --git a/source4/build/smb_build/smb_build_h.pm b/source4/build/smb_build/smb_build_h.pm deleted file mode 100644 index 3b178c8226..0000000000 --- a/source4/build/smb_build/smb_build_h.pm +++ /dev/null @@ -1,95 +0,0 @@ -# SMB Build System -# - create output for build.h -# -# Copyright (C) Stefan (metze) Metzmacher 2004 -# Released under the GNU GPL - -package smb_build_h; -use strict; - -sub _add_define_section($) -{ - my $DEFINE = shift; - my $output = ""; - - $output .= " -/* $DEFINE->{COMMENT} */ -#define $DEFINE->{KEY} $DEFINE->{VAL} -"; - - return $output; -} - -sub _prepare_build_h($) -{ - my $depend = shift; - my @defines = (); - my $output = ""; - - foreach my $key (values %{$depend}) { - my $DEFINE = (); - next if ($key->{TYPE} ne "LIBRARY" and $key->{TYPE} ne "SUBSYSTEM"); - next unless defined($key->{INIT_FUNCTIONS}); - - $DEFINE->{COMMENT} = "$key->{TYPE} $key->{NAME} INIT"; - $DEFINE->{KEY} = "STATIC_$key->{NAME}_MODULES"; - $DEFINE->{VAL} = "{ \\\n"; - foreach (@{$key->{INIT_FUNCTIONS}}) { - $DEFINE->{VAL} .= "\t$_, \\\n"; - $output .= "NTSTATUS $_(void);\n"; - } - - $DEFINE->{VAL} .= "\tNULL \\\n }"; - - push(@defines,$DEFINE); - } - - # - # Shared modules - # - foreach my $key (values %{$depend}) { - next if $key->{TYPE} ne "MODULE"; - next if $key->{ENABLE} ne "YES"; - next if $key->{OUTPUT_TYPE} ne "SHARED_LIBRARY"; - - my $name = $key->{NAME}; - next if not defined($key->{INIT_FUNCTION}); - - my $DEFINE = (); - - $DEFINE->{COMMENT} = "$name is built shared"; - $DEFINE->{KEY} = $key->{INIT_FUNCTION}; - $DEFINE->{VAL} = "init_module"; - - push(@defines,$DEFINE); - } - - # - # loop over all BUILD_H define sections - # - foreach (@defines) { $output .= _add_define_section($_); } - - return $output; -} - -########################################################### -# This function creates include/build.h from the SMB_BUILD -# context -# -# create_build_h($SMB_BUILD_CTX) -# -# $SMB_BUILD_CTX - the global SMB_BUILD context -# -# $output - the resulting output buffer -sub create_smb_build_h($$) -{ - my ($CTX, $file) = @_; - - open(SMB_BUILD_H,">$file") || die ("Can't open `$file'\n"); - print SMB_BUILD_H "/* autogenerated by build/smb_build/main.pl */\n"; - print SMB_BUILD_H _prepare_build_h($CTX); - close(SMB_BUILD_H); - - print __FILE__.": creating $file\n"; -} -1; diff --git a/source4/include/includes.h b/source4/include/includes.h index 3babb4eef5..444feab6fc 100644 --- a/source4/include/includes.h +++ b/source4/include/includes.h @@ -108,7 +108,7 @@ struct ipv4_addr { #include "librpc/ndr/ndr_orpc.h" #include "librpc/gen_ndr/orpc.h" #include "librpc/rpc/dcerpc.h" -#include "smb_interfaces.h" +#include "libcli/raw/interfaces.h" #include "auth/credentials/credentials.h" #include "libcli/nbt/libnbt.h" diff --git a/source4/include/mutex.h b/source4/include/mutex.h deleted file mode 100644 index bb26c84f5d..0000000000 --- a/source4/include/mutex.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef _MUTEX_H_ -#define _MUTEX_H_ -/* - Unix SMB/CIFS implementation. - Samba mutex functions - Copyright (C) Andrew Tridgell 2003 - Copyright (C) James J Myers 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. -*/ - -/* To add a new read/write lock, add it to enum rwlock_id - */ -enum rwlock_id { RWLOCK_SMBD, /* global smbd lock */ - - RWLOCK_MAX /* this MUST be kept last */ -}; - -#define MUTEX_LOCK_BY_ID(mutex_index) smb_mutex_lock_by_id(mutex_index, #mutex_index) -#define MUTEX_UNLOCK_BY_ID(mutex_index) smb_mutex_unlock_by_id(mutex_index, #mutex_index) -#define MUTEX_INIT(mutex, name) smb_mutex_init(mutex, #name) -#define MUTEX_DESTROY(mutex, name) smb_mutex_destroy(mutex, #name) -#define MUTEX_LOCK(mutex, name) smb_mutex_lock(mutex, #name) -#define MUTEX_UNLOCK(mutex, name) smb_mutex_unlock(mutex, #name) - -#define RWLOCK_INIT(rwlock, name) smb_rwlock_init(rwlock, #name) -#define RWLOCK_DESTROY(rwlock, name) smb_rwlock_destroy(rwlock, #name) -#define RWLOCK_LOCK_WRITE(rwlock, name) smb_rwlock_lock_write(rwlock, #name) -#define RWLOCK_LOCK_READ(rwlock, name) smb_rwlock_lock_read(rwlock, #name) -#define RWLOCK_UNLOCK(rwlock, name) smb_rwlock_unlock(rwlock, #name) - - - -/* this null typedef ensures we get the types right and avoids the - pitfalls of void* */ -typedef struct smb_mutex { - void *mutex; -} smb_mutex_t; -typedef struct { - void *rwlock; -} smb_rwlock_t; - -/* the mutex model operations structure - contains function pointers to - the model-specific implementations of each operation */ -struct mutex_ops { - int (*mutex_init)(smb_mutex_t *mutex, const char *name); - int (*mutex_lock)(smb_mutex_t *mutex, const char *name); - int (*mutex_unlock)(smb_mutex_t *mutex, const char *name); - int (*mutex_destroy)(smb_mutex_t *mutex, const char *name); - int (*rwlock_init)(smb_rwlock_t *rwlock, const char *name); - int (*rwlock_lock_write)(smb_rwlock_t *rwlock, const char *name); - int (*rwlock_lock_read)(smb_rwlock_t *rwlock, const char *name); - int (*rwlock_unlock)(smb_rwlock_t *rwlock, const char *name); - int (*rwlock_destroy)(smb_rwlock_t *rwlock, const char *name); -}; - -#endif /* endif _MUTEX_H_ */ diff --git a/source4/include/pstring.h b/source4/include/pstring.h index 3683849686..392ada4533 100644 --- a/source4/include/pstring.h +++ b/source4/include/pstring.h @@ -26,6 +26,7 @@ */ #ifndef _PSTRING +#define _PSTRING #define PSTRING_LEN 1024 #define FSTRING_LEN 256 @@ -33,5 +34,9 @@ typedef char pstring[PSTRING_LEN]; typedef char fstring[FSTRING_LEN]; -#define _PSTRING +#define pstrcpy(d,s) safe_strcpy((d), (s),sizeof(pstring)-1) +#define pstrcat(d,s) safe_strcat((d), (s),sizeof(pstring)-1) +#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1) +#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1) + #endif diff --git a/source4/include/safe_string.h b/source4/include/safe_string.h index 57c5d21429..43e094467c 100644 --- a/source4/include/safe_string.h +++ b/source4/include/safe_string.h @@ -47,11 +47,6 @@ #endif /* !_SPLINT_ */ -#define pstrcpy(d,s) safe_strcpy((d), (s),sizeof(pstring)-1) -#define pstrcat(d,s) safe_strcat((d), (s),sizeof(pstring)-1) -#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1) -#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1) - /* replace some string functions with multi-byte versions */ #define strlower(s) strlower_m(s) diff --git a/source4/include/smb_interfaces.h b/source4/include/smb_interfaces.h deleted file mode 100644 index 49fe085f2c..0000000000 --- a/source4/include/smb_interfaces.h +++ /dev/null @@ -1,2035 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB request interface structures - Copyright (C) Andrew Tridgell 2003 - Copyright (C) James J Myers 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. -*/ - - - -/* 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 other 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 in the structure definition. - */ -typedef struct { - uint32_t private_length; - const char *s; -} WIRE_STRING; - - -/* - use the same structure for dom_sid2 as dom_sid. A dom_sid2 is really - just a dom sid, but with the sub_auths represented as a conformant - array. As with all in-structure conformant arrays, the array length - is placed before the start of the structure. That's what gives rise - to the extra num_auths elemenent. We don't want the Samba code to - have to bother with such esoteric NDR details, so its easier to just - define it as a dom_sid and use pidl magic to make it all work. It - just means you need to mark a sid as a "dom_sid2" in the IDL when you - know it is of the conformant array variety -*/ -#define dom_sid2 dom_sid - -/* same struct as dom_sid but inside a 28 bytes fixed buffer in NDR */ -#define dom_sid28 dom_sid - - -/* - 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_t fnum; - uint16_t mode; - int32_t offset; /* signed */ - } in; - struct { - int32_t offset; - } out; -}; - - -/* struct used in unlink() call */ -struct smb_unlink { - struct { - const char *pattern; - uint16_t attrib; - } in; -}; - - -/* struct used in chkpath() call */ -struct smb_chkpath { - struct { - const char *path; - } in; -}; - -enum smb_mkdir_level {RAW_MKDIR_GENERIC, RAW_MKDIR_MKDIR, RAW_MKDIR_T2MKDIR}; - -/* union used in mkdir() call */ -union smb_mkdir { - /* generic level */ - struct { - enum smb_mkdir_level level; - } generic; - - struct { - enum smb_mkdir_level level; - struct { - const char *path; - } in; - } mkdir; - - struct { - enum smb_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 */ -enum smb_rename_level {RAW_RENAME_RENAME, RAW_RENAME_NTRENAME}; - -union smb_rename { - struct { - enum smb_rename_level level; - } generic; - - /* SMBrename interface */ - struct { - enum smb_rename_level level; - - struct { - const char *pattern1; - const char *pattern2; - uint16_t attrib; - } in; - } rename; - - - /* SMBntrename interface */ - struct { - enum smb_rename_level level; - - struct { - uint16_t attrib; - uint16_t flags; /* see RENAME_FLAG_* */ - uint32_t cluster_size; - const char *old_name; - const char *new_name; - } in; - } ntrename; -}; - -enum smb_tcon_level {RAW_TCON_TCON, RAW_TCON_TCONX}; - -/* union used in tree connect call */ -union smb_tcon { - /* generic interface */ - struct { - enum smb_tcon_level level; - } generic; - - /* SMBtcon interface */ - struct { - enum smb_tcon_level level; - - struct { - const char *service; - const char *password; - const char *dev; - } in; - struct { - uint16_t max_xmit; - uint16_t tid; - } out; - } tcon; - - /* SMBtconX interface */ - struct { - enum smb_tcon_level level; - - struct { - uint16_t flags; - DATA_BLOB password; - const char *path; - const char *device; - } in; - struct { - uint16_t options; - char *dev_type; - char *fs_type; - uint16_t tid; - } out; - } tconx; -}; - - -enum smb_sesssetup_level {RAW_SESSSETUP_OLD, RAW_SESSSETUP_NT1, RAW_SESSSETUP_SPNEGO}; - -/* union used in session_setup call */ -union smb_sesssetup { - /* the pre-NT1 interface */ - struct { - enum smb_sesssetup_level level; - - struct { - uint16_t bufsize; - uint16_t mpx_max; - uint16_t vc_num; - uint32_t sesskey; - DATA_BLOB password; - const char *user; - const char *domain; - const char *os; - const char *lanman; - } in; - struct { - uint16_t action; - uint16_t vuid; - char *os; - char *lanman; - char *domain; - } out; - } old; - - /* the NT1 interface */ - struct { - enum smb_sesssetup_level level; - - struct { - uint16_t bufsize; - uint16_t mpx_max; - uint16_t vc_num; - uint32_t sesskey; - uint32_t capabilities; - DATA_BLOB password1; - DATA_BLOB password2; - const char *user; - const char *domain; - const char *os; - const char *lanman; - } in; - struct { - uint16_t action; - uint16_t vuid; - char *os; - char *lanman; - char *domain; - } out; - } nt1; - - - /* the SPNEGO interface */ - struct { - enum smb_sesssetup_level level; - - struct { - uint16_t bufsize; - uint16_t mpx_max; - uint16_t vc_num; - uint32_t sesskey; - uint32_t capabilities; - DATA_BLOB secblob; - const char *os; - const char *lanman; - const char *workgroup; - } in; - struct { - uint16_t action; - DATA_BLOB secblob; - char *os; - char *lanman; - char *workgroup; - uint16_t vuid; - } out; - } spnego; -}; - -/* Note that the specified enum values are identical to the actual info-levels used - * on the wire. - */ -enum smb_fileinfo_level { - RAW_FILEINFO_GENERIC = 0xF000, - RAW_FILEINFO_GETATTR, /* SMBgetatr */ - RAW_FILEINFO_GETATTRE, /* SMBgetattrE */ - RAW_FILEINFO_SEC_DESC, /* NT_TRANSACT_QUERY_SECURITY_DESC */ - RAW_FILEINFO_STANDARD = SMB_QFILEINFO_STANDARD, - RAW_FILEINFO_EA_SIZE = SMB_QFILEINFO_EA_SIZE, - RAW_FILEINFO_EA_LIST = SMB_QFILEINFO_EA_LIST, - 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, - /* SMB2 specific levels */ - RAW_FILEINFO_SMB2_ALL_EAS = 0x0f01, - RAW_FILEINFO_SMB2_ALL_INFORMATION = 0x1201 -}; - -/* - file handles in SMB2 are 16 bytes -*/ -struct smb2_handle { - uint64_t data[2]; -}; - - -/* union used in qfileinfo() and qpathinfo() backend calls */ -union smb_fileinfo { - /* generic interface: - * matches RAW_FILEINFO_GENERIC */ - struct { - enum smb_fileinfo_level level; - - /* each level can be called on either a pathname or a - filename, in either case the return format is - identical - On SMB2 a 16 byte handle is used - */ - union smb_fileinfo_in { - const char *fname; - uint16_t fnum; - struct smb2_handle handle; - } in; - - struct { - uint32_t attrib; - uint32_t ea_size; - uint_t num_eas; - struct ea_struct { - uint8_t flags; - WIRE_STRING name; - DATA_BLOB value; - } *eas; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t alloc_size; - uint64_t size; - uint32_t nlink; - WIRE_STRING fname; - WIRE_STRING alt_fname; - uint8_t delete_pending; - uint8_t directory; - uint64_t compressed_size; - uint16_t format; - uint8_t unit_shift; - uint8_t chunk_shift; - uint8_t cluster_shift; - uint64_t file_id; - uint32_t access_flags; /* seen 0x001f01ff from w2k3 */ - uint64_t position; - uint32_t mode; - uint32_t alignment_requirement; - uint32_t reparse_tag; - uint_t num_streams; - struct stream_struct { - uint64_t size; - uint64_t alloc_size; - WIRE_STRING stream_name; - } *streams; - } out; - } generic; - - - /* SMBgetatr interface: - * matches RAW_FILEINFO_GETATTR */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint16_t attrib; - uint32_t size; - time_t write_time; - } out; - } getattr; - - /* SMBgetattrE and RAW_FILEINFO_STANDARD interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - time_t create_time; - time_t access_time; - time_t write_time; - uint32_t size; - uint32_t alloc_size; - uint16_t attrib; - } out; - } getattre, standard; - - /* trans2 RAW_FILEINFO_EA_SIZE interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - time_t create_time; - time_t access_time; - time_t write_time; - uint32_t size; - uint32_t alloc_size; - uint16_t attrib; - uint32_t ea_size; - } out; - } ea_size; - - /* trans2 RAW_FILEINFO_EA_LIST interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in file; - - struct { - uint_t num_names; - struct ea_name { - WIRE_STRING name; - } *ea_names; - } in; - - struct smb_ea_list { - uint_t num_eas; - struct ea_struct *eas; - } out; - } ea_list; - - /* trans2 RAW_FILEINFO_ALL_EAS and RAW_FILEINFO_FULL_EA_INFORMATION interfaces */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - uint8_t continue_flags; /* SMB2 only - SMB2_CONTINUE_FLAG_* */ - - struct smb_ea_list out; - } all_eas; - - /* trans2 qpathinfo RAW_FILEINFO_IS_NAME_VALID interface - only valid for a QPATHNAME call - no returned data */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - } is_name_valid; - - /* RAW_FILEINFO_BASIC_INFO and RAW_FILEINFO_BASIC_INFORMATION interfaces */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint32_t attrib; - } out; - } basic_info; - - - /* RAW_FILEINFO_STANDARD_INFO and RAW_FILEINFO_STANDARD_INFORMATION interfaces */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint64_t alloc_size; - uint64_t size; - uint32_t nlink; - BOOL delete_pending; - BOOL directory; - } out; - } standard_info; - - /* RAW_FILEINFO_EA_INFO and RAW_FILEINFO_EA_INFORMATION interfaces */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint32_t ea_size; - } out; - } ea_info; - - /* RAW_FILEINFO_NAME_INFO and RAW_FILEINFO_NAME_INFORMATION interfaces */ - struct { - enum smb_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 smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint32_t attrib; - uint64_t alloc_size; - uint64_t size; - uint32_t nlink; - uint8_t delete_pending; - uint8_t directory; - uint32_t ea_size; - WIRE_STRING fname; - } out; - } all_info; - - /* RAW_FILEINFO_SMB2_ALL_INFORMATION interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint32_t attrib; - uint32_t unknown1; - uint64_t alloc_size; - uint64_t size; - uint32_t nlink; - uint8_t delete_pending; - uint8_t directory; - /* uint16_t _pad; */ - uint64_t file_id; - uint32_t ea_size; - uint32_t access_mask; - uint64_t position; - uint64_t mode; - WIRE_STRING fname; - } out; - } all_info2; - - /* RAW_FILEINFO_ALT_NAME_INFO and RAW_FILEINFO_ALT_NAME_INFORMATION interfaces */ - struct { - enum smb_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 smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct stream_information { - uint_t num_streams; - struct stream_struct *streams; - } out; - } stream_info; - - /* RAW_FILEINFO_COMPRESSION_INFO and RAW_FILEINFO_COMPRESSION_INFORMATION interfaces */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint64_t compressed_size; - uint16_t format; - uint8_t unit_shift; - uint8_t chunk_shift; - uint8_t cluster_shift; - } out; - } compression_info; - - /* RAW_FILEINFO_UNIX_BASIC interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint64_t end_of_file; - uint64_t num_bytes; - NTTIME status_change_time; - NTTIME access_time; - NTTIME change_time; - uint64_t uid; - uint64_t gid; - uint32_t file_type; - uint64_t dev_major; - uint64_t dev_minor; - uint64_t unique_id; - uint64_t permissions; - uint64_t nlink; - } out; - } unix_basic_info; - - /* RAW_FILEINFO_UNIX_LINK interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - WIRE_STRING link_dest; - } out; - } unix_link_info; - - /* RAW_FILEINFO_INTERNAL_INFORMATION interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint64_t file_id; - } out; - } internal_information; - - /* RAW_FILEINFO_ACCESS_INFORMATION interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint32_t access_flags; - } out; - } access_information; - - /* RAW_FILEINFO_POSITION_INFORMATION interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint64_t position; - } out; - } position_information; - - /* RAW_FILEINFO_MODE_INFORMATION interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint32_t mode; - } out; - } mode_information; - - /* RAW_FILEINFO_ALIGNMENT_INFORMATION interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint32_t alignment_requirement; - } out; - } alignment_information; - - /* RAW_FILEINFO_NETWORK_OPEN_INFORMATION interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t alloc_size; - uint64_t size; - uint32_t attrib; - } out; - } network_open_information; - - - /* RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION interface */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - - struct { - uint32_t attrib; - uint32_t reparse_tag; - } out; - } attribute_tag_information; - - /* RAW_FILEINFO_SEC_DESC */ - struct { - enum smb_fileinfo_level level; - union smb_fileinfo_in in; - uint32_t secinfo_flags; - struct { - struct security_descriptor *sd; - } out; - } query_secdesc; -}; - - -enum smb_setfileinfo_level { - RAW_SFILEINFO_GENERIC = 0xF000, - RAW_SFILEINFO_SETATTR, /* SMBsetatr */ - RAW_SFILEINFO_SETATTRE, /* SMBsetattrE */ - RAW_SFILEINFO_SEC_DESC, /* NT_TRANSACT_SET_SECURITY_DESC */ - 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 smb_setfileinfo_level level; - - /* we are combining setfileinfo and setpathinfo into one - interface */ - union setfileinfo_file { - const char *fname; - uint16_t fnum; - struct smb2_handle handle; /* only for SMB2 */ - } file; - } generic; - - /* RAW_SFILEINFO_SETATTR (SMBsetatr) interface - only via setpathinfo() */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - struct { - uint16_t attrib; - time_t write_time; - } in; - } setattr; - - /* RAW_SFILEINFO_SETATTRE (SMBsetattrE) interface - only via setfileinfo() - also RAW_SFILEINFO_STANDARD */ - struct { - enum smb_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; - } setattre, standard; - - /* RAW_SFILEINFO_EA_SET interface */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - struct { - uint_t num_eas; - struct ea_struct *eas; - } in; - } ea_set; - - /* RAW_SFILEINFO_BASIC_INFO and - RAW_SFILEINFO_BASIC_INFORMATION interfaces */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - - struct { - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint32_t attrib; - } in; - } basic_info; - - /* RAW_SFILEINFO_DISPOSITION_INFO and - RAW_SFILEINFO_DISPOSITION_INFORMATION interfaces */ - struct { - enum smb_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 smb_setfileinfo_level level; - union setfileinfo_file file; - - struct { - /* w2k3 rounds this up to nearest 4096 */ - uint64_t alloc_size; - } in; - } allocation_info; - - /* RAW_SFILEINFO_END_OF_FILE_INFO and - RAW_SFILEINFO_END_OF_FILE_INFORMATION interfaces */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - - struct { - uint64_t size; - } in; - } end_of_file_info; - - /* RAW_SFILEINFO_RENAME_INFORMATION interface */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - - struct smb_rename_information { - uint8_t overwrite; - uint32_t root_fid; - const char *new_name; - } in; - } rename_information; - - /* RAW_SFILEINFO_POSITION_INFORMATION interface */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - - struct { - uint64_t position; - } in; - } position_information; - - /* RAW_SFILEINFO_MODE_INFORMATION interface */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - - struct { - /* valid values seem to be 0, 2, 4 and 6 */ - uint32_t mode; - } in; - } mode_information; - - - - /* RAW_SFILEINFO_UNIX_BASIC interface */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - struct { - uint32_t mode; /* yuck - this field remains to fix compile of libcli/clifile.c */ - uint64_t end_of_file; - uint64_t num_bytes; - NTTIME status_change_time; - NTTIME access_time; - NTTIME change_time; - uint64_t uid; - uint64_t gid; - uint32_t file_type; - uint64_t dev_major; - uint64_t dev_minor; - uint64_t unique_id; - uint64_t permissions; - uint64_t nlink; - } in; - } unix_basic; - - /* RAW_SFILEINFO_UNIX_LINK, RAW_SFILEINFO_UNIX_HLINK interface */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - struct { - const char *link_dest; - } in; - } unix_link, unix_hlink; - - /* RAW_FILEINFO_SET_SEC_DESC */ - struct { - enum smb_setfileinfo_level level; - union setfileinfo_file file; - struct { - uint32_t secinfo_flags; - struct security_descriptor *sd; - } in; - } set_secdesc; -}; - - -enum smb_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 smb_fsinfo_level level; - struct smb2_handle handle; /* only for smb2 */ - - struct { - uint32_t block_size; - uint64_t blocks_total; - uint64_t blocks_free; - uint32_t fs_id; - NTTIME create_time; - uint32_t serial_number; - uint32_t fs_attr; - uint32_t max_file_component_length; - uint32_t device_type; - uint32_t device_characteristics; - uint64_t quota_soft; - uint64_t quota_hard; - uint64_t quota_flags; - struct GUID guid; - char *volume_name; - char *fs_type; - } out; - } generic; - - /* SMBdskattr interface */ - struct { - enum smb_fsinfo_level level; - - struct { - uint16_t units_total; - uint16_t blocks_per_unit; - uint16_t block_size; - uint16_t units_free; - } out; - } dskattr; - - /* trans2 RAW_QFS_ALLOCATION interface */ - struct { - enum smb_fsinfo_level level; - - struct { - uint32_t fs_id; - uint32_t sectors_per_unit; - uint32_t total_alloc_units; - uint32_t avail_alloc_units; - uint16_t bytes_per_sector; - } out; - } allocation; - - /* TRANS2 RAW_QFS_VOLUME interface */ - struct { - enum smb_fsinfo_level level; - - struct { - uint32_t serial_number; - WIRE_STRING volume_name; - } out; - } volume; - - /* TRANS2 RAW_QFS_VOLUME_INFO and RAW_QFS_VOLUME_INFORMATION interfaces */ - struct { - enum smb_fsinfo_level level; - struct smb2_handle handle; /* only for smb2 */ - - struct { - NTTIME create_time; - uint32_t serial_number; - WIRE_STRING volume_name; - } out; - } volume_info; - - /* trans2 RAW_QFS_SIZE_INFO and RAW_QFS_SIZE_INFORMATION interfaces */ - struct { - enum smb_fsinfo_level level; - struct smb2_handle handle; /* only for smb2 */ - - struct { - uint64_t total_alloc_units; - uint64_t avail_alloc_units; /* maps to call_avail_alloc_units */ - uint32_t sectors_per_unit; - uint32_t bytes_per_sector; - } out; - } size_info; - - /* TRANS2 RAW_QFS_DEVICE_INFO and RAW_QFS_DEVICE_INFORMATION interfaces */ - struct { - enum smb_fsinfo_level level; - struct smb2_handle handle; /* only for smb2 */ - - struct { - uint32_t device_type; - uint32_t characteristics; - } out; - } device_info; - - - /* TRANS2 RAW_QFS_ATTRIBUTE_INFO and RAW_QFS_ATTRIBUTE_INFORMATION interfaces */ - struct { - enum smb_fsinfo_level level; - struct smb2_handle handle; /* only for smb2 */ - - struct { - uint32_t fs_attr; - uint32_t max_file_component_length; - WIRE_STRING fs_type; - } out; - } attribute_info; - - - /* TRANS2 RAW_QFS_UNIX_INFO interface */ - struct { - enum smb_fsinfo_level level; - - struct { - uint16_t major_version; - uint16_t minor_version; - uint64_t capability; - } out; - } unix_info; - - /* trans2 RAW_QFS_QUOTA_INFORMATION interface */ - struct { - enum smb_fsinfo_level level; - struct smb2_handle handle; /* only for smb2 */ - - struct { - uint64_t unknown[3]; - uint64_t quota_soft; - uint64_t quota_hard; - uint64_t quota_flags; - } out; - } quota_information; - - /* trans2 RAW_QFS_FULL_SIZE_INFORMATION interface */ - struct { - enum smb_fsinfo_level level; - struct smb2_handle handle; /* only for smb2 */ - - struct { - uint64_t total_alloc_units; - uint64_t call_avail_alloc_units; - uint64_t actual_avail_alloc_units; - uint32_t sectors_per_unit; - uint32_t bytes_per_sector; - } out; - } full_size_information; - - /* trans2 RAW_QFS_OBJECTID_INFORMATION interface */ - struct { - enum smb_fsinfo_level level; - struct smb2_handle handle; /* only for smb2 */ - - struct { - struct GUID guid; - uint64_t unknown[6]; - } out; - } objectid_information; -}; - - - -enum smb_open_level { - RAW_OPEN_OPEN, RAW_OPEN_OPENX, - RAW_OPEN_MKNEW, RAW_OPEN_CREATE, - RAW_OPEN_CTEMP, RAW_OPEN_SPLOPEN, - RAW_OPEN_NTCREATEX, RAW_OPEN_T2OPEN, - RAW_OPEN_NTTRANS_CREATE, - RAW_OPEN_OPENX_READX}; - -/* 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 smb_open_level level; - - struct { - uint32_t flags; - uint32_t root_fid; - uint32_t access_mask; - uint64_t alloc_size; - uint32_t file_attr; - uint32_t share_access; - uint32_t open_disposition; - uint32_t create_options; - uint32_t impersonation; - uint8_t security_flags; - /* NOTE: fname can also be a pointer to a - uint64_t file_id if create_options has the - NTCREATEX_OPTIONS_OPEN_BY_FILE_ID flag set */ - const char *fname; - - /* these last 2 elements are only used in the - NTTRANS varient of the call */ - struct security_descriptor *sec_desc; - struct smb_ea_list *ea_list; - } in; - - struct { - uint8_t oplock_level; - uint16_t fnum; - uint32_t create_action; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint32_t attrib; - uint64_t alloc_size; - uint64_t size; - uint16_t file_type; - uint16_t ipc_state; - uint8_t is_directory; - } out; - } ntcreatex, generic; - - /* TRANS2_OPEN interface */ - struct { - enum smb_open_level level; - - struct { - uint16_t flags; - uint16_t open_mode; - uint16_t search_attrs; - uint16_t file_attrs; - time_t write_time; - uint16_t open_func; - uint32_t size; - uint32_t timeout; - const char *fname; - uint_t num_eas; - struct ea_struct *eas; - } in; - - struct { - uint16_t fnum; - uint16_t attrib; - time_t write_time; - uint32_t size; - uint16_t access; - uint16_t ftype; - uint16_t devstate; - uint16_t action; - uint32_t file_id; - } out; - } t2open; - - /* SMBopen interface */ - struct { - enum smb_open_level level; - - struct { - uint16_t open_mode; - uint16_t search_attrs; - const char *fname; - } in; - struct { - uint16_t fnum; - uint16_t attrib; - time_t write_time; - uint32_t size; - uint16_t rmode; - } out; - } openold; - - /* SMBopenX interface */ - struct { - enum smb_open_level level; - - struct { - uint16_t flags; - uint16_t open_mode; - uint16_t search_attrs; /* not honoured by win2003 */ - uint16_t file_attrs; - time_t write_time; /* not honoured by win2003 */ - uint16_t open_func; - uint32_t size; /* note that this sets the - initial file size, not - just allocation size */ - uint32_t timeout; /* not honoured by win2003 */ - const char *fname; - } in; - struct { - uint16_t fnum; - uint16_t attrib; - time_t write_time; - uint32_t size; - uint16_t access; - uint16_t ftype; - uint16_t devstate; - uint16_t action; - uint32_t unique_fid; - uint32_t access_mask; - uint32_t unknown; - } out; - } openx; - - /* SMBmknew interface */ - struct { - enum smb_open_level level; - - struct { - uint16_t attrib; - time_t write_time; - const char *fname; - } in; - struct { - uint16_t fnum; - } out; - } mknew, create; - - /* SMBctemp interface */ - struct { - enum smb_open_level level; - - struct { - uint16_t attrib; - time_t write_time; - const char *directory; - } in; - struct { - uint16_t fnum; - /* temp name, relative to directory */ - char *name; - } out; - } ctemp; - - /* SMBsplopen interface */ - struct { - enum smb_open_level level; - - struct { - uint16_t setup_length; - uint16_t mode; - const char *ident; - } in; - struct { - uint16_t fnum; - } out; - } splopen; - - - /* chained OpenX/ReadX interface */ - struct { - enum smb_open_level level; - - struct { - uint16_t flags; - uint16_t open_mode; - uint16_t search_attrs; /* not honoured by win2003 */ - uint16_t file_attrs; - time_t write_time; /* not honoured by win2003 */ - uint16_t open_func; - uint32_t size; /* note that this sets the - initial file size, not - just allocation size */ - uint32_t timeout; /* not honoured by win2003 */ - const char *fname; - - /* readx part */ - uint64_t offset; - uint16_t mincnt; - uint32_t maxcnt; - uint16_t remaining; - } in; - struct { - uint16_t fnum; - uint16_t attrib; - time_t write_time; - uint32_t size; - uint16_t access; - uint16_t ftype; - uint16_t devstate; - uint16_t action; - uint32_t unique_fid; - uint32_t access_mask; - uint32_t unknown; - - /* readx part */ - uint8_t *data; - uint16_t remaining; - uint16_t compaction_mode; - uint16_t nread; - } out; - } openxreadx; -}; - - - -enum smb_read_level {RAW_READ_READBRAW, RAW_READ_LOCKREAD, RAW_READ_READ, RAW_READ_READX}; - -#define RAW_READ_GENERIC 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 { - /* SMBreadX (and generic) interface */ - struct { - enum smb_read_level level; - - struct { - uint16_t fnum; - uint64_t offset; - uint16_t mincnt; - uint32_t maxcnt; - uint16_t remaining; - } in; - struct { - uint8_t *data; - uint16_t remaining; - uint16_t compaction_mode; - uint16_t nread; - } out; - } readx, generic; - - /* SMBreadbraw interface */ - struct { - enum smb_read_level level; - - struct { - uint16_t fnum; - uint64_t offset; - uint16_t maxcnt; - uint16_t mincnt; - uint32_t timeout; - } in; - struct { - uint8_t *data; - uint32_t nread; - } out; - } readbraw; - - - /* SMBlockandread interface */ - struct { - enum smb_read_level level; - - struct { - uint16_t fnum; - uint16_t count; - uint32_t offset; - uint16_t remaining; - } in; - struct { - uint8_t *data; - uint16_t nread; - } out; - } lockread; - - /* SMBread interface */ - struct { - enum smb_read_level level; - - struct { - uint16_t fnum; - uint16_t count; - uint32_t offset; - uint16_t remaining; - } in; - struct { - uint8_t *data; - uint16_t nread; - } out; - } read; -}; - - -enum smb_write_level {RAW_WRITE_WRITEUNLOCK, RAW_WRITE_WRITE, - RAW_WRITE_WRITEX, RAW_WRITE_WRITECLOSE, - RAW_WRITE_SPLWRITE}; - -#define RAW_WRITE_GENERIC RAW_WRITE_WRITEX - -/* union for write() backend call -*/ -union smb_write { - /* SMBwriteX interface */ - struct { - enum smb_write_level level; - - struct { - uint16_t fnum; - uint64_t offset; - uint16_t wmode; - uint16_t remaining; - uint32_t count; - const uint8_t *data; - } in; - struct { - uint32_t nwritten; - uint16_t remaining; - } out; - } writex, generic; - - /* SMBwriteunlock interface */ - struct { - enum smb_write_level level; - - struct { - uint16_t fnum; - uint16_t count; - uint32_t offset; - uint16_t remaining; - const uint8_t *data; - } in; - struct { - uint32_t nwritten; - } out; - } writeunlock; - - /* SMBwrite interface */ - struct { - enum smb_write_level level; - - struct { - uint16_t fnum; - uint16_t count; - uint32_t offset; - uint16_t remaining; - const uint8_t *data; - } in; - struct { - uint16_t nwritten; - } out; - } write; - - /* SMBwriteclose interface */ - struct { - enum smb_write_level level; - - struct { - uint16_t fnum; - uint16_t count; - uint32_t offset; - time_t mtime; - const uint8_t *data; - } in; - struct { - uint16_t nwritten; - } out; - } writeclose; - - /* SMBsplwrite interface */ - struct { - enum smb_write_level level; - - struct { - uint16_t fnum; - uint16_t count; - const uint8_t *data; - } in; - } splwrite; -}; - - -enum smb_lock_level {RAW_LOCK_LOCK, RAW_LOCK_UNLOCK, RAW_LOCK_LOCKX}; - -/* the generic interface is defined to be equal to the lockingX interface */ -#define RAW_LOCK_GENERIC RAW_LOCK_LOCKX - -/* union for lock() backend call -*/ -union smb_lock { - /* SMBlockingX (and generic) interface */ - struct { - enum smb_lock_level level; - - struct { - uint16_t fnum; - uint16_t mode; - uint32_t timeout; - uint16_t ulock_cnt; - uint16_t lock_cnt; - struct smb_lock_entry { - uint16_t pid; - uint64_t offset; - uint64_t count; - } *locks; /* unlocks are first in the arrray */ - } in; - } lockx, generic; - - /* SMBlock and SMBunlock interface */ - struct { - enum smb_lock_level level; - - struct { - uint16_t fnum; - uint32_t count; - uint32_t offset; - } in; - } lock, unlock; -}; - - -enum smb_close_level {RAW_CLOSE_CLOSE, RAW_CLOSE_SPLCLOSE}; - -#define RAW_CLOSE_GENERIC RAW_CLOSE_CLOSE - -/* - union for close() backend call -*/ -union smb_close { - /* SMBclose (and generic) interface */ - struct { - enum smb_close_level level; - - struct { - uint16_t fnum; - time_t write_time; - } in; - } close, generic; - - /* SMBsplclose interface - empty! */ - struct { - enum smb_close_level level; - - struct { - uint16_t fnum; - } in; - } splclose; -}; - - -enum smb_lpq_level {RAW_LPQ_GENERIC, RAW_LPQ_RETQ}; - -/* - union for lpq() backend -*/ -union smb_lpq { - /* generic interface */ - struct { - enum smb_lpq_level level; - - } generic; - - - /* SMBsplretq interface */ - struct { - enum smb_lpq_level level; - - struct { - uint16_t maxcount; - uint16_t startidx; - } in; - struct { - uint16_t count; - uint16_t restart_idx; - struct { - time_t time; - uint8_t status; - uint16_t job; - uint32_t size; - char *user; - } *queue; - } out; - } retq; -}; - -enum smb_ioctl_level {RAW_IOCTL_IOCTL, RAW_IOCTL_NTIOCTL}; - -/* - union for ioctl() backend -*/ -union smb_ioctl { - /* generic interface */ - struct { - enum smb_ioctl_level level; - - } generic; - - /* struct for SMBioctl */ - struct { - enum smb_ioctl_level level; - struct { - uint16_t fnum; - uint32_t request; - } in; - struct { - DATA_BLOB blob; - } out; - } ioctl; - - - /* struct for NT ioctl call */ - struct { - enum smb_ioctl_level level; - struct { - uint32_t function; - uint16_t fnum; - BOOL fsctl; - uint8_t filter; - } in; - struct { - DATA_BLOB blob; - } out; - } ntioctl; -}; - -/* struct for SMBflush */ -struct smb_flush { - struct { - uint16_t fnum; - } in; -}; - - -/* struct for SMBcopy */ -struct smb_copy { - struct { - uint16_t tid2; - uint16_t ofun; - uint16_t flags; - const char *path1; - const char *path2; - } in; - struct { - uint16_t count; - } out; -}; - - -/* struct for transact/transact2 call */ -struct smb_trans2 { - struct { - uint16_t max_param; - uint16_t max_data; - uint8_t max_setup; - uint16_t flags; - uint32_t timeout; - uint8_t setup_count; - uint16_t *setup; - const char *trans_name; /* SMBtrans only */ - DATA_BLOB params; - DATA_BLOB data; - } in; - - struct { - uint8_t setup_count; - uint16_t *setup; - DATA_BLOB params; - DATA_BLOB data; - } out; -}; - -/* struct for nttransact2 call */ -struct smb_nttrans { - struct { - uint8_t max_setup; - uint32_t max_param; - uint32_t max_data; - uint32_t setup_count; - uint16_t function; - uint16_t *setup; - DATA_BLOB params; - DATA_BLOB data; - } in; - - struct { - uint8_t setup_count; - uint16_t *setup; - DATA_BLOB params; - DATA_BLOB data; - } out; -}; - - -/* struct for nttrans change notify call */ -struct smb_notify { - struct { - uint32_t buffer_size; - uint32_t completion_filter; - uint16_t fnum; - BOOL recursive; - } in; - - struct { - uint32_t num_changes; - struct notify_changes { - uint32_t action; - WIRE_STRING name; - } *changes; - } out; -}; - - -enum smb_search_level {RAW_SEARCH_GENERIC = 0xF000, - RAW_SEARCH_SEARCH, /* SMBsearch */ - RAW_SEARCH_FFIRST, /* SMBffirst */ - RAW_SEARCH_FUNIQUE, /* SMBfunique */ - RAW_SEARCH_STANDARD = SMB_FIND_STANDARD, - RAW_SEARCH_EA_SIZE = SMB_FIND_EA_SIZE, - RAW_SEARCH_EA_LIST = SMB_FIND_EA_LIST, - 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_ID_FULL_DIRECTORY_INFO = SMB_FIND_ID_FULL_DIRECTORY_INFO, - RAW_SEARCH_ID_BOTH_DIRECTORY_INFO = SMB_FIND_ID_BOTH_DIRECTORY_INFO, - RAW_SEARCH_UNIX_INFO = SMB_FIND_UNIX_INFO}; - - -/* union for file search */ -union smb_search_first { - struct { - enum smb_search_level level; - } generic; - - /* search (old) findfirst interface. - Also used for ffirst and funique. */ - struct { - enum smb_search_level level; - - struct { - uint16_t max_count; - uint16_t search_attrib; - const char *pattern; - } in; - struct { - int16_t count; - } out; - } search_first; - - /* trans2 findfirst interface */ - struct { - enum smb_search_level level; - - struct { - uint16_t search_attrib; - uint16_t max_count; - uint16_t flags; - uint32_t storage_type; - const char *pattern; - - /* the ea names are only used for RAW_SEARCH_EA_LIST */ - uint_t num_names; - struct ea_name *ea_names; - } in; - struct { - uint16_t handle; - uint16_t count; - uint16_t end_of_search; - } out; - } t2ffirst; -}; - -/* union for file search continue */ -union smb_search_next { - struct { - enum smb_search_level level; - } generic; - - /* search (old) findnext interface. Also used - for ffirst when continuing */ - struct { - enum smb_search_level level; - - struct { - uint16_t max_count; - uint16_t search_attrib; - struct smb_search_id { - uint8_t reserved; - char name[11]; - uint8_t handle; - uint32_t server_cookie; - uint32_t client_cookie; - } id; - } in; - struct { - uint16_t count; - } out; - } search_next; - - /* trans2 findnext interface */ - struct { - enum smb_search_level level; - - struct { - uint16_t handle; - uint16_t max_count; - uint32_t resume_key; - uint16_t flags; - const char *last_name; - - /* the ea names are only used for RAW_SEARCH_EA_LIST */ - uint_t num_names; - struct ea_name *ea_names; - } in; - struct { - uint16_t count; - uint16_t end_of_search; - } out; - } t2fnext; -}; - -/* union for search reply file data */ -union smb_search_data { - /* search (old) findfirst */ - struct { - uint16_t attrib; - time_t write_time; - uint32_t size; - struct smb_search_id id; - const char *name; - } search; - - /* trans2 findfirst RAW_SEARCH_STANDARD level */ - struct { - uint32_t resume_key; - time_t create_time; - time_t access_time; - time_t write_time; - uint32_t size; - uint32_t alloc_size; - uint16_t attrib; - WIRE_STRING name; - } standard; - - /* trans2 findfirst RAW_SEARCH_EA_SIZE level */ - struct { - uint32_t resume_key; - time_t create_time; - time_t access_time; - time_t write_time; - uint32_t size; - uint32_t alloc_size; - uint16_t attrib; - uint32_t ea_size; - WIRE_STRING name; - } ea_size; - - /* trans2 findfirst RAW_SEARCH_EA_LIST level */ - struct { - uint32_t resume_key; - time_t create_time; - time_t access_time; - time_t write_time; - uint32_t size; - uint32_t alloc_size; - uint16_t attrib; - struct smb_ea_list eas; - WIRE_STRING name; - } ea_list; - - /* RAW_SEARCH_DIRECTORY_INFO interface */ - struct { - uint32_t file_index; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t size; - uint64_t alloc_size; - uint32_t attrib; - WIRE_STRING name; - } directory_info; - - /* RAW_SEARCH_FULL_DIRECTORY_INFO interface */ - struct { - uint32_t file_index; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t size; - uint64_t alloc_size; - uint32_t attrib; - uint32_t ea_size; - WIRE_STRING name; - } full_directory_info; - - /* RAW_SEARCH_NAME_INFO interface */ - struct { - uint32_t file_index; - WIRE_STRING name; - } name_info; - - /* RAW_SEARCH_BOTH_DIRECTORY_INFO interface */ - struct { - uint32_t file_index; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t size; - uint64_t alloc_size; - uint32_t attrib; - uint32_t ea_size; - WIRE_STRING short_name; - WIRE_STRING name; - } both_directory_info; - - /* RAW_SEARCH_ID_FULL_DIRECTORY_INFO interface */ - struct { - uint32_t file_index; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t size; - uint64_t alloc_size; - uint32_t attrib; - uint32_t ea_size; - uint64_t file_id; - WIRE_STRING name; - } id_full_directory_info; - - /* RAW_SEARCH_ID_BOTH_DIRECTORY_INFO interface */ - struct { - uint32_t file_index; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t size; - uint64_t alloc_size; - uint32_t attrib; - uint32_t ea_size; - uint64_t file_id; - WIRE_STRING short_name; - WIRE_STRING name; - } id_both_directory_info; - - /* RAW_SEARCH_UNIX_INFO interface */ - struct { - uint32_t file_index; - uint64_t size; - uint64_t alloc_size; - NTTIME status_change_time; - NTTIME access_time; - NTTIME change_time; - uint64_t uid; - uint64_t gid; - uint32_t file_type; - uint64_t dev_major; - uint64_t dev_minor; - uint64_t unique_id; - uint64_t permissions; - uint64_t nlink; - const char *name; - } unix_info; -}; - - -enum smb_search_close_level {RAW_FINDCLOSE_GENERIC, RAW_FINDCLOSE_FCLOSE, RAW_FINDCLOSE_FINDCLOSE}; - -/* union for file search close */ -union smb_search_close { - struct { - enum smb_search_close_level level; - } generic; - - /* SMBfclose (old search) interface */ - struct { - enum smb_search_close_level level; - - struct { - /* max_count and search_attrib are not used, but are present */ - uint16_t max_count; - uint16_t search_attrib; - struct smb_search_id id; - } in; - } fclose; - - /* SMBfindclose interface */ - struct { - enum smb_search_close_level level; - - struct { - uint16_t handle; - } in; - } findclose; -}; - diff --git a/source4/include/smb_macros.h b/source4/include/smb_macros.h index 356d968083..956b0709ca 100644 --- a/source4/include/smb_macros.h +++ b/source4/include/smb_macros.h @@ -1,6 +1,6 @@ /* Unix SMB/CIFS implementation. - SMB parameters and setup + Some convenient macros Copyright (C) Andrew Tridgell 1992-1999 Copyright (C) John H Terpstra 1996-1999 Copyright (C) Luke Kenneth Casson Leighton 1996-1999 diff --git a/source4/lib/mutex.h b/source4/lib/mutex.h new file mode 100644 index 0000000000..bb26c84f5d --- /dev/null +++ b/source4/lib/mutex.h @@ -0,0 +1,69 @@ +#ifndef _MUTEX_H_ +#define _MUTEX_H_ +/* + Unix SMB/CIFS implementation. + Samba mutex functions + Copyright (C) Andrew Tridgell 2003 + Copyright (C) James J Myers 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. +*/ + +/* To add a new read/write lock, add it to enum rwlock_id + */ +enum rwlock_id { RWLOCK_SMBD, /* global smbd lock */ + + RWLOCK_MAX /* this MUST be kept last */ +}; + +#define MUTEX_LOCK_BY_ID(mutex_index) smb_mutex_lock_by_id(mutex_index, #mutex_index) +#define MUTEX_UNLOCK_BY_ID(mutex_index) smb_mutex_unlock_by_id(mutex_index, #mutex_index) +#define MUTEX_INIT(mutex, name) smb_mutex_init(mutex, #name) +#define MUTEX_DESTROY(mutex, name) smb_mutex_destroy(mutex, #name) +#define MUTEX_LOCK(mutex, name) smb_mutex_lock(mutex, #name) +#define MUTEX_UNLOCK(mutex, name) smb_mutex_unlock(mutex, #name) + +#define RWLOCK_INIT(rwlock, name) smb_rwlock_init(rwlock, #name) +#define RWLOCK_DESTROY(rwlock, name) smb_rwlock_destroy(rwlock, #name) +#define RWLOCK_LOCK_WRITE(rwlock, name) smb_rwlock_lock_write(rwlock, #name) +#define RWLOCK_LOCK_READ(rwlock, name) smb_rwlock_lock_read(rwlock, #name) +#define RWLOCK_UNLOCK(rwlock, name) smb_rwlock_unlock(rwlock, #name) + + + +/* this null typedef ensures we get the types right and avoids the + pitfalls of void* */ +typedef struct smb_mutex { + void *mutex; +} smb_mutex_t; +typedef struct { + void *rwlock; +} smb_rwlock_t; + +/* the mutex model operations structure - contains function pointers to + the model-specific implementations of each operation */ +struct mutex_ops { + int (*mutex_init)(smb_mutex_t *mutex, const char *name); + int (*mutex_lock)(smb_mutex_t *mutex, const char *name); + int (*mutex_unlock)(smb_mutex_t *mutex, const char *name); + int (*mutex_destroy)(smb_mutex_t *mutex, const char *name); + int (*rwlock_init)(smb_rwlock_t *rwlock, const char *name); + int (*rwlock_lock_write)(smb_rwlock_t *rwlock, const char *name); + int (*rwlock_lock_read)(smb_rwlock_t *rwlock, const char *name); + int (*rwlock_unlock)(smb_rwlock_t *rwlock, const char *name); + int (*rwlock_destroy)(smb_rwlock_t *rwlock, const char *name); +}; + +#endif /* endif _MUTEX_H_ */ diff --git a/source4/libcli/raw/interfaces.h b/source4/libcli/raw/interfaces.h new file mode 100644 index 0000000000..49fe085f2c --- /dev/null +++ b/source4/libcli/raw/interfaces.h @@ -0,0 +1,2035 @@ +/* + Unix SMB/CIFS implementation. + SMB request interface structures + Copyright (C) Andrew Tridgell 2003 + Copyright (C) James J Myers 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. +*/ + + + +/* 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 other 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 in the structure definition. + */ +typedef struct { + uint32_t private_length; + const char *s; +} WIRE_STRING; + + +/* + use the same structure for dom_sid2 as dom_sid. A dom_sid2 is really + just a dom sid, but with the sub_auths represented as a conformant + array. As with all in-structure conformant arrays, the array length + is placed before the start of the structure. That's what gives rise + to the extra num_auths elemenent. We don't want the Samba code to + have to bother with such esoteric NDR details, so its easier to just + define it as a dom_sid and use pidl magic to make it all work. It + just means you need to mark a sid as a "dom_sid2" in the IDL when you + know it is of the conformant array variety +*/ +#define dom_sid2 dom_sid + +/* same struct as dom_sid but inside a 28 bytes fixed buffer in NDR */ +#define dom_sid28 dom_sid + + +/* + 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_t fnum; + uint16_t mode; + int32_t offset; /* signed */ + } in; + struct { + int32_t offset; + } out; +}; + + +/* struct used in unlink() call */ +struct smb_unlink { + struct { + const char *pattern; + uint16_t attrib; + } in; +}; + + +/* struct used in chkpath() call */ +struct smb_chkpath { + struct { + const char *path; + } in; +}; + +enum smb_mkdir_level {RAW_MKDIR_GENERIC, RAW_MKDIR_MKDIR, RAW_MKDIR_T2MKDIR}; + +/* union used in mkdir() call */ +union smb_mkdir { + /* generic level */ + struct { + enum smb_mkdir_level level; + } generic; + + struct { + enum smb_mkdir_level level; + struct { + const char *path; + } in; + } mkdir; + + struct { + enum smb_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 */ +enum smb_rename_level {RAW_RENAME_RENAME, RAW_RENAME_NTRENAME}; + +union smb_rename { + struct { + enum smb_rename_level level; + } generic; + + /* SMBrename interface */ + struct { + enum smb_rename_level level; + + struct { + const char *pattern1; + const char *pattern2; + uint16_t attrib; + } in; + } rename; + + + /* SMBntrename interface */ + struct { + enum smb_rename_level level; + + struct { + uint16_t attrib; + uint16_t flags; /* see RENAME_FLAG_* */ + uint32_t cluster_size; + const char *old_name; + const char *new_name; + } in; + } ntrename; +}; + +enum smb_tcon_level {RAW_TCON_TCON, RAW_TCON_TCONX}; + +/* union used in tree connect call */ +union smb_tcon { + /* generic interface */ + struct { + enum smb_tcon_level level; + } generic; + + /* SMBtcon interface */ + struct { + enum smb_tcon_level level; + + struct { + const char *service; + const char *password; + const char *dev; + } in; + struct { + uint16_t max_xmit; + uint16_t tid; + } out; + } tcon; + + /* SMBtconX interface */ + struct { + enum smb_tcon_level level; + + struct { + uint16_t flags; + DATA_BLOB password; + const char *path; + const char *device; + } in; + struct { + uint16_t options; + char *dev_type; + char *fs_type; + uint16_t tid; + } out; + } tconx; +}; + + +enum smb_sesssetup_level {RAW_SESSSETUP_OLD, RAW_SESSSETUP_NT1, RAW_SESSSETUP_SPNEGO}; + +/* union used in session_setup call */ +union smb_sesssetup { + /* the pre-NT1 interface */ + struct { + enum smb_sesssetup_level level; + + struct { + uint16_t bufsize; + uint16_t mpx_max; + uint16_t vc_num; + uint32_t sesskey; + DATA_BLOB password; + const char *user; + const char *domain; + const char *os; + const char *lanman; + } in; + struct { + uint16_t action; + uint16_t vuid; + char *os; + char *lanman; + char *domain; + } out; + } old; + + /* the NT1 interface */ + struct { + enum smb_sesssetup_level level; + + struct { + uint16_t bufsize; + uint16_t mpx_max; + uint16_t vc_num; + uint32_t sesskey; + uint32_t capabilities; + DATA_BLOB password1; + DATA_BLOB password2; + const char *user; + const char *domain; + const char *os; + const char *lanman; + } in; + struct { + uint16_t action; + uint16_t vuid; + char *os; + char *lanman; + char *domain; + } out; + } nt1; + + + /* the SPNEGO interface */ + struct { + enum smb_sesssetup_level level; + + struct { + uint16_t bufsize; + uint16_t mpx_max; + uint16_t vc_num; + uint32_t sesskey; + uint32_t capabilities; + DATA_BLOB secblob; + const char *os; + const char *lanman; + const char *workgroup; + } in; + struct { + uint16_t action; + DATA_BLOB secblob; + char *os; + char *lanman; + char *workgroup; + uint16_t vuid; + } out; + } spnego; +}; + +/* Note that the specified enum values are identical to the actual info-levels used + * on the wire. + */ +enum smb_fileinfo_level { + RAW_FILEINFO_GENERIC = 0xF000, + RAW_FILEINFO_GETATTR, /* SMBgetatr */ + RAW_FILEINFO_GETATTRE, /* SMBgetattrE */ + RAW_FILEINFO_SEC_DESC, /* NT_TRANSACT_QUERY_SECURITY_DESC */ + RAW_FILEINFO_STANDARD = SMB_QFILEINFO_STANDARD, + RAW_FILEINFO_EA_SIZE = SMB_QFILEINFO_EA_SIZE, + RAW_FILEINFO_EA_LIST = SMB_QFILEINFO_EA_LIST, + 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, + /* SMB2 specific levels */ + RAW_FILEINFO_SMB2_ALL_EAS = 0x0f01, + RAW_FILEINFO_SMB2_ALL_INFORMATION = 0x1201 +}; + +/* + file handles in SMB2 are 16 bytes +*/ +struct smb2_handle { + uint64_t data[2]; +}; + + +/* union used in qfileinfo() and qpathinfo() backend calls */ +union smb_fileinfo { + /* generic interface: + * matches RAW_FILEINFO_GENERIC */ + struct { + enum smb_fileinfo_level level; + + /* each level can be called on either a pathname or a + filename, in either case the return format is + identical + On SMB2 a 16 byte handle is used + */ + union smb_fileinfo_in { + const char *fname; + uint16_t fnum; + struct smb2_handle handle; + } in; + + struct { + uint32_t attrib; + uint32_t ea_size; + uint_t num_eas; + struct ea_struct { + uint8_t flags; + WIRE_STRING name; + DATA_BLOB value; + } *eas; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t alloc_size; + uint64_t size; + uint32_t nlink; + WIRE_STRING fname; + WIRE_STRING alt_fname; + uint8_t delete_pending; + uint8_t directory; + uint64_t compressed_size; + uint16_t format; + uint8_t unit_shift; + uint8_t chunk_shift; + uint8_t cluster_shift; + uint64_t file_id; + uint32_t access_flags; /* seen 0x001f01ff from w2k3 */ + uint64_t position; + uint32_t mode; + uint32_t alignment_requirement; + uint32_t reparse_tag; + uint_t num_streams; + struct stream_struct { + uint64_t size; + uint64_t alloc_size; + WIRE_STRING stream_name; + } *streams; + } out; + } generic; + + + /* SMBgetatr interface: + * matches RAW_FILEINFO_GETATTR */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint16_t attrib; + uint32_t size; + time_t write_time; + } out; + } getattr; + + /* SMBgetattrE and RAW_FILEINFO_STANDARD interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + time_t create_time; + time_t access_time; + time_t write_time; + uint32_t size; + uint32_t alloc_size; + uint16_t attrib; + } out; + } getattre, standard; + + /* trans2 RAW_FILEINFO_EA_SIZE interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + time_t create_time; + time_t access_time; + time_t write_time; + uint32_t size; + uint32_t alloc_size; + uint16_t attrib; + uint32_t ea_size; + } out; + } ea_size; + + /* trans2 RAW_FILEINFO_EA_LIST interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in file; + + struct { + uint_t num_names; + struct ea_name { + WIRE_STRING name; + } *ea_names; + } in; + + struct smb_ea_list { + uint_t num_eas; + struct ea_struct *eas; + } out; + } ea_list; + + /* trans2 RAW_FILEINFO_ALL_EAS and RAW_FILEINFO_FULL_EA_INFORMATION interfaces */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + uint8_t continue_flags; /* SMB2 only - SMB2_CONTINUE_FLAG_* */ + + struct smb_ea_list out; + } all_eas; + + /* trans2 qpathinfo RAW_FILEINFO_IS_NAME_VALID interface + only valid for a QPATHNAME call - no returned data */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + } is_name_valid; + + /* RAW_FILEINFO_BASIC_INFO and RAW_FILEINFO_BASIC_INFORMATION interfaces */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint32_t attrib; + } out; + } basic_info; + + + /* RAW_FILEINFO_STANDARD_INFO and RAW_FILEINFO_STANDARD_INFORMATION interfaces */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint64_t alloc_size; + uint64_t size; + uint32_t nlink; + BOOL delete_pending; + BOOL directory; + } out; + } standard_info; + + /* RAW_FILEINFO_EA_INFO and RAW_FILEINFO_EA_INFORMATION interfaces */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint32_t ea_size; + } out; + } ea_info; + + /* RAW_FILEINFO_NAME_INFO and RAW_FILEINFO_NAME_INFORMATION interfaces */ + struct { + enum smb_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 smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint32_t attrib; + uint64_t alloc_size; + uint64_t size; + uint32_t nlink; + uint8_t delete_pending; + uint8_t directory; + uint32_t ea_size; + WIRE_STRING fname; + } out; + } all_info; + + /* RAW_FILEINFO_SMB2_ALL_INFORMATION interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint32_t attrib; + uint32_t unknown1; + uint64_t alloc_size; + uint64_t size; + uint32_t nlink; + uint8_t delete_pending; + uint8_t directory; + /* uint16_t _pad; */ + uint64_t file_id; + uint32_t ea_size; + uint32_t access_mask; + uint64_t position; + uint64_t mode; + WIRE_STRING fname; + } out; + } all_info2; + + /* RAW_FILEINFO_ALT_NAME_INFO and RAW_FILEINFO_ALT_NAME_INFORMATION interfaces */ + struct { + enum smb_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 smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct stream_information { + uint_t num_streams; + struct stream_struct *streams; + } out; + } stream_info; + + /* RAW_FILEINFO_COMPRESSION_INFO and RAW_FILEINFO_COMPRESSION_INFORMATION interfaces */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint64_t compressed_size; + uint16_t format; + uint8_t unit_shift; + uint8_t chunk_shift; + uint8_t cluster_shift; + } out; + } compression_info; + + /* RAW_FILEINFO_UNIX_BASIC interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint64_t end_of_file; + uint64_t num_bytes; + NTTIME status_change_time; + NTTIME access_time; + NTTIME change_time; + uint64_t uid; + uint64_t gid; + uint32_t file_type; + uint64_t dev_major; + uint64_t dev_minor; + uint64_t unique_id; + uint64_t permissions; + uint64_t nlink; + } out; + } unix_basic_info; + + /* RAW_FILEINFO_UNIX_LINK interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + WIRE_STRING link_dest; + } out; + } unix_link_info; + + /* RAW_FILEINFO_INTERNAL_INFORMATION interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint64_t file_id; + } out; + } internal_information; + + /* RAW_FILEINFO_ACCESS_INFORMATION interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint32_t access_flags; + } out; + } access_information; + + /* RAW_FILEINFO_POSITION_INFORMATION interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint64_t position; + } out; + } position_information; + + /* RAW_FILEINFO_MODE_INFORMATION interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint32_t mode; + } out; + } mode_information; + + /* RAW_FILEINFO_ALIGNMENT_INFORMATION interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint32_t alignment_requirement; + } out; + } alignment_information; + + /* RAW_FILEINFO_NETWORK_OPEN_INFORMATION interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t alloc_size; + uint64_t size; + uint32_t attrib; + } out; + } network_open_information; + + + /* RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION interface */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + + struct { + uint32_t attrib; + uint32_t reparse_tag; + } out; + } attribute_tag_information; + + /* RAW_FILEINFO_SEC_DESC */ + struct { + enum smb_fileinfo_level level; + union smb_fileinfo_in in; + uint32_t secinfo_flags; + struct { + struct security_descriptor *sd; + } out; + } query_secdesc; +}; + + +enum smb_setfileinfo_level { + RAW_SFILEINFO_GENERIC = 0xF000, + RAW_SFILEINFO_SETATTR, /* SMBsetatr */ + RAW_SFILEINFO_SETATTRE, /* SMBsetattrE */ + RAW_SFILEINFO_SEC_DESC, /* NT_TRANSACT_SET_SECURITY_DESC */ + 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 smb_setfileinfo_level level; + + /* we are combining setfileinfo and setpathinfo into one + interface */ + union setfileinfo_file { + const char *fname; + uint16_t fnum; + struct smb2_handle handle; /* only for SMB2 */ + } file; + } generic; + + /* RAW_SFILEINFO_SETATTR (SMBsetatr) interface - only via setpathinfo() */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + struct { + uint16_t attrib; + time_t write_time; + } in; + } setattr; + + /* RAW_SFILEINFO_SETATTRE (SMBsetattrE) interface - only via setfileinfo() + also RAW_SFILEINFO_STANDARD */ + struct { + enum smb_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; + } setattre, standard; + + /* RAW_SFILEINFO_EA_SET interface */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + struct { + uint_t num_eas; + struct ea_struct *eas; + } in; + } ea_set; + + /* RAW_SFILEINFO_BASIC_INFO and + RAW_SFILEINFO_BASIC_INFORMATION interfaces */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + + struct { + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint32_t attrib; + } in; + } basic_info; + + /* RAW_SFILEINFO_DISPOSITION_INFO and + RAW_SFILEINFO_DISPOSITION_INFORMATION interfaces */ + struct { + enum smb_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 smb_setfileinfo_level level; + union setfileinfo_file file; + + struct { + /* w2k3 rounds this up to nearest 4096 */ + uint64_t alloc_size; + } in; + } allocation_info; + + /* RAW_SFILEINFO_END_OF_FILE_INFO and + RAW_SFILEINFO_END_OF_FILE_INFORMATION interfaces */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + + struct { + uint64_t size; + } in; + } end_of_file_info; + + /* RAW_SFILEINFO_RENAME_INFORMATION interface */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + + struct smb_rename_information { + uint8_t overwrite; + uint32_t root_fid; + const char *new_name; + } in; + } rename_information; + + /* RAW_SFILEINFO_POSITION_INFORMATION interface */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + + struct { + uint64_t position; + } in; + } position_information; + + /* RAW_SFILEINFO_MODE_INFORMATION interface */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + + struct { + /* valid values seem to be 0, 2, 4 and 6 */ + uint32_t mode; + } in; + } mode_information; + + + + /* RAW_SFILEINFO_UNIX_BASIC interface */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + struct { + uint32_t mode; /* yuck - this field remains to fix compile of libcli/clifile.c */ + uint64_t end_of_file; + uint64_t num_bytes; + NTTIME status_change_time; + NTTIME access_time; + NTTIME change_time; + uint64_t uid; + uint64_t gid; + uint32_t file_type; + uint64_t dev_major; + uint64_t dev_minor; + uint64_t unique_id; + uint64_t permissions; + uint64_t nlink; + } in; + } unix_basic; + + /* RAW_SFILEINFO_UNIX_LINK, RAW_SFILEINFO_UNIX_HLINK interface */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + struct { + const char *link_dest; + } in; + } unix_link, unix_hlink; + + /* RAW_FILEINFO_SET_SEC_DESC */ + struct { + enum smb_setfileinfo_level level; + union setfileinfo_file file; + struct { + uint32_t secinfo_flags; + struct security_descriptor *sd; + } in; + } set_secdesc; +}; + + +enum smb_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 smb_fsinfo_level level; + struct smb2_handle handle; /* only for smb2 */ + + struct { + uint32_t block_size; + uint64_t blocks_total; + uint64_t blocks_free; + uint32_t fs_id; + NTTIME create_time; + uint32_t serial_number; + uint32_t fs_attr; + uint32_t max_file_component_length; + uint32_t device_type; + uint32_t device_characteristics; + uint64_t quota_soft; + uint64_t quota_hard; + uint64_t quota_flags; + struct GUID guid; + char *volume_name; + char *fs_type; + } out; + } generic; + + /* SMBdskattr interface */ + struct { + enum smb_fsinfo_level level; + + struct { + uint16_t units_total; + uint16_t blocks_per_unit; + uint16_t block_size; + uint16_t units_free; + } out; + } dskattr; + + /* trans2 RAW_QFS_ALLOCATION interface */ + struct { + enum smb_fsinfo_level level; + + struct { + uint32_t fs_id; + uint32_t sectors_per_unit; + uint32_t total_alloc_units; + uint32_t avail_alloc_units; + uint16_t bytes_per_sector; + } out; + } allocation; + + /* TRANS2 RAW_QFS_VOLUME interface */ + struct { + enum smb_fsinfo_level level; + + struct { + uint32_t serial_number; + WIRE_STRING volume_name; + } out; + } volume; + + /* TRANS2 RAW_QFS_VOLUME_INFO and RAW_QFS_VOLUME_INFORMATION interfaces */ + struct { + enum smb_fsinfo_level level; + struct smb2_handle handle; /* only for smb2 */ + + struct { + NTTIME create_time; + uint32_t serial_number; + WIRE_STRING volume_name; + } out; + } volume_info; + + /* trans2 RAW_QFS_SIZE_INFO and RAW_QFS_SIZE_INFORMATION interfaces */ + struct { + enum smb_fsinfo_level level; + struct smb2_handle handle; /* only for smb2 */ + + struct { + uint64_t total_alloc_units; + uint64_t avail_alloc_units; /* maps to call_avail_alloc_units */ + uint32_t sectors_per_unit; + uint32_t bytes_per_sector; + } out; + } size_info; + + /* TRANS2 RAW_QFS_DEVICE_INFO and RAW_QFS_DEVICE_INFORMATION interfaces */ + struct { + enum smb_fsinfo_level level; + struct smb2_handle handle; /* only for smb2 */ + + struct { + uint32_t device_type; + uint32_t characteristics; + } out; + } device_info; + + + /* TRANS2 RAW_QFS_ATTRIBUTE_INFO and RAW_QFS_ATTRIBUTE_INFORMATION interfaces */ + struct { + enum smb_fsinfo_level level; + struct smb2_handle handle; /* only for smb2 */ + + struct { + uint32_t fs_attr; + uint32_t max_file_component_length; + WIRE_STRING fs_type; + } out; + } attribute_info; + + + /* TRANS2 RAW_QFS_UNIX_INFO interface */ + struct { + enum smb_fsinfo_level level; + + struct { + uint16_t major_version; + uint16_t minor_version; + uint64_t capability; + } out; + } unix_info; + + /* trans2 RAW_QFS_QUOTA_INFORMATION interface */ + struct { + enum smb_fsinfo_level level; + struct smb2_handle handle; /* only for smb2 */ + + struct { + uint64_t unknown[3]; + uint64_t quota_soft; + uint64_t quota_hard; + uint64_t quota_flags; + } out; + } quota_information; + + /* trans2 RAW_QFS_FULL_SIZE_INFORMATION interface */ + struct { + enum smb_fsinfo_level level; + struct smb2_handle handle; /* only for smb2 */ + + struct { + uint64_t total_alloc_units; + uint64_t call_avail_alloc_units; + uint64_t actual_avail_alloc_units; + uint32_t sectors_per_unit; + uint32_t bytes_per_sector; + } out; + } full_size_information; + + /* trans2 RAW_QFS_OBJECTID_INFORMATION interface */ + struct { + enum smb_fsinfo_level level; + struct smb2_handle handle; /* only for smb2 */ + + struct { + struct GUID guid; + uint64_t unknown[6]; + } out; + } objectid_information; +}; + + + +enum smb_open_level { + RAW_OPEN_OPEN, RAW_OPEN_OPENX, + RAW_OPEN_MKNEW, RAW_OPEN_CREATE, + RAW_OPEN_CTEMP, RAW_OPEN_SPLOPEN, + RAW_OPEN_NTCREATEX, RAW_OPEN_T2OPEN, + RAW_OPEN_NTTRANS_CREATE, + RAW_OPEN_OPENX_READX}; + +/* 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 smb_open_level level; + + struct { + uint32_t flags; + uint32_t root_fid; + uint32_t access_mask; + uint64_t alloc_size; + uint32_t file_attr; + uint32_t share_access; + uint32_t open_disposition; + uint32_t create_options; + uint32_t impersonation; + uint8_t security_flags; + /* NOTE: fname can also be a pointer to a + uint64_t file_id if create_options has the + NTCREATEX_OPTIONS_OPEN_BY_FILE_ID flag set */ + const char *fname; + + /* these last 2 elements are only used in the + NTTRANS varient of the call */ + struct security_descriptor *sec_desc; + struct smb_ea_list *ea_list; + } in; + + struct { + uint8_t oplock_level; + uint16_t fnum; + uint32_t create_action; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint32_t attrib; + uint64_t alloc_size; + uint64_t size; + uint16_t file_type; + uint16_t ipc_state; + uint8_t is_directory; + } out; + } ntcreatex, generic; + + /* TRANS2_OPEN interface */ + struct { + enum smb_open_level level; + + struct { + uint16_t flags; + uint16_t open_mode; + uint16_t search_attrs; + uint16_t file_attrs; + time_t write_time; + uint16_t open_func; + uint32_t size; + uint32_t timeout; + const char *fname; + uint_t num_eas; + struct ea_struct *eas; + } in; + + struct { + uint16_t fnum; + uint16_t attrib; + time_t write_time; + uint32_t size; + uint16_t access; + uint16_t ftype; + uint16_t devstate; + uint16_t action; + uint32_t file_id; + } out; + } t2open; + + /* SMBopen interface */ + struct { + enum smb_open_level level; + + struct { + uint16_t open_mode; + uint16_t search_attrs; + const char *fname; + } in; + struct { + uint16_t fnum; + uint16_t attrib; + time_t write_time; + uint32_t size; + uint16_t rmode; + } out; + } openold; + + /* SMBopenX interface */ + struct { + enum smb_open_level level; + + struct { + uint16_t flags; + uint16_t open_mode; + uint16_t search_attrs; /* not honoured by win2003 */ + uint16_t file_attrs; + time_t write_time; /* not honoured by win2003 */ + uint16_t open_func; + uint32_t size; /* note that this sets the + initial file size, not + just allocation size */ + uint32_t timeout; /* not honoured by win2003 */ + const char *fname; + } in; + struct { + uint16_t fnum; + uint16_t attrib; + time_t write_time; + uint32_t size; + uint16_t access; + uint16_t ftype; + uint16_t devstate; + uint16_t action; + uint32_t unique_fid; + uint32_t access_mask; + uint32_t unknown; + } out; + } openx; + + /* SMBmknew interface */ + struct { + enum smb_open_level level; + + struct { + uint16_t attrib; + time_t write_time; + const char *fname; + } in; + struct { + uint16_t fnum; + } out; + } mknew, create; + + /* SMBctemp interface */ + struct { + enum smb_open_level level; + + struct { + uint16_t attrib; + time_t write_time; + const char *directory; + } in; + struct { + uint16_t fnum; + /* temp name, relative to directory */ + char *name; + } out; + } ctemp; + + /* SMBsplopen interface */ + struct { + enum smb_open_level level; + + struct { + uint16_t setup_length; + uint16_t mode; + const char *ident; + } in; + struct { + uint16_t fnum; + } out; + } splopen; + + + /* chained OpenX/ReadX interface */ + struct { + enum smb_open_level level; + + struct { + uint16_t flags; + uint16_t open_mode; + uint16_t search_attrs; /* not honoured by win2003 */ + uint16_t file_attrs; + time_t write_time; /* not honoured by win2003 */ + uint16_t open_func; + uint32_t size; /* note that this sets the + initial file size, not + just allocation size */ + uint32_t timeout; /* not honoured by win2003 */ + const char *fname; + + /* readx part */ + uint64_t offset; + uint16_t mincnt; + uint32_t maxcnt; + uint16_t remaining; + } in; + struct { + uint16_t fnum; + uint16_t attrib; + time_t write_time; + uint32_t size; + uint16_t access; + uint16_t ftype; + uint16_t devstate; + uint16_t action; + uint32_t unique_fid; + uint32_t access_mask; + uint32_t unknown; + + /* readx part */ + uint8_t *data; + uint16_t remaining; + uint16_t compaction_mode; + uint16_t nread; + } out; + } openxreadx; +}; + + + +enum smb_read_level {RAW_READ_READBRAW, RAW_READ_LOCKREAD, RAW_READ_READ, RAW_READ_READX}; + +#define RAW_READ_GENERIC 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 { + /* SMBreadX (and generic) interface */ + struct { + enum smb_read_level level; + + struct { + uint16_t fnum; + uint64_t offset; + uint16_t mincnt; + uint32_t maxcnt; + uint16_t remaining; + } in; + struct { + uint8_t *data; + uint16_t remaining; + uint16_t compaction_mode; + uint16_t nread; + } out; + } readx, generic; + + /* SMBreadbraw interface */ + struct { + enum smb_read_level level; + + struct { + uint16_t fnum; + uint64_t offset; + uint16_t maxcnt; + uint16_t mincnt; + uint32_t timeout; + } in; + struct { + uint8_t *data; + uint32_t nread; + } out; + } readbraw; + + + /* SMBlockandread interface */ + struct { + enum smb_read_level level; + + struct { + uint16_t fnum; + uint16_t count; + uint32_t offset; + uint16_t remaining; + } in; + struct { + uint8_t *data; + uint16_t nread; + } out; + } lockread; + + /* SMBread interface */ + struct { + enum smb_read_level level; + + struct { + uint16_t fnum; + uint16_t count; + uint32_t offset; + uint16_t remaining; + } in; + struct { + uint8_t *data; + uint16_t nread; + } out; + } read; +}; + + +enum smb_write_level {RAW_WRITE_WRITEUNLOCK, RAW_WRITE_WRITE, + RAW_WRITE_WRITEX, RAW_WRITE_WRITECLOSE, + RAW_WRITE_SPLWRITE}; + +#define RAW_WRITE_GENERIC RAW_WRITE_WRITEX + +/* union for write() backend call +*/ +union smb_write { + /* SMBwriteX interface */ + struct { + enum smb_write_level level; + + struct { + uint16_t fnum; + uint64_t offset; + uint16_t wmode; + uint16_t remaining; + uint32_t count; + const uint8_t *data; + } in; + struct { + uint32_t nwritten; + uint16_t remaining; + } out; + } writex, generic; + + /* SMBwriteunlock interface */ + struct { + enum smb_write_level level; + + struct { + uint16_t fnum; + uint16_t count; + uint32_t offset; + uint16_t remaining; + const uint8_t *data; + } in; + struct { + uint32_t nwritten; + } out; + } writeunlock; + + /* SMBwrite interface */ + struct { + enum smb_write_level level; + + struct { + uint16_t fnum; + uint16_t count; + uint32_t offset; + uint16_t remaining; + const uint8_t *data; + } in; + struct { + uint16_t nwritten; + } out; + } write; + + /* SMBwriteclose interface */ + struct { + enum smb_write_level level; + + struct { + uint16_t fnum; + uint16_t count; + uint32_t offset; + time_t mtime; + const uint8_t *data; + } in; + struct { + uint16_t nwritten; + } out; + } writeclose; + + /* SMBsplwrite interface */ + struct { + enum smb_write_level level; + + struct { + uint16_t fnum; + uint16_t count; + const uint8_t *data; + } in; + } splwrite; +}; + + +enum smb_lock_level {RAW_LOCK_LOCK, RAW_LOCK_UNLOCK, RAW_LOCK_LOCKX}; + +/* the generic interface is defined to be equal to the lockingX interface */ +#define RAW_LOCK_GENERIC RAW_LOCK_LOCKX + +/* union for lock() backend call +*/ +union smb_lock { + /* SMBlockingX (and generic) interface */ + struct { + enum smb_lock_level level; + + struct { + uint16_t fnum; + uint16_t mode; + uint32_t timeout; + uint16_t ulock_cnt; + uint16_t lock_cnt; + struct smb_lock_entry { + uint16_t pid; + uint64_t offset; + uint64_t count; + } *locks; /* unlocks are first in the arrray */ + } in; + } lockx, generic; + + /* SMBlock and SMBunlock interface */ + struct { + enum smb_lock_level level; + + struct { + uint16_t fnum; + uint32_t count; + uint32_t offset; + } in; + } lock, unlock; +}; + + +enum smb_close_level {RAW_CLOSE_CLOSE, RAW_CLOSE_SPLCLOSE}; + +#define RAW_CLOSE_GENERIC RAW_CLOSE_CLOSE + +/* + union for close() backend call +*/ +union smb_close { + /* SMBclose (and generic) interface */ + struct { + enum smb_close_level level; + + struct { + uint16_t fnum; + time_t write_time; + } in; + } close, generic; + + /* SMBsplclose interface - empty! */ + struct { + enum smb_close_level level; + + struct { + uint16_t fnum; + } in; + } splclose; +}; + + +enum smb_lpq_level {RAW_LPQ_GENERIC, RAW_LPQ_RETQ}; + +/* + union for lpq() backend +*/ +union smb_lpq { + /* generic interface */ + struct { + enum smb_lpq_level level; + + } generic; + + + /* SMBsplretq interface */ + struct { + enum smb_lpq_level level; + + struct { + uint16_t maxcount; + uint16_t startidx; + } in; + struct { + uint16_t count; + uint16_t restart_idx; + struct { + time_t time; + uint8_t status; + uint16_t job; + uint32_t size; + char *user; + } *queue; + } out; + } retq; +}; + +enum smb_ioctl_level {RAW_IOCTL_IOCTL, RAW_IOCTL_NTIOCTL}; + +/* + union for ioctl() backend +*/ +union smb_ioctl { + /* generic interface */ + struct { + enum smb_ioctl_level level; + + } generic; + + /* struct for SMBioctl */ + struct { + enum smb_ioctl_level level; + struct { + uint16_t fnum; + uint32_t request; + } in; + struct { + DATA_BLOB blob; + } out; + } ioctl; + + + /* struct for NT ioctl call */ + struct { + enum smb_ioctl_level level; + struct { + uint32_t function; + uint16_t fnum; + BOOL fsctl; + uint8_t filter; + } in; + struct { + DATA_BLOB blob; + } out; + } ntioctl; +}; + +/* struct for SMBflush */ +struct smb_flush { + struct { + uint16_t fnum; + } in; +}; + + +/* struct for SMBcopy */ +struct smb_copy { + struct { + uint16_t tid2; + uint16_t ofun; + uint16_t flags; + const char *path1; + const char *path2; + } in; + struct { + uint16_t count; + } out; +}; + + +/* struct for transact/transact2 call */ +struct smb_trans2 { + struct { + uint16_t max_param; + uint16_t max_data; + uint8_t max_setup; + uint16_t flags; + uint32_t timeout; + uint8_t setup_count; + uint16_t *setup; + const char *trans_name; /* SMBtrans only */ + DATA_BLOB params; + DATA_BLOB data; + } in; + + struct { + uint8_t setup_count; + uint16_t *setup; + DATA_BLOB params; + DATA_BLOB data; + } out; +}; + +/* struct for nttransact2 call */ +struct smb_nttrans { + struct { + uint8_t max_setup; + uint32_t max_param; + uint32_t max_data; + uint32_t setup_count; + uint16_t function; + uint16_t *setup; + DATA_BLOB params; + DATA_BLOB data; + } in; + + struct { + uint8_t setup_count; + uint16_t *setup; + DATA_BLOB params; + DATA_BLOB data; + } out; +}; + + +/* struct for nttrans change notify call */ +struct smb_notify { + struct { + uint32_t buffer_size; + uint32_t completion_filter; + uint16_t fnum; + BOOL recursive; + } in; + + struct { + uint32_t num_changes; + struct notify_changes { + uint32_t action; + WIRE_STRING name; + } *changes; + } out; +}; + + +enum smb_search_level {RAW_SEARCH_GENERIC = 0xF000, + RAW_SEARCH_SEARCH, /* SMBsearch */ + RAW_SEARCH_FFIRST, /* SMBffirst */ + RAW_SEARCH_FUNIQUE, /* SMBfunique */ + RAW_SEARCH_STANDARD = SMB_FIND_STANDARD, + RAW_SEARCH_EA_SIZE = SMB_FIND_EA_SIZE, + RAW_SEARCH_EA_LIST = SMB_FIND_EA_LIST, + 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_ID_FULL_DIRECTORY_INFO = SMB_FIND_ID_FULL_DIRECTORY_INFO, + RAW_SEARCH_ID_BOTH_DIRECTORY_INFO = SMB_FIND_ID_BOTH_DIRECTORY_INFO, + RAW_SEARCH_UNIX_INFO = SMB_FIND_UNIX_INFO}; + + +/* union for file search */ +union smb_search_first { + struct { + enum smb_search_level level; + } generic; + + /* search (old) findfirst interface. + Also used for ffirst and funique. */ + struct { + enum smb_search_level level; + + struct { + uint16_t max_count; + uint16_t search_attrib; + const char *pattern; + } in; + struct { + int16_t count; + } out; + } search_first; + + /* trans2 findfirst interface */ + struct { + enum smb_search_level level; + + struct { + uint16_t search_attrib; + uint16_t max_count; + uint16_t flags; + uint32_t storage_type; + const char *pattern; + + /* the ea names are only used for RAW_SEARCH_EA_LIST */ + uint_t num_names; + struct ea_name *ea_names; + } in; + struct { + uint16_t handle; + uint16_t count; + uint16_t end_of_search; + } out; + } t2ffirst; +}; + +/* union for file search continue */ +union smb_search_next { + struct { + enum smb_search_level level; + } generic; + + /* search (old) findnext interface. Also used + for ffirst when continuing */ + struct { + enum smb_search_level level; + + struct { + uint16_t max_count; + uint16_t search_attrib; + struct smb_search_id { + uint8_t reserved; + char name[11]; + uint8_t handle; + uint32_t server_cookie; + uint32_t client_cookie; + } id; + } in; + struct { + uint16_t count; + } out; + } search_next; + + /* trans2 findnext interface */ + struct { + enum smb_search_level level; + + struct { + uint16_t handle; + uint16_t max_count; + uint32_t resume_key; + uint16_t flags; + const char *last_name; + + /* the ea names are only used for RAW_SEARCH_EA_LIST */ + uint_t num_names; + struct ea_name *ea_names; + } in; + struct { + uint16_t count; + uint16_t end_of_search; + } out; + } t2fnext; +}; + +/* union for search reply file data */ +union smb_search_data { + /* search (old) findfirst */ + struct { + uint16_t attrib; + time_t write_time; + uint32_t size; + struct smb_search_id id; + const char *name; + } search; + + /* trans2 findfirst RAW_SEARCH_STANDARD level */ + struct { + uint32_t resume_key; + time_t create_time; + time_t access_time; + time_t write_time; + uint32_t size; + uint32_t alloc_size; + uint16_t attrib; + WIRE_STRING name; + } standard; + + /* trans2 findfirst RAW_SEARCH_EA_SIZE level */ + struct { + uint32_t resume_key; + time_t create_time; + time_t access_time; + time_t write_time; + uint32_t size; + uint32_t alloc_size; + uint16_t attrib; + uint32_t ea_size; + WIRE_STRING name; + } ea_size; + + /* trans2 findfirst RAW_SEARCH_EA_LIST level */ + struct { + uint32_t resume_key; + time_t create_time; + time_t access_time; + time_t write_time; + uint32_t size; + uint32_t alloc_size; + uint16_t attrib; + struct smb_ea_list eas; + WIRE_STRING name; + } ea_list; + + /* RAW_SEARCH_DIRECTORY_INFO interface */ + struct { + uint32_t file_index; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t size; + uint64_t alloc_size; + uint32_t attrib; + WIRE_STRING name; + } directory_info; + + /* RAW_SEARCH_FULL_DIRECTORY_INFO interface */ + struct { + uint32_t file_index; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t size; + uint64_t alloc_size; + uint32_t attrib; + uint32_t ea_size; + WIRE_STRING name; + } full_directory_info; + + /* RAW_SEARCH_NAME_INFO interface */ + struct { + uint32_t file_index; + WIRE_STRING name; + } name_info; + + /* RAW_SEARCH_BOTH_DIRECTORY_INFO interface */ + struct { + uint32_t file_index; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t size; + uint64_t alloc_size; + uint32_t attrib; + uint32_t ea_size; + WIRE_STRING short_name; + WIRE_STRING name; + } both_directory_info; + + /* RAW_SEARCH_ID_FULL_DIRECTORY_INFO interface */ + struct { + uint32_t file_index; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t size; + uint64_t alloc_size; + uint32_t attrib; + uint32_t ea_size; + uint64_t file_id; + WIRE_STRING name; + } id_full_directory_info; + + /* RAW_SEARCH_ID_BOTH_DIRECTORY_INFO interface */ + struct { + uint32_t file_index; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t size; + uint64_t alloc_size; + uint32_t attrib; + uint32_t ea_size; + uint64_t file_id; + WIRE_STRING short_name; + WIRE_STRING name; + } id_both_directory_info; + + /* RAW_SEARCH_UNIX_INFO interface */ + struct { + uint32_t file_index; + uint64_t size; + uint64_t alloc_size; + NTTIME status_change_time; + NTTIME access_time; + NTTIME change_time; + uint64_t uid; + uint64_t gid; + uint32_t file_type; + uint64_t dev_major; + uint64_t dev_minor; + uint64_t unique_id; + uint64_t permissions; + uint64_t nlink; + const char *name; + } unix_info; +}; + + +enum smb_search_close_level {RAW_FINDCLOSE_GENERIC, RAW_FINDCLOSE_FCLOSE, RAW_FINDCLOSE_FINDCLOSE}; + +/* union for file search close */ +union smb_search_close { + struct { + enum smb_search_close_level level; + } generic; + + /* SMBfclose (old search) interface */ + struct { + enum smb_search_close_level level; + + struct { + /* max_count and search_attrib are not used, but are present */ + uint16_t max_count; + uint16_t search_attrib; + struct smb_search_id id; + } in; + } fclose; + + /* SMBfindclose interface */ + struct { + enum smb_search_close_level level; + + struct { + uint16_t handle; + } in; + } findclose; +}; + -- cgit