2 Unix SMB/CIFS implementation.
4 SMB client negotiate context management functions
6 Copyright (C) Andrew Tridgell 1994-2005
7 Copyright (C) James Myers 2003 <myersjj@samba.org>
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "system/time.h"
26 #include "libcli/raw/libcliraw.h"
27 #include "libcli/raw/raw_proto.h"
28 #include "../libcli/smb/smbXcli_base.h"
29 #include "../lib/util/tevent_ntstatus.h"
31 struct smb_raw_negotiate_state
{
32 struct smbcli_transport
*transport
;
35 static void smb_raw_negotiate_done(struct tevent_req
*subreq
);
37 struct tevent_req
*smb_raw_negotiate_send(TALLOC_CTX
*mem_ctx
,
38 struct tevent_context
*ev
,
39 struct smbcli_transport
*transport
,
42 struct tevent_req
*req
;
43 struct smb_raw_negotiate_state
*state
;
44 struct tevent_req
*subreq
;
45 uint32_t timeout_msec
= transport
->options
.request_timeout
* 1000;
47 req
= tevent_req_create(mem_ctx
, &state
,
48 struct smb_raw_negotiate_state
);;
52 state
->transport
= transport
;
54 subreq
= smbXcli_negprot_send(state
, ev
,
59 if (tevent_req_nomem(subreq
, req
)) {
60 return tevent_req_post(req
, ev
);
62 tevent_req_set_callback(subreq
, smb_raw_negotiate_done
, req
);
67 static void smb_raw_negotiate_done(struct tevent_req
*subreq
)
69 struct tevent_req
*req
=
70 tevent_req_callback_data(subreq
,
72 struct smb_raw_negotiate_state
*state
=
74 struct smb_raw_negotiate_state
);
75 struct smbcli_negotiate
*n
= &state
->transport
->negotiate
;
76 struct smbXcli_conn
*c
= state
->transport
->conn
;
80 status
= smbXcli_negprot_recv(subreq
);
82 if (tevent_req_nterror(req
, status
)) {
86 n
->protocol
= smbXcli_conn_protocol(c
);
88 n
->sec_mode
= smb1cli_conn_server_security_mode(c
);
89 n
->max_mux
= smbXcli_conn_max_requests(c
);
90 n
->max_xmit
= smb1cli_conn_max_xmit(c
);
91 n
->sesskey
= smb1cli_conn_server_session_key(c
);
92 n
->capabilities
= smb1cli_conn_capabilities(c
);;
94 /* this time arrives in real GMT */
95 ntt
= smbXcli_conn_server_system_time(c
);
96 n
->server_time
= nt_time_to_unix(ntt
);
97 n
->server_zone
= smb1cli_conn_server_time_zone(c
);
99 if (n
->capabilities
& CAP_EXTENDED_SECURITY
) {
100 const DATA_BLOB
*b
= smbXcli_conn_server_gss_blob(c
);
105 const uint8_t *p
= smb1cli_conn_server_challenge(c
);
107 n
->secblob
= data_blob_const(p
, 8);
111 n
->readbraw_supported
= smb1cli_conn_server_readbraw(c
);
112 n
->readbraw_supported
= smb1cli_conn_server_writebraw(c
);
113 n
->lockread_supported
= smb1cli_conn_server_lockread(c
);
115 tevent_req_done(req
);
119 Send a negprot command.
121 NTSTATUS
smb_raw_negotiate_recv(struct tevent_req
*req
)
123 return tevent_req_simple_recv_ntstatus(req
);
128 Send a negprot command (sync interface)
130 NTSTATUS
smb_raw_negotiate(struct smbcli_transport
*transport
, bool unicode
, int maxprotocol
)
132 NTSTATUS status
= NT_STATUS_INTERNAL_ERROR
;
133 struct tevent_req
*subreq
= NULL
;
136 subreq
= smb_raw_negotiate_send(transport
,
140 if (subreq
== NULL
) {
141 return NT_STATUS_NO_MEMORY
;
144 ok
= tevent_req_poll(subreq
, transport
->ev
);
146 status
= map_nt_error_from_unix_common(errno
);
150 status
= smb_raw_negotiate_recv(subreq
);