Store sendfile capability per-fsp.
[jpeach/samba.git] / source / include / smb.h
index 36d8cd318de30506669044619df86c4d7819495f..d0df005f5443388239e1b6b9f26946005dc0e4ec 100644 (file)
@@ -28,7 +28,7 @@
 #define _SMB_H
 
 /* logged when starting the various Samba daemons */
-#define COPYRIGHT_STARTUP_MESSAGE      "Copyright Andrew Tridgell and the Samba Team 1992-2006"
+#define COPYRIGHT_STARTUP_MESSAGE      "Copyright Andrew Tridgell and the Samba Team 1992-2007"
 
 
 #if defined(LARGE_SMB_OFF_T)
 #define Auto (2)
 #define Required (3)
 
-#ifndef _BOOL
-typedef int BOOL;
-#define _BOOL       /* So we don't typedef BOOL again in vfs.h */
-#endif
-
 #define SIZEOFWORD 2
 
 #ifndef DEF_CREATE_MASK
@@ -138,13 +133,6 @@ typedef int BOOL;
 #define OPENX_FILE_CREATE_IF_NOT_EXIST 0x10
 #define OPENX_FILE_FAIL_IF_NOT_EXIST 0
 
-/* share types */
-#define STYPE_DISKTREE  0      /* Disk drive */
-#define STYPE_PRINTQ    1      /* Spooler queue */
-#define STYPE_DEVICE    2      /* Serial device */
-#define STYPE_IPC       3      /* Interprocess communication (IPC) */
-#define STYPE_HIDDEN    0x80000000 /* share is a hidden one (ends with $) */
-
 #include "doserr.h"
 
 typedef union unid_t {
@@ -173,12 +161,16 @@ typedef smb_ucs2_t wfstring[FSTRING_LEN];
 #define UCS2_CHAR(c) ((c) << UCS2_SHIFT)
 
 /* return an ascii version of a ucs2 character */
-#define UCS2_TO_CHAR(c) ((c) & 0xff)
+#define UCS2_TO_CHAR(c) (((c) >> UCS2_SHIFT) & 0xff)
 
 /* Copy into a smb_ucs2_t from a possibly unaligned buffer. Return the copied smb_ucs2_t */
 #define COPY_UCS2_CHAR(dest,src) (((unsigned char *)(dest))[0] = ((unsigned char *)(src))[0],\
                                ((unsigned char *)(dest))[1] = ((unsigned char *)(src))[1], (dest))
 
+/* Large data type for manipulating uint32 unicode codepoints */
+typedef uint32 codepoint_t;
+#define INVALID_CODEPOINT ((codepoint_t)-1)
+
 /* pipe string names */
 #define PIPE_LANMAN   "\\PIPE\\LANMAN"
 #define PIPE_SRVSVC   "\\PIPE\\srvsvc"
@@ -217,34 +209,33 @@ typedef smb_ucs2_t wfstring[FSTRING_LEN];
 #define PI_MAX_PIPES           14
 
 /* 64 bit time (100usec) since ????? - cifs6.txt, section 3.5, page 30 */
-typedef struct nttime_info {
-       uint32 low;
-       uint32 high;
-} NTTIME;
+typedef uint64_t NTTIME;
 
 
 /* Allowable account control bits */
-#define ACB_DISABLED   0x0001  /* 1 = User account disabled */
-#define ACB_HOMDIRREQ  0x0002  /* 1 = Home directory required */
-#define ACB_PWNOTREQ   0x0004  /* 1 = User password not required */
-#define ACB_TEMPDUP    0x0008  /* 1 = Temporary duplicate account */
-#define ACB_NORMAL     0x0010  /* 1 = Normal user account */
-#define ACB_MNS        0x0020  /* 1 = MNS logon user account */
-#define ACB_DOMTRUST   0x0040  /* 1 = Interdomain trust account */
-#define ACB_WSTRUST    0x0080  /* 1 = Workstation trust account */
-#define ACB_SVRTRUST   0x0100  /* 1 = Server trust account (BDC) */
-#define ACB_PWNOEXP    0x0200  /* 1 = User password does not expire */
-#define ACB_AUTOLOCK   0x0400  /* 1 = Account auto locked */
-#define MAX_HOURS_LEN 32
-
-/* 
- * window during which we must talk to the PDC to avoid
- * sam sync delays; expressed in seconds (15 minutes is the 
- * default period for SAM replication under Windows NT 4.0
- */
-#define SAM_SYNC_WINDOW                900
+#define ACB_DISABLED                   0x00000001  /* 1 = User account disabled */
+#define ACB_HOMDIRREQ                  0x00000002  /* 1 = Home directory required */
+#define ACB_PWNOTREQ                   0x00000004  /* 1 = User password not required */
+#define ACB_TEMPDUP                    0x00000008  /* 1 = Temporary duplicate account */
+#define ACB_NORMAL                     0x00000010  /* 1 = Normal user account */
+#define ACB_MNS                                0x00000020  /* 1 = MNS logon user account */
+#define ACB_DOMTRUST                   0x00000040  /* 1 = Interdomain trust account */
+#define ACB_WSTRUST                    0x00000080  /* 1 = Workstation trust account */
+#define ACB_SVRTRUST                   0x00000100  /* 1 = Server trust account (BDC) */
+#define ACB_PWNOEXP                    0x00000200  /* 1 = User password does not expire */
+#define ACB_AUTOLOCK                   0x00000400  /* 1 = Account auto locked */
+
+/* only valid for > Windows 2000 */
+#define ACB_ENC_TXT_PWD_ALLOWED                0x00000800  /* 1 = Text password encryped */
+#define ACB_SMARTCARD_REQUIRED         0x00001000  /* 1 = Smart Card required */
+#define ACB_TRUSTED_FOR_DELEGATION     0x00002000  /* 1 = Trusted for Delegation */
+#define ACB_NOT_DELEGATED              0x00004000  /* 1 = Not delegated */
+#define ACB_USE_DES_KEY_ONLY           0x00008000  /* 1 = Use DES key only */
+#define ACB_DONT_REQUIRE_PREAUTH       0x00010000  /* 1 = Preauth not required */
+#define ACB_PWEXPIRED                  0x00020000  /* 1 = Password is expired */
+#define ACB_NO_AUTH_DATA_REQD          0x00080000  /* 1 = No authorization data required */
 
+#define MAX_HOURS_LEN 32
 
 #ifndef MAXSUBAUTHS
 #define MAXSUBAUTHS 15 /* max sub authorities in a SID */
@@ -253,8 +244,7 @@ typedef struct nttime_info {
 #define SID_MAX_SIZE ((size_t)(8+(MAXSUBAUTHS*4)))
 
 /* SID Types */
-enum SID_NAME_USE
-{
+enum lsa_SidType {
        SID_NAME_USE_NONE = 0,
        SID_NAME_USER    = 1, /* user */
        SID_NAME_DOM_GRP,     /* domain group */
@@ -267,26 +257,78 @@ enum SID_NAME_USE
        SID_NAME_COMPUTER     /* sid for a computer */
 };
 
+#define LOOKUP_NAME_ISOLATED 1 /* Look up unqualified names */
+#define LOOKUP_NAME_REMOTE   2  /* Ask others */
+#define LOOKUP_NAME_ALL (LOOKUP_NAME_ISOLATED|LOOKUP_NAME_REMOTE)
+
+#define LOOKUP_NAME_GROUP    4  /* (unused) This is a NASTY hack for valid users = @foo
+                                * where foo also exists in as user. */
+
 /**
  * @brief Security Identifier
  *
  * @sa http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/accctrl_38yn.asp
  **/
-typedef struct sid_info
-{
-  uint8  sid_rev_num;             /**< SID revision number */
-  uint8  num_auths;               /**< Number of sub-authorities */
-  uint8  id_auth[6];              /**< Identifier Authority */
-  /*
-   *  Pointer to sub-authorities.
-   *
-   * @note The values in these uint32's are in *native* byteorder, not
-   * neccessarily little-endian...... JRA.
-   */
-  uint32 sub_auths[MAXSUBAUTHS];  
-
+typedef struct dom_sid {
+       uint8  sid_rev_num;             /**< SID revision number */
+       uint8  num_auths;               /**< Number of sub-authorities */
+       uint8  id_auth[6];              /**< Identifier Authority */
+       /*
+        *  Pointer to sub-authorities.
+        *
+        * @note The values in these uint32's are in *native* byteorder, not
+        * neccessarily little-endian...... JRA.
+        */
+       uint32 sub_auths[MAXSUBAUTHS];  
 } DOM_SID;
 
+#define dom_sid2 dom_sid
+#define dom_sid28 dom_sid
+
+enum id_mapping {
+       ID_UNKNOWN = 0,
+       ID_MAPPED,
+       ID_UNMAPPED,
+       ID_EXPIRED
+};
+
+enum id_type {
+       ID_TYPE_NOT_SPECIFIED = 0,
+       ID_TYPE_UID,
+       ID_TYPE_GID
+};
+
+struct unixid {
+       uint32_t id;
+       enum id_type type;
+};
+
+struct id_map {
+       DOM_SID *sid;
+       struct unixid xid;
+       enum id_mapping status;
+};
+
+#include "librpc/ndr/misc.h"
+#include "librpc/ndr/security.h"
+#include "librpc/ndr/libndr.h"
+#include "librpc/gen_ndr/wkssvc.h"
+
+struct lsa_dom_info {
+       BOOL valid;
+       DOM_SID sid;
+       const char *name;
+       int num_idxs;
+       int *idxs;
+};
+
+struct lsa_name_info {
+       uint32 rid;
+       enum lsa_SidType type;
+       const char *name;
+       int dom_idx;
+};
+
 /* Some well-known SIDs */
 extern const DOM_SID global_sid_World_Domain;
 extern const DOM_SID global_sid_World;
@@ -309,6 +351,9 @@ extern const DOM_SID global_sid_Builtin_Server_Operators;
 extern const DOM_SID global_sid_Builtin_Print_Operators;
 extern const DOM_SID global_sid_Builtin_Backup_Operators;
 extern const DOM_SID global_sid_Builtin_Replicator;
+extern const DOM_SID global_sid_Builtin_PreWin2kAccess;
+extern const DOM_SID global_sid_Unix_Users;
+extern const DOM_SID global_sid_Unix_Groups;
 
 /*
  * The complete list of SIDS belonging to this user.
@@ -323,59 +368,22 @@ extern const DOM_SID global_sid_Builtin_Replicator;
 #define PRIMARY_USER_SID_INDEX 0
 #define PRIMARY_GROUP_SID_INDEX 1
 
-typedef struct _nt_user_token {
+typedef struct nt_user_token {
        size_t num_sids;
        DOM_SID *user_sids;
        SE_PRIV privileges;
 } NT_USER_TOKEN;
 
-/*** query a local group, get a list of these: shows who is in that group ***/
-
-/* local group member info */
-typedef struct local_grp_member_info
-{
-       DOM_SID sid    ; /* matches with name */
-       uint8   sid_use; /* usr=1 grp=2 dom=3 alias=4 wkng=5 del=6 inv=7 unk=8 */
-       fstring name   ; /* matches with sid: must be of the form "DOMAIN\account" */
-
-} LOCAL_GRP_MEMBER;
-
-/* enumerate these to get list of local groups */
-
-/* local group info */
-typedef struct local_grp_info
-{
-       fstring name;
-       fstring comment;
-
-} LOCAL_GRP;
-
-/*** enumerate these to get list of domain groups ***/
-
-/* domain group member info */
-typedef struct domain_grp_info
-{
-       fstring name;
-       fstring comment;
-       uint32  rid; /* group rid */
-       uint8   attr; /* attributes forced to be set to 0x7: SE_GROUP_xxx */
-
-} DOMAIN_GRP;
-
-/*** query a domain group, get a list of these: shows who is in that group ***/
-
-/* domain group info */
-typedef struct domain_grp_member_info
-{
-       fstring name;
-       uint8   attr; /* attributes forced to be set to 0x7: SE_GROUP_xxx */
-
-} DOMAIN_GRP_MEMBER;
+typedef struct _unix_token {
+       uid_t uid;
+       gid_t gid;
+       int ngroups;
+       gid_t *groups;
+} UNIX_USER_TOKEN;
 
 /* 32 bit time (sec) since 01jan1970 - cifs6.txt, section 3.5, page 30 */
-typedef struct time_info
-{
-  uint32 time;
+typedef struct time_info {
+       uint32 time;
 } UTIME;
 
 /* Structure used when SMBwritebmpx is active */
@@ -389,17 +397,15 @@ typedef struct {
        BOOL  wr_discard; /* discard all further data */
 } write_bmpx_struct;
 
-typedef struct write_cache
-{
-    SMB_OFF_T file_size;
-    SMB_OFF_T offset;
-    size_t alloc_size;
-    size_t data_size;
-    char *data;
+typedef struct write_cache {
+       SMB_OFF_T file_size;
+       SMB_OFF_T offset;
+       size_t alloc_size;
+       size_t data_size;
+       char *data;
 } write_cache;
 
-typedef struct
-{
+typedef struct {
        smb_ucs2_t *origname;
        smb_ucs2_t *filename;
        SMB_STRUCT_STAT *statinfo;
@@ -419,11 +425,63 @@ struct fd_handle {
                                 * DELETE_ON_CLOSE is not stored in the share
                                 * mode database.
                                 */
+       unsigned long file_id;
 };
 
+struct messaging_context;
+struct event_context;
+struct fd_event;
 struct timed_event;
 struct idle_event;
 struct share_mode_entry;
+struct uuid;
+
+struct vfs_fsp_data {
+    struct vfs_fsp_data *next;
+    struct vfs_handle_struct *owner;
+    /* NOTE: This structure contains two pointers so that we can guarantee
+     * that the end of the structure is always both 4-byte and 8-byte aligned.
+     */
+};
+
+/* the basic packet size, assuming no words or bytes */
+#define smb_size 39
+
+struct notify_change {
+       uint32_t action;
+       const char *name;
+};
+
+struct notify_mid_map;
+struct notify_entry;
+struct notify_event;
+struct notify_change_request;
+struct sys_notify_backend;
+struct sys_notify_context {
+       struct event_context *ev;
+       struct connection_struct *conn;
+       void *private_data;     /* For use by the system backend */
+};
+
+struct notify_change_buf {
+       /*
+        * If no requests are pending, changes are queued here. Simple array,
+        * we only append.
+        */
+
+       /*
+        * num_changes == -1 means that we have got a catch-all change, when
+        * asked we just return NT_STATUS_OK without specific changes.
+        */
+       int num_changes;
+       struct notify_change *changes;
+
+       /*
+        * If no changes are around requests are queued here. Using a linked
+        * list, because we have to append at the end and delete from the top.
+        */
+       struct notify_change_request *requests;
+};
 
 typedef struct files_struct {
        struct files_struct *next, *prev;
@@ -444,16 +502,17 @@ typedef struct files_struct {
        uint32 access_mask;             /* NTCreateX access bits (FILE_READ_DATA etc.) */
        uint32 share_access;            /* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */
        BOOL pending_modtime_owner;
-       time_t pending_modtime;
-       time_t last_write_time;
+       struct timespec pending_modtime;
+       struct timespec last_write_time;
        int oplock_type;
        int sent_oplock_break;
        struct timed_event *oplock_timeout;
+       struct lock_struct last_lock_failure;
+       int current_lock_count; /* Count the number of outstanding locks and pending locks. */
 
        struct share_mode_entry *pending_break_messages;
        int num_pending_break_messages;
 
-       unsigned long file_id;
        BOOL can_lock;
        BOOL can_read;
        BOOL can_write;
@@ -461,9 +520,17 @@ typedef struct files_struct {
        BOOL modified;
        BOOL is_directory;
        BOOL is_stat;
+       BOOL is_sendfile_capable;
        BOOL aio_write_behind;
+       BOOL lockdb_clean;
+       BOOL initial_delete_on_close; /* Only set at NTCreateX if file was created. */
+       BOOL posix_open;
        char *fsp_name;
+
+       struct vfs_fsp_data *vfs_extension;
        FAKE_FILE_HANDLE *fake_file_handle;
+
+       struct notify_change_buf *notify;
 } files_struct;
 
 #include "ntquotas.h"
@@ -481,33 +548,61 @@ typedef struct data_blob_ {
  * Used in NT change-notify code.
  */
 
-typedef struct
-{
+typedef struct {
        time_t modify_time;
        time_t status_time;
 } dir_status_struct;
 
-struct vuid_cache_entry
-{
+struct vuid_cache_entry {
        uint16 vuid;
        BOOL read_only;
        BOOL admin_user;
 };
 
-struct vuid_cache
-{
+struct vuid_cache {
        unsigned int entries;
        struct vuid_cache_entry array[VUID_CACHE_SIZE];
 };
 
-typedef struct
-{
+typedef struct {
        char *name;
        BOOL is_wild;
 } name_compare_entry;
 
+struct trans_state {
+       struct trans_state *next, *prev;
+       uint16 vuid;
+       uint16 mid;
+
+       uint32 max_param_return;
+       uint32 max_data_return;
+       uint32 max_setup_return;
+
+       uint8 cmd;              /* SMBtrans or SMBtrans2 */
+
+       fstring name;           /* for trans requests */
+       uint16 call;            /* for trans2 and nttrans requests */
+
+       BOOL close_on_completion;
+       BOOL one_way;
+
+       unsigned int setup_count;
+       uint16 *setup;
+
+       size_t received_data;
+       size_t received_param;
+
+       size_t total_param;
+       char *param;
+
+       size_t total_data;
+       char *data;
+};
+
 /* Include VFS stuff */
 
+struct security_descriptor_info;
+
 #include "smb_acls.h"
 #include "vfs.h"
 
@@ -521,12 +616,19 @@ struct dfree_cached_info {
 
 struct dptr_struct;
 
-typedef struct connection_struct
-{
+struct share_params {
+       int service;
+};
+
+struct share_iterator {
+       int next_id;
+};
+
+typedef struct connection_struct {
        struct connection_struct *next, *prev;
-       TALLOC_CTX *mem_ctx;
+       TALLOC_CTX *mem_ctx; /* long-lived memory context for things hanging off this struct. */
        unsigned cnum; /* an index passed over the wire */
-       int service;
+       struct share_params *params;
        BOOL force_user;
        BOOL force_group;
        struct vuid_cache vuid_cache;
@@ -558,29 +660,32 @@ typedef struct connection_struct
        NT_USER_TOKEN *nt_user_token;
        
        time_t lastused;
+       time_t lastused_count;
        BOOL used;
        int num_files_open;
        unsigned int num_smb_operations; /* Count of smb operations on this tree. */
 
+       /* Semantics requested by the client or forced by the server config. */
        BOOL case_sensitive;
        BOOL case_preserve;
        BOOL short_case_preserve;
 
+       /* Semantics provided by the underlying filesystem. */
+       int fs_capabilities;
+
        name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
        name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
        name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */       
        name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */       
        struct dfree_cached_info *dfree_info;
+       struct trans_state *pending_trans;
+       struct notify_context *notify_ctx;
 } connection_struct;
 
-struct current_user
-{
+struct current_user {
        connection_struct *conn;
        uint16 vuid;
-       uid_t uid;
-       gid_t gid;
-       int ngroups;
-       gid_t *groups;
+       UNIX_USER_TOKEN ut;
        NT_USER_TOKEN *nt_user_token;
 };
 
@@ -601,42 +706,37 @@ typedef struct {
 enum {LPQ_QUEUED=0,LPQ_PAUSED,LPQ_SPOOLING,LPQ_PRINTING,LPQ_ERROR,LPQ_DELETING,
       LPQ_OFFLINE,LPQ_PAPEROUT,LPQ_PRINTED,LPQ_DELETED,LPQ_BLOCKED,LPQ_USER_INTERVENTION};
 
-typedef struct _print_queue_struct
-{
-  int job;             /* normally the UNIX jobid -- see note in 
-                          printing.c:traverse_fn_delete() */
-  int size;
-  int page_count;
-  int status;
-  int priority;
-  time_t time;
-  fstring fs_user;
-  fstring fs_file;
+typedef struct _print_queue_struct {
+       int job;                /* normally the UNIX jobid -- see note in 
+                                  printing.c:traverse_fn_delete() */
+       int size;
+       int page_count;
+       int status;
+       int priority;
+       time_t time;
+       fstring fs_user;
+       fstring fs_file;
 } print_queue_struct;
 
 enum {LPSTAT_OK, LPSTAT_STOPPED, LPSTAT_ERROR};
 
-typedef struct
-{
-  fstring message;
-  int qcount;
-  int status;
+typedef struct {
+       fstring message;
+       int qcount;
+       int status;
 }  print_status_struct;
 
 /* used for server information: client, nameserv and ipc */
-struct server_info_struct
-{
-  fstring name;
-  uint32 type;
-  fstring comment;
-  fstring domain; /* used ONLY in ipc.c NOT namework.c */
-  BOOL server_added; /* used ONLY in ipc.c NOT namework.c */
+struct server_info_struct {
+       fstring name;
+       uint32 type;
+       fstring comment;
+       fstring domain; /* used ONLY in ipc.c NOT namework.c */
+       BOOL server_added; /* used ONLY in ipc.c NOT namework.c */
 };
 
-
 /* used for network interfaces */
-struct interface
-{
+struct interface {
        struct interface *next, *prev;
        struct in_addr ip;
        struct in_addr bcast;
@@ -652,6 +752,9 @@ struct pending_message_list {
        DATA_BLOB private_data;
 };
 
+#define SHARE_MODE_FLAG_POSIX_OPEN     0x1
+#define SHARE_MODE_ALLOW_INITIAL_DELETE_ON_CLOSE      0x2
+
 /* struct returned by get_share_modes */
 struct share_mode_entry {
        struct process_id pid;
@@ -667,6 +770,8 @@ struct share_mode_entry {
        SMB_DEV_T dev;
        SMB_INO_T inode;
        unsigned long share_file_id;
+       uint32 uid;             /* uid of file opener. */
+       uint16 flags;           /* See SHARE_MODE_XX above. */
 };
 
 /* oplock break message definition - linearization of share_mode_entry.
@@ -683,10 +788,12 @@ Offset  Data                      length.
 28     SMB_DEV_T dev           8 bytes.
 36     SMB_INO_T inode         8 bytes
 44     unsigned long file_id   4 bytes
-48
+48     uint32 uid              4 bytes
+52     uint16 flags            2 bytes
+54
 
 */
-#define MSG_SMB_SHARE_MODE_ENTRY_SIZE 48
+#define MSG_SMB_SHARE_MODE_ENTRY_SIZE 54
 
 struct share_mode_lock {
        const char *servicepath; /* canonicalized. */
@@ -695,11 +802,46 @@ struct share_mode_lock {
        SMB_INO_T ino;
        int num_share_modes;
        struct share_mode_entry *share_modes;
+       UNIX_USER_TOKEN *delete_token;
        BOOL delete_on_close;
        BOOL fresh;
        BOOL modified;
 };
 
+/*
+ * Internal structure of locking.tdb share mode db.
+ * Used by locking.c and libsmbsharemodes.c
+ */
+
+struct locking_data {
+       union {
+               struct {
+                       int num_share_mode_entries;
+                       BOOL delete_on_close;
+                       uint32 delete_token_size; /* Only valid if either of
+                                                    the two previous fields
+                                                    are True. */
+               } s;
+               struct share_mode_entry dummy; /* Needed for alignment. */
+       } u;
+       /* The following four entries are implicit
+          struct share_mode_entry modes[num_share_mode_entries];
+          char unix_token[delete_token_size] (divisible by 4).
+          char share_name[];
+          char file_name[];
+        */
+};
+
+/* Used to store pipe open records for NetFileEnum() */
+
+struct pipe_open_rec {
+       struct process_id pid;
+       uid_t uid;
+       int pnum;
+       fstring name;
+};
+
+
 #define NT_HASH_LEN 16
 #define LM_HASH_LEN 16
 
@@ -707,6 +849,7 @@ struct share_mode_lock {
 #define PW_HISTORY_SALT_LEN 16
 #define SALTED_MD5_HASH_LEN 16
 #define PW_HISTORY_ENTRY_LEN (PW_HISTORY_SALT_LEN+SALTED_MD5_HASH_LEN)
+#define MAX_PW_HISTORY_LEN 24
 
 /*
  * Flags for account policy.
@@ -750,7 +893,7 @@ struct connections_data {
        int cnum;
        uid_t uid;
        gid_t gid;
-       char name[24];
+       char servicename[FSTRING_LEN];
        char addr[24];
        char machine[FSTRING_LEN];
        time_t start;
@@ -768,24 +911,12 @@ typedef enum {
        P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE
 } parm_class;
 
-/* passed to br lock code */
-enum brl_type {READ_LOCK, WRITE_LOCK, PENDING_LOCK};
-
 struct enum_list {
        int value;
        const char *name;
 };
 
-#define BRLOCK_FN_CAST() \
-       void (*)(SMB_DEV_T dev, SMB_INO_T ino, struct process_id pid, \
-                                enum brl_type lock_type, \
-                                br_off start, br_off size)
-#define BRLOCK_FN(fn) \
-       void (*fn)(SMB_DEV_T dev, SMB_INO_T ino, struct process_id pid, \
-                                enum brl_type lock_type, \
-                                br_off start, br_off size)
-struct parm_struct
-{
+struct parm_struct {
        const char *label;
        parm_type type;
        parm_class p_class;
@@ -802,11 +933,6 @@ struct parm_struct
        } def;
 };
 
-struct bitmap {
-       uint32 *b;
-       unsigned int n;
-};
-
 /* The following flags are used in SWAT */
 #define FLAG_BASIC     0x0001 /* Display only in BASIC view */
 #define FLAG_SHARE     0x0002 /* file sharing options */
@@ -819,13 +945,10 @@ struct bitmap {
 #define FLAG_HIDE      0x2000 /* options that should be hidden in SWAT */
 #define FLAG_DOS_STRING 0x4000 /* convert from UNIX to DOS codepage when reading this string. */
 
-#ifndef LOCKING_VERSION
-#define LOCKING_VERSION 4
-#endif /* LOCKING_VERSION */
-
-
-/* the basic packet size, assuming no words or bytes */
-#define smb_size 39
+struct bitmap {
+       uint32 *b;
+       unsigned int n;
+};
 
 /* offsets into message for common items */
 #define smb_com 8
@@ -888,7 +1011,7 @@ struct bitmap {
 #define SMBunlock     0x0D   /* unlock byte range */
 #define SMBctemp      0x0E   /* create temporary file */
 #define SMBmknew      0x0F   /* make new file */
-#define SMBchkpth     0x10   /* check directory path */
+#define SMBcheckpath  0x10   /* check directory path */
 #define SMBexit       0x11   /* process exit */
 #define SMBlseek      0x12   /* seek */
 #define SMBtcon       0x70   /* tree connect */
@@ -1134,17 +1257,24 @@ struct bitmap {
 
 /* Mapping of generic access rights for files to specific rights. */
 
+/* This maps to 0x1F01FF */
 #define FILE_GENERIC_ALL (STANDARD_RIGHTS_REQUIRED_ACCESS| SYNCHRONIZE_ACCESS|FILE_ALL_ACCESS)
 
+/* This maps to 0x120089 */
 #define FILE_GENERIC_READ (STANDARD_RIGHTS_READ_ACCESS|FILE_READ_DATA|FILE_READ_ATTRIBUTES|\
                                                        FILE_READ_EA|SYNCHRONIZE_ACCESS)
 
+/* This maps to 0x120116 */
 #define FILE_GENERIC_WRITE (STD_RIGHT_READ_CONTROL_ACCESS|FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|\
                                                        FILE_WRITE_EA|FILE_APPEND_DATA|SYNCHRONIZE_ACCESS)
 
 #define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE_ACCESS|\
                                                                FILE_EXECUTE|SYNCHRONIZE_ACCESS)
 
+/* Share specific rights. */
+#define SHARE_ALL_ACCESS      FILE_GENERIC_ALL
+#define SHARE_READ_ONLY       (FILE_GENERIC_READ|FILE_EXECUTE)
+
 /* Mapping of access rights to UNIX perms. */
 #define UNIX_ACCESS_RWX                FILE_GENERIC_ALL
 #define UNIX_ACCESS_R          FILE_GENERIC_READ
@@ -1277,7 +1407,7 @@ struct bitmap {
 #define FILE_READ_ONLY_VOLUME           0x00080000
 
 /* ChangeNotify flags. */
-#define FILE_NOTIFY_CHANGE_FILE        0x001
+#define FILE_NOTIFY_CHANGE_FILE_NAME   0x001
 #define FILE_NOTIFY_CHANGE_DIR_NAME    0x002
 #define FILE_NOTIFY_CHANGE_ATTRIBUTES  0x004
 #define FILE_NOTIFY_CHANGE_SIZE        0x008
@@ -1286,7 +1416,23 @@ struct bitmap {
 #define FILE_NOTIFY_CHANGE_CREATION    0x040
 #define FILE_NOTIFY_CHANGE_EA          0x080
 #define FILE_NOTIFY_CHANGE_SECURITY    0x100
-#define FILE_NOTIFY_CHANGE_FILE_NAME   0x200
+#define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
+#define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
+#define FILE_NOTIFY_CHANGE_STREAM_WRITE        0x00000800
+
+#define FILE_NOTIFY_CHANGE_NAME \
+       (FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME)
+
+/* change notify action results */
+#define NOTIFY_ACTION_ADDED 1
+#define NOTIFY_ACTION_REMOVED 2
+#define NOTIFY_ACTION_MODIFIED 3
+#define NOTIFY_ACTION_OLD_NAME 4
+#define NOTIFY_ACTION_NEW_NAME 5
+#define NOTIFY_ACTION_ADDED_STREAM 6
+#define NOTIFY_ACTION_REMOVED_STREAM 7
+#define NOTIFY_ACTION_MODIFIED_STREAM 8
+
 
 /* where to find the base of the SMB packet proper */
 #define smb_base(buf) (((char *)(buf))+4)
@@ -1315,36 +1461,6 @@ char *strdup(char *s);
 #define SELECT_CAST
 #endif
 
-/* these are used in NetServerEnum to choose what to receive */
-#define SV_TYPE_WORKSTATION         0x00000001
-#define SV_TYPE_SERVER              0x00000002
-#define SV_TYPE_SQLSERVER           0x00000004
-#define SV_TYPE_DOMAIN_CTRL         0x00000008
-#define SV_TYPE_DOMAIN_BAKCTRL      0x00000010
-#define SV_TYPE_TIME_SOURCE         0x00000020
-#define SV_TYPE_AFP                 0x00000040
-#define SV_TYPE_NOVELL              0x00000080
-#define SV_TYPE_DOMAIN_MEMBER       0x00000100
-#define SV_TYPE_PRINTQ_SERVER       0x00000200
-#define SV_TYPE_DIALIN_SERVER       0x00000400
-#define SV_TYPE_SERVER_UNIX         0x00000800
-#define SV_TYPE_NT                  0x00001000
-#define SV_TYPE_WFW                 0x00002000
-#define SV_TYPE_SERVER_MFPN         0x00004000
-#define SV_TYPE_SERVER_NT           0x00008000
-#define SV_TYPE_POTENTIAL_BROWSER   0x00010000
-#define SV_TYPE_BACKUP_BROWSER      0x00020000
-#define SV_TYPE_MASTER_BROWSER      0x00040000
-#define SV_TYPE_DOMAIN_MASTER       0x00080000
-#define SV_TYPE_SERVER_OSF          0x00100000
-#define SV_TYPE_SERVER_VMS          0x00200000
-#define SV_TYPE_WIN95_PLUS          0x00400000
-#define SV_TYPE_DFS_SERVER         0x00800000
-#define SV_TYPE_ALTERNATE_XPORT     0x20000000  
-#define SV_TYPE_LOCAL_LIST_ONLY     0x40000000  
-#define SV_TYPE_DOMAIN_ENUM         0x80000000
-#define SV_TYPE_ALL                 0xFFFFFFFF  
-
 /* This was set by JHT in liaison with Jeremy Allison early 1997
  * History:
  * Version 4.0 - never made public
@@ -1376,6 +1492,7 @@ char *strdup(char *s);
 #define FLAGS2_LONG_PATH_COMPONENTS    0x0001
 #define FLAGS2_EXTENDED_ATTRIBUTES     0x0002
 #define FLAGS2_SMB_SECURITY_SIGNATURES 0x0004
+#define FLAGS2_UNKNOWN_BIT4            0x0010
 #define FLAGS2_IS_LONG_NAME            0x0040
 #define FLAGS2_EXTENDED_SECURITY       0x0800 
 #define FLAGS2_DFS_PATHNAMES           0x1000
@@ -1385,6 +1502,9 @@ char *strdup(char *s);
 
 #define FLAGS2_WIN2K_SIGNATURE         0xC852 /* Hack alert ! For now... JRA. */
 
+/* TCONX Flag (smb_vwv2). */
+#define TCONX_FLAG_EXTENDED_RESPONSE   0x8
+
 /* Capabilities.  see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */
 
 #define CAP_RAW_MODE         0x0001
@@ -1412,8 +1532,7 @@ enum protocol_types {PROTOCOL_NONE,PROTOCOL_CORE,PROTOCOL_COREPLUS,PROTOCOL_LANM
 enum security_types {SEC_SHARE,SEC_USER,SEC_SERVER,SEC_DOMAIN,SEC_ADS};
 
 /* server roles */
-enum server_types
-{
+enum server_types {
        ROLE_STANDALONE,
        ROLE_DOMAIN_MEMBER,
        ROLE_DOMAIN_BDC,
@@ -1424,7 +1543,7 @@ enum server_types
 enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX,
                     PRINT_QNX,PRINT_PLP,PRINT_LPRNG,PRINT_SOFTQ,
                     PRINT_CUPS,PRINT_LPRNT,PRINT_LPROS2,PRINT_IPRINT
-#ifdef DEVELOPER
+#if defined(DEVELOPER) || defined(ENABLE_BUILD_FARM_HACKS)
 ,PRINT_TEST,PRINT_VLP
 #endif /* DEVELOPER */
 };
@@ -1440,11 +1559,14 @@ enum ldap_passwd_sync_types {LDAP_PASSWD_SYNC_ON, LDAP_PASSWD_SYNC_OFF, LDAP_PAS
 
 /* Remote architectures we know about. */
 enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT,
-                       RA_WIN2K, RA_WINXP, RA_WIN2K3, RA_SAMBA, RA_CIFSFS};
+                       RA_WIN2K, RA_WINXP, RA_WIN2K3, RA_VISTA,
+                       RA_SAMBA, RA_CIFSFS};
 
 /* case handling */
 enum case_handling {CASE_LOWER,CASE_UPPER};
 
+/* ACL compatibility */
+enum acl_compatibility {ACL_COMPAT_AUTO, ACL_COMPAT_WINNT, ACL_COMPAT_WIN2K};
 /*
  * Global value meaing that the smb_uid field should be
  * ingored (in share level security and protocol level == CORE)
@@ -1488,18 +1610,25 @@ extern int chain_size;
 
 /*
  * Bits we test with.
+ * Note these must fit into 16-bits.
  */
-                                                                                                                              
-#define NO_OPLOCK 0
-#define EXCLUSIVE_OPLOCK 1
-#define BATCH_OPLOCK 2
-#define LEVEL_II_OPLOCK 4
-#define INTERNAL_OPEN_ONLY 8
-#define FAKE_LEVEL_II_OPLOCK 16        /* Client requested no_oplock, but we have to
+
+#define NO_OPLOCK                      0x0
+#define EXCLUSIVE_OPLOCK               0x1
+#define BATCH_OPLOCK                   0x2
+#define LEVEL_II_OPLOCK                0x4
+
+/* The following are Samba-private. */
+#define INTERNAL_OPEN_ONLY             0x8
+#define FAKE_LEVEL_II_OPLOCK           0x10    /* Client requested no_oplock, but we have to
                                 * inform potential level2 holders on
                                 * write. */
-#define DEFERRED_OPEN_ENTRY 32
-#define UNUSED_SHARE_MODE_ENTRY 64
+#define DEFERRED_OPEN_ENTRY            0x20
+#define UNUSED_SHARE_MODE_ENTRY        0x40
+#define FORCE_OPLOCK_BREAK_TO_NONE     0x80
+
+/* None of the following should ever appear in fsp->oplock_request. */
+#define SAMBA_PRIVATE_OPLOCK_MASK (INTERNAL_OPEN_ONLY|DEFERRED_OPEN_ENTRY|UNUSED_SHARE_MODE_ENTRY|FORCE_OPLOCK_BREAK_TO_NONE)
 
 #define EXCLUSIVE_OPLOCK_TYPE(lck) ((lck) & ((unsigned int)EXCLUSIVE_OPLOCK|(unsigned int)BATCH_OPLOCK))
 #define BATCH_OPLOCK_TYPE(lck) ((lck) & (unsigned int)BATCH_OPLOCK)
@@ -1568,7 +1697,10 @@ minimum length == 18.
  * Capabilities abstracted for different systems.
  */
 
-#define KERNEL_OPLOCK_CAPABILITY 0x1
+enum smbd_capability {
+    KERNEL_OPLOCK_CAPABILITY,
+    DMAPI_ACCESS_CAPABILITY
+};
 
 /* if a kernel does support oplocks then a structure of the following
    typee is used to describe how to interact with the kernel */
@@ -1580,18 +1712,6 @@ struct kernel_oplocks {
        int notification_fd;
 };
 
-
-/* this structure defines the functions for doing change notify in
-   various implementations */
-struct cnotify_fns {
-       void * (*register_notify)(connection_struct *conn, char *path, uint32 flags);
-       BOOL (*check_notify)(connection_struct *conn, uint16 vuid, char *path, uint32 flags, void *data, time_t t);
-       void (*remove_notify)(void *data);
-       int select_time;
-};
-
-
-
 #include "smb_macros.h"
 
 #define MAX_NETBIOSNAME_LEN 16
@@ -1625,7 +1745,15 @@ struct pwd_info {
        BOOL cleartext;
 
        fstring password;
+};
 
+/* For split krb5 SPNEGO blobs. */
+struct pending_auth_data {
+       struct pending_auth_data *prev, *next;
+       uint16 vuid; /* Tag for this entry. */
+       uint16 smbpid; /* Alternate tag for this entry. */
+       size_t needed_len;
+       DATA_BLOB partial_data;
 };
 
 typedef struct user_struct {
@@ -1657,10 +1785,8 @@ typedef struct user_struct {
        struct auth_serversupplied_info *server_info;
 
        struct auth_ntlmssp_state *auth_ntlmssp_state;
-
 } user_struct;
 
-
 struct unix_error_map {
        int unix_error;
        int dos_class;
@@ -1735,6 +1861,9 @@ struct ip_service {
        unsigned port;
 };
 
+/* Special name type used to cause a _kerberos DNS lookup. */
+#define KDC_NAME_TYPE 0xDCDC
+
 /* Used by the SMB signing functions. */
 
 typedef struct smb_sign_info {
@@ -1766,15 +1895,7 @@ struct ea_list {
 /* EA to use for DOS attributes */
 #define SAMBA_XATTR_DOS_ATTRIB "user.DOSATTRIB"
 
-struct uuid {
-       uint32 time_low;
-       uint16 time_mid;
-       uint16 time_hi_and_version;
-       uint8  clock_seq[2];
-       uint8  node[6];
-};
 #define UUID_SIZE 16
-
 #define UUID_FLAT_SIZE 16
 typedef struct uuid_flat {
        uint8 info[UUID_FLAT_SIZE];
@@ -1783,4 +1904,23 @@ typedef struct uuid_flat {
 /* map readonly options */
 enum mapreadonly_options {MAP_READONLY_NO, MAP_READONLY_YES, MAP_READONLY_PERMISSIONS};
 
+/* usershare error codes. */
+enum usershare_err {
+               USERSHARE_OK=0,
+               USERSHARE_MALFORMED_FILE,
+               USERSHARE_BAD_VERSION,
+               USERSHARE_MALFORMED_PATH,
+               USERSHARE_MALFORMED_COMMENT_DEF,
+               USERSHARE_MALFORMED_ACL_DEF,
+               USERSHARE_ACL_ERR,
+               USERSHARE_PATH_NOT_ABSOLUTE,
+               USERSHARE_PATH_IS_DENIED,
+               USERSHARE_PATH_NOT_ALLOWED,
+               USERSHARE_PATH_NOT_DIRECTORY,
+               USERSHARE_POSIX_ERR
+};
+
+/* Different reasons for closing a file. */
+enum file_close_type {NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE};
+
 #endif /* _SMB_H */