From 2e7e5dfbc660045d5dd964e78d771cdf80e8f9f5 Mon Sep 17 00:00:00 2001 From: Uri Simchoni Date: Tue, 20 Sep 2016 14:32:06 +0300 Subject: [PATCH] s3-libsmb: Support getting fs attributes via SMB2 Add a wrapper function arounf GET_INFO to obtain file system attributes, and plumb it in. Signed-off-by: Uri Simchoni Reviewed-by: Jeremy Allison --- source3/libsmb/cli_smb2_fnum.c | 77 ++++++++++++++++++++++++++++++++++ source3/libsmb/cli_smb2_fnum.h | 1 + source3/libsmb/clifsinfo.c | 4 ++ 3 files changed, 82 insertions(+) diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index ac7209014626..a998d6fedeca 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -1755,6 +1755,83 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli, const char *path, return status; } +/*************************************************************** + Wrapper that allows SMB2 to query file system attributes. + Synchronous only. +***************************************************************/ + +NTSTATUS cli_smb2_get_fs_attr_info(struct cli_state *cli, uint32_t *fs_attr) +{ + NTSTATUS status; + uint16_t fnum = 0xffff; + DATA_BLOB outbuf = data_blob_null; + struct smb2_hnd *ph = NULL; + TALLOC_CTX *frame = talloc_stackframe(); + + if (smbXcli_conn_has_async_calls(cli->conn)) { + /* + * Can't use sync call while an async call is in flight + */ + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + + /* First open the top level directory. */ + status = + cli_smb2_create_fnum(cli, "", 0, /* create_flags */ + FILE_READ_ATTRIBUTES, /* desired_access */ + FILE_ATTRIBUTE_DIRECTORY, /* file attributes */ + FILE_SHARE_READ | FILE_SHARE_WRITE | + FILE_SHARE_DELETE, /* share_access */ + FILE_OPEN, /* create_disposition */ + FILE_DIRECTORY_FILE, /* create_options */ + &fnum, + NULL); + + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + + status = map_fnum_to_smb2_handle(cli, fnum, &ph); + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + + status = smb2cli_query_info(cli->conn, cli->timeout, cli->smb2.session, + cli->smb2.tcon, 2, /* in_info_type */ + 5, /* in_file_info_class */ + 0xFFFF, /* in_max_output_length */ + NULL, /* in_input_buffer */ + 0, /* in_additional_info */ + 0, /* in_flags */ + ph->fid_persistent, ph->fid_volatile, frame, + &outbuf); + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + + if (outbuf.length < 12) { + status = NT_STATUS_INVALID_NETWORK_RESPONSE; + goto fail; + } + + *fs_attr = IVAL(outbuf.data, 0); + +fail: + + if (fnum != 0xffff) { + cli_smb2_close_fnum(cli, fnum); + } + + TALLOC_FREE(frame); + return status; +} + /*************************************************************** Wrapper that allows SMB2 to query a security descriptor. Synchronous only. diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h index 0436c68da8bd..2df54a30b407 100644 --- a/source3/libsmb/cli_smb2_fnum.h +++ b/source3/libsmb/cli_smb2_fnum.h @@ -121,6 +121,7 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli, uint64_t *bsize, uint64_t *total, uint64_t *avail); +NTSTATUS cli_smb2_get_fs_attr_info(struct cli_state *cli, uint32_t *fs_attr); NTSTATUS cli_smb2_query_security_descriptor(struct cli_state *cli, uint16_t fnum, uint32_t sec_info, diff --git a/source3/libsmb/clifsinfo.c b/source3/libsmb/clifsinfo.c index ddc9efd61b37..31a2c0222b2d 100644 --- a/source3/libsmb/clifsinfo.c +++ b/source3/libsmb/clifsinfo.c @@ -337,6 +337,10 @@ NTSTATUS cli_get_fs_attr_info(struct cli_state *cli, uint32_t *fs_attr) struct tevent_req *req; NTSTATUS status = NT_STATUS_NO_MEMORY; + if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { + return cli_smb2_get_fs_attr_info(cli, fs_attr); + } + if (smbXcli_conn_has_async_calls(cli->conn)) { return NT_STATUS_INVALID_PARAMETER; } -- 2.34.1