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,
43 struct tevent_req *req;
44 struct smb_raw_negotiate_state *state;
45 struct tevent_req *subreq;
46 uint32_t timeout_msec = transport->options.request_timeout * 1000;
48 req = tevent_req_create(mem_ctx, &state,
49 struct smb_raw_negotiate_state);;
53 state->transport = transport;
55 if (maxprotocol > PROTOCOL_NT1) {
56 maxprotocol = PROTOCOL_NT1;
59 subreq = smbXcli_negprot_send(state, ev,
64 if (tevent_req_nomem(subreq, req)) {
65 return tevent_req_post(req, ev);
67 tevent_req_set_callback(subreq, smb_raw_negotiate_done, req);
72 static void smb_raw_negotiate_done(struct tevent_req *subreq)
74 struct tevent_req *req =
75 tevent_req_callback_data(subreq,
77 struct smb_raw_negotiate_state *state =
79 struct smb_raw_negotiate_state);
80 struct smbcli_negotiate *n = &state->transport->negotiate;
81 struct smbXcli_conn *c = state->transport->conn;
85 status = smbXcli_negprot_recv(subreq);
87 if (tevent_req_nterror(req, status)) {
91 n->protocol = smbXcli_conn_protocol(c);
93 n->sec_mode = smb1cli_conn_server_security_mode(c);
94 n->max_mux = smbXcli_conn_max_requests(c);
95 n->max_xmit = smb1cli_conn_max_xmit(c);
96 n->sesskey = smb1cli_conn_server_session_key(c);
97 n->capabilities = smb1cli_conn_capabilities(c);;
99 /* this time arrives in real GMT */
100 ntt = smbXcli_conn_server_system_time(c);
101 n->server_time = nt_time_to_unix(ntt);
102 n->server_zone = smb1cli_conn_server_time_zone(c);
104 if (n->capabilities & CAP_EXTENDED_SECURITY) {
105 const DATA_BLOB *b = smbXcli_conn_server_gss_blob(c);
110 const uint8_t *p = smb1cli_conn_server_challenge(c);
112 n->secblob = data_blob_const(p, 8);
116 n->readbraw_supported = smb1cli_conn_server_readbraw(c);
117 n->readbraw_supported = smb1cli_conn_server_writebraw(c);
118 n->lockread_supported = smb1cli_conn_server_lockread(c);
120 tevent_req_done(req);
124 Send a negprot command.
126 NTSTATUS smb_raw_negotiate_recv(struct tevent_req *req)
128 return tevent_req_simple_recv_ntstatus(req);
133 Send a negprot command (sync interface)
135 NTSTATUS smb_raw_negotiate(struct smbcli_transport *transport, bool unicode,
136 int minprotocol, int maxprotocol)
138 NTSTATUS status = NT_STATUS_INTERNAL_ERROR;
139 struct tevent_req *subreq = NULL;
142 subreq = smb_raw_negotiate_send(transport,
147 if (subreq == NULL) {
148 return NT_STATUS_NO_MEMORY;
151 ok = tevent_req_poll(subreq, transport->ev);
153 status = map_nt_error_from_unix_common(errno);
157 status = smb_raw_negotiate_recv(subreq);