1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-09 08:58:35 +03:00

s3:smbd: add support for SMB2 Ioctl FSCTL_DFS_GET_REFERRALS

metze
This commit is contained in:
Stefan Metzmacher 2009-06-05 18:38:20 +02:00
parent d1db140a73
commit 140fe782a9

View File

@ -243,6 +243,80 @@ static struct tevent_req *smbd_smb2_ioctl_send(TALLOC_CTX *mem_ctx,
} }
switch (in_ctl_code) { switch (in_ctl_code) {
case 0x00060194: /* FSCTL_DFS_GET_REFERRALS */
{
uint16_t in_max_referral_level;
DATA_BLOB in_file_name_buffer;
char *in_file_name_string;
size_t in_file_name_string_size;
bool ok;
bool overflow = false;
NTSTATUS status;
int dfs_size;
char *dfs_data = NULL;
if (!IS_IPC(smbreq->conn)) {
tevent_req_nterror(req, NT_STATUS_INVALID_DEVICE_REQUEST);
return tevent_req_post(req, ev);
}
if (!lp_host_msdfs()) {
tevent_req_nterror(req, NT_STATUS_FS_DRIVER_REQUIRED);
return tevent_req_post(req, ev);
}
if (in_input.length < (2 + 2)) {
tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
return tevent_req_post(req, ev);
}
in_max_referral_level = SVAL(in_input.data, 0);
in_file_name_buffer.data = in_input.data + 2;
in_file_name_buffer.length = in_input.length - 2;
ok = convert_string_talloc(state, CH_UTF16, CH_UNIX,
in_file_name_buffer.data,
in_file_name_buffer.length,
&in_file_name_string,
&in_file_name_string_size, false);
if (!ok) {
tevent_req_nterror(req, NT_STATUS_ILLEGAL_CHARACTER);
return tevent_req_post(req, ev);
}
dfs_size = setup_dfs_referral(smbreq->conn,
in_file_name_string,
in_max_referral_level,
&dfs_data, &status);
if (dfs_size < 0) {
tevent_req_nterror(req, status);
return tevent_req_post(req, ev);
}
if (dfs_size > in_max_output) {
/*
* TODO: we need a testsuite for this
*/
overflow = true;
dfs_size = in_max_output;
}
state->out_output = data_blob_talloc(state,
(uint8_t *)dfs_data,
dfs_size);
SAFE_FREE(dfs_data);
if (dfs_size > 0 &&
tevent_req_nomem(state->out_output.data, req)) {
return tevent_req_post(req, ev);
}
if (overflow) {
tevent_req_nterror(STATUS_BUFFER_OVERFLOW);
} else {
tevent_req_done(req);
}
return tevent_req_post(req, ev);
}
case 0x0011C017: /* FSCTL_PIPE_TRANSCEIVE */ case 0x0011C017: /* FSCTL_PIPE_TRANSCEIVE */
if (!IS_IPC(smbreq->conn)) { if (!IS_IPC(smbreq->conn)) {