2 Unix SMB/CIFS implementation.
4 Copyright (C) Volker Lendecke 2011
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "async_smb.h"
24 #include "../libcli/smb/smbXcli_base.h"
25 #include "libsmb/proto.h"
26 #include "lib/util/tevent_ntstatus.h"
27 #include "../libcli/auth/spnego.h"
28 #include "../auth/ntlmssp/ntlmssp.h"
30 struct smb2cli_logoff_state
{
34 static void smb2cli_logoff_done(struct tevent_req
*subreq
);
36 struct tevent_req
*smb2cli_logoff_send(TALLOC_CTX
*mem_ctx
,
37 struct tevent_context
*ev
,
38 struct smbXcli_conn
*conn
,
39 uint32_t timeout_msec
,
40 struct smbXcli_session
*session
)
42 struct tevent_req
*req
, *subreq
;
43 struct smb2cli_logoff_state
*state
;
45 req
= tevent_req_create(mem_ctx
, &state
,
46 struct smb2cli_logoff_state
);
50 SSVAL(state
->fixed
, 0, 4);
52 subreq
= smb2cli_req_send(state
, ev
,
59 state
->fixed
, sizeof(state
->fixed
),
61 if (tevent_req_nomem(subreq
, req
)) {
62 return tevent_req_post(req
, ev
);
64 tevent_req_set_callback(subreq
, smb2cli_logoff_done
, req
);
68 static void smb2cli_logoff_done(struct tevent_req
*subreq
)
70 struct tevent_req
*req
=
71 tevent_req_callback_data(subreq
,
73 struct smb2cli_logoff_state
*state
=
75 struct smb2cli_logoff_state
);
78 static const struct smb2cli_req_expected_response expected
[] = {
80 .status
= NT_STATUS_OK
,
85 status
= smb2cli_req_recv(subreq
, state
, &iov
,
86 expected
, ARRAY_SIZE(expected
));
88 if (tevent_req_nterror(req
, status
)) {
94 NTSTATUS
smb2cli_logoff_recv(struct tevent_req
*req
)
96 return tevent_req_simple_recv_ntstatus(req
);
99 NTSTATUS
smb2cli_logoff(struct smbXcli_conn
*conn
,
100 uint32_t timeout_msec
,
101 struct smbXcli_session
*session
)
103 TALLOC_CTX
*frame
= talloc_stackframe();
104 struct tevent_context
*ev
;
105 struct tevent_req
*req
;
106 NTSTATUS status
= NT_STATUS_NO_MEMORY
;
108 if (smbXcli_conn_has_async_calls(conn
)) {
110 * Can't use sync call while an async call is in flight
112 status
= NT_STATUS_INVALID_PARAMETER
;
115 ev
= tevent_context_init(frame
);
119 req
= smb2cli_logoff_send(frame
, ev
, conn
, timeout_msec
, session
);
123 if (!tevent_req_poll_ntstatus(req
, ev
, &status
)) {
126 status
= smb2cli_logoff_recv(req
);