From f596bbff3046a38aa9cd9ce77072ba3542dfc403 Mon Sep 17 00:00:00 2001 From: Uri Simchoni Date: Thu, 22 Sep 2016 01:03:41 +0300 Subject: [PATCH] cliquota: support setting file system quota via SMB2 Signed-off-by: Uri Simchoni Reviewed-by: Jeremy Allison --- source3/libsmb/cli_smb2_fnum.c | 44 ++++++++++++++++++++++++++++++++++ source3/libsmb/cli_smb2_fnum.h | 3 +++ source3/libsmb/cliquota.c | 4 ++++ 3 files changed, 51 insertions(+) diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index 9ee4daed13d9..cf00f60ae99c 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -2608,6 +2608,50 @@ cleanup: return status; } +NTSTATUS cli_smb2_set_fs_quota_info(struct cli_state *cli, + int quota_fnum, + SMB_NTQUOTA_STRUCT *pqt) +{ + NTSTATUS status; + DATA_BLOB inbuf = 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 cleanup; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + status = NT_STATUS_INVALID_PARAMETER; + goto cleanup; + } + + status = map_fnum_to_smb2_handle(cli, quota_fnum, &ph); + if (!NT_STATUS_IS_OK(status)) { + goto cleanup; + } + + status = build_fs_quota_buffer(talloc_tos(), pqt, &inbuf, 0); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + status = smb2cli_set_info( + cli->conn, cli->timeout, cli->smb2.session, cli->smb2.tcon, + 2, /* in_info_type */ + SMB_FS_QUOTA_INFORMATION - 1000, /* in_file_info_class */ + &inbuf, /* in_input_buffer */ + 0, /* in_additional_info */ + ph->fid_persistent, ph->fid_volatile); +cleanup: + TALLOC_FREE(frame); + return status; +} + struct cli_smb2_read_state { struct tevent_context *ev; struct cli_state *cli; diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h index 7c618d186547..3289f7e78f49 100644 --- a/source3/libsmb/cli_smb2_fnum.h +++ b/source3/libsmb/cli_smb2_fnum.h @@ -163,6 +163,9 @@ NTSTATUS cli_smb2_get_fs_quota_info(struct cli_state *cli, NTSTATUS cli_smb2_set_user_quota(struct cli_state *cli, int quota_fnum, SMB_NTQUOTA_LIST *qtl); +NTSTATUS cli_smb2_set_fs_quota_info(struct cli_state *cli, + int quota_fnum, + SMB_NTQUOTA_STRUCT *pqt); struct tevent_req *cli_smb2_read_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct cli_state *cli, diff --git a/source3/libsmb/cliquota.c b/source3/libsmb/cliquota.c index 09c3d4d75dfd..e22ccdd1931b 100644 --- a/source3/libsmb/cliquota.c +++ b/source3/libsmb/cliquota.c @@ -619,6 +619,10 @@ NTSTATUS cli_set_fs_quota_info(struct cli_state *cli, int quota_fnum, smb_panic("cli_set_fs_quota_info() called with NULL Pointer!"); } + if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { + return cli_smb2_set_fs_quota_info(cli, quota_fnum, pqt); + } + status = build_fs_quota_buffer(talloc_tos(), pqt, &data, 0); if (!NT_STATUS_IS_OK(status)) { return status; -- 2.34.1