1 /*
2    Unix SMB/CIFS implementation.
3    Infrastructure for async SMB client requests
4    Copyright (C) Volker Lendecke 2008
5    Copyright (C) Stefan Metzmacher 2011
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 #ifndef _SMBXCLI_BASE_H_
22 #define _SMBXCLI_BASE_H_
23 
24 #define SMB_SUICIDE_PACKET 0x74697865
25 
26 struct smbXcli_conn;
27 struct smbXcli_session;
28 struct smbXcli_tcon;
29 struct smb_trans_enc_state;
30 struct GUID;
31 struct iovec;
32 struct smb2_create_blobs;
33 struct smb_create_returns;
34 
35 struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx,
36 					 int fd,
37 					 const char *remote_name,
38 					 enum smb_signing_setting signing_state,
39 					 uint32_t smb1_capabilities,
40 					 struct GUID *client_guid,
41 					 uint32_t smb2_capabilities);
42 
43 bool smbXcli_conn_is_connected(struct smbXcli_conn *conn);
44 void smbXcli_conn_disconnect(struct smbXcli_conn *conn, NTSTATUS status);
45 
46 bool smbXcli_conn_has_async_calls(struct smbXcli_conn *conn);
47 
48 bool smbXcli_conn_dfs_supported(struct smbXcli_conn *conn);
49 
50 enum protocol_types smbXcli_conn_protocol(struct smbXcli_conn *conn);
51 bool smbXcli_conn_use_unicode(struct smbXcli_conn *conn);
52 bool smbXcli_conn_signing_mandatory(struct smbXcli_conn *conn);
53 bool smbXcli_conn_support_passthrough(struct smbXcli_conn *conn);
54 
55 void smbXcli_conn_set_sockopt(struct smbXcli_conn *conn, const char *options);
56 const struct sockaddr_storage *smbXcli_conn_local_sockaddr(struct smbXcli_conn *conn);
57 const struct sockaddr_storage *smbXcli_conn_remote_sockaddr(struct smbXcli_conn *conn);
58 const char *smbXcli_conn_remote_name(struct smbXcli_conn *conn);
59 
60 uint16_t smbXcli_conn_max_requests(struct smbXcli_conn *conn);
61 NTTIME smbXcli_conn_server_system_time(struct smbXcli_conn *conn);
62 const DATA_BLOB *smbXcli_conn_server_gss_blob(struct smbXcli_conn *conn);
63 const struct GUID *smbXcli_conn_server_guid(struct smbXcli_conn *conn);
64 bool smbXcli_conn_get_force_channel_sequence(struct smbXcli_conn *conn);
65 void smbXcli_conn_set_force_channel_sequence(struct smbXcli_conn *conn,
66 					     bool v);
67 
68 
69 struct tevent_req *smbXcli_conn_samba_suicide_send(TALLOC_CTX *mem_ctx,
70 						   struct tevent_context *ev,
71 						   struct smbXcli_conn *conn,
72 						   uint8_t exitcode);
73 NTSTATUS smbXcli_conn_samba_suicide_recv(struct tevent_req *req);
74 NTSTATUS smbXcli_conn_samba_suicide(struct smbXcli_conn *conn,
75 				    uint8_t exitcode);
76 
77 void smbXcli_req_unset_pending(struct tevent_req *req);
78 bool smbXcli_req_set_pending(struct tevent_req *req);
79 struct timeval smbXcli_req_endtime(struct tevent_req *req);
80 
81 uint32_t smb1cli_conn_capabilities(struct smbXcli_conn *conn);
82 uint32_t smb1cli_conn_max_xmit(struct smbXcli_conn *conn);
83 bool smb1cli_conn_req_possible(struct smbXcli_conn *conn);
84 uint32_t smb1cli_conn_server_session_key(struct smbXcli_conn *conn);
85 const uint8_t *smb1cli_conn_server_challenge(struct smbXcli_conn *conn);
86 uint16_t smb1cli_conn_server_security_mode(struct smbXcli_conn *conn);
87 bool smb1cli_conn_server_readbraw(struct smbXcli_conn *conn);
88 bool smb1cli_conn_server_writebraw(struct smbXcli_conn *conn);
89 bool smb1cli_conn_server_lockread(struct smbXcli_conn *conn);
90 bool smb1cli_conn_server_writeunlock(struct smbXcli_conn *conn);
91 int smb1cli_conn_server_time_zone(struct smbXcli_conn *conn);
92 
93 bool smb1cli_conn_activate_signing(struct smbXcli_conn *conn,
94 				   const DATA_BLOB user_session_key,
95 				   const DATA_BLOB response);
96 bool smb1cli_conn_check_signing(struct smbXcli_conn *conn,
97 				const uint8_t *buf, uint32_t seqnum);
98 bool smb1cli_conn_signing_is_active(struct smbXcli_conn *conn);
99 
100 void smb1cli_conn_set_encryption(struct smbXcli_conn *conn,
101 				 struct smb_trans_enc_state *es);
102 bool smb1cli_conn_encryption_on(struct smbXcli_conn *conn);
103 
104 bool smb1cli_is_andx_req(uint8_t cmd);
105 size_t smb1cli_req_wct_ofs(struct tevent_req **reqs, int num_reqs);
106 
107 uint16_t smb1cli_req_mid(struct tevent_req *req);
108 void smb1cli_req_set_mid(struct tevent_req *req, uint16_t mid);
109 
110 uint32_t smb1cli_req_seqnum(struct tevent_req *req);
111 void smb1cli_req_set_seqnum(struct tevent_req *req, uint32_t seqnum);
112 
113 struct smb1cli_req_expected_response {
114 	NTSTATUS status;
115 	uint8_t wct;
116 };
117 
118 struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
119 				      struct tevent_context *ev,
120 				      struct smbXcli_conn *conn,
121 				      uint8_t smb_command,
122 				      uint8_t additional_flags,
123 				      uint8_t clear_flags,
124 				      uint16_t additional_flags2,
125 				      uint16_t clear_flags2,
126 				      uint32_t timeout_msec,
127 				      uint32_t pid,
128 				      struct smbXcli_tcon *tcon,
129 				      struct smbXcli_session *session,
130 				      uint8_t wct, uint16_t *vwv,
131 				      int iov_count,
132 				      struct iovec *bytes_iov);
133 NTSTATUS smb1cli_req_chain_submit(struct tevent_req **reqs, int num_reqs);
134 
135 struct tevent_req *smb1cli_req_send(TALLOC_CTX *mem_ctx,
136 				    struct tevent_context *ev,
137 				    struct smbXcli_conn *conn,
138 				    uint8_t smb_command,
139 				    uint8_t additional_flags,
140 				    uint8_t clear_flags,
141 				    uint16_t additional_flags2,
142 				    uint16_t clear_flags2,
143 				    uint32_t timeout_msec,
144 				    uint32_t pid,
145 				    struct smbXcli_tcon *tcon,
146 				    struct smbXcli_session *session,
147 				    uint8_t wct, uint16_t *vwv,
148 				    uint32_t num_bytes,
149 				    const uint8_t *bytes);
150 NTSTATUS smb1cli_req_recv(struct tevent_req *req,
151 			  TALLOC_CTX *mem_ctx,
152 			  struct iovec **piov,
153 			  uint8_t **phdr,
154 			  uint8_t *pwct,
155 			  uint16_t **pvwv,
156 			  uint32_t *pvwv_offset,
157 			  uint32_t *pnum_bytes,
158 			  uint8_t **pbytes,
159 			  uint32_t *pbytes_offset,
160 			  uint8_t **pinbuf,
161 			  const struct smb1cli_req_expected_response *expected,
162 			  size_t num_expected);
163 
164 struct tevent_req *smb1cli_trans_send(
165 	TALLOC_CTX *mem_ctx, struct tevent_context *ev,
166 	struct smbXcli_conn *conn, uint8_t cmd,
167 	uint8_t additional_flags, uint8_t clear_flags,
168 	uint16_t additional_flags2, uint16_t clear_flags2,
169 	uint32_t timeout_msec,
170 	uint32_t pid,
171 	struct smbXcli_tcon *tcon,
172 	struct smbXcli_session *session,
173 	const char *pipe_name, uint16_t fid, uint16_t function, int flags,
174 	uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
175 	uint8_t *param, uint32_t num_param, uint32_t max_param,
176 	uint8_t *data, uint32_t num_data, uint32_t max_data);
177 NTSTATUS smb1cli_trans_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
178 			    uint16_t *recv_flags2,
179 			    uint16_t **setup, uint8_t min_setup,
180 			    uint8_t *num_setup,
181 			    uint8_t **param, uint32_t min_param,
182 			    uint32_t *num_param,
183 			    uint8_t **data, uint32_t min_data,
184 			    uint32_t *num_data);
185 NTSTATUS smb1cli_trans(TALLOC_CTX *mem_ctx, struct smbXcli_conn *conn,
186 		uint8_t trans_cmd,
187 		uint8_t additional_flags, uint8_t clear_flags,
188 		uint16_t additional_flags2, uint16_t clear_flags2,
189 		uint32_t timeout_msec,
190 		uint32_t pid,
191 		struct smbXcli_tcon *tcon,
192 		struct smbXcli_session *session,
193 		const char *pipe_name, uint16_t fid, uint16_t function,
194 		int flags,
195 		uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
196 		uint8_t *param, uint32_t num_param, uint32_t max_param,
197 		uint8_t *data, uint32_t num_data, uint32_t max_data,
198 		uint16_t *recv_flags2,
199 		uint16_t **rsetup, uint8_t min_rsetup, uint8_t *num_rsetup,
200 		uint8_t **rparam, uint32_t min_rparam, uint32_t *num_rparam,
201 		uint8_t **rdata, uint32_t min_rdata, uint32_t *num_rdata);
202 
203 struct tevent_req *smb1cli_echo_send(TALLOC_CTX *mem_ctx,
204 				     struct tevent_context *ev,
205 				     struct smbXcli_conn *conn,
206 				     uint32_t timeout_msec,
207 				     uint16_t num_echos,
208 				     DATA_BLOB data);
209 NTSTATUS smb1cli_echo_recv(struct tevent_req *req);
210 NTSTATUS smb1cli_echo(struct smbXcli_conn *conn, uint32_t timeout_msec,
211 		      uint16_t num_echos, DATA_BLOB data);
212 
213 struct tevent_req *smb1cli_session_setup_lm21_send(TALLOC_CTX *mem_ctx,
214 				struct tevent_context *ev,
215 				struct smbXcli_conn *conn,
216 				uint32_t timeout_msec,
217 				uint32_t pid,
218 				struct smbXcli_session *session,
219 				uint16_t in_buf_size,
220 				uint16_t in_mpx_max,
221 				uint16_t in_vc_num,
222 				uint32_t in_sess_key,
223 				const char *in_user,
224 				const char *in_domain,
225 				const DATA_BLOB in_password,
226 				const char *in_native_os,
227 				const char *in_native_lm);
228 NTSTATUS smb1cli_session_setup_lm21_recv(struct tevent_req *req,
229 					 TALLOC_CTX *mem_ctx,
230 					 char **out_native_os,
231 					 char **out_native_lm);
232 struct tevent_req *smb1cli_session_setup_nt1_send(TALLOC_CTX *mem_ctx,
233 				struct tevent_context *ev,
234 				struct smbXcli_conn *conn,
235 				uint32_t timeout_msec,
236 				uint32_t pid,
237 				struct smbXcli_session *session,
238 				uint16_t in_buf_size,
239 				uint16_t in_mpx_max,
240 				uint16_t in_vc_num,
241 				uint32_t in_sess_key,
242 				const char *in_user,
243 				const char *in_domain,
244 				const DATA_BLOB in_apassword,
245 				const DATA_BLOB in_upassword,
246 				uint32_t in_capabilities,
247 				const char *in_native_os,
248 				const char *in_native_lm);
249 NTSTATUS smb1cli_session_setup_nt1_recv(struct tevent_req *req,
250 					TALLOC_CTX *mem_ctx,
251 					struct iovec **precv_iov,
252 					const uint8_t **precv_inbuf,
253 					char **out_native_os,
254 					char **out_native_lm,
255 					char **out_primary_domain);
256 struct tevent_req *smb1cli_session_setup_ext_send(TALLOC_CTX *mem_ctx,
257 				struct tevent_context *ev,
258 				struct smbXcli_conn *conn,
259 				uint32_t timeout_msec,
260 				uint32_t pid,
261 				struct smbXcli_session *session,
262 				uint16_t in_buf_size,
263 				uint16_t in_mpx_max,
264 				uint16_t in_vc_num,
265 				uint32_t in_sess_key,
266 				const DATA_BLOB in_security_blob,
267 				uint32_t in_capabilities,
268 				const char *in_native_os,
269 				const char *in_native_lm);
270 NTSTATUS smb1cli_session_setup_ext_recv(struct tevent_req *req,
271 					TALLOC_CTX *mem_ctx,
272 					struct iovec **precv_iov,
273 					const uint8_t **precv_inbuf,
274 					DATA_BLOB *out_security_blob,
275 					char **out_native_os,
276 					char **out_native_lm);
277 
278 struct tevent_req *smb1cli_ntcreatex_send(TALLOC_CTX *mem_ctx,
279 					  struct tevent_context *ev,
280 					  struct smbXcli_conn *conn,
281 					  uint32_t timeout_msec,
282 					  uint32_t pid,
283 					  struct smbXcli_tcon *tcon,
284 					  struct smbXcli_session *session,
285 					  const char *fname,
286 					  uint32_t CreatFlags,
287 					  uint32_t RootDirectoryFid,
288 					  uint32_t DesiredAccess,
289 					  uint64_t AllocationSize,
290 					  uint32_t FileAttributes,
291 					  uint32_t ShareAccess,
292 					  uint32_t CreateDisposition,
293 					  uint32_t CreateOptions,
294 					  uint32_t ImpersonationLevel,
295 					  uint8_t SecurityFlags);
296 NTSTATUS smb1cli_ntcreatex_recv(struct tevent_req *req, uint16_t *pfnum);
297 NTSTATUS smb1cli_ntcreatex(struct smbXcli_conn *conn,
298 			   uint32_t timeout_msec,
299 			   uint32_t pid,
300 			   struct smbXcli_tcon *tcon,
301 			   struct smbXcli_session *session,
302 			   const char *fname,
303 			   uint32_t CreatFlags,
304 			   uint32_t RootDirectoryFid,
305 			   uint32_t DesiredAccess,
306 			   uint64_t AllocationSize,
307 			   uint32_t FileAttributes,
308 			   uint32_t ShareAccess,
309 			   uint32_t CreateDisposition,
310 			   uint32_t CreateOptions,
311 			   uint32_t ImpersonationLevel,
312 			   uint8_t SecurityFlags,
313 			   uint16_t *pfnum);
314 struct tevent_req *smb1cli_close_send(TALLOC_CTX *mem_ctx,
315 				      struct tevent_context *ev,
316 				      struct smbXcli_conn *conn,
317 				      uint32_t timeout_msec,
318 				      uint32_t pid,
319 				      struct smbXcli_tcon *tcon,
320 				      struct smbXcli_session *session,
321 				      uint16_t fnum,
322 				      uint32_t last_modified);
323 NTSTATUS smb1cli_close_recv(struct tevent_req *req);
324 NTSTATUS smb1cli_close(struct smbXcli_conn *conn,
325 		       uint32_t timeout_msec,
326 		       uint32_t pid,
327 		       struct smbXcli_tcon *tcon,
328 		       struct smbXcli_session *session,
329 		       uint16_t fnum,
330 		       uint32_t last_modified);
331 struct tevent_req *smb1cli_writex_send(TALLOC_CTX *mem_ctx,
332 				       struct tevent_context *ev,
333 				       struct smbXcli_conn *conn,
334 				       uint32_t timeout_msec,
335 				       uint32_t pid,
336 				       struct smbXcli_tcon *tcon,
337 				       struct smbXcli_session *session,
338 				       uint16_t fnum,
339 				       uint16_t mode,
340 				       const uint8_t *buf,
341 				       uint64_t offset,
342 				       uint32_t size);
343 NTSTATUS smb1cli_writex_recv(struct tevent_req *req,
344 			     uint32_t *pwritten,
345 			     uint16_t *pavailable);
346 NTSTATUS smb1cli_writex(struct smbXcli_conn *conn,
347 			uint32_t timeout_msec,
348 			uint32_t pid,
349 			struct smbXcli_tcon *tcon,
350 			struct smbXcli_session *session,
351 			uint16_t fnum,
352 			uint16_t mode,
353 			const uint8_t *buf,
354 			uint64_t offset,
355 			uint32_t size,
356 			uint32_t *pwritten,
357 			uint16_t *pavailable);
358 struct tevent_req *smb1cli_readx_send(TALLOC_CTX *mem_ctx,
359 				      struct tevent_context *ev,
360 				      struct smbXcli_conn *conn,
361 				      uint32_t timeout_msec,
362 				      uint32_t pid,
363 				      struct smbXcli_tcon *tcon,
364 				      struct smbXcli_session *session,
365 				      uint16_t fnum,
366 				      uint64_t offset,
367 				      uint32_t size);
368 NTSTATUS smb1cli_readx_recv(struct tevent_req *req,
369 			    uint32_t *received,
370 			    uint8_t **rcvbuf);
371 
372 bool smb2cli_conn_req_possible(struct smbXcli_conn *conn, uint32_t *max_dyn_len);
373 uint32_t smb2cli_conn_server_capabilities(struct smbXcli_conn *conn);
374 uint16_t smb2cli_conn_server_security_mode(struct smbXcli_conn *conn);
375 uint32_t smb2cli_conn_max_trans_size(struct smbXcli_conn *conn);
376 uint32_t smb2cli_conn_max_read_size(struct smbXcli_conn *conn);
377 uint32_t smb2cli_conn_max_write_size(struct smbXcli_conn *conn);
378 void smb2cli_conn_set_max_credits(struct smbXcli_conn *conn,
379 				  uint16_t max_credits);
380 uint16_t smb2cli_conn_get_cur_credits(struct smbXcli_conn *conn);
381 uint8_t smb2cli_conn_get_io_priority(struct smbXcli_conn *conn);
382 void smb2cli_conn_set_io_priority(struct smbXcli_conn *conn,
383 				  uint8_t io_priority);
384 uint32_t smb2cli_conn_cc_chunk_len(struct smbXcli_conn *conn);
385 void smb2cli_conn_set_cc_chunk_len(struct smbXcli_conn *conn,
386 				   uint32_t chunk_len);
387 uint32_t smb2cli_conn_cc_max_chunks(struct smbXcli_conn *conn);
388 void smb2cli_conn_set_cc_max_chunks(struct smbXcli_conn *conn,
389 				    uint32_t max_chunks);
390 void smb2cli_conn_set_mid(struct smbXcli_conn *conn, uint64_t mid);
391 uint64_t smb2cli_conn_get_mid(struct smbXcli_conn *conn);
392 
393 struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
394 				      struct tevent_context *ev,
395 				      struct smbXcli_conn *conn,
396 				      uint16_t cmd,
397 				      uint32_t additional_flags,
398 				      uint32_t clear_flags,
399 				      uint32_t timeout_msec,
400 				      struct smbXcli_tcon *tcon,
401 				      struct smbXcli_session *session,
402 				      const uint8_t *fixed,
403 				      uint16_t fixed_len,
404 				      const uint8_t *dyn,
405 				      uint32_t dyn_len,
406 				      uint32_t max_dyn_len);
407 void smb2cli_req_set_notify_async(struct tevent_req *req);
408 NTSTATUS smb2cli_req_compound_submit(struct tevent_req **reqs,
409 				     int num_reqs);
410 void smb2cli_req_set_credit_charge(struct tevent_req *req, uint16_t charge);
411 
412 struct smb2cli_req_expected_response {
413 	NTSTATUS status;
414 	uint16_t body_size;
415 };
416 
417 struct tevent_req *smb2cli_req_send(TALLOC_CTX *mem_ctx,
418 				    struct tevent_context *ev,
419 				    struct smbXcli_conn *conn,
420 				    uint16_t cmd,
421 				    uint32_t additional_flags,
422 				    uint32_t clear_flags,
423 				    uint32_t timeout_msec,
424 				    struct smbXcli_tcon *tcon,
425 				    struct smbXcli_session *session,
426 				    const uint8_t *fixed,
427 				    uint16_t fixed_len,
428 				    const uint8_t *dyn,
429 				    uint32_t dyn_len,
430 				    uint32_t max_dyn_len);
431 NTSTATUS smb2cli_req_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
432 			  struct iovec **piov,
433 			  const struct smb2cli_req_expected_response *expected,
434 			  size_t num_expected);
435 
436 /*
437  * This expects an iov[3] array, that is filled with references to
438  * the buffers used for the sending the requests into the socket.
439  *
440  * This can only be called after smb2cli_req_recv(subreq) before
441  * the TALLOC_FREE(subreq).
442  */
443 NTSTATUS smb2cli_req_get_sent_iov(struct tevent_req *req,
444 				  struct iovec *sent_iov);
445 
446 struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
447 					struct tevent_context *ev,
448 					struct smbXcli_conn *conn,
449 					uint32_t timeout_msec,
450 					enum protocol_types min_protocol,
451 					enum protocol_types max_protocol,
452 					uint16_t max_credits);
453 NTSTATUS smbXcli_negprot_recv(struct tevent_req *req);
454 NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn,
455 			 uint32_t timeout_msec,
456 			 enum protocol_types min_protocol,
457 			 enum protocol_types max_protocol);
458 
459 struct tevent_req *smb2cli_validate_negotiate_info_send(TALLOC_CTX *mem_ctx,
460 						struct tevent_context *ev,
461 						struct smbXcli_conn *conn,
462 						uint32_t timeout_msec,
463 						struct smbXcli_session *session,
464 						struct smbXcli_tcon *tcon);
465 NTSTATUS smb2cli_validate_negotiate_info_recv(struct tevent_req *req);
466 
467 struct smbXcli_session *smbXcli_session_create(TALLOC_CTX *mem_ctx,
468 					       struct smbXcli_conn *conn);
469 struct smbXcli_session *smbXcli_session_shallow_copy(TALLOC_CTX *mem_ctx,
470 					       struct smbXcli_session *src);
471 bool smbXcli_session_is_guest(struct smbXcli_session *session);
472 bool smbXcli_session_is_authenticated(struct smbXcli_session *session);
473 NTSTATUS smb2cli_session_signing_key(struct smbXcli_session *session,
474 				     TALLOC_CTX *mem_ctx,
475 				     DATA_BLOB *key);
476 NTSTATUS smb2cli_session_encryption_key(struct smbXcli_session *session,
477 					TALLOC_CTX *mem_ctx,
478 					DATA_BLOB *key);
479 NTSTATUS smb2cli_session_decryption_key(struct smbXcli_session *session,
480 					TALLOC_CTX *mem_ctx,
481 					DATA_BLOB *key);
482 NTSTATUS smbXcli_session_application_key(struct smbXcli_session *session,
483 					 TALLOC_CTX *mem_ctx,
484 					 DATA_BLOB *key);
485 void smbXcli_session_set_disconnect_expired(struct smbXcli_session *session);
486 uint16_t smb1cli_session_current_id(struct smbXcli_session* session);
487 void smb1cli_session_set_id(struct smbXcli_session* session,
488 			    uint16_t session_id);
489 void smb1cli_session_set_action(struct smbXcli_session *session,
490 				uint16_t action);
491 NTSTATUS smb1cli_session_set_session_key(struct smbXcli_session *session,
492 					 const DATA_BLOB _session_key);
493 NTSTATUS smb1cli_session_protect_session_key(struct smbXcli_session *session);
494 uint8_t smb2cli_session_security_mode(struct smbXcli_session *session);
495 uint64_t smb2cli_session_current_id(struct smbXcli_session *session);
496 uint16_t smb2cli_session_get_flags(struct smbXcli_session *session);
497 void smb2cli_session_set_id_and_flags(struct smbXcli_session *session,
498 				      uint64_t session_id,
499 				      uint16_t session_flags);
500 void smb2cli_session_increment_channel_sequence(struct smbXcli_session *session);
501 uint16_t smb2cli_session_reset_channel_sequence(struct smbXcli_session *session,
502 						uint16_t channel_sequence);
503 uint16_t smb2cli_session_current_channel_sequence(struct smbXcli_session *session);
504 void smb2cli_session_start_replay(struct smbXcli_session *session);
505 void smb2cli_session_stop_replay(struct smbXcli_session *session);
506 void smb2cli_session_require_signed_response(struct smbXcli_session *session,
507 					     bool require_signed_response);
508 NTSTATUS smb2cli_session_update_preauth(struct smbXcli_session *session,
509 					const struct iovec *iov);
510 NTSTATUS smb2cli_session_set_session_key(struct smbXcli_session *session,
511 					 const DATA_BLOB session_key,
512 					 const struct iovec *recv_iov);
513 NTSTATUS smb2cli_session_create_channel(TALLOC_CTX *mem_ctx,
514 					struct smbXcli_session *session1,
515 					struct smbXcli_conn *conn,
516 					struct smbXcli_session **_session2);
517 NTSTATUS smb2cli_session_set_channel_key(struct smbXcli_session *session,
518 					 const DATA_BLOB channel_key,
519 					 const struct iovec *recv_iov);
520 NTSTATUS smb2cli_session_encryption_on(struct smbXcli_session *session);
521 
522 struct smbXcli_tcon *smbXcli_tcon_create(TALLOC_CTX *mem_ctx);
523 struct smbXcli_tcon *smbXcli_tcon_copy(TALLOC_CTX *mem_ctx,
524 				const struct smbXcli_tcon *tcon_in);
525 void smbXcli_tcon_set_fs_attributes(struct smbXcli_tcon *tcon,
526 				    uint32_t fs_attributes);
527 uint32_t smbXcli_tcon_get_fs_attributes(struct smbXcli_tcon *tcon);
528 bool smbXcli_tcon_is_dfs_share(struct smbXcli_tcon *tcon);
529 uint16_t smb1cli_tcon_current_id(struct smbXcli_tcon *tcon);
530 void smb1cli_tcon_set_id(struct smbXcli_tcon *tcon, uint16_t tcon_id);
531 bool smb1cli_tcon_set_values(struct smbXcli_tcon *tcon,
532 			     uint16_t tcon_id,
533 			     uint16_t optional_support,
534 			     uint32_t maximal_access,
535 			     uint32_t guest_maximal_access,
536 			     const char *service,
537 			     const char *fs_type);
538 uint32_t smb2cli_tcon_current_id(struct smbXcli_tcon *tcon);
539 void smb2cli_tcon_set_id(struct smbXcli_tcon *tcon, uint32_t tcon_id);
540 uint32_t smb2cli_tcon_capabilities(struct smbXcli_tcon *tcon);
541 uint32_t smb2cli_tcon_flags(struct smbXcli_tcon *tcon);
542 void smb2cli_tcon_set_values(struct smbXcli_tcon *tcon,
543 			     struct smbXcli_session *session,
544 			     uint32_t tcon_id,
545 			     uint8_t type,
546 			     uint32_t flags,
547 			     uint32_t capabilities,
548 			     uint32_t maximal_access);
549 void smb2cli_tcon_should_sign(struct smbXcli_tcon *tcon,
550 			      bool should_sign);
551 bool smb2cli_tcon_is_signing_on(struct smbXcli_tcon *tcon);
552 void smb2cli_tcon_should_encrypt(struct smbXcli_tcon *tcon,
553 				 bool should_encrypt);
554 bool smb2cli_tcon_is_encryption_on(struct smbXcli_tcon *tcon);
555 
556 struct tevent_req *smb2cli_session_setup_send(TALLOC_CTX *mem_ctx,
557 				struct tevent_context *ev,
558 				struct smbXcli_conn *conn,
559 				uint32_t timeout_msec,
560 				struct smbXcli_session *session,
561 				uint8_t in_flags,
562 				uint32_t in_capabilities,
563 				uint32_t in_channel,
564 				uint64_t in_previous_session_id,
565 				const DATA_BLOB *in_security_buffer);
566 NTSTATUS smb2cli_session_setup_recv(struct tevent_req *req,
567 				    TALLOC_CTX *mem_ctx,
568 				    struct iovec **recv_iov,
569 				    DATA_BLOB *out_security_buffer);
570 
571 struct tevent_req *smb2cli_logoff_send(TALLOC_CTX *mem_ctx,
572 				       struct tevent_context *ev,
573 				       struct smbXcli_conn *conn,
574 				       uint32_t timeout_msec,
575 				       struct smbXcli_session *session);
576 NTSTATUS smb2cli_logoff_recv(struct tevent_req *req);
577 NTSTATUS smb2cli_logoff(struct smbXcli_conn *conn,
578 			uint32_t timeout_msec,
579 			struct smbXcli_session *session);
580 
581 struct tevent_req *smb2cli_tcon_send(TALLOC_CTX *mem_ctx,
582 				     struct tevent_context *ev,
583 				     struct smbXcli_conn *conn,
584 				     uint32_t timeout_msec,
585 				     struct smbXcli_session *session,
586 				     struct smbXcli_tcon *tcon,
587 				     uint16_t flags,
588 				     const char *unc);
589 NTSTATUS smb2cli_tcon_recv(struct tevent_req *req);
590 NTSTATUS smb2cli_tcon(struct smbXcli_conn *conn,
591 		      uint32_t timeout_msec,
592 		      struct smbXcli_session *session,
593 		      struct smbXcli_tcon *tcon,
594 		      uint16_t flags,
595 		      const char *unc);
596 
597 struct tevent_req *smb2cli_tdis_send(TALLOC_CTX *mem_ctx,
598 				     struct tevent_context *ev,
599 				     struct smbXcli_conn *conn,
600 				     uint32_t timeout_msec,
601 				     struct smbXcli_session *session,
602 				     struct smbXcli_tcon *tcon);
603 NTSTATUS smb2cli_tdis_recv(struct tevent_req *req);
604 NTSTATUS smb2cli_tdis(struct smbXcli_conn *conn,
605 		      uint32_t timeout_msec,
606 		      struct smbXcli_session *session,
607 		      struct smbXcli_tcon *tcon);
608 
609 struct tevent_req *smb2cli_create_send(
610 	TALLOC_CTX *mem_ctx,
611 	struct tevent_context *ev,
612 	struct smbXcli_conn *conn,
613 	uint32_t timeout_msec,
614 	struct smbXcli_session *session,
615 	struct smbXcli_tcon *tcon,
616 	const char *filename,
617 	uint8_t  oplock_level,		/* SMB2_OPLOCK_LEVEL_* */
618 	uint32_t impersonation_level,	/* SMB2_IMPERSONATION_* */
619 	uint32_t desired_access,
620 	uint32_t file_attributes,
621 	uint32_t share_access,
622 	uint32_t create_disposition,
623 	uint32_t create_options,
624 	struct smb2_create_blobs *blobs);
625 NTSTATUS smb2cli_create_recv(struct tevent_req *req,
626 			     uint64_t *fid_persistent,
627 			     uint64_t *fid_volatile,
628 			     struct smb_create_returns *cr,
629 			     TALLOC_CTX *mem_ctx,
630 			     struct smb2_create_blobs *blobs);
631 NTSTATUS smb2cli_create(struct smbXcli_conn *conn,
632 			uint32_t timeout_msec,
633 			struct smbXcli_session *session,
634 			struct smbXcli_tcon *tcon,
635 			const char *filename,
636 			uint8_t  oplock_level,	     /* SMB2_OPLOCK_LEVEL_* */
637 			uint32_t impersonation_level, /* SMB2_IMPERSONATION_* */
638 			uint32_t desired_access,
639 			uint32_t file_attributes,
640 			uint32_t share_access,
641 			uint32_t create_disposition,
642 			uint32_t create_options,
643 			struct smb2_create_blobs *blobs,
644 			uint64_t *fid_persistent,
645 			uint64_t *fid_volatile,
646 			struct smb_create_returns *cr,
647 			TALLOC_CTX *mem_ctx,
648 			struct smb2_create_blobs *ret_blobs);
649 
650 struct tevent_req *smb2cli_close_send(TALLOC_CTX *mem_ctx,
651 				      struct tevent_context *ev,
652 				      struct smbXcli_conn *conn,
653 				      uint32_t timeout_msec,
654 				      struct smbXcli_session *session,
655 				      struct smbXcli_tcon *tcon,
656 				      uint16_t flags,
657 				      uint64_t fid_persistent,
658 				      uint64_t fid_volatile);
659 NTSTATUS smb2cli_close_recv(struct tevent_req *req);
660 NTSTATUS smb2cli_close(struct smbXcli_conn *conn,
661 		       uint32_t timeout_msec,
662 		       struct smbXcli_session *session,
663 		       struct smbXcli_tcon *tcon,
664 		       uint16_t flags,
665 		       uint64_t fid_persistent,
666 		       uint64_t fid_volatile);
667 
668 struct tevent_req *smb2cli_read_send(TALLOC_CTX *mem_ctx,
669 				     struct tevent_context *ev,
670 				     struct smbXcli_conn *conn,
671 				     uint32_t timeout_msec,
672 				     struct smbXcli_session *session,
673 				     struct smbXcli_tcon *tcon,
674 				     uint32_t length,
675 				     uint64_t offset,
676 				     uint64_t fid_persistent,
677 				     uint64_t fid_volatile,
678 				     uint64_t minimum_count,
679 				     uint64_t remaining_bytes);
680 NTSTATUS smb2cli_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
681 			   uint8_t **data, uint32_t *data_length);
682 NTSTATUS smb2cli_read(struct smbXcli_conn *conn,
683 		      uint32_t timeout_msec,
684 		      struct smbXcli_session *session,
685 		      struct smbXcli_tcon *tcon,
686 		      uint32_t length,
687 		      uint64_t offset,
688 		      uint64_t fid_persistent,
689 		      uint64_t fid_volatile,
690 		      uint64_t minimum_count,
691 		      uint64_t remaining_bytes,
692 		      TALLOC_CTX *mem_ctx,
693 		      uint8_t **data,
694 		      uint32_t *data_length);
695 
696 struct tevent_req *smb2cli_write_send(TALLOC_CTX *mem_ctx,
697 				      struct tevent_context *ev,
698 				      struct smbXcli_conn *conn,
699 				      uint32_t timeout_msec,
700 				      struct smbXcli_session *session,
701 				      struct smbXcli_tcon *tcon,
702 				      uint32_t length,
703 				      uint64_t offset,
704 				      uint64_t fid_persistent,
705 				      uint64_t fid_volatile,
706 				      uint32_t remaining_bytes,
707 				      uint32_t flags,
708 				      const uint8_t *data);
709 NTSTATUS smb2cli_write_recv(struct tevent_req *req,
710 			uint32_t *written);
711 NTSTATUS smb2cli_write(struct smbXcli_conn *conn,
712 		       uint32_t timeout_msec,
713 		       struct smbXcli_session *session,
714 		       struct smbXcli_tcon *tcon,
715 		       uint32_t length,
716 		       uint64_t offset,
717 		       uint64_t fid_persistent,
718 		       uint64_t fid_volatile,
719 		       uint32_t remaining_bytes,
720 		       uint32_t flags,
721 		       const uint8_t *data,
722 		       uint32_t *written);
723 
724 struct tevent_req *smb2cli_flush_send(TALLOC_CTX *mem_ctx,
725 				      struct tevent_context *ev,
726 				      struct smbXcli_conn *conn,
727 				      uint32_t timeout_msec,
728 				      struct smbXcli_session *session,
729 				      struct smbXcli_tcon *tcon,
730 				      uint64_t fid_persistent,
731 				      uint64_t fid_volatile);
732 NTSTATUS smb2cli_flush_recv(struct tevent_req *req);
733 NTSTATUS smb2cli_flush(struct smbXcli_conn *conn,
734 		       uint32_t timeout_msec,
735 		       struct smbXcli_session *session,
736 		       struct smbXcli_tcon *tcon,
737 		       uint64_t fid_persistent,
738 		       uint64_t fid_volatile);
739 
740 struct tevent_req *smb2cli_set_info_send(TALLOC_CTX *mem_ctx,
741 					 struct tevent_context *ev,
742 					 struct smbXcli_conn *conn,
743 					 uint32_t timeout_msec,
744 					 struct smbXcli_session *session,
745 					 struct smbXcli_tcon *tcon,
746 					 uint8_t in_info_type,
747 					 uint8_t in_file_info_class,
748 					 const DATA_BLOB *in_input_buffer,
749 					 uint32_t in_additional_info,
750 					 uint64_t in_fid_persistent,
751 					 uint64_t in_fid_volatile);
752 NTSTATUS smb2cli_set_info_recv(struct tevent_req *req);
753 NTSTATUS smb2cli_set_info(struct smbXcli_conn *conn,
754 			  uint32_t timeout_msec,
755 			  struct smbXcli_session *session,
756 			  struct smbXcli_tcon *tcon,
757 			  uint8_t in_info_type,
758 			  uint8_t in_file_info_class,
759 			  const DATA_BLOB *in_input_buffer,
760 			  uint32_t in_additional_info,
761 			  uint64_t in_fid_persistent,
762 			  uint64_t in_fid_volatile);
763 
764 struct tevent_req *smb2cli_query_info_send(TALLOC_CTX *mem_ctx,
765 					   struct tevent_context *ev,
766 					   struct smbXcli_conn *conn,
767 					   uint32_t timeout_msec,
768 					   struct smbXcli_session *session,
769 					   struct smbXcli_tcon *tcon,
770 					   uint8_t in_info_type,
771 					   uint8_t in_file_info_class,
772 					   uint32_t in_max_output_length,
773 					   const DATA_BLOB *in_input_buffer,
774 					   uint32_t in_additional_info,
775 					   uint32_t in_flags,
776 					   uint64_t in_fid_persistent,
777 					   uint64_t in_fid_volatile);
778 NTSTATUS smb2cli_query_info_recv(struct tevent_req *req,
779 				 TALLOC_CTX *mem_ctx,
780 				 DATA_BLOB *out_output_buffer);
781 NTSTATUS smb2cli_query_info(struct smbXcli_conn *conn,
782 			    uint32_t timeout_msec,
783 			    struct smbXcli_session *session,
784 			    struct smbXcli_tcon *tcon,
785 			    uint8_t in_info_type,
786 			    uint8_t in_file_info_class,
787 			    uint32_t in_max_output_length,
788 			    const DATA_BLOB *in_input_buffer,
789 			    uint32_t in_additional_info,
790 			    uint32_t in_flags,
791 			    uint64_t in_fid_persistent,
792 			    uint64_t in_fid_volatile,
793 			    TALLOC_CTX *mem_ctx,
794 			    DATA_BLOB *out_output_buffer);
795 
796 struct tevent_req *smb2cli_query_directory_send(TALLOC_CTX *mem_ctx,
797 						struct tevent_context *ev,
798 						struct smbXcli_conn *conn,
799 						uint32_t timeout_msec,
800 						struct smbXcli_session *session,
801 						struct smbXcli_tcon *tcon,
802 						uint8_t level,
803 						uint8_t flags,
804 						uint32_t file_index,
805 						uint64_t fid_persistent,
806 						uint64_t fid_volatile,
807 						const char *mask,
808 						uint32_t outbuf_len);
809 NTSTATUS smb2cli_query_directory_recv(struct tevent_req *req,
810 				      TALLOC_CTX *mem_ctx,
811 				      uint8_t **data,
812 				      uint32_t *data_length);
813 NTSTATUS smb2cli_query_directory(struct smbXcli_conn *conn,
814 				 uint32_t timeout_msec,
815 				 struct smbXcli_session *session,
816 				 struct smbXcli_tcon *tcon,
817 				 uint8_t level,
818 				 uint8_t flags,
819 				 uint32_t file_index,
820 				 uint64_t fid_persistent,
821 				 uint64_t fid_volatile,
822 				 const char *mask,
823 				 uint32_t outbuf_len,
824 				 TALLOC_CTX *mem_ctx,
825 				 uint8_t **data,
826 				 uint32_t *data_length);
827 
828 struct tevent_req *smb2cli_notify_send(TALLOC_CTX *mem_ctx,
829 				       struct tevent_context *ev,
830 				       struct smbXcli_conn *conn,
831 				       uint32_t timeout_msec,
832 				       struct smbXcli_session *session,
833 				       struct smbXcli_tcon *tcon,
834 				       uint32_t output_buffer_length,
835 				       uint64_t fid_persistent,
836 				       uint64_t fid_volatile,
837 				       uint32_t completion_filter,
838 				       bool recursive);
839 NTSTATUS smb2cli_notify_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
840 			     uint8_t **data, uint32_t *data_length);
841 NTSTATUS smb2cli_notify(struct smbXcli_conn *conn,
842 			uint32_t timeout_msec,
843 			struct smbXcli_session *session,
844 			struct smbXcli_tcon *tcon,
845 			uint32_t output_buffer_length,
846 			uint64_t fid_persistent,
847 			uint64_t fid_volatile,
848 			uint32_t completion_filter,
849 			bool recursive,
850 			TALLOC_CTX *mem_ctx,
851 			uint8_t **data,
852 			uint32_t *data_length);
853 
854 struct tevent_req *smb2cli_ioctl_send(TALLOC_CTX *mem_ctx,
855 				      struct tevent_context *ev,
856 				      struct smbXcli_conn *conn,
857 				      uint32_t timeout_msec,
858 				      struct smbXcli_session *session,
859 				      struct smbXcli_tcon *tcon,
860 				      uint64_t in_fid_persistent,
861 				      uint64_t in_fid_volatile,
862 				      uint32_t in_ctl_code,
863 				      uint32_t in_max_input_length,
864 				      const DATA_BLOB *in_input_buffer,
865 				      uint32_t in_max_output_length,
866 				      const DATA_BLOB *in_output_buffer,
867 				      uint32_t in_flags);
868 NTSTATUS smb2cli_ioctl_recv(struct tevent_req *req,
869 			    TALLOC_CTX *mem_ctx,
870 			    DATA_BLOB *out_input_buffer,
871 			    DATA_BLOB *out_output_buffer);
872 NTSTATUS smb2cli_ioctl(struct smbXcli_conn *conn,
873 		       uint32_t timeout_msec,
874 		       struct smbXcli_session *session,
875 		       struct smbXcli_tcon *tcon,
876 		       uint64_t in_fid_persistent,
877 		       uint64_t in_fid_volatile,
878 		       uint32_t in_ctl_code,
879 		       uint32_t in_max_input_length,
880 		       const DATA_BLOB *in_input_buffer,
881 		       uint32_t in_max_output_length,
882 		       const DATA_BLOB *in_output_buffer,
883 		       uint32_t in_flags,
884 		       TALLOC_CTX *mem_ctx,
885 		       DATA_BLOB *out_input_buffer,
886 		       DATA_BLOB *out_output_buffer);
887 
888 struct tevent_req *smb2cli_echo_send(TALLOC_CTX *mem_ctx,
889 				     struct tevent_context *ev,
890 				     struct smbXcli_conn *conn,
891 				     uint32_t timeout_msec);
892 NTSTATUS smb2cli_echo_recv(struct tevent_req *req);
893 NTSTATUS smb2cli_echo(struct smbXcli_conn *conn,
894 		      uint32_t timeout_msec);
895 
896 #endif /* _SMBXCLI_BASE_H_ */
897