7726c24b63737738623175cb19f6a6c0cd00bb0f
[samba.git] / source3 / smbd / globals.h
1 /*
2    Unix SMB/Netbios implementation.
3    smbd globals
4    Copyright (C) Stefan Metzmacher 2009
5    Copyright (C) Jeremy Allison 2010
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "system/select.h"
22 #include "librpc/gen_ndr/smbXsrv.h"
23 #include "smbprofile.h"
24
25 extern int aio_pending_size;
26 extern int outstanding_aio_calls;
27
28 #ifdef USE_DMAPI
29 struct smbd_dmapi_context;
30 extern struct smbd_dmapi_context *dmapi_ctx;
31 #endif
32
33 extern bool dfree_broken;
34
35 /* how many write cache buffers have been allocated */
36 extern unsigned int allocated_write_caches;
37
38 /* A singleton cache to speed up searching by dev/inode. */
39 struct fsp_singleton_cache {
40         files_struct *fsp;
41         struct file_id id;
42 };
43
44 extern const struct mangle_fns *mangle_fns;
45
46 extern unsigned char *chartest;
47 struct tdb_context;
48 extern struct tdb_context *tdb_mangled_cache;
49
50 /*
51   this determines how many characters are used from the original filename
52   in the 8.3 mangled name. A larger value leads to a weaker hash and more collisions.
53   The largest possible value is 6.
54 */
55 extern unsigned mangle_prefix;
56
57 struct msg_state;
58
59 extern bool logged_ioctl_message;
60
61 extern int trans_num;
62
63 extern time_t last_smb_conf_reload_time;
64 extern time_t last_printer_reload_time;
65 extern pid_t background_lpq_updater_pid;
66
67 /****************************************************************************
68  structure to hold a linked list of queued messages.
69  for processing.
70 ****************************************************************************/
71 extern uint32_t common_flags2;
72
73 extern struct smb_trans_enc_state *partial_srv_trans_enc_ctx;
74 extern struct smb_trans_enc_state *srv_trans_enc_ctx;
75
76 struct sec_ctx {
77         struct security_unix_token ut;
78         struct security_token *token;
79 };
80 /* A stack of security contexts.  We include the current context as being
81    the first one, so there is room for another MAX_SEC_CTX_DEPTH more. */
82 extern struct sec_ctx sec_ctx_stack[MAX_SEC_CTX_DEPTH + 1];
83 extern int sec_ctx_stack_ndx;
84 extern bool become_uid_done;
85 extern bool become_gid_done;
86
87 extern connection_struct *last_conn;
88 extern uint16_t last_flags;
89
90 extern uint32_t global_client_caps;
91
92 extern uint16_t fnf_handle;
93
94 struct conn_ctx {
95         connection_struct *conn;
96         uint64_t vuid;
97 };
98 /* A stack of current_user connection contexts. */
99 extern struct conn_ctx conn_ctx_stack[MAX_SEC_CTX_DEPTH];
100 extern int conn_ctx_stack_ndx;
101
102 struct vfs_init_function_entry;
103 extern struct vfs_init_function_entry *backends;
104 extern char *sparse_buf;
105 extern char *LastDir;
106
107 struct smbd_parent_context;
108 extern struct smbd_parent_context *am_parent;
109 extern struct memcache *smbd_memcache_ctx;
110 extern bool exit_firsttime;
111
112 struct tstream_context;
113 struct smbd_smb2_request;
114
115 DATA_BLOB negprot_spnego(TALLOC_CTX *ctx, struct smbXsrv_connection *xconn);
116
117 void smbd_lock_socket(struct smbXsrv_connection *xconn);
118 void smbd_unlock_socket(struct smbXsrv_connection *xconn);
119
120 NTSTATUS smbd_do_locking(struct smb_request *req,
121                          files_struct *fsp,
122                          uint8_t type,
123                          int32_t timeout,
124                          uint16_t num_locks,
125                          struct smbd_lock_element *locks,
126                          bool *async);
127 NTSTATUS smbd_do_unlocking(struct smb_request *req,
128                            files_struct *fsp,
129                            uint16_t num_ulocks,
130                            struct smbd_lock_element *ulocks);
131
132 NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
133                                TALLOC_CTX *mem_ctx,
134                                uint16_t info_level,
135                                files_struct *fsp,
136                                struct smb_filename *smb_fname,
137                                bool delete_pending,
138                                struct timespec write_time_ts,
139                                struct ea_list *ea_list,
140                                int lock_data_count,
141                                char *lock_data,
142                                uint16_t flags2,
143                                unsigned int max_data_bytes,
144                                size_t *fixed_portion,
145                                char **ppdata,
146                                unsigned int *pdata_size);
147
148 NTSTATUS smbd_do_setfilepathinfo(connection_struct *conn,
149                                 struct smb_request *req,
150                                 TALLOC_CTX *mem_ctx,
151                                 uint16_t info_level,
152                                 files_struct *fsp,
153                                 struct smb_filename *smb_fname,
154                                 char **ppdata, int total_data,
155                                 int *ret_data_size);
156
157 NTSTATUS smbd_do_qfsinfo(struct smbXsrv_connection *xconn,
158                          connection_struct *conn,
159                          TALLOC_CTX *mem_ctx,
160                          uint16_t info_level,
161                          uint16_t flags2,
162                          unsigned int max_data_bytes,
163                          size_t *fixed_portion,
164                          struct smb_filename *smb_fname,
165                          char **ppdata,
166                          int *ret_data_len);
167
168 bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
169                            struct dptr_struct *dirptr,
170                            const char *mask,
171                            uint32_t dirtype,
172                            bool dont_descend,
173                            bool ask_sharemode,
174                            bool (*match_fn)(TALLOC_CTX *ctx,
175                                             void *private_data,
176                                             const char *dname,
177                                             const char *mask,
178                                             char **_fname),
179                            bool (*mode_fn)(TALLOC_CTX *ctx,
180                                            void *private_data,
181                                            struct smb_filename *smb_fname,
182                                            uint32_t *_mode),
183                            void *private_data,
184                            char **_fname,
185                            struct smb_filename **_smb_fname,
186                            uint32_t *_mode,
187                            long *_prev_offset);
188
189 NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
190                                connection_struct *conn,
191                                struct dptr_struct *dirptr,
192                                uint16 flags2,
193                                const char *path_mask,
194                                uint32 dirtype,
195                                int info_level,
196                                int requires_resume_key,
197                                bool dont_descend,
198                                bool ask_sharemode,
199                                uint8_t align,
200                                bool do_pad,
201                                char **ppdata,
202                                char *base_data,
203                                char *end_data,
204                                int space_remaining,
205                                bool *got_exact_match,
206                                int *_last_entry_off,
207                                struct ea_list *name_list);
208
209 NTSTATUS smbd_calculate_access_mask(connection_struct *conn,
210                                     const struct smb_filename *smb_fname,
211                                     bool use_privs,
212                                     uint32_t access_mask,
213                                     uint32_t *access_mask_out);
214
215 void smbd_notify_cancel_by_smbreq(const struct smb_request *smbreq);
216
217 void smbd_server_connection_terminate_ex(struct smbXsrv_connection *xconn,
218                                          const char *reason,
219                                          const char *location);
220 #define smbd_server_connection_terminate(xconn, reason) \
221         smbd_server_connection_terminate_ex(xconn, reason, __location__)
222
223 const char *smb2_opcode_name(uint16_t opcode);
224 bool smbd_is_smb2_header(const uint8_t *inbuf, size_t size);
225
226 NTSTATUS smbd_add_connection(struct smbXsrv_client *client, int sock_fd,
227                              struct smbXsrv_connection **_xconn);
228
229 void reply_smb2002(struct smb_request *req, uint16_t choice);
230 void reply_smb20ff(struct smb_request *req, uint16_t choice);
231 void smbd_smb2_first_negprot(struct smbXsrv_connection *xconn,
232                              const uint8_t *inpdu, size_t size);
233
234 DATA_BLOB smbd_smb2_generate_outbody(struct smbd_smb2_request *req, size_t size);
235
236 NTSTATUS smbd_smb2_request_error_ex(struct smbd_smb2_request *req,
237                                     NTSTATUS status,
238                                     DATA_BLOB *info,
239                                     const char *location);
240 #define smbd_smb2_request_error(req, status) \
241         smbd_smb2_request_error_ex(req, status, NULL, __location__)
242 NTSTATUS smbd_smb2_request_done_ex(struct smbd_smb2_request *req,
243                                    NTSTATUS status,
244                                    DATA_BLOB body, DATA_BLOB *dyn,
245                                    const char *location);
246 #define smbd_smb2_request_done(req, body, dyn) \
247         smbd_smb2_request_done_ex(req, NT_STATUS_OK, body, dyn, __location__)
248
249 NTSTATUS smbd_smb2_send_oplock_break(struct smbXsrv_connection *xconn,
250                                      struct smbXsrv_session *session,
251                                      struct smbXsrv_tcon *tcon,
252                                      struct smbXsrv_open *op,
253                                      uint8_t oplock_level);
254 NTSTATUS smbd_smb2_send_lease_break(struct smbXsrv_connection *xconn,
255                                     uint16_t new_epoch,
256                                     uint32_t lease_flags,
257                                     struct smb2_lease_key *lease_key,
258                                     uint32_t current_lease_state,
259                                     uint32_t new_lease_state);
260
261 NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req,
262                                          struct tevent_req *subreq,
263                                          uint32_t defer_time);
264
265 struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req);
266 size_t smbd_smb2_unread_bytes(struct smbd_smb2_request *req);
267 void remove_smb2_chained_fsp(files_struct *fsp);
268
269 NTSTATUS smbd_smb2_request_verify_creditcharge(struct smbd_smb2_request *req,
270                                                uint32_t data_length);
271
272 NTSTATUS smbd_smb2_request_verify_sizes(struct smbd_smb2_request *req,
273                                         size_t expected_body_size);
274
275 enum protocol_types smbd_smb2_protocol_dialect_match(const uint8_t *indyn,
276                                                      const int dialect_count,
277                                                      uint16_t *dialect);
278 NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req);
279 NTSTATUS smbd_smb2_request_process_sesssetup(struct smbd_smb2_request *req);
280 NTSTATUS smbd_smb2_request_process_logoff(struct smbd_smb2_request *req);
281 NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req);
282 NTSTATUS smbd_smb2_request_process_tdis(struct smbd_smb2_request *req);
283 NTSTATUS smbd_smb2_request_process_create(struct smbd_smb2_request *req);
284 NTSTATUS smbd_smb2_request_process_close(struct smbd_smb2_request *req);
285 NTSTATUS smbd_smb2_request_process_flush(struct smbd_smb2_request *req);
286 NTSTATUS smbd_smb2_request_process_read(struct smbd_smb2_request *req);
287 NTSTATUS smb2_read_complete(struct tevent_req *req, ssize_t nread, int err);
288 NTSTATUS smbd_smb2_request_process_write(struct smbd_smb2_request *req);
289 NTSTATUS smb2_write_complete(struct tevent_req *req, ssize_t nwritten, int err);
290 NTSTATUS smb2_write_complete_nosync(struct tevent_req *req, ssize_t nwritten,
291                                     int err);
292 NTSTATUS smbd_smb2_request_process_lock(struct smbd_smb2_request *req);
293 NTSTATUS smbd_smb2_request_process_ioctl(struct smbd_smb2_request *req);
294 NTSTATUS smbd_smb2_request_process_keepalive(struct smbd_smb2_request *req);
295 NTSTATUS smbd_smb2_request_process_find(struct smbd_smb2_request *req);
296 NTSTATUS smbd_smb2_request_process_notify(struct smbd_smb2_request *req);
297 NTSTATUS smbd_smb2_request_process_getinfo(struct smbd_smb2_request *req);
298 NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req);
299 NTSTATUS smbd_smb2_request_process_break(struct smbd_smb2_request *req);
300 NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req);
301 void smbd_smb2_request_dispatch_immediate(struct tevent_context *ctx,
302                                 struct tevent_immediate *im,
303                                 void *private_data);
304
305 struct deferred_open_record;
306
307 /* SMB1 -> SMB2 glue. */
308 void send_break_message_smb2(files_struct *fsp,
309                              uint32_t break_from,
310                              uint32_t break_to);
311 struct blocking_lock_record *get_pending_smb2req_blr(struct smbd_smb2_request *smb2req);
312 bool push_blocking_lock_request_smb2( struct byte_range_lock *br_lck,
313                                 struct smb_request *req,
314                                 files_struct *fsp,
315                                 int lock_timeout,
316                                 int lock_num,
317                                 uint64_t smblctx,
318                                 enum brl_type lock_type,
319                                 enum brl_flavour lock_flav,
320                                 uint64_t offset,
321                                 uint64_t count,
322                                 uint64_t blocking_smblctx);
323 void process_blocking_lock_queue_smb2(
324         struct smbd_server_connection *sconn, struct timeval tv_curr);
325 void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
326                         struct byte_range_lock *br_lck,
327                         enum file_close_type close_type);
328 /* From smbd/smb2_create.c */
329 int map_smb2_oplock_levels_to_samba(uint8_t in_oplock_level);
330 bool get_deferred_open_message_state_smb2(struct smbd_smb2_request *smb2req,
331                         struct timeval *p_request_time,
332                         struct deferred_open_record **open_rec);
333 bool open_was_deferred_smb2(
334         struct smbXsrv_connection *xconn, uint64_t mid);
335 void remove_deferred_open_message_smb2(
336         struct smbXsrv_connection *xconn, uint64_t mid);
337 bool schedule_deferred_open_message_smb2(
338         struct smbXsrv_connection *xconn, uint64_t mid);
339 bool push_deferred_open_message_smb2(struct smbd_smb2_request *smb2req,
340                                 struct timeval request_time,
341                                 struct timeval timeout,
342                                 struct file_id id,
343                                 struct deferred_open_record *open_rec);
344
345 struct smbXsrv_client;
346
347 struct smbXsrv_connection {
348         struct smbXsrv_connection *prev, *next;
349
350         struct smbXsrv_client *client;
351
352
353         const struct tsocket_address *local_address;
354         const struct tsocket_address *remote_address;
355         const char *remote_hostname;
356
357         struct tevent_context *ev_ctx;
358         struct messaging_context *msg_ctx;
359
360         enum protocol_types protocol;
361
362         struct {
363                 NTSTATUS status;
364                 int sock;
365                 struct tevent_fd *fde;
366
367                 struct {
368                         bool got_session;
369                 } nbt;
370         } transport;
371
372         struct {
373                 struct {
374                         /*
375                          * fd for the fcntl lock and process shared
376                          * robust mutex to coordinate access to the
377                          * client socket. When the system supports
378                          * process shared robust mutexes, those are
379                          * used. If not, then the fcntl lock will be
380                          * used.
381                          */
382                         int socket_lock_fd;
383 #ifdef HAVE_ROBUST_MUTEXES
384                         pthread_mutex_t *socket_mutex;
385 #endif
386
387                         /*
388                          * fd for the trusted pipe from
389                          * echo handler child
390                          */
391                         int trusted_fd;
392
393                         /*
394                          * fde for the trusted_fd
395                          */
396                         struct tevent_fd *trusted_fde;
397
398                         /*
399                          * Reference count for the fcntl lock to
400                          * allow recursive locks.
401                          */
402                         int ref_count;
403                 } echo_handler;
404
405                 struct {
406                         bool encrypted_passwords;
407                         bool spnego;
408                         struct auth4_context *auth_context;
409                         bool done;
410                         /*
411                          * Size of the data we can receive. Set by us.
412                          * Can be modified by the max xmit parameter.
413                          */
414                         int max_recv;
415                 } negprot;
416
417                 struct {
418                         bool done_sesssetup;
419                         /*
420                          * Size of data we can send to client. Set
421                          *  by the client for all protocols above CORE.
422                          *  Set by us for CORE protocol.
423                          */
424                         int max_send;
425                 } sessions;
426                 struct smb_signing_state *signing_state;
427
428                 struct {
429                         uint16_t client_major;
430                         uint16_t client_minor;
431                         uint32_t client_cap_low;
432                         uint32_t client_cap_high;
433                 } unix_info;
434
435                 struct msg_state *msg_state;
436         } smb1;
437         struct {
438                 struct smbd_smb2_request_read_state {
439                         struct smbd_smb2_request *req;
440                         struct {
441                                 uint8_t nbt[NBT_HDR_SIZE];
442                                 bool done;
443                         } hdr;
444                         struct iovec vector;
445                         bool doing_receivefile;
446                         size_t min_recv_size;
447                         size_t pktfull;
448                         size_t pktlen;
449                         uint8_t *pktbuf;
450                 } request_read_state;
451                 struct smbd_smb2_send_queue *send_queue;
452                 size_t send_queue_len;
453
454                 struct {
455                         /*
456                          * seq_low is the lowest sequence number
457                          * we will accept.
458                          */
459                         uint64_t seq_low;
460                         /*
461                          * seq_range is the range of credits we have
462                          * granted from the sequence windows starting
463                          * at seq_low.
464                          *
465                          * This gets incremented when new credits are
466                          * granted and gets decremented when the
467                          * lowest sequence number is consumed
468                          * (when seq_low gets incremented).
469                          */
470                         uint16_t seq_range;
471                         /*
472                          * The number of credits we have currently granted
473                          * to the client.
474                          *
475                          * This gets incremented when new credits are
476                          * granted and gets decremented when any credit
477                          * is comsumed.
478                          *
479                          * Note: the decrementing is different compared
480                          *       to seq_range.
481                          */
482                         uint16_t granted;
483                         /*
484                          * The maximum number of credits we will ever
485                          * grant to the client.
486                          *
487                          * Typically we will only grant 1/16th of
488                          * max_credits.
489                          *
490                          * This is the "server max credits" parameter.
491                          */
492                         uint16_t max;
493                         /*
494                          * a bitmap of size max_credits
495                          */
496                         struct bitmap *bitmap;
497                         bool multicredit;
498                 } credits;
499
500                 bool allow_2ff;
501                 struct {
502                         uint32_t capabilities;
503                         struct GUID guid;
504                         uint16_t security_mode;
505                         uint16_t num_dialects;
506                         uint16_t *dialects;
507                 } client;
508                 struct {
509                         uint32_t capabilities;
510                         struct GUID guid;
511                         uint16_t security_mode;
512                         uint16_t dialect;
513                         uint32_t max_trans;
514                         uint32_t max_read;
515                         uint32_t max_write;
516                         uint16_t cipher;
517                 } server;
518
519                 struct smbd_smb2_request *requests;
520         } smb2;
521 };
522
523 const char *smbXsrv_connection_dbg(const struct smbXsrv_connection *xconn);
524
525 NTSTATUS smbXsrv_version_global_init(const struct server_id *server_id);
526 uint32_t smbXsrv_version_global_current(void);
527
528 NTSTATUS smbXsrv_connection_init_tables(struct smbXsrv_connection *conn,
529                                         enum protocol_types protocol);
530
531 NTSTATUS smbXsrv_session_global_init(void);
532 NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
533                                 NTTIME now,
534                                 struct smbXsrv_session **_session);
535 NTSTATUS smbXsrv_session_update(struct smbXsrv_session *session);
536 struct smbXsrv_channel_global0;
537 NTSTATUS smbXsrv_session_find_channel(const struct smbXsrv_session *session,
538                                       const struct smbXsrv_connection *conn,
539                                       struct smbXsrv_channel_global0 **_c);
540 NTSTATUS smbXsrv_session_logoff(struct smbXsrv_session *session);
541 NTSTATUS smbXsrv_session_logoff_all(struct smbXsrv_connection *conn);
542 NTSTATUS smb1srv_session_table_init(struct smbXsrv_connection *conn);
543 NTSTATUS smb1srv_session_lookup(struct smbXsrv_connection *conn,
544                                 uint16_t vuid, NTTIME now,
545                                 struct smbXsrv_session **session);
546 NTSTATUS smb2srv_session_table_init(struct smbXsrv_connection *conn);
547 NTSTATUS smb2srv_session_lookup(struct smbXsrv_connection *conn,
548                                 uint64_t session_id, NTTIME now,
549                                 struct smbXsrv_session **session);
550 struct smbXsrv_session_global0;
551 NTSTATUS smbXsrv_session_global_traverse(
552                         int (*fn)(struct smbXsrv_session_global0 *, void *),
553                         void *private_data);
554 struct tevent_req *smb2srv_session_close_previous_send(TALLOC_CTX *mem_ctx,
555                                         struct tevent_context *ev,
556                                         struct smbXsrv_connection *conn,
557                                         struct auth_session_info *session_info,
558                                         uint64_t previous_session_id,
559                                         uint64_t current_session_id);
560 NTSTATUS smb2srv_session_close_previous_recv(struct tevent_req *req);
561
562 NTSTATUS smbXsrv_tcon_global_init(void);
563 NTSTATUS smbXsrv_tcon_update(struct smbXsrv_tcon *tcon);
564 NTSTATUS smbXsrv_tcon_disconnect(struct smbXsrv_tcon *tcon, uint64_t vuid);
565 NTSTATUS smb1srv_tcon_table_init(struct smbXsrv_connection *conn);
566 NTSTATUS smb1srv_tcon_create(struct smbXsrv_connection *conn,
567                              NTTIME now,
568                              struct smbXsrv_tcon **_tcon);
569 NTSTATUS smb1srv_tcon_lookup(struct smbXsrv_connection *conn,
570                              uint16_t tree_id, NTTIME now,
571                              struct smbXsrv_tcon **tcon);
572 NTSTATUS smb1srv_tcon_disconnect_all(struct smbXsrv_connection *conn);
573 NTSTATUS smb2srv_tcon_table_init(struct smbXsrv_session *session);
574 NTSTATUS smb2srv_tcon_create(struct smbXsrv_session *session,
575                              NTTIME now,
576                              struct smbXsrv_tcon **_tcon);
577 NTSTATUS smb2srv_tcon_lookup(struct smbXsrv_session *session,
578                              uint32_t tree_id, NTTIME now,
579                              struct smbXsrv_tcon **tcon);
580 NTSTATUS smb2srv_tcon_disconnect_all(struct smbXsrv_session *session);
581 struct smbXsrv_tcon_global0;
582 NTSTATUS smbXsrv_tcon_global_traverse(
583                         int (*fn)(struct smbXsrv_tcon_global0 *, void *),
584                         void *private_data);
585
586 NTSTATUS smbXsrv_open_global_init(void);
587 NTSTATUS smbXsrv_open_create(struct smbXsrv_connection *conn,
588                              struct auth_session_info *session_info,
589                              NTTIME now,
590                              struct smbXsrv_open **_open);
591 uint32_t smbXsrv_open_hash(struct smbXsrv_open *_open);
592 NTSTATUS smbXsrv_open_update(struct smbXsrv_open *_open);
593 NTSTATUS smbXsrv_open_close(struct smbXsrv_open *op, NTTIME now);
594 NTSTATUS smb1srv_open_table_init(struct smbXsrv_connection *conn);
595 NTSTATUS smb1srv_open_lookup(struct smbXsrv_connection *conn,
596                              uint16_t fnum, NTTIME now,
597                              struct smbXsrv_open **_open);
598 NTSTATUS smb2srv_open_table_init(struct smbXsrv_connection *conn);
599 NTSTATUS smb2srv_open_lookup(struct smbXsrv_connection *conn,
600                              uint64_t persistent_id,
601                              uint64_t volatile_id,
602                              NTTIME now,
603                              struct smbXsrv_open **_open);
604 NTSTATUS smb2srv_open_recreate(struct smbXsrv_connection *conn,
605                                struct auth_session_info *session_info,
606                                uint64_t persistent_id,
607                                const struct GUID *create_guid,
608                                NTTIME now,
609                                struct smbXsrv_open **_open);
610 struct smbXsrv_open_global0;
611 NTSTATUS smbXsrv_open_global_traverse(
612         int (*fn)(struct smbXsrv_open_global0 *, void *),
613         void *private_data);
614
615 NTSTATUS smbXsrv_open_cleanup(uint64_t persistent_id);
616
617 struct smbd_smb2_send_queue {
618         struct smbd_smb2_send_queue *prev, *next;
619
620         DATA_BLOB *sendfile_header;
621         NTSTATUS *sendfile_status;
622         struct iovec *vector;
623         int count;
624
625         TALLOC_CTX *mem_ctx;
626 };
627
628 struct smbd_smb2_request {
629         struct smbd_smb2_request *prev, *next;
630
631         struct smbd_server_connection *sconn;
632         struct smbXsrv_connection *xconn;
633
634         struct smbd_smb2_send_queue queue_entry;
635
636         /* the session the request operates on, maybe NULL */
637         struct smbXsrv_session *session;
638         uint64_t last_session_id;
639
640         /* the tcon the request operates on, maybe NULL */
641         struct smbXsrv_tcon *tcon;
642         uint32_t last_tid;
643
644         int current_idx;
645         bool do_signing;
646         bool do_encryption;
647         struct tevent_timer *async_te;
648         bool compound_related;
649
650         /*
651          * the encryption key for the whole
652          * compound chain
653          */
654         DATA_BLOB first_key;
655         /*
656          * the signing key for the last
657          * request/response of a compound chain
658          */
659         DATA_BLOB last_key;
660
661         struct timeval request_time;
662
663         SMBPROFILE_IOBYTES_ASYNC_STATE(profile);
664
665         /* fake smb1 request. */
666         struct smb_request *smb1req;
667         struct files_struct *compat_chain_fsp;
668
669         /*
670          * The sub request for async backend calls.
671          * This is used for SMB2 Cancel.
672          */
673         struct tevent_req *subreq;
674
675 #define SMBD_SMB2_TF_IOV_OFS 0
676 #define SMBD_SMB2_HDR_IOV_OFS 1
677 #define SMBD_SMB2_BODY_IOV_OFS 2
678 #define SMBD_SMB2_DYN_IOV_OFS 3
679
680 #define SMBD_SMB2_NUM_IOV_PER_REQ 4
681
682 #define SMBD_SMB2_IOV_IDX_OFS(req,dir,idx,ofs) \
683         (&req->dir.vector[(idx)+(ofs)])
684
685 #define SMBD_SMB2_IDX_TF_IOV(req,dir,idx) \
686         SMBD_SMB2_IOV_IDX_OFS(req,dir,idx,SMBD_SMB2_TF_IOV_OFS)
687 #define SMBD_SMB2_IDX_HDR_IOV(req,dir,idx) \
688         SMBD_SMB2_IOV_IDX_OFS(req,dir,idx,SMBD_SMB2_HDR_IOV_OFS)
689 #define SMBD_SMB2_IDX_BODY_IOV(req,dir,idx) \
690         SMBD_SMB2_IOV_IDX_OFS(req,dir,idx,SMBD_SMB2_BODY_IOV_OFS)
691 #define SMBD_SMB2_IDX_DYN_IOV(req,dir,idx) \
692         SMBD_SMB2_IOV_IDX_OFS(req,dir,idx,SMBD_SMB2_DYN_IOV_OFS)
693
694 #define SMBD_SMB2_IN_TF_IOV(req)    SMBD_SMB2_IDX_TF_IOV(req,in,req->current_idx)
695 #define SMBD_SMB2_IN_TF_PTR(req)    (uint8_t *)(SMBD_SMB2_IN_TF_IOV(req)->iov_base)
696 #define SMBD_SMB2_IN_HDR_IOV(req)    SMBD_SMB2_IDX_HDR_IOV(req,in,req->current_idx)
697 #define SMBD_SMB2_IN_HDR_PTR(req)    (uint8_t *)(SMBD_SMB2_IN_HDR_IOV(req)->iov_base)
698 #define SMBD_SMB2_IN_BODY_IOV(req)   SMBD_SMB2_IDX_BODY_IOV(req,in,req->current_idx)
699 #define SMBD_SMB2_IN_BODY_PTR(req)   (uint8_t *)(SMBD_SMB2_IN_BODY_IOV(req)->iov_base)
700 #define SMBD_SMB2_IN_BODY_LEN(req)   (SMBD_SMB2_IN_BODY_IOV(req)->iov_len)
701 #define SMBD_SMB2_IN_DYN_IOV(req)    SMBD_SMB2_IDX_DYN_IOV(req,in,req->current_idx)
702 #define SMBD_SMB2_IN_DYN_PTR(req)    (uint8_t *)(SMBD_SMB2_IN_DYN_IOV(req)->iov_base)
703 #define SMBD_SMB2_IN_DYN_LEN(req)    (SMBD_SMB2_IN_DYN_IOV(req)->iov_len)
704
705 #define SMBD_SMB2_OUT_TF_IOV(req)   SMBD_SMB2_IDX_TF_IOV(req,out,req->current_idx)
706 #define SMBD_SMB2_OUT_TF_PTR(req)   (uint8_t *)(SMBD_SMB2_OUT_TF_IOV(req)->iov_base)
707 #define SMBD_SMB2_OUT_HDR_IOV(req)   SMBD_SMB2_IDX_HDR_IOV(req,out,req->current_idx)
708 #define SMBD_SMB2_OUT_HDR_PTR(req)   (uint8_t *)(SMBD_SMB2_OUT_HDR_IOV(req)->iov_base)
709 #define SMBD_SMB2_OUT_BODY_IOV(req)  SMBD_SMB2_IDX_BODY_IOV(req,out,req->current_idx)
710 #define SMBD_SMB2_OUT_BODY_PTR(req)  (uint8_t *)(SMBD_SMB2_OUT_BODY_IOV(req)->iov_base)
711 #define SMBD_SMB2_OUT_BODY_LEN(req)  (SMBD_SMB2_OUT_BODY_IOV(req)->iov_len)
712 #define SMBD_SMB2_OUT_DYN_IOV(req)   SMBD_SMB2_IDX_DYN_IOV(req,out,req->current_idx)
713 #define SMBD_SMB2_OUT_DYN_PTR(req)   (uint8_t *)(SMBD_SMB2_OUT_DYN_IOV(req)->iov_base)
714 #define SMBD_SMB2_OUT_DYN_LEN(req)   (SMBD_SMB2_OUT_DYN_IOV(req)->iov_len)
715
716 #define SMBD_SMB2_SHORT_RECEIVEFILE_WRITE_LEN (SMB2_HDR_BODY + 0x30)
717
718         struct {
719                 /*
720                  * vector[0] TRANSPORT HEADER (empty)
721                  * .
722                  * vector[1] SMB2_TRANSFORM (optional)
723                  * vector[2] SMB2
724                  * vector[3] fixed body
725                  * vector[4] dynamic body
726                  * .
727                  * .
728                  * .
729                  * vector[5] SMB2_TRANSFORM (optional)
730                  * vector[6] SMB2
731                  * vector[7] fixed body
732                  * vector[8] dynamic body
733                  * .
734                  * .
735                  * .
736                  */
737                 struct iovec *vector;
738                 int vector_count;
739                 struct iovec _vector[1 + SMBD_SMB2_NUM_IOV_PER_REQ];
740         } in;
741         struct {
742                 /* the NBT header is not allocated */
743                 uint8_t nbt_hdr[4];
744                 /*
745                  * vector[0] TRANSPORT HEADER
746                  * .
747                  * vector[1] SMB2_TRANSFORM (optional)
748                  * vector[2] SMB2
749                  * vector[3] fixed body
750                  * vector[4] dynamic body
751                  * .
752                  * .
753                  * .
754                  * vector[5] SMB2_TRANSFORM (empty)
755                  * vector[6] SMB2
756                  * vector[7] fixed body
757                  * vector[8] dynamic body
758                  * .
759                  * .
760                  * .
761                  */
762                 struct iovec *vector;
763                 int vector_count;
764                 struct iovec _vector[1 + SMBD_SMB2_NUM_IOV_PER_REQ];
765 #define OUTVEC_ALLOC_SIZE (SMB2_HDR_BODY + 9)
766                 uint8_t _hdr[OUTVEC_ALLOC_SIZE];
767                 uint8_t _body[0x58];
768         } out;
769 };
770
771 struct smbd_server_connection;
772 struct user_struct;
773
774 struct pending_message_list;
775 struct pending_auth_data;
776
777 struct user_struct {
778         struct user_struct *next, *prev;
779         uint64_t vuid; /* Tag for this entry. */
780
781         char *session_keystr; /* used by utmp and pam session code.
782                                  TDB key string */
783         int homes_snum;
784
785         struct auth_session_info *session_info;
786
787         struct smbXsrv_session *session;
788 };
789
790 struct smbd_server_connection {
791         const struct tsocket_address *local_address;
792         const struct tsocket_address *remote_address;
793         const char *remote_hostname;
794         struct tevent_context *ev_ctx;
795         struct messaging_context *msg_ctx;
796         struct sys_notify_context *sys_notify_ctx;
797         struct notify_context *notify_ctx;
798         bool using_smb2;
799         int trans_num;
800
801         size_t num_users;
802         struct user_struct *users;
803
804         size_t num_connections;
805         struct connection_struct *connections;
806
807         size_t num_files;
808         struct files_struct *files;
809
810         int real_max_open_files;
811         struct fsp_singleton_cache fsp_fi_cache;
812
813         struct pending_message_list *deferred_open_queue;
814
815
816         /* open directory handles. */
817         struct {
818                 struct bitmap *dptr_bmap;
819                 struct dptr_struct *dirptrs;
820                 int dirhandles_open;
821         } searches;
822
823         uint64_t num_requests;
824
825         /* Current number of oplocks we have outstanding. */
826         struct {
827                 int32_t exclusive_open;
828                 int32_t level_II_open;
829                 struct kernel_oplocks *kernel_ops;
830         } oplocks;
831
832         struct {
833                 struct notify_mid_map *notify_mid_maps;
834
835                 struct {
836                         /* dlink list we store pending lock records on. */
837                         struct blocking_lock_record *blocking_lock_queue;
838                         /* dlink list we move cancelled lock records onto. */
839                         struct blocking_lock_record *blocking_lock_cancelled_queue;
840
841                         /* The event that makes us process our blocking lock queue */
842                         struct tevent_timer *brl_timeout;
843
844                         bool blocking_lock_unlock_state;
845                         bool blocking_lock_cancel_state;
846                 } locks;
847         } smb1;
848         struct {
849                 struct {
850                         /* The event that makes us process our blocking lock queue */
851                         struct tevent_timer *brl_timeout;
852                         bool blocking_lock_unlock_state;
853                 } locks;
854         } smb2;
855
856         /*
857          * Link into libasys for asynchronous operations
858          */
859         struct asys_context *asys_ctx;
860         struct tevent_fd *asys_fde;
861
862         struct smbXsrv_client *client;
863 };
864
865 extern struct smbXsrv_client *global_smbXsrv_client;
866
867 void smbd_init_globals(void);