mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
s3:smb2_tcon: make the top level code async using
metze
This commit is contained in:
parent
b19a9dbb5b
commit
302f767fb7
@ -27,14 +27,6 @@
|
|||||||
#include "lib/param/loadparm.h"
|
#include "lib/param/loadparm.h"
|
||||||
#include "../lib/util/tevent_ntstatus.h"
|
#include "../lib/util/tevent_ntstatus.h"
|
||||||
|
|
||||||
static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
|
|
||||||
const char *in_path,
|
|
||||||
uint8_t *out_share_type,
|
|
||||||
uint32_t *out_share_flags,
|
|
||||||
uint32_t *out_capabilities,
|
|
||||||
uint32_t *out_maximal_access,
|
|
||||||
uint32_t *out_tree_id);
|
|
||||||
|
|
||||||
static struct tevent_req *smbd_smb2_tree_connect_send(TALLOC_CTX *mem_ctx,
|
static struct tevent_req *smbd_smb2_tree_connect_send(TALLOC_CTX *mem_ctx,
|
||||||
struct tevent_context *ev,
|
struct tevent_context *ev,
|
||||||
struct smbd_smb2_request *smb2req,
|
struct smbd_smb2_request *smb2req,
|
||||||
@ -46,24 +38,20 @@ static NTSTATUS smbd_smb2_tree_connect_recv(struct tevent_req *req,
|
|||||||
uint32_t *out_maximal_access,
|
uint32_t *out_maximal_access,
|
||||||
uint32_t *out_tree_id);
|
uint32_t *out_tree_id);
|
||||||
|
|
||||||
|
static void smbd_smb2_request_tcon_done(struct tevent_req *subreq);
|
||||||
|
|
||||||
NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
|
NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
|
||||||
{
|
{
|
||||||
const uint8_t *inbody;
|
const uint8_t *inbody;
|
||||||
int i = req->current_idx;
|
int i = req->current_idx;
|
||||||
uint8_t *outhdr;
|
|
||||||
DATA_BLOB outbody;
|
|
||||||
uint16_t in_path_offset;
|
uint16_t in_path_offset;
|
||||||
uint16_t in_path_length;
|
uint16_t in_path_length;
|
||||||
DATA_BLOB in_path_buffer;
|
DATA_BLOB in_path_buffer;
|
||||||
char *in_path_string;
|
char *in_path_string;
|
||||||
size_t in_path_string_size;
|
size_t in_path_string_size;
|
||||||
uint8_t out_share_type = 0;
|
|
||||||
uint32_t out_share_flags = 0;
|
|
||||||
uint32_t out_capabilities = 0;
|
|
||||||
uint32_t out_maximal_access = 0;
|
|
||||||
uint32_t out_tree_id = 0;
|
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
bool ok;
|
bool ok;
|
||||||
|
struct tevent_req *subreq;
|
||||||
|
|
||||||
status = smbd_smb2_request_verify_sizes(req, 0x09);
|
status = smbd_smb2_request_verify_sizes(req, 0x09);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
@ -102,21 +90,62 @@ NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
|
|||||||
return smbd_smb2_request_error(req, NT_STATUS_BAD_NETWORK_NAME);
|
return smbd_smb2_request_error(req, NT_STATUS_BAD_NETWORK_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
status = smbd_smb2_tree_connect(req, in_path_string,
|
subreq = smbd_smb2_tree_connect_send(req,
|
||||||
&out_share_type,
|
req->sconn->ev_ctx,
|
||||||
&out_share_flags,
|
req,
|
||||||
&out_capabilities,
|
in_path_string);
|
||||||
&out_maximal_access,
|
if (subreq == NULL) {
|
||||||
&out_tree_id);
|
return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
|
||||||
|
}
|
||||||
|
tevent_req_set_callback(subreq, smbd_smb2_request_tcon_done, req);
|
||||||
|
|
||||||
|
return smbd_smb2_request_pending_queue(req, subreq, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void smbd_smb2_request_tcon_done(struct tevent_req *subreq)
|
||||||
|
{
|
||||||
|
struct smbd_smb2_request *req =
|
||||||
|
tevent_req_callback_data(subreq,
|
||||||
|
struct smbd_smb2_request);
|
||||||
|
int i = req->current_idx;
|
||||||
|
uint8_t *outhdr;
|
||||||
|
DATA_BLOB outbody;
|
||||||
|
uint8_t out_share_type = 0;
|
||||||
|
uint32_t out_share_flags = 0;
|
||||||
|
uint32_t out_capabilities = 0;
|
||||||
|
uint32_t out_maximal_access = 0;
|
||||||
|
uint32_t out_tree_id = 0;
|
||||||
|
NTSTATUS status;
|
||||||
|
NTSTATUS error;
|
||||||
|
|
||||||
|
status = smbd_smb2_tree_connect_recv(subreq,
|
||||||
|
&out_share_type,
|
||||||
|
&out_share_flags,
|
||||||
|
&out_capabilities,
|
||||||
|
&out_maximal_access,
|
||||||
|
&out_tree_id);
|
||||||
|
TALLOC_FREE(subreq);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
return smbd_smb2_request_error(req, status);
|
error = smbd_smb2_request_error(req, status);
|
||||||
|
if (!NT_STATUS_IS_OK(error)) {
|
||||||
|
smbd_server_connection_terminate(req->sconn,
|
||||||
|
nt_errstr(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
outhdr = (uint8_t *)req->out.vector[i].iov_base;
|
outhdr = (uint8_t *)req->out.vector[i].iov_base;
|
||||||
|
|
||||||
outbody = data_blob_talloc(req->out.vector, NULL, 0x10);
|
outbody = data_blob_talloc(req->out.vector, NULL, 0x10);
|
||||||
if (outbody.data == NULL) {
|
if (outbody.data == NULL) {
|
||||||
return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
|
error = smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
|
||||||
|
if (!NT_STATUS_IS_OK(error)) {
|
||||||
|
smbd_server_connection_terminate(req->sconn,
|
||||||
|
nt_errstr(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SIVAL(outhdr, SMB2_HDR_TID, out_tree_id);
|
SIVAL(outhdr, SMB2_HDR_TID, out_tree_id);
|
||||||
@ -132,7 +161,12 @@ NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
|
|||||||
SIVAL(outbody.data, 0x0C,
|
SIVAL(outbody.data, 0x0C,
|
||||||
out_maximal_access); /* maximal access */
|
out_maximal_access); /* maximal access */
|
||||||
|
|
||||||
return smbd_smb2_request_done(req, outbody, NULL);
|
error = smbd_smb2_request_done(req, outbody, NULL);
|
||||||
|
if (!NT_STATUS_IS_OK(error)) {
|
||||||
|
smbd_server_connection_terminate(req->sconn,
|
||||||
|
nt_errstr(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smbd_smb2_tcon_destructor(struct smbd_smb2_tcon *tcon)
|
static int smbd_smb2_tcon_destructor(struct smbd_smb2_tcon *tcon)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user