r25554: Convert last instances of BOOL, True and False to the standard types.
[kai/samba-autobuild/.git] / source4 / ntvfs / posix / vfs_posix.h
index 64b9a0d653d2932a622cbbd80e808bf426cf35a5..a660da329a98ec2401dffc047fc802ca2d438959 100644 (file)
@@ -7,7 +7,7 @@
 
    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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    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.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #ifndef _VFS_POSIX_H_
 #define _VFS_POSIX_H_
 
-#include "smb_server/smb_server.h"
+#include "librpc/gen_ndr/xattr.h"
+#include "system/filesys.h"
+#include "ntvfs/ntvfs.h"
+#include "ntvfs/common/ntvfs_common.h"
+#include "dsdb/samdb/samdb.h"
 
 /* this is the private structure for the posix vfs backend. It is used
    to hold per-connection (per tree connect) state information */
 struct pvfs_state {
-       struct smbsrv_tcon *tcon;
+       struct ntvfs_module_context *ntvfs;
        const char *base_directory;
+       struct GUID *base_fs_uuid;
 
        const char *share_name;
        uint_t flags;
 
-       struct pvfs_file *open_files;
-
        struct pvfs_mangle_context *mangle_ctx;
 
        struct brl_context *brl_context;
        struct odb_context *odb_context;
-
-       /* an id tree mapping open search ID to a pvfs_search_state structure */
-       struct idr_context *idtree_search;
-
-       /* an id tree mapping open file handle -> struct pvfs_file */
-       struct idr_context *idtree_fnum;
+       struct notify_context *notify_context;
+       struct sidmap_context *sidmap;
 
        /* a list of pending async requests. Needed to support
           ntcancel */
@@ -53,8 +51,49 @@ struct pvfs_state {
 
        /* the sharing violation timeout */
        uint_t sharing_violation_delay;
-};
 
+       /* filesystem attributes (see FS_ATTR_*) */
+       uint32_t fs_attribs;
+
+       /* if posix:eadb is set, then this gets setup */
+       struct tdb_wrap *ea_db;
+
+       /* the allocation size rounding */
+       uint32_t alloc_size_rounding;
+
+       struct {
+               /* the open files as DLINKLIST */
+               struct pvfs_file *list;
+       } files;
+
+       struct {
+               /* an id tree mapping open search ID to a pvfs_search_state structure */
+               struct idr_context *idtree;
+
+               /* the open searches as DLINKLIST */
+               struct pvfs_search_state *list;
+
+               /* how long to keep inactive searches around for */
+               uint_t inactivity_time;
+       } search;
+
+       /* used to accelerate acl mapping */
+       struct {
+               const struct dom_sid *creator_owner;
+               const struct dom_sid *creator_group;            
+       } sid_cache;
+
+       /* the acl backend */
+       const struct pvfs_acl_ops *acl_ops;
+
+       /* non-flag share options */
+       struct {
+               mode_t dir_mask;
+               mode_t force_dir_mode;
+               mode_t create_mask;
+               mode_t force_create_mode;
+       } options;
+};
 
 /* this is the basic information needed about a file from the filesystem */
 struct pvfs_dos_fileinfo {
@@ -67,6 +106,7 @@ struct pvfs_dos_fileinfo {
        uint32_t nlink;
        uint32_t ea_size;
        uint64_t file_id;
+       uint32_t flags;
 };
 
 /*
@@ -76,81 +116,98 @@ struct pvfs_dos_fileinfo {
 struct pvfs_filename {
        const char *original_name;
        char *full_name;
-       const char *stream_name;
-       BOOL has_wildcard;
-       BOOL exists;
+       const char *stream_name; /* does not include :$DATA suffix */
+       uint32_t stream_id;      /* this uses a hash, so is probabilistic */
+       bool has_wildcard;
+       bool exists;          /* true if the base filename exists */
+       bool stream_exists;   /* true if the stream exists */
        struct stat st;
        struct pvfs_dos_fileinfo dos;
 };
 
 
-/* open file state */
-struct pvfs_file {
-       struct pvfs_file *next, *prev;
+/* open file handle state - encapsulates the posix fd
+
+   Note that this is separated from the pvfs_file structure in order
+   to cope with the openx DENY_DOS semantics where a 2nd DENY_DOS open
+   on the same connection gets the same low level filesystem handle,
+   rather than a new handle
+*/
+struct pvfs_file_handle {
        int fd;
-       uint16_t fnum;
+
        struct pvfs_filename *name;
 
-       /* we need to remember the session it was opened on,
-          as it is illegal to operate on someone elses fnum */
-       struct smbsrv_session *session;
+       /* a unique file key to be used for open file locking */
+       DATA_BLOB odb_locking_key;
+
+       uint32_t create_options;
 
-       /* we need to remember the client pid that 
-          opened the file so SMBexit works */
-       uint16_t smbpid;
+       /* this is set by the mode_information level. What does it do? */
+       uint32_t mode;
 
-       /* a unique file key to be used for file locking */
-       DATA_BLOB locking_key;
+       /* yes, we need 2 independent positions ... */
+       uint64_t seek_offset;
+       uint64_t position;
+
+       bool have_opendb_entry;
 
        /* we need this hook back to our parent for lock destruction */
        struct pvfs_state *pvfs;
 
-       /* a list of pending locks - used for locking cancel operations */
-       struct pvfs_pending_lock *pending_list;
+       /* have we set a sticky write time that we should remove on close */
+       bool sticky_write_time;
 
-       /* a count of active locks - used to avoid calling brl_close on
-          file close */
-       uint64_t lock_count;
+       /* the open went through to completion */
+       bool open_completed;
+};
 
-       uint32_t create_options;
-       uint32_t share_access;
-       uint32_t access_mask;
+/* open file state */
+struct pvfs_file {
+       struct pvfs_file *next, *prev;
+       struct pvfs_file_handle *handle;
+       struct ntvfs_handle *ntvfs;
 
-       /* yes, we need 2 independent positions ... */
-       uint64_t seek_offset;
-       uint64_t position;
+       struct pvfs_state *pvfs;
 
-       BOOL have_opendb_entry;
-};
+       uint32_t impersonation;
+       uint32_t share_access;
+       uint32_t access_mask;
 
+       /* a list of pending locks - used for locking cancel operations */
+       struct pvfs_pending_lock *pending_list;
 
-struct pvfs_mangle_context {
-       uint8_t char_flags[256];
-       /*
-         this determines how many characters are used from the original
-         filename in the 8.3 mangled name. A larger value leads to a weaker
-         hash and more collisions.  The largest possible value is 6.
-       */
-       int mangle_prefix;
-       uint32_t mangle_modulus;
+       /* a file handle to be used for byte range locking */
+       struct brl_handle *brl_handle;
 
-       /* we will use a very simple direct mapped prefix cache. The big
-          advantage of this cache structure is speed and low memory usage 
+       /* a count of active locks - used to avoid calling brl_close on
+          file close */
+       uint64_t lock_count;
 
-          The cache is indexed by the low-order bits of the hash, and confirmed by
-          hashing the resulting cache entry to match the known hash
-       */
-       char **prefix_cache;
-       uint32_t *prefix_cache_hashes;
+       /* for directories, a buffer of pending notify events */
+       struct pvfs_notify_buffer *notify_buffer;
 
-       /* this is used to reverse the base 36 mapping */
-       unsigned char base_reverse[256];
+       /* for directories, the state of an incomplete SMB2 Find */
+       struct pvfs_search_state *search;
 };
 
-
+/* the state of a search started with pvfs_search_first() */
+struct pvfs_search_state {
+       struct pvfs_search_state *prev, *next;
+       struct pvfs_state *pvfs;
+       uint16_t handle;
+       off_t current_index;
+       uint16_t search_attrib;
+       uint16_t must_attrib;
+       struct pvfs_dir *dir;
+       time_t last_used;
+       uint_t num_ea_names;
+       struct ea_name *ea_names;
+       struct timed_event *te;
+};
 
 /* flags to pvfs_resolve_name() */
-#define PVFS_RESOLVE_NO_WILDCARD (1<<0)
+#define PVFS_RESOLVE_WILDCARD    (1<<0)
 #define PVFS_RESOLVE_STREAMS     (1<<1)
 
 /* flags in pvfs->flags */
@@ -162,6 +219,8 @@ struct pvfs_mangle_context {
 #define PVFS_FLAG_STRICT_SYNC    (1<<5)
 #define PVFS_FLAG_STRICT_LOCKING (1<<6)
 #define PVFS_FLAG_XATTR_ENABLE   (1<<7)
+#define PVFS_FLAG_FAKE_OPLOCKS   (1<<8)
+#define PVFS_FLAG_LINUX_AIO      (1<<9)
 
 /* forward declare some anonymous structures */
 struct pvfs_dir;
@@ -169,14 +228,33 @@ struct pvfs_dir;
 /* types of notification for pvfs wait events */
 enum pvfs_wait_notice {PVFS_WAIT_EVENT, PVFS_WAIT_TIMEOUT, PVFS_WAIT_CANCEL};
 
+#define PVFS_EADB                      "posix:eadb"
+#define PVFS_XATTR                     "posix:xattr"
+#define PVFS_FAKE_OPLOCKS              "posix:fakeoplocks"
+#define PVFS_SHARE_DELAY               "posix:sharedelay"
+#define PVFS_ALLOCATION_ROUNDING       "posix:allocationrounding"
+#define PVFS_SEARCH_INACTIVITY         "posix:searchinactivity"
+#define PVFS_ACL                       "posix:acl"
+#define PVFS_AIO                       "posix:aio"
+
+#define PVFS_XATTR_DEFAULT                     true
+#define PVFS_FAKE_OPLOCKS_DEFAULT              false
+#define PVFS_SHARE_DELAY_DEFAULT               1000000
+#define PVFS_ALLOCATION_ROUNDING_DEFAULT       512
+#define PVFS_SEARCH_INACTIVITY_DEFAULT         300
+
+struct pvfs_acl_ops {
+       const char *name;
+       NTSTATUS (*acl_load)(struct pvfs_state *, struct pvfs_filename *, int , TALLOC_CTX *, 
+                            struct security_descriptor **);
+       NTSTATUS (*acl_save)(struct pvfs_state *, struct pvfs_filename *, int , struct security_descriptor *);
+};
+
+#include "ntvfs/posix/vfs_posix_proto.h"
 
-/* putting this prototype here avoids us having to expose this whole header in the
-   rest of Samba */
-void *pvfs_wait_message(struct pvfs_state *pvfs, 
-                        struct smbsrv_request *req, 
-                        int msg_type, 
-                        struct timeval end_time,
-                        void (*fn)(void *, enum pvfs_wait_notice),
-                        void *private);
+NTSTATUS pvfs_aio_pread(struct ntvfs_request *req, union smb_read *rd,
+                       struct pvfs_file *f, uint32_t maxcnt);
+NTSTATUS pvfs_aio_pwrite(struct ntvfs_request *req, union smb_write *wr,
+                        struct pvfs_file *f);
 
 #endif /* _VFS_POSIX_H_ */