1 /* 2 Unix SMB/CIFS implementation. 3 4 POSIX NTVFS backend - structure definitions 5 6 Copyright (C) Andrew Tridgell 2004 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 */ 22 23 #ifndef _VFS_POSIX_H_ 24 #define _VFS_POSIX_H_ 25 26 #include "librpc/gen_ndr/xattr.h" 27 #include "system/filesys.h" 28 #include "ntvfs/ntvfs.h" 29 #include "ntvfs/common/proto.h" 30 #include "dsdb/samdb/samdb.h" 31 32 /* this is the private structure for the posix vfs backend. It is used 33 to hold per-connection (per tree connect) state information */ 34 struct pvfs_state { 35 struct ntvfs_module_context *ntvfs; 36 const char *base_directory; 37 struct GUID *base_fs_uuid; 38 39 const char *share_name; 40 uint_t flags; 41 42 struct pvfs_mangle_context *mangle_ctx; 43 44 struct brl_context *brl_context; 45 struct odb_context *odb_context; 46 struct notify_context *notify_context; 47 struct sidmap_context *sidmap; 48 49 /* a list of pending async requests. Needed to support 50 ntcancel */ 51 struct pvfs_wait *wait_list; 52 53 /* the sharing violation timeout */ 54 uint_t sharing_violation_delay; 55 56 /* filesystem attributes (see FS_ATTR_*) */ 57 uint32_t fs_attribs; 58 59 /* if posix:eadb is set, then this gets setup */ 60 struct tdb_wrap *ea_db; 61 62 /* the allocation size rounding */ 63 uint32_t alloc_size_rounding; 64 65 struct { 66 /* the open files as DLINKLIST */ 67 struct pvfs_file *list; 68 } files; 69 70 struct { 71 /* an id tree mapping open search ID to a pvfs_search_state structure */ 72 struct idr_context *idtree; 73 74 /* the open searches as DLINKLIST */ 75 struct pvfs_search_state *list; 76 77 /* how long to keep inactive searches around for */ 78 uint_t inactivity_time; 79 } search; 80 81 /* used to accelerate acl mapping */ 82 struct { 83 const struct dom_sid *creator_owner; 84 const struct dom_sid *creator_group; 85 } sid_cache; 86 87 /* the acl backend */ 88 const struct pvfs_acl_ops *acl_ops; 89 }; 90 91 /* this is the basic information needed about a file from the filesystem */ 92 struct pvfs_dos_fileinfo { 93 NTTIME create_time; 94 NTTIME access_time; 95 NTTIME write_time; 96 NTTIME change_time; 97 uint32_t attrib; 98 uint64_t alloc_size; 99 uint32_t nlink; 100 uint32_t ea_size; 101 uint64_t file_id; 102 uint32_t flags; 103 }; 104 105 /* 106 this is the structure returned by pvfs_resolve_name(). It holds the posix details of 107 a filename passed by the client to any function 108 */ 109 struct pvfs_filename { 110 const char *original_name; 111 char *full_name; 112 const char *stream_name; /* does not include :$DATA suffix */ 113 uint32_t stream_id; /* this uses a hash, so is probabilistic */ 114 BOOL has_wildcard; 115 BOOL exists; /* true if the base filename exists */ 116 BOOL stream_exists; /* true if the stream exists */ 117 struct stat st; 118 struct pvfs_dos_fileinfo dos; 119 }; 120 121 122 /* open file handle state - encapsulates the posix fd 123 124 Note that this is separated from the pvfs_file structure in order 125 to cope with the openx DENY_DOS semantics where a 2nd DENY_DOS open 126 on the same connection gets the same low level filesystem handle, 127 rather than a new handle 128 */ 129 struct pvfs_file_handle { 130 int fd; 131 132 struct pvfs_filename *name; 133 134 /* a unique file key to be used for open file locking */ 135 DATA_BLOB odb_locking_key; 136 137 uint32_t create_options; 138 139 /* this is set by the mode_information level. What does it do? */ 140 uint32_t mode; 141 142 /* yes, we need 2 independent positions ... */ 143 uint64_t seek_offset; 144 uint64_t position; 145 146 BOOL have_opendb_entry; 147 148 /* we need this hook back to our parent for lock destruction */ 149 struct pvfs_state *pvfs; 150 151 /* have we set a sticky write time that we should remove on close */ 152 BOOL sticky_write_time; 153 }; 154 155 /* open file state */ 156 struct pvfs_file { 157 struct pvfs_file *next, *prev; 158 struct pvfs_file_handle *handle; 159 struct ntvfs_handle *ntvfs; 160 161 struct pvfs_state *pvfs; 162 163 uint32_t impersonation; 164 uint32_t share_access; 165 uint32_t access_mask; 166 167 /* a list of pending locks - used for locking cancel operations */ 168 struct pvfs_pending_lock *pending_list; 169 170 /* a file handle to be used for byte range locking */ 171 struct brl_handle *brl_handle; 172 173 /* a count of active locks - used to avoid calling brl_close on 174 file close */ 175 uint64_t lock_count; 176 177 /* for directories, a buffer of pending notify events */ 178 struct pvfs_notify_buffer *notify_buffer; 179 180 /* for directories, the state of an incomplete SMB2 Find */ 181 struct pvfs_search_state *search; 182 }; 183 184 /* the state of a search started with pvfs_search_first() */ 185 struct pvfs_search_state { 186 struct pvfs_search_state *prev, *next; 187 struct pvfs_state *pvfs; 188 uint16_t handle; 189 off_t current_index; 190 uint16_t search_attrib; 191 uint16_t must_attrib; 192 struct pvfs_dir *dir; 193 time_t last_used; 194 uint_t num_ea_names; 195 struct ea_name *ea_names; 196 struct timed_event *te; 197 }; 198 199 /* flags to pvfs_resolve_name() */ 200 #define PVFS_RESOLVE_WILDCARD (1<<0) 201 #define PVFS_RESOLVE_STREAMS (1<<1) 202 203 /* flags in pvfs->flags */ 204 #define PVFS_FLAG_CI_FILESYSTEM (1<<0) /* the filesystem is case insensitive */ 205 #define PVFS_FLAG_MAP_ARCHIVE (1<<1) 206 #define PVFS_FLAG_MAP_SYSTEM (1<<2) 207 #define PVFS_FLAG_MAP_HIDDEN (1<<3) 208 #define PVFS_FLAG_READONLY (1<<4) 209 #define PVFS_FLAG_STRICT_SYNC (1<<5) 210 #define PVFS_FLAG_STRICT_LOCKING (1<<6) 211 #define PVFS_FLAG_XATTR_ENABLE (1<<7) 212 #define PVFS_FLAG_FAKE_OPLOCKS (1<<8) 213 214 /* forward declare some anonymous structures */ 215 struct pvfs_dir; 216 217 /* types of notification for pvfs wait events */ 218 enum pvfs_wait_notice {PVFS_WAIT_EVENT, PVFS_WAIT_TIMEOUT, PVFS_WAIT_CANCEL}; 219 220 #define PVFS_EADB "posix:eadb" 221 #define PVFS_XATTR "posix:xattr" 222 #define PVFS_FAKE_OPLOCKS "posix:fakeoplocks" 223 #define PVFS_SHARE_DELAY "posix:sharedelay" 224 #define PVFS_ALLOCATION_ROUNDING "posix:allocationrounding" 225 #define PVFS_SEARCH_INACTIVITY "posix:searchinactivity" 226 #define PVFS_ACL "posix:acl" 227 228 #define PVFS_XATTR_DEFAULT True 229 #define PVFS_FAKE_OPLOCKS_DEFAULT False 230 #define PVFS_SHARE_DELAY_DEFAULT 1000000 231 #define PVFS_ALLOCATION_ROUNDING_DEFAULT 512 232 #define PVFS_SEARCH_INACTIVITY_DEFAULT 300 233 234 struct pvfs_acl_ops { 235 const char *name; 236 NTSTATUS (*acl_load)(struct pvfs_state *, struct pvfs_filename *, int , TALLOC_CTX *, 237 struct security_descriptor **); 238 NTSTATUS (*acl_save)(struct pvfs_state *, struct pvfs_filename *, int , struct security_descriptor *); 239 }; 240 241 #include "ntvfs/posix/vfs_posix_proto.h" 242 243 #endif /* _VFS_POSIX_H_ */ 244